mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-10 23:54:14 +01:00
00ccf0c6b5
# Conflicts: # .github/CODEOWNERS # .github/workflows/compile_changelogs.yml # .github/workflows/stale.yml # SQL/database_changelog.md # _maps/map_files/CatwalkStation/CatwalkStation_2023.dmm # code/__DEFINES/atom_hud.dm # code/__DEFINES/inventory.dm # code/__DEFINES/mobs.dm # code/__DEFINES/species_clothing_paths.dm # code/__DEFINES/subsystems.dm # code/__DEFINES/surgery.dm # code/__HELPERS/global_lists.dm # code/_globalvars/lists/maintenance_loot.dm # code/_globalvars/traits/_traits.dm # code/controllers/subsystem/minor_mapping.dm # code/controllers/subsystem/processing/quirks.dm # code/controllers/subsystem/shuttle.dm # code/datums/components/palette.dm # code/datums/components/surgery_initiator.dm # code/datums/diseases/advance/advance.dm # code/datums/hud.dm # code/datums/mood.dm # code/datums/mutations/chameleon.dm # code/datums/quirks/negative_quirks/nyctophobia.dm # code/datums/status_effects/debuffs/debuffs.dm # code/datums/status_effects/debuffs/drunk.dm # code/datums/status_effects/debuffs/slime/slime_leech.dm # code/datums/weather/weather.dm # code/game/data_huds.dm # code/game/objects/items.dm # code/game/objects/items/devices/scanners/health_analyzer.dm # code/game/objects/items/frog_statue.dm # code/game/objects/items/rcd/RLD.dm # code/game/objects/items/robot/items/hypo.dm # code/game/objects/items/stacks/medical.dm # code/game/objects/items/stacks/wrap.dm # code/game/objects/items/storage/garment.dm # code/game/objects/items/tools/medical/defib.dm # code/game/objects/items/weaponry.dm # code/game/objects/items/weaponry/melee/misc.dm # code/game/objects/structures/crates_lockers/closets/secure/security.dm # code/game/objects/structures/curtains.dm # code/game/objects/structures/dresser.dm # code/game/objects/structures/girders.dm # code/game/objects/structures/maintenance.dm # code/game/objects/structures/mirror.dm # code/modules/admin/greyscale_modify_menu.dm # code/modules/admin/verbs/light_debug.dm # code/modules/antagonists/ashwalker/ashwalker.dm # code/modules/antagonists/heretic/knowledge/starting_lore.dm # code/modules/antagonists/ninja/ninjaDrainAct.dm # code/modules/art/paintings.dm # code/modules/client/preferences.dm # code/modules/client/verbs/ooc.dm # code/modules/clothing/head/wig.dm # code/modules/events/disease_outbreak.dm # code/modules/holodeck/holo_effect.dm # code/modules/jobs/job_types/head_of_security.dm # code/modules/jobs/job_types/security_officer.dm # code/modules/library/skill_learning/generic_skillchips/point.dm # code/modules/mining/lavaland/ash_flora.dm # code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm # code/modules/mob/dead/new_player/new_player.dm # code/modules/mob/living/basic/guardian/guardian.dm # code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm # code/modules/mob/living/carbon/carbon.dm # code/modules/mob/living/carbon/human/human.dm # code/modules/mob/living/carbon/human/human_defines.dm # code/modules/mob/living/carbon/life.dm # code/modules/mob/living/living.dm # code/modules/mob/living/living_defines.dm # code/modules/mob/mob.dm # code/modules/mob_spawn/ghost_roles/mining_roles.dm # code/modules/mod/mod_control.dm # code/modules/mod/modules/modules_general.dm # code/modules/modular_computers/computers/item/computer_ui.dm # code/modules/paperwork/paper.dm # code/modules/paperwork/paperbin.dm # code/modules/power/lighting/light.dm # code/modules/projectiles/guns/energy/kinetic_accelerator.dm # code/modules/projectiles/projectile.dm # code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm # code/modules/reagents/chemistry/reagents/food_reagents.dm # code/modules/reagents/chemistry/reagents/other_reagents.dm # code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm # code/modules/research/xenobiology/crossbreeding/_clothing.dm # code/modules/research/xenobiology/crossbreeding/prismatic.dm # code/modules/surgery/advanced/brainwashing.dm # code/modules/surgery/advanced/lobotomy.dm # code/modules/surgery/amputation.dm # code/modules/surgery/blood_filter.dm # code/modules/surgery/bodyparts/_bodyparts.dm # code/modules/surgery/brain_surgery.dm # code/modules/surgery/cavity_implant.dm # code/modules/surgery/coronary_bypass.dm # code/modules/surgery/gastrectomy.dm # code/modules/surgery/healing.dm # code/modules/surgery/limb_augmentation.dm # code/modules/surgery/organ_manipulation.dm # code/modules/surgery/revival.dm # code/modules/surgery/sleeper_protocol.dm # code/modules/surgery/surgery_helpers.dm # code/modules/surgery/surgery_step.dm # code/modules/unit_tests/_unit_tests.dm # code/modules/unit_tests/designs.dm # code/modules/unit_tests/icon_state_worn.dm # code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png # code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png # code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png # code/modules/unit_tests/screenshots/screenshot_husk_body.png # code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png # icons/map_icons/clothing/head/_head.dmi # icons/map_icons/clothing/shoes.dmi # icons/map_icons/items/_item.dmi # icons/mob/huds/hud.dmi # icons/mob/inhands/64x64_lefthand.dmi # icons/mob/inhands/64x64_righthand.dmi # icons/obj/machines/computer.dmi # tgui/packages/tgui/interfaces/OperatingComputer.jsx # tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx # tgui/packages/tgui/interfaces/PreferencesMenu/types.ts # tgui/packages/tgui/interfaces/SurgeryInitiator.tsx # tools/icon_cutter/check.py
229 lines
6.3 KiB
Plaintext
229 lines
6.3 KiB
Plaintext
// Clipboard skins
|
|
/datum/atom_skin/clipboard
|
|
abstract_type = /datum/atom_skin/clipboard
|
|
change_inhand_icon_state = TRUE
|
|
|
|
/datum/atom_skin/clipboard/brown
|
|
preview_name = "Brown"
|
|
new_icon_state = "clipboard"
|
|
|
|
/datum/atom_skin/clipboard/black
|
|
preview_name = "Black"
|
|
new_icon_state = "clipboard_black"
|
|
|
|
/datum/atom_skin/clipboard/white
|
|
preview_name = "White"
|
|
new_icon_state = "clipboard_white"
|
|
|
|
/**
|
|
* Clipboard
|
|
*/
|
|
/obj/item/clipboard
|
|
name = "clipboard"
|
|
icon = 'icons/obj/service/bureaucracy.dmi'
|
|
icon_state = "clipboard"
|
|
inhand_icon_state = "clipboard"
|
|
worn_icon_state = "clipboard"
|
|
throwforce = 0
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
throw_speed = 3
|
|
throw_range = 7
|
|
slot_flags = ITEM_SLOT_BELT
|
|
resistance_flags = FLAMMABLE
|
|
|
|
custom_materials = list(/datum/material/wood = SHEET_MATERIAL_AMOUNT, /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT)
|
|
|
|
/// The stored pen
|
|
var/obj/item/pen/pen
|
|
/// Is the pen integrated?
|
|
var/integrated_pen = FALSE
|
|
/**
|
|
* Topmost piece of paper
|
|
* This is used for the paper displayed on the clipboard's icon
|
|
* and it is the one attacked, when attacking the clipboard.
|
|
*/
|
|
var/obj/item/paper/top_paper
|
|
|
|
/obj/item/clipboard/suicide_act(mob/living/carbon/user)
|
|
user.visible_message(span_suicide("[user] begins putting [user.p_their()] head into the clip of \the [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
return BRUTELOSS //The clipboard's clip is very strong. Industrial duty. Can kill a man easily.
|
|
|
|
/obj/item/clipboard/Initialize(mapload)
|
|
update_appearance()
|
|
. = ..()
|
|
|
|
/obj/item/clipboard/setup_reskins()
|
|
AddComponent(/datum/component/reskinable_item, /datum/atom_skin/clipboard)
|
|
|
|
/obj/item/clipboard/Destroy()
|
|
QDEL_NULL(pen)
|
|
return ..()
|
|
|
|
/obj/item/clipboard/examine()
|
|
. = ..()
|
|
if(!integrated_pen && pen)
|
|
. += span_notice("Right-click to remove [pen].")
|
|
else if(top_paper)
|
|
. += span_notice("Right-click to remove [top_paper].")
|
|
|
|
/// Take out the topmost paper
|
|
/obj/item/clipboard/proc/remove_paper(obj/item/paper/paper, mob/user)
|
|
if(!istype(paper))
|
|
return
|
|
paper.forceMove(user.loc)
|
|
user.put_in_hands(paper)
|
|
to_chat(user, span_notice("You remove [paper] from [src]."))
|
|
|
|
/obj/item/clipboard/proc/remove_pen(mob/user)
|
|
var/obj/item/pen/pen = src.pen
|
|
pen.forceMove(user.loc)
|
|
user.put_in_hands(pen)
|
|
to_chat(user, span_notice("You remove [pen] from [src]."))
|
|
|
|
/obj/item/clipboard/Exited(atom/movable/gone, direction)
|
|
. = ..()
|
|
if (gone == pen)
|
|
pen = null
|
|
update_icon()
|
|
return
|
|
|
|
if (gone != top_paper)
|
|
return
|
|
|
|
UnregisterSignal(top_paper, COMSIG_ATOM_UPDATED_ICON)
|
|
top_paper = locate(/obj/item/paper) in src
|
|
update_icon()
|
|
|
|
/obj/item/clipboard/update_overlays()
|
|
. = ..()
|
|
var/paper_to_add = get_paper_overlay()
|
|
if(paper_to_add)
|
|
. += paper_to_add
|
|
if(!integrated_pen && pen) // SKYRAT EDIT - CARGO BORGS - ORIGINAL: if(pen)
|
|
. += "clipboard_pen"
|
|
. += "clipboard_over"
|
|
|
|
/obj/item/clipboard/proc/get_paper_overlay()
|
|
if(isnull(top_paper))
|
|
return
|
|
|
|
var/mutable_appearance/paper_overlay = mutable_appearance(icon, top_paper.icon_state, offset_spokesman = src, appearance_flags = KEEP_APART)
|
|
paper_overlay = top_paper.color_atom_overlay(paper_overlay)
|
|
paper_overlay.overlays += top_paper.overlays
|
|
return paper_overlay
|
|
|
|
/obj/item/clipboard/attack_hand(mob/user, list/modifiers)
|
|
if(LAZYACCESS(modifiers, RIGHT_CLICK))
|
|
if(!integrated_pen && pen)
|
|
remove_pen(user)
|
|
else
|
|
remove_paper(top_paper, user)
|
|
return TRUE
|
|
. = ..()
|
|
|
|
/obj/item/clipboard/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
|
|
if(istype(weapon, /obj/item/paper))
|
|
//Add paper into the clipboard
|
|
if(!user.transferItemToLoc(weapon, src))
|
|
return
|
|
if(top_paper)
|
|
UnregisterSignal(top_paper, COMSIG_ATOM_UPDATED_ICON)
|
|
RegisterSignal(weapon, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_top_paper_change))
|
|
top_paper = weapon
|
|
to_chat(user, span_notice("You clip [weapon] onto [src]."))
|
|
else if(istype(weapon, /obj/item/pen) && !pen)
|
|
//Add a pen into the clipboard, attack (write) if there is already one
|
|
if(!usr.transferItemToLoc(weapon, src))
|
|
return
|
|
pen = weapon
|
|
to_chat(usr, span_notice("You slot [weapon] into [src]."))
|
|
else if(top_paper)
|
|
top_paper.attackby(user.get_active_held_item(), user)
|
|
update_appearance()
|
|
|
|
/obj/item/clipboard/attack_self(mob/user)
|
|
add_fingerprint(usr)
|
|
ui_interact(user)
|
|
return
|
|
|
|
/obj/item/clipboard/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "Clipboard")
|
|
ui.open()
|
|
|
|
/obj/item/clipboard/ui_data(mob/user)
|
|
// prepare data for TGUI
|
|
var/list/data = list()
|
|
data["pen"] = "[pen]"
|
|
data["integrated_pen"] = integrated_pen
|
|
|
|
data["top_paper"] = "[top_paper]"
|
|
data["top_paper_ref"] = "[REF(top_paper)]"
|
|
|
|
data["paper"] = list()
|
|
data["paper_ref"] = list()
|
|
for(var/obj/item/paper/paper in src)
|
|
if(paper == top_paper)
|
|
continue
|
|
data["paper"] += "[paper]"
|
|
data["paper_ref"] += "[REF(paper)]"
|
|
|
|
return data
|
|
|
|
/obj/item/clipboard/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED))
|
|
return
|
|
|
|
switch(action)
|
|
// Take the pen out
|
|
if("remove_pen")
|
|
if(pen)
|
|
if(!integrated_pen)
|
|
remove_pen(usr)
|
|
else
|
|
to_chat(usr, span_warning("You can't seem to find a way to remove [src]'s [pen]."))
|
|
. = TRUE
|
|
// Take paper out
|
|
if("remove_paper")
|
|
var/obj/item/paper/paper = locate(params["ref"]) in src
|
|
if(istype(paper))
|
|
remove_paper(paper, usr)
|
|
. = TRUE
|
|
// Look at (or edit) the paper
|
|
if("edit_paper")
|
|
var/obj/item/paper/paper = locate(params["ref"]) in src
|
|
if(istype(paper))
|
|
paper.ui_interact(usr)
|
|
update_icon()
|
|
. = TRUE
|
|
// Move paper to the top
|
|
if("move_top_paper")
|
|
var/obj/item/paper/paper = locate(params["ref"]) in src
|
|
if(istype(paper))
|
|
top_paper = paper
|
|
to_chat(usr, span_notice("You move [paper] to the top."))
|
|
update_icon()
|
|
. = TRUE
|
|
// Rename the paper (it's a verb)
|
|
if("rename_paper")
|
|
var/obj/item/paper/paper = locate(params["ref"]) in src
|
|
if(istype(paper))
|
|
paper.rename()
|
|
update_icon()
|
|
. = TRUE
|
|
|
|
/**
|
|
* This is a simple proc to handle calling update_icon() upon receiving the top paper's `COMSIG_ATOM_UPDATE_APPEARANCE`.
|
|
*/
|
|
/obj/item/clipboard/proc/on_top_paper_change()
|
|
SIGNAL_HANDLER
|
|
update_appearance()
|
|
|
|
/obj/item/clipboard/IsContainedAtomAccessible(atom/contained, atom/movable/user)
|
|
return ..() || (contained == top_paper)
|