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