From fbc98d3208351c6e3091b1f11d8a7b906ca8dc3a Mon Sep 17 00:00:00 2001 From: Geeves Date: Wed, 25 Aug 2021 16:31:39 +0200 Subject: [PATCH] Kathira Custom Item (#12367) --- aurorastation.dme | 1 + code/modules/customitems/item_defines.dm | 8 ++ code/modules/paperwork/folders.dm | 36 +++++++- code/modules/paperwork/journal.dm | 96 +++++++++++++++++++++ code/modules/paperwork/paper.dm | 18 +++- icons/obj/contained_items/misc/journal.dmi | Bin 0 -> 2274 bytes icons/obj/custom_items/kathira_journal.dmi | Bin 0 -> 3343 bytes 7 files changed, 153 insertions(+), 6 deletions(-) create mode 100644 code/modules/paperwork/journal.dm create mode 100644 icons/obj/contained_items/misc/journal.dmi create mode 100644 icons/obj/custom_items/kathira_journal.dmi diff --git a/aurorastation.dme b/aurorastation.dme index bee49b72379..49fece370da 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -2505,6 +2505,7 @@ #include "code\modules\paperwork\filingcabinet.dm" #include "code\modules\paperwork\folders.dm" #include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\journal.dm" #include "code\modules\paperwork\paper.dm" #include "code\modules\paperwork\paper_bundle.dm" #include "code\modules\paperwork\paperbin.dm" diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index acd519450f8..b42f9831c3d 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -2126,3 +2126,11 @@ All custom items with worn sprites must follow the contained sprite system: http icon_state = "pax_bag" item_state = "pax_bag" contained_sprite = TRUE + +/obj/item/journal/fluff/kathira // Blue Leather-Bound Journal - Kathira El-Hashem - TheGreyWolf + name = "blue leather-bound journal" + desc = "A blue journal emblazoned with the New Kingdom of Adhomai's flag across the cover." + closed_desc = " The pages within are a mix of clearly indexed case files, and study notes alongside less clearly indexed pages that appears to be fragmented thoughts, not unlike a diary. The very first page of the journal reads “dedicated to Qirandri Mrorirhaldarr” and is signed “Mrradar Sanufar” underneath." + icon = 'icons/obj/custom_items/kathira_journal.dmi' + icon_state = "kath_journal" + item_state = "kath_journal" \ No newline at end of file diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 0db871e2e29..71189775ee7 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -7,6 +7,8 @@ drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' + var/can_write = FALSE + /obj/item/folder/blue desc = "A blue folder." icon_state = "folder_blue" @@ -52,7 +54,7 @@ var/dat = "[name]" for(var/obj/item/paper/P in src) - dat += "Remove Rename - [P.name]
" + dat += "[can_write ? "Write " : ""]Remove Rename - [P.name]
" for(var/obj/item/photo/Ph in src) dat += "Remove Rename - [Ph.name]
" for(var/obj/item/paper_bundle/Pb in src) @@ -69,14 +71,19 @@ if((usr.stat || usr.restrained())) return - if(src.loc == usr) + if(loc_check(usr)) if(href_list["remove"]) var/obj/item/P = locate(href_list["remove"]) if(P && (P.loc == src) && istype(P)) P.forceMove(usr.loc) usr.put_in_hands(P) - + handle_post_remove() + else if(href_list["write"]) + var/obj/item/paper/P = locate(href_list["write"]) + var/obj/item/I = usr.get_inactive_hand() + if(P && I && (P.loc == src) && istype(P) && I.ispen()) + P.attackby(I, usr) else if(href_list["read"]) var/obj/item/paper/P = locate(href_list["read"]) if(P && (P.loc == src) && istype(P)) @@ -111,6 +118,14 @@ update_icon() return +/obj/item/folder/proc/loc_check(var/atom/A) + if(loc == A) + return TRUE + return FALSE + +/obj/item/folder/proc/handle_post_remove() + return + /obj/item/folder/blue/nka/Initialize() . = ..() for (var/I = 1 to 5) @@ -119,4 +134,17 @@ /obj/item/folder/filled/Initialize() . = ..() for (var/I = 1 to 10) - new /obj/item/paper(src) \ No newline at end of file + new /obj/item/paper(src) + +/obj/item/folder/embedded + name = "index" + can_write = TRUE + +/obj/item/folder/embedded/loc_check(var/atom/A) + if(loc.loc == A) + return TRUE + return FALSE + +/obj/item/folder/embedded/handle_post_remove() + if(!length(contents)) + qdel(src) \ No newline at end of file diff --git a/code/modules/paperwork/journal.dm b/code/modules/paperwork/journal.dm new file mode 100644 index 00000000000..e0e5945f0fe --- /dev/null +++ b/code/modules/paperwork/journal.dm @@ -0,0 +1,96 @@ +/obj/item/journal + name = "journal" + desc = "A journal, kind of like a folder, but bigger! And personal." + var/closed_desc + desc_info = "Ctrl-click this while it's on your person to open this journal." + icon = 'icons/obj/contained_items/misc/journal.dmi' + icon_state = "journal" + item_state = "journal" + contained_sprite = TRUE + update_icon_on_init = TRUE + throw_speed = 1 + throw_range = 5 + w_class = ITEMSIZE_NORMAL + attack_verb = list("bashed", "whacked", "educated") + drop_sound = 'sound/items/drop/book.ogg' + pickup_sound = 'sound/items/pickup/book.ogg' + + var/static/list/insertables = list(/obj/item/paper, /obj/item/photo, /obj/item/paper_bundle, /obj/item/sample) + + var/open = FALSE + var/list/indices + +/obj/item/journal/Destroy() + for(var/obj/item/folder/embedded/E as anything in indices) + qdel(E) + return ..() + +/obj/item/journal/update_icon() + if(!open) + icon_state = "[initial(icon_state)]_closed" + else if(LAZYLEN(indices)) + icon_state = "[initial(icon_state)]_writing" + else + icon_state = initial(icon_state) + + if(closed_desc) + desc = open ? initial(desc) + closed_desc : initial(desc) + +/obj/item/journal/CtrlClick(mob/user) + if(loc == user) + open = !open + to_chat(user, SPAN_NOTICE("You [open ? "open" : "close"] \the [src].")) + update_icon() + return + return ..() + +/obj/item/journal/attack_self(mob/user) + if(!open) + to_chat(user, SPAN_WARNING("You can't look inside \the [src] while it's closed.")) + return + if(!LAZYLEN(indices)) + to_chat(user, SPAN_WARNING("\The [src] doesn't have anything inside!")) + return + var/selected_folder = input(user, "Select an index to view.", "Index View") as null|anything in indices + if(isnull(selected_folder)) + return + var/obj/item/folder/embedded/E = indices[selected_folder] + E.attack_self(user) + +/obj/item/journal/attackby(obj/item/I, mob/user) + if(is_type_in_list(I, insertables)) + if(!open) + to_chat(user, SPAN_WARNING("You can't put anything into \the [src] while it's closed.")) + return + var/obj/item/folder/embedded/E + var/list/options = LAZYLEN(indices) ? indices + "New Index" : list("New Index") + var/selected_folder = input(user, "Select an index to insert this into.", "Index Selection") as null|anything in options + if(isnull(selected_folder)) + return + if(selected_folder == "New Index") + E = generate_index(user) + else + E = indices[selected_folder] + if(!E) + return + user.drop_from_inventory(I, E) + to_chat(user, SPAN_NOTICE("You put \the [I] into \the [E].")) + update_icon() + return + +/obj/item/journal/proc/generate_index(var/mob/user) + var/obj/item/folder/embedded/E = new /obj/item/folder/embedded(src) + var/index_name = sanitize(input(user, "Enter the index' name.", "Index Name") as text|null) + if(!index_name) + qdel(E) + return null + if(index_name == "New Index" || LAZYISIN(indices, index_name)) + index_name = "Index ([length(indices) + 1])" + E.name = index_name + LAZYSET(indices, E.name, E) + destroyed_event.register(E, src, .proc/remove_index) + return E + +/obj/item/journal/proc/remove_index(var/obj/item/folder/embedded/E) + LAZYREMOVE(indices, E.name) + update_icon() \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 101c6603526..cd3770a092a 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -433,6 +433,8 @@ 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 || !i.ispen()) + i = usr.get_inactive_hand() var/obj/item/clipboard/c var/iscrayon = FALSE var/isfountain = FALSE @@ -463,8 +465,7 @@ else isfountain = FALSE - // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr - if(src.loc != usr && !src.Adjacent(usr) && !((istype(src.loc, /obj/item/clipboard) || istype(src.loc, /obj/item/folder)) && (src.loc.loc == usr || src.loc.Adjacent(usr)) ) ) + if(!write_check(usr)) return var/last_fields_value = fields @@ -495,6 +496,19 @@ if(c) c.update_icon() +/obj/item/paper/proc/write_check(var/mob/user) + . = TRUE + // if paper is not in usr, then it must be near them, or in a clipboard or folder, which must be in or near usr + if(loc != user && !Adjacent(user)) + . = FALSE + if(!. && istype(loc, /obj/item/clipboard)) + var/obj/item/clipboard/C = loc + if(C.loc == user || C.Adjacent(user)) + . = TRUE + if(!. && istype(loc, /obj/item/folder)) + var/obj/item/folder/F = loc + if(F.loc_check(user) || F.Adjacent(user)) + . = TRUE /obj/item/paper/attackby(var/obj/item/P, mob/user) ..() diff --git a/icons/obj/contained_items/misc/journal.dmi b/icons/obj/contained_items/misc/journal.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d3d173a046dfb5f29f6d5ed05b125a195b7f4643 GIT binary patch literal 2274 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 literal 0 HcmV?d00001