diff --git a/aurorastation.dme b/aurorastation.dme index 1080d739d29..da509905290 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -2887,6 +2887,7 @@ #include "code\modules\paperwork\photography.dm" #include "code\modules\paperwork\silicon_photography.dm" #include "code\modules\paperwork\stamps.dm" +#include "code\modules\paperwork\typewriter.dm" #include "code\modules\power\apc.dm" #include "code\modules\power\batteryrack.dm" #include "code\modules\power\breaker_box.dm" diff --git a/code/modules/asset_cache/asset_cache.dm b/code/modules/asset_cache/asset_cache.dm index 5863f5631b7..6a41e247cd1 100644 --- a/code/modules/asset_cache/asset_cache.dm +++ b/code/modules/asset_cache/asset_cache.dm @@ -592,7 +592,8 @@ var/list/asset_datums = list() "copt-b.woff" = 'html/fonts/OFL/Copt-B.woff', "ducados.woff" = 'html/fonts/OFL/Ducados.woff', "kawkabmono.woff" = 'html/fonts/OFL/KawkabMono.woff', - "kaushanscript.woff" = 'html/fonts/OFL/KaushanScript.woff' + "kaushanscript.woff" = 'html/fonts/OFL/KaushanScript.woff', + "typewriter.woff" = 'html/fonts/OFL/typewriter.woff' ) cross_round_cachable = TRUE diff --git a/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm b/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm index 25de81e0642..512f40921f4 100644 --- a/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/items/xeno/tajara.dm @@ -658,3 +658,17 @@ earrings["adhomian pearls earrings"] = /obj/item/clothing/ears/earring/tajara earrings["adhomian golden earrings"] = /obj/item/clothing/ears/earring/tajara/gold gear_tweaks += new /datum/gear_tweak/path(earrings) + +/datum/gear/tajara_camera + display_name = "adhomian camera" + path = /obj/item/device/camera/adhomai + whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) + sort_category = "Xenowear - Tajara" + flags = GEAR_HAS_DESC_SELECTION + +/datum/gear/typewriter + display_name = "adhomian portable typewriter" + whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) + sort_category = "Xenowear - Tajara" + path = /obj/item/typewriter_case + flags = GEAR_HAS_DESC_SELECTION diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 2df4358330c..1b1c8a20f41 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -40,6 +40,7 @@ var/const/signfont = "Times New Roman" var/const/crayonfont = "Comic Sans MS" var/const/fountainfont = "Segoe Script" + var/const/typewriterfont = "Typewriter" drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' @@ -307,7 +308,7 @@ return signfont -/obj/item/paper/proc/parsepencode(t, obj/item/pen/P, mob/user, iscrayon, isfountain) +/obj/item/paper/proc/parsepencode(t, obj/item/pen/P, mob/user, iscrayon, isfountain, istypewriter) t = parse_languages(user, t, TRUE) t = replacetext(t, "\[sign\]", "[get_signature(P, user)]") @@ -340,10 +341,25 @@ t = replacetext(t, "\[logo_golden\]", "") t = replacetext(t, "\[barcode\]", "") + if(istypewriter) + t = replacetext(t, "\[*\]", "") + t = replacetext(t, "\[hr\]", "") + t = replacetext(t, "\[small\]", "") + t = replacetext(t, "\[/small\]", "") + t = replacetext(t, "\[list\]", "") + t = replacetext(t, "\[/list\]", "") + t = replacetext(t, "\[table\]", "") + t = replacetext(t, "\[/table\]", "") + t = replacetext(t, "\[row\]", "") + t = replacetext(t, "\[cell\]", "") + t = replacetext(t, "\[barcode\]", "") + if(iscrayon) t = "[t]" else if(isfountain) t = "[t]" + else if(istypewriter) + t = "[t]" else t = "[t]" @@ -460,11 +476,23 @@ return var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen. + + if(!i && istype(loc, /obj/item/portable_typewriter)) + var/obj/item/portable_typewriter/T = loc + if(T.pen) + i = T.pen + + if(i && istype(i, /obj/item/portable_typewriter) || !i && istype(loc, /obj/item/portable_typewriter)) + var/obj/item/portable_typewriter/T = i + if(T.pen) + i = T.pen + if(!i || !i.ispen()) i = usr.get_inactive_hand() var/obj/item/clipboard/c var/iscrayon = FALSE var/isfountain = FALSE + var/istypewriter = FALSE if(!i.ispen()) if(usr.back && istype(usr.back,/obj/item/rig)) var/obj/item/rig/r = usr.back @@ -473,12 +501,10 @@ i = m.device else return - else if(istype(src.loc, /obj/item/clipboard)) + if(istype(src.loc, /obj/item/clipboard)) c = src.loc if(c.haspen) i = c.haspen - else - return else return @@ -492,13 +518,15 @@ else isfountain = FALSE + if(istype(i, /obj/item/pen/typewriter)) + istypewriter = TRUE + if(!write_check(usr)) return var/last_fields_value = fields - t = parsepencode(t, i, usr, iscrayon, isfountain) // Encode everything from pencode to html - + t = parsepencode(t, i, usr, iscrayon, isfountain, istypewriter) // Encode everything from pencode to html if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield() to_chat(usr, SPAN_WARNING("Too many fields. Sorry, you can't do this.")) @@ -518,7 +546,11 @@ paper_win.add_stylesheet("paper_languages", 'html/browser/paper_languages.css') paper_win.open() - playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20) + if(istype(i, /obj/item/pen/typewriter)) + playsound(src, ('sound/machines/typewriter.ogg'), 40) + else + playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20) + update_icon() if(c) c.update_icon() @@ -536,6 +568,10 @@ var/obj/item/folder/F = loc if(F.loc_check(user) || F.Adjacent(user)) . = TRUE + if(!. && istype(loc, /obj/item/portable_typewriter)) + var/obj/item/portable_typewriter/T = loc + if(T.loc == user || T.Adjacent(user)) + . = TRUE /obj/item/paper/attackby(var/obj/item/P, mob/user) ..() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 2a0d6767467..7c04e268a6e 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -17,6 +17,11 @@ item_state = "electropack" w_class = ITEMSIZE_TINY +/obj/item/device/camera_film/taj_film + name = "film canister" + icon = 'icons/obj/tajara_items.dmi' + desc = "A rolle of 35mm film intended for cameras of Tajaran make." + icon_state = "taj_film" /******** * photo * @@ -137,6 +142,7 @@ var/global/photo_count = 0 obj_flags = OBJ_FLAG_CONDUCTABLE slot_flags = SLOT_BELT matter = list(DEFAULT_WALL_MATERIAL = 2000) + var/black_white = FALSE var/pictures_max = 10 var/pictures_left = 10 var/on = 1 @@ -209,7 +215,7 @@ var/global/photo_count = 0 if(!on || !pictures_left || ismob(target.loc)) return captureimage(target, user, flag) - playsound(loc, /singleton/sound_category/print_sound, 75, 1, -3) + do_photo_sound() pictures_left-- to_chat(user, "[pictures_left] photos left.") @@ -219,6 +225,9 @@ var/global/photo_count = 0 icon_state = icon_on on = 1 +/obj/item/device/camera/proc/do_photo_sound() + playsound(loc, /singleton/sound_category/print_sound, 75, 1, -3) + /obj/item/device/camera/detective name = "detectives camera" desc = "A one use - polaroid camera." @@ -267,6 +276,9 @@ var/global/photo_count = 0 p.icon = ic p.tiny = pc p.img = photoimage + if(black_white) + p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) p.picture_desc = mobs p.pixel_x = rand(-10, 10) p.pixel_y = rand(-10, 10) @@ -296,3 +308,19 @@ var/global/photo_count = 0 p.id = id return p + +/obj/item/device/camera/adhomai + name = "adhomian camera" + icon = 'icons/obj/tajara_items.dmi' + desc = "A slightly antiquated camera with a large flash bulb. Still popular with Tajara all over Adhomai." + icon_state = "taj_camera_on" + item_state = "taj_camera" + contained_sprite = TRUE + slot_flags = SLOT_MASK + black_white = TRUE + icon_on = "taj_camera_on" + icon_off = "taj_camera_off" + +/obj/item/device/camera/adhomai/do_photo_sound() + flick("taj_camera_flash", src) + playsound(loc, 'sound/items/camerabulb.ogg', 75, 1, -3) diff --git a/code/modules/paperwork/typewriter.dm b/code/modules/paperwork/typewriter.dm new file mode 100644 index 00000000000..365bb40b2b6 --- /dev/null +++ b/code/modules/paperwork/typewriter.dm @@ -0,0 +1,190 @@ +/obj/item/pen/typewriter + name = "national typist 'Adhomai Electric' experimental integrated typewriter pen" + desc = "A mechanical pen that writes on paper inside a typewriter. How did you even get this?" + +/obj/item/portable_typewriter + name = "portable typewriter" + desc = "A reasonably lightweight typewriter designed to be moved around." + desc_info = "You can alt-click this to eject the paper. Click and drag onto yourself while adjacent to type on the typewriter." + desc_extended = "The National Typist Company in the People's Republic of Adhomai was once the largest producer of \ + typewriters on the planet. With the introduction of human technology, however, these items - \ + which were once staples of Tajaran offices - have slowly become more uncommon. That \ + said, rural areas and less urban parts of the planet still rely heavily on these machines." + icon_state = "typewriter" + icon = 'icons/obj/device.dmi' + force = 20 + throwforce = 5 + w_class = ITEMSIZE_NORMAL + drop_sound = 'sound/items/drop/metalweapon.ogg' + pickup_sound = 'sound/items/pickup/metalweapon.ogg' + + var/obj/item/paper/stored_paper = null + var/obj/item/pen/pen + +/obj/item/portable_typewriter/Initialize() + . = ..() + + if(!pen) + pen = new /obj/item/pen/typewriter(src) + +/obj/item/portable_typewriter/Destroy() + QDEL_NULL(stored_paper) + QDEL_NULL(pen) + + return ..() + +/obj/item/portable_typewriter/attack_self(mob/user) + if(!stored_paper) + to_chat(user, SPAN_ALERT("\The [src] has no paper fed for typing!")) + else + stored_paper.attackby(pen, user) + . = ..() + +/obj/item/portable_typewriter/proc/get_signature(var/mob/user) + if (pen) + pen.get_signature(user) + +/obj/item/portable_typewriter/AltClick(mob/user) + if(!Adjacent(user)) + return + + else if(stored_paper) + var/obj/item/paper/paper = stored_paper + if(eject_paper(user.loc)) + user.put_in_hands(paper) + else + . = ..() + +/obj/item/portable_typewriter/MouseDrop(mob/user as mob) + if(use_check_and_message(user)) + return + + if(((user.contents.Find(src) || in_range(src, user)))) + if(isnull(stored_paper)) + to_chat(user, SPAN_ALERT("\The [src] has no paper fed for typing!")) + else + stored_paper.attackby(pen, user) + return + +/obj/item/portable_typewriter/update_icon() + if(stored_paper) + icon_state = "typewriter_[stored_paper.icon_state]" + else + icon_state = "typewriter" + +/obj/item/portable_typewriter/proc/eject_paper(atom/target, mob/user) + if(!stored_paper) + return FALSE + + to_chat(user, SPAN_ALERT("\The [src] ejects \the [stored_paper].")) + playsound(loc, 'sound/bureaucracy/paperfold.ogg', 60, 0) + stored_paper.forceMove(target) + stored_paper = null + update_icon() + return TRUE + +/obj/item/portable_typewriter/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/paper)) + if(!stored_paper) + if(W.icon_state == "scrap") + to_chat(user, SPAN_ALERT("\The [W] is too crumpled to feed correctly!")) + return + else + user.drop_item(W) + user.unEquip(W) + W.forceMove(src) + stored_paper = W + user.visible_message(SPAN_ALERT("\The [user] sucks up \the [W] into \the [src]."), SPAN_ALERT("You suck up \the [W] into \the [src].")) + src.update_icon() + else + to_chat(user, SPAN_ALERT("\The [src] already has a paper in it.")) + . = ..() + +/obj/item/portable_typewriter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + ..() + user.visible_message(SPAN_ALERT("\The [src] shatters into metal pieces!")) + M.Weaken(2) + playsound(loc, 'sound/effects/metalhit.ogg', 50, 1) + playsound(loc, 'sound/weapons/ring.ogg', 50, 1) + new /obj/item/material/shard/shrapnel(get_turf(user)) + qdel(src) + +/obj/item/typewriter_case + name = "typewriter case" + desc = "A large briefcase-esque place to store one's typewriter." + desc_info = "You can alt-click on this case to open and close it. A typewriter can only be removed or added when it is open!" + desc_extended = "The National Typist Company in the People's Republic of Adhomai was once the largest producer of \ + typewriters on the planet. With the introduction of human technology, however, these items - \ + which were once staples of Tajaran offices - have slowly become more uncommon. That \ + said, rural areas and less urban parts of the planet still rely heavily on these machines." + icon = 'icons/obj/storage/briefcase.dmi' + icon_state = "typewriter_case_closed" + item_state = "briefcase_black" + contained_sprite = TRUE + force = 10 + throwforce = 5 + throw_speed = 1 + throw_range = 4 + w_class = ITEMSIZE_LARGE + drop_sound = 'sound/items/drop/backpack.ogg' + pickup_sound = 'sound/items/pickup/backpack.ogg' + + var/obj/item/portable_typewriter/machine + var/opened = FALSE + +/obj/item/typewriter_case/Initialize() + . = ..() + if(!machine) + machine = new /obj/item/portable_typewriter(src) + +/obj/item/typewriter_case/Destroy() + QDEL_NULL(machine) + return ..() + +/obj/item/typewriter_case/AltClick(mob/user) + if(!Adjacent(user)) + return + + playsound(loc, 'sound/items/storage/briefcase.ogg', 50, 0, -5) + + opened = !opened + update_icon() + +/obj/item/typewriter_case/update_icon() + if(opened && machine) + icon_state = "typewriter_case_open" + else if (opened && !machine) + icon_state = "typewriter_case_open_e" + else if (!opened) + icon_state = "typewriter_case_closed" + +/obj/item/typewriter_case/attack_self(mob/user) + if(use_check_and_message(user)) + return + if(((user.contents.Find(src) || in_range(src, user)))) + if(opened) + if(!machine) + to_chat(user, SPAN_ALERT("\The [src] is currently empty!")) + else + user.put_in_hands(machine) + machine = null + update_icon() + else + to_chat(user, SPAN_ALERT("\The [src] is currently closed!")) + return + +/obj/item/typewriter_case/MouseDrop(mob/user as mob) + attack_self(user) + +/obj/item/typewriter_case/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/portable_typewriter)) + if(!machine) + user.drop_item(W) + user.unEquip(W) + W.forceMove(src) + src.machine = W + user.visible_message(SPAN_ALERT("[user] places \the [W] into \the [src]."), SPAN_ALERT ("You store \the [W] in \the [src].")) + src.update_icon() + else + to_chat(user, SPAN_ALERT("\The [src] already has a typewriter in it!")) + . = ..() diff --git a/html/changelogs/alberyk-detectivework.yml b/html/changelogs/alberyk-detectivework.yml new file mode 100644 index 00000000000..7ec79fd1051 --- /dev/null +++ b/html/changelogs/alberyk-detectivework.yml @@ -0,0 +1,12 @@ +author: Alberyk, Suethecake + +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added an adhomian typewriter." + - rscadd: "Added am adhomian camera." diff --git a/html/fonts/OFL/font_attributions.txt b/html/fonts/OFL/font_attributions.txt index 9cbae102fd7..c9f662c3ec6 100644 --- a/html/fonts/OFL/font_attributions.txt +++ b/html/fonts/OFL/font_attributions.txt @@ -16,4 +16,5 @@ Stormning.woff - Copyright (c) 2015, Mew Too, Robert Jablonski (Cannot Into Spac Copt-B.woff - Copyright (c) 2014, Nick Matavka (https://fontlibrary.org/en/member/nmatavka), with Reserved Font Name "Copt-B". KawkabMono.woff - Copyright (c) 2015, Abdullah Arif (abdullah.a@gmail.com), with Reserved Font Name 'Kawkab Mono'. KaushanScript.woff - Copyright (c) 2011, Pablo Impallari (www.impallari.com|impallari@gmail.com), Copyright (c) 2011, Igino Marini. (www.ikern.com|mail@iginomarini.com), with Reserved Font Name Kaushan Script. -Ducados.woff - Copyright (c) 2015, Rafael Ferran i Peralta (https://fontlibrary.org/en/member/rferran), with Reserved Font Name 'Ducados'. \ No newline at end of file +Ducados.woff - Copyright (c) 2015, Rafael Ferran i Peralta (https://fontlibrary.org/en/member/rferran), with Reserved Font Name 'Ducados'. +veteran_typewriter.woff - Copyright (c) 2012, Koczman Balint (https://www.abstractfonts.com/designer/372/koczman-balint) with Reserved Font Name "Veteran Typewriter Regular". \ No newline at end of file diff --git a/html/fonts/OFL/typewriter.woff b/html/fonts/OFL/typewriter.woff new file mode 100644 index 00000000000..8468ad101a6 Binary files /dev/null and b/html/fonts/OFL/typewriter.woff differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index d048cb4ba8d..f1feebd653a 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/storage/briefcase.dmi b/icons/obj/storage/briefcase.dmi index 3bad07b4155..96b5fb98e8d 100644 Binary files a/icons/obj/storage/briefcase.dmi and b/icons/obj/storage/briefcase.dmi differ diff --git a/icons/obj/tajara_items.dmi b/icons/obj/tajara_items.dmi index 2431de4375d..c6ead2b284a 100644 Binary files a/icons/obj/tajara_items.dmi and b/icons/obj/tajara_items.dmi differ diff --git a/sound/attributions.txt b/sound/attributions.txt index 9fcd27c4509..d1e33c12672 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -70,4 +70,9 @@ ATTRIBUTIONS SECTION END ATTRIBUTIONS SECTION START sound/weapons/reloads/lever_action_cock1.ogg - "Lever action cocking 2.wav", licensed under CC0. Obtained and edited from https://freesound.org/people/C-V/sounds/523402/ +ATTRIBUTIONS SECTION END + +ATTRIBUTIONS SECTION START +sound/items/typewriter.ogg - "Typewriter Sound Effect" licensed under CC0, by No Copyright Creator Sounds. Obtained and edited from https://www.youtube.com/watch?v=HYvJtImzoNI&ab_channel=NoCopyrightCreator-Sounds +sound/items/camerabulb.ogg - "Vintage Camera Flash Bulb Pops Sound Design" licensed under CC0, by Adilbek Sounds. Obainted and edited from https://freesound.org/people/adilbek_sounds/sounds/595044/ ATTRIBUTIONS SECTION END \ No newline at end of file diff --git a/sound/items/camerabulb.ogg b/sound/items/camerabulb.ogg new file mode 100644 index 00000000000..ccb74efdd3f Binary files /dev/null and b/sound/items/camerabulb.ogg differ diff --git a/sound/machines/typewriter.ogg b/sound/machines/typewriter.ogg new file mode 100644 index 00000000000..8f4c6a0986e Binary files /dev/null and b/sound/machines/typewriter.ogg differ