From fa84366203d775ae4b3ee217cd8b97925ce81fb1 Mon Sep 17 00:00:00 2001 From: Aquilar <20759278+Aquilar@users.noreply.github.com> Date: Sat, 1 Feb 2020 18:16:41 +0800 Subject: [PATCH 1/3] Added an icon to differentiate the blueprints from the CE's blueprints. purely to prevent confusion. Fixed the pinpointer from pointing to cyborg and slime blueprints by; Changing the steal objectives to require the CE's copy of the blueprints exclusive. Which required changing few lines in various places that reference that specific copy. Signed-off-by: Aquilar <20759278+Aquilar@users.noreply.github.com> missed the line in photography.dm --- code/game/gamemodes/steal_items.dm | 4 ++-- code/game/objects/items/blueprints.dm | 13 +++++++++---- .../closets/secure/engineering.dm | 2 +- code/modules/paperwork/photography.dm | 2 +- .../research/xenobiology/xenobiology.dm | 1 + icons/obj/items.dmi | Bin 153063 -> 153359 bytes 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index de9f8fc0eb7..78a05f904a8 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -76,12 +76,12 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C) /datum/theft_objective/blueprints name = "the station blueprints" - typepath = /obj/item/areaeditor/blueprints + typepath = /obj/item/areaeditor/blueprints/ce protected_jobs = list("Chief Engineer") altitems = list(/obj/item/photo) /datum/objective_item/steal/blueprints/check_special_completion(obj/item/I) - if(istype(I, /obj/item/areaeditor/blueprints)) + if(istype(I, /obj/item/areaeditor/blueprints/ce)) return 1 if(istype(I, /obj/item/photo)) var/obj/item/photo/P = I diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 79cc221ee7f..2ece6b6b32a 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -87,11 +87,11 @@ //Station blueprints!!! /obj/item/areaeditor/blueprints - name = "station blueprints" - desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it." + name = "Blueprints Tablet" + desc = "Heavy duty work tablet with blueprints of the station loaded. There is a blinking \"Classified\" icon and several dents in the casing" icon = 'icons/obj/items.dmi' - icon_state = "blueprints" - fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." + icon_state = "blueprinttablet" + fluffnotice = "Property of Nanotrasen. For heads of staff only. Wipe data after usage." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF w_class = WEIGHT_CLASS_NORMAL var/list/showing = list() @@ -328,3 +328,8 @@ desc = "A digital copy of the station blueprints stored in your memory." fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station." +/obj/item/areaeditor/blueprints/ce + name = "station blueprints" + desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it." + icon_state = "blueprints" + fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 517732cdd11..f5beb27d0bd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -16,7 +16,7 @@ new /obj/item/storage/backpack/satchel_eng(src) new /obj/item/storage/backpack/duffel/engineering(src) new /obj/item/clothing/head/beret/ce(src) - new /obj/item/areaeditor/blueprints(src) + new /obj/item/areaeditor/blueprints/ce(src) new /obj/item/storage/box/permits(src) new /obj/item/clothing/under/rank/chief_engineer(src) new /obj/item/clothing/under/rank/chief_engineer/skirt(src) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 11beb1a7cb6..c579c887b59 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -256,7 +256,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s var/atom/A = sorted[i] if(A) var/icon/img = getFlatIcon(A)//build_composite_icon(A) - if(istype(A, /obj/item/areaeditor/blueprints)) + if(istype(A, /obj/item/areaeditor/blueprints/ce)) blueprints = 1 // If what we got back is actually a picture, draw it. diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index c71c3f6f8d8..298946853da 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -538,6 +538,7 @@ /obj/item/areaeditor/blueprints/slime name = "cerulean prints" + icon_state = "blueprints" desc = "A one use set of blueprints made of jelly like organic material. Extends the reach of the management console." color = "#2956B2" diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index bac18fe788d5f449aa2d0a5c1198351c27a913a8..dadc1c3540583d6027b04b954d9f906fb7952a19 100644 GIT binary patch delta 6614 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 P=1_a2{qVb@MbQ5MB)geL delta 6315 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 dsqeX5u%9mHSBEr;Qv Date: Sun, 15 Mar 2020 12:56:01 +0800 Subject: [PATCH 2/3] simpler --- code/game/objects/items/blueprints.dm | 13 +++++-------- .../research/xenobiology/xenobiology.dm | 1 - icons/obj/items.dmi | Bin 153359 -> 153063 bytes 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 2ece6b6b32a..09a3e17e034 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -87,11 +87,11 @@ //Station blueprints!!! /obj/item/areaeditor/blueprints - name = "Blueprints Tablet" - desc = "Heavy duty work tablet with blueprints of the station loaded. There is a blinking \"Classified\" icon and several dents in the casing" + name = "station blueprints" + desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it." icon = 'icons/obj/items.dmi' - icon_state = "blueprinttablet" - fluffnotice = "Property of Nanotrasen. For heads of staff only. Wipe data after usage." + icon_state = "blueprints" + fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF w_class = WEIGHT_CLASS_NORMAL var/list/showing = list() @@ -329,7 +329,4 @@ fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station." /obj/item/areaeditor/blueprints/ce - name = "station blueprints" - desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it." - icon_state = "blueprints" - fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage." + diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 298946853da..c71c3f6f8d8 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -538,7 +538,6 @@ /obj/item/areaeditor/blueprints/slime name = "cerulean prints" - icon_state = "blueprints" desc = "A one use set of blueprints made of jelly like organic material. Extends the reach of the management console." color = "#2956B2" diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index dadc1c3540583d6027b04b954d9f906fb7952a19..bac18fe788d5f449aa2d0a5c1198351c27a913a8 100644 GIT binary patch delta 6315 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 dsqeX5u%9mHSBEr;Qv6Y%0?pPM~ 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 P=1_a2{qVb@MbQ5MB)geL From 898ca53e71a4d0ae984af55ba66bc1f76825a4e3 Mon Sep 17 00:00:00 2001 From: Aquilar <20759278+Aquilar@users.noreply.github.com> Date: Wed, 18 Mar 2020 15:09:41 +0800 Subject: [PATCH 3/3] deconflict Signed-off-by: Aquilar <20759278+Aquilar@users.noreply.github.com> --- .../closets/secure/engineering.dm | 294 ++--- code/modules/paperwork/photography.dm | 1136 ++++++++--------- 2 files changed, 715 insertions(+), 715 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index e09e94710f8..f0a7336389b 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -1,152 +1,152 @@ -/obj/structure/closet/secure_closet/engineering_chief - name = "chief engineer's locker" +/obj/structure/closet/secure_closet/engineering_chief + name = "chief engineer's locker" req_access = list(ACCESS_CE) - icon_state = "securece1" - icon_closed = "securece" - icon_locked = "securece1" - icon_opened = "secureceopen" - icon_broken = "securecebroken" - icon_off = "secureceoff" - -/obj/structure/closet/secure_closet/engineering_chief/New() - ..() - if(prob(50)) - new /obj/item/storage/backpack/industrial(src) - else - new /obj/item/storage/backpack/satchel_eng(src) - new /obj/item/storage/backpack/duffel/engineering(src) - new /obj/item/clothing/head/beret/ce(src) - new /obj/item/areaeditor/blueprints/ce(src) - new /obj/item/storage/box/permits(src) - new /obj/item/clothing/under/rank/chief_engineer(src) - new /obj/item/clothing/under/rank/chief_engineer/skirt(src) - new /obj/item/clothing/suit/mantle/chief_engineer(src) - new /obj/item/clothing/head/hardhat/white(src) - new /obj/item/clothing/glasses/welding/superior(src) - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/tank/jetpack/suit(src) - new /obj/item/cartridge/ce(src) - new /obj/item/radio/headset/heads/ce(src) - new /obj/item/storage/toolbox/mechanical(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/multitool(src) - new /obj/item/holosign_creator/engineering(src) - new /obj/item/flash(src) - new /obj/item/clothing/head/beret/eng(src) - new /obj/item/door_remote/chief_engineer(src) - new /obj/item/rpd(src) - new /obj/item/reagent_containers/food/drinks/mug/ce(src) - new /obj/item/organ/internal/cyberimp/eyes/meson(src) - new /obj/item/clothing/accessory/medal/engineering(src) - new /obj/item/holosign_creator/atmos(src) - - -/obj/structure/closet/secure_closet/engineering_electrical - name = "electrical supplies locker" + icon_state = "securece1" + icon_closed = "securece" + icon_locked = "securece1" + icon_opened = "secureceopen" + icon_broken = "securecebroken" + icon_off = "secureceoff" + +/obj/structure/closet/secure_closet/engineering_chief/New() + ..() + if(prob(50)) + new /obj/item/storage/backpack/industrial(src) + else + new /obj/item/storage/backpack/satchel_eng(src) + new /obj/item/storage/backpack/duffel/engineering(src) + new /obj/item/clothing/head/beret/ce(src) + new /obj/item/areaeditor/blueprints/ce(src) + new /obj/item/storage/box/permits(src) + new /obj/item/clothing/under/rank/chief_engineer(src) + new /obj/item/clothing/under/rank/chief_engineer/skirt(src) + new /obj/item/clothing/suit/mantle/chief_engineer(src) + new /obj/item/clothing/head/hardhat/white(src) + new /obj/item/clothing/glasses/welding/superior(src) + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/tank/jetpack/suit(src) + new /obj/item/cartridge/ce(src) + new /obj/item/radio/headset/heads/ce(src) + new /obj/item/storage/toolbox/mechanical(src) + new /obj/item/clothing/suit/storage/hazardvest(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/multitool(src) + new /obj/item/holosign_creator/engineering(src) + new /obj/item/flash(src) + new /obj/item/clothing/head/beret/eng(src) + new /obj/item/door_remote/chief_engineer(src) + new /obj/item/rpd(src) + new /obj/item/reagent_containers/food/drinks/mug/ce(src) + new /obj/item/organ/internal/cyberimp/eyes/meson(src) + new /obj/item/clothing/accessory/medal/engineering(src) + new /obj/item/holosign_creator/atmos(src) + + +/obj/structure/closet/secure_closet/engineering_electrical + name = "electrical supplies locker" req_access = list(ACCESS_ENGINE_EQUIP) - icon_state = "secureengelec1" - icon_closed = "secureengelec" - icon_locked = "secureengelec1" - icon_opened = "toolclosetopen" - icon_broken = "secureengelecbroken" - icon_off = "secureengelecoff" - -/obj/structure/closet/secure_closet/engineering_electrical/New() - ..() - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/storage/toolbox/electrical(src) - new /obj/item/storage/toolbox/electrical(src) - new /obj/item/storage/toolbox/electrical(src) - new /obj/item/apc_electronics(src) - new /obj/item/apc_electronics(src) - new /obj/item/apc_electronics(src) - new /obj/item/multitool(src) - new /obj/item/multitool(src) - new /obj/item/multitool(src) - new /obj/item/clothing/head/beret/eng - - -/obj/structure/closet/secure_closet/engineering_welding - name = "welding supplies locker" + icon_state = "secureengelec1" + icon_closed = "secureengelec" + icon_locked = "secureengelec1" + icon_opened = "toolclosetopen" + icon_broken = "secureengelecbroken" + icon_off = "secureengelecoff" + +/obj/structure/closet/secure_closet/engineering_electrical/New() + ..() + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/storage/toolbox/electrical(src) + new /obj/item/storage/toolbox/electrical(src) + new /obj/item/storage/toolbox/electrical(src) + new /obj/item/apc_electronics(src) + new /obj/item/apc_electronics(src) + new /obj/item/apc_electronics(src) + new /obj/item/multitool(src) + new /obj/item/multitool(src) + new /obj/item/multitool(src) + new /obj/item/clothing/head/beret/eng + + +/obj/structure/closet/secure_closet/engineering_welding + name = "welding supplies locker" req_access = list(ACCESS_ENGINE_EQUIP) - icon_state = "secureengweld1" - icon_closed = "secureengweld" - icon_locked = "secureengweld1" - icon_opened = "toolclosetopen" - icon_broken = "secureengweldbroken" - icon_off = "secureengweldoff" - -/obj/structure/closet/secure_closet/engineering_welding/New() - ..() - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/clothing/head/welding(src) - new /obj/item/weldingtool/largetank(src) - new /obj/item/weldingtool/largetank(src) - new /obj/item/weldingtool/largetank(src) - - -/obj/structure/closet/secure_closet/engineering_personal - name = "engineer's locker" + icon_state = "secureengweld1" + icon_closed = "secureengweld" + icon_locked = "secureengweld1" + icon_opened = "toolclosetopen" + icon_broken = "secureengweldbroken" + icon_off = "secureengweldoff" + +/obj/structure/closet/secure_closet/engineering_welding/New() + ..() + new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/head/welding(src) + new /obj/item/clothing/head/welding(src) + new /obj/item/weldingtool/largetank(src) + new /obj/item/weldingtool/largetank(src) + new /obj/item/weldingtool/largetank(src) + + +/obj/structure/closet/secure_closet/engineering_personal + name = "engineer's locker" req_access = list(ACCESS_ENGINE_EQUIP) - icon_state = "secureeng1" - icon_closed = "secureeng" - icon_locked = "secureeng1" - icon_opened = "secureengopen" - icon_broken = "secureengbroken" - icon_off = "secureengoff" - -/obj/structure/closet/secure_closet/engineering_personal/New() - ..() - if(prob(50)) - new /obj/item/storage/backpack/industrial(src) - else - new /obj/item/storage/backpack/satchel_eng(src) - new /obj/item/storage/backpack/duffel/engineering(src) - new /obj/item/storage/toolbox/mechanical(src) - new /obj/item/holosign_creator/engineering(src) - new /obj/item/radio/headset/headset_eng(src) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/under/rank/engineer/skirt(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/cartridge/engineering(src) - new /obj/item/clothing/head/beret/eng(src) - - -/obj/structure/closet/secure_closet/atmos_personal - name = "technician's locker" + icon_state = "secureeng1" + icon_closed = "secureeng" + icon_locked = "secureeng1" + icon_opened = "secureengopen" + icon_broken = "secureengbroken" + icon_off = "secureengoff" + +/obj/structure/closet/secure_closet/engineering_personal/New() + ..() + if(prob(50)) + new /obj/item/storage/backpack/industrial(src) + else + new /obj/item/storage/backpack/satchel_eng(src) + new /obj/item/storage/backpack/duffel/engineering(src) + new /obj/item/storage/toolbox/mechanical(src) + new /obj/item/holosign_creator/engineering(src) + new /obj/item/radio/headset/headset_eng(src) + new /obj/item/clothing/under/rank/engineer(src) + new /obj/item/clothing/under/rank/engineer/skirt(src) + new /obj/item/clothing/suit/storage/hazardvest(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/cartridge/engineering(src) + new /obj/item/clothing/head/beret/eng(src) + + +/obj/structure/closet/secure_closet/atmos_personal + name = "technician's locker" req_access = list(ACCESS_ATMOSPHERICS) - icon_state = "secureatm1" - icon_closed = "secureatm" - icon_locked = "secureatm1" - icon_opened = "secureatmopen" - icon_broken = "secureatmbroken" - icon_off = "secureatmoff" - -/obj/structure/closet/secure_closet/atmos_personal/New() - ..() - new /obj/item/radio/headset/headset_eng(src) - new /obj/item/cartridge/atmos(src) - new /obj/item/storage/toolbox/mechanical(src) - if(prob(50)) - new /obj/item/storage/backpack/industrial(src) - else - new /obj/item/storage/backpack/satchel_eng(src) - new /obj/item/storage/backpack/duffel/atmos(src) - new /obj/item/extinguisher(src) - new /obj/item/grenade/gas/oxygen(src) - new /obj/item/grenade/gas/oxygen(src) - new /obj/item/clothing/suit/storage/hazardvest(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/tank/emergency_oxygen/engi(src) - new /obj/item/holosign_creator/atmos(src) - new /obj/item/watertank/atmos(src) - new /obj/item/clothing/suit/fire/atmos(src) - new /obj/item/clothing/head/hardhat/atmos(src) - new /obj/item/rpd(src) - new /obj/item/destTagger(src) + icon_state = "secureatm1" + icon_closed = "secureatm" + icon_locked = "secureatm1" + icon_opened = "secureatmopen" + icon_broken = "secureatmbroken" + icon_off = "secureatmoff" + +/obj/structure/closet/secure_closet/atmos_personal/New() + ..() + new /obj/item/radio/headset/headset_eng(src) + new /obj/item/cartridge/atmos(src) + new /obj/item/storage/toolbox/mechanical(src) + if(prob(50)) + new /obj/item/storage/backpack/industrial(src) + else + new /obj/item/storage/backpack/satchel_eng(src) + new /obj/item/storage/backpack/duffel/atmos(src) + new /obj/item/extinguisher(src) + new /obj/item/grenade/gas/oxygen(src) + new /obj/item/grenade/gas/oxygen(src) + new /obj/item/clothing/suit/storage/hazardvest(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/tank/emergency_oxygen/engi(src) + new /obj/item/holosign_creator/atmos(src) + new /obj/item/watertank/atmos(src) + new /obj/item/clothing/suit/fire/atmos(src) + new /obj/item/clothing/head/hardhat/atmos(src) + new /obj/item/rpd(src) + new /obj/item/destTagger(src) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 7fa60101db3..574d0b91afb 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -1,86 +1,86 @@ -/* Photography! - * Contains: - * Camera - * Camera Film - * Photos - * Photo Albums - */ - -/******* -* film * -*******/ -/obj/item/camera_film - name = "film cartridge" - icon = 'icons/obj/items.dmi' - desc = "A camera film cartridge. Insert it into a camera to reload it." - icon_state = "film" - item_state = "electropack" - w_class = WEIGHT_CLASS_TINY - resistance_flags = FLAMMABLE - - -/******** -* photo * -********/ -/obj/item/photo - name = "photo" - icon = 'icons/obj/items.dmi' - icon_state = "photo" - item_state = "paper" - w_class = WEIGHT_CLASS_SMALL - resistance_flags = FLAMMABLE - max_integrity = 50 - var/blueprints = 0 // Does this have the blueprints? - var/icon/img //Big photo image - var/scribble //Scribble on the back. - var/icon/tiny - var/photo_size = 3 - -/obj/item/photo/attack_self(mob/user as mob) - user.examinate(src) - -/obj/item/photo/attackby(obj/item/P as obj, mob/user as mob, params) - if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) - var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text) - txt = copytext(txt, 1, 128) - if(loc == user && user.stat == 0) - scribble = txt - else if(istype(P, /obj/item/lighter)) - burnphoto(P, user) - ..() - -/obj/item/photo/proc/burnphoto(obj/item/lighter/P, mob/user) - var/class = "" - - if(P.lit && !user.restrained()) - if(istype(P, /obj/item/lighter/zippo)) - class = "" - - user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like [user.p_theyre()] trying to burn it!", \ - "[class]You hold [P] up to [src], burning it slowly.") - - spawn(20) - if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit) - user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ - "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - - if(user.is_in_inactive_hand(src)) - user.unEquip(src) - - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) - - else - to_chat(user, "You must hold \the [P] steady to burn \the [src].") - -/obj/item/photo/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - show(user) - else - . += "It is too far away." - -/obj/item/photo/proc/show(mob/user as mob) +/* Photography! + * Contains: + * Camera + * Camera Film + * Photos + * Photo Albums + */ + +/******* +* film * +*******/ +/obj/item/camera_film + name = "film cartridge" + icon = 'icons/obj/items.dmi' + desc = "A camera film cartridge. Insert it into a camera to reload it." + icon_state = "film" + item_state = "electropack" + w_class = WEIGHT_CLASS_TINY + resistance_flags = FLAMMABLE + + +/******** +* photo * +********/ +/obj/item/photo + name = "photo" + icon = 'icons/obj/items.dmi' + icon_state = "photo" + item_state = "paper" + w_class = WEIGHT_CLASS_SMALL + resistance_flags = FLAMMABLE + max_integrity = 50 + var/blueprints = 0 // Does this have the blueprints? + var/icon/img //Big photo image + var/scribble //Scribble on the back. + var/icon/tiny + var/photo_size = 3 + +/obj/item/photo/attack_self(mob/user as mob) + user.examinate(src) + +/obj/item/photo/attackby(obj/item/P as obj, mob/user as mob, params) + if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) + var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text) + txt = copytext(txt, 1, 128) + if(loc == user && user.stat == 0) + scribble = txt + else if(istype(P, /obj/item/lighter)) + burnphoto(P, user) + ..() + +/obj/item/photo/proc/burnphoto(obj/item/lighter/P, mob/user) + var/class = "" + + if(P.lit && !user.restrained()) + if(istype(P, /obj/item/lighter/zippo)) + class = "" + + user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like [user.p_theyre()] trying to burn it!", \ + "[class]You hold [P] up to [src], burning it slowly.") + + spawn(20) + if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit) + user.visible_message("[class][user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "[class]You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + + if(user.is_in_inactive_hand(src)) + user.unEquip(src) + + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) + + else + to_chat(user, "You must hold \the [P] steady to burn \the [src].") + +/obj/item/photo/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + show(user) + else + . += "It is too far away." + +/obj/item/photo/proc/show(mob/user as mob) var/icon/img_shown = new/icon(img) var/colormatrix = user.get_screen_colour() // Apply colorblindness effects, if any. @@ -91,490 +91,490 @@ colormatrix[7], colormatrix[8], colormatrix[9], ) usr << browse_rsc(img_shown, "tmp_photo.png") - usr << browse("[name]" \ - + "" \ - + "" \ - + "[scribble ? "
Written on the back:
[scribble]" : ""]"\ + usr << browse("[name]" \ + + "" \ + + "" \ + + "[scribble ? "
Written on the back:
[scribble]" : ""]"\ + "", "window=Photo[UID()];size=[64*photo_size]x[scribble ? 400 : 64*photo_size]") onclose(usr, "Photo[UID()]") - return - -/obj/item/photo/verb/rename() - set name = "Rename photo" - set category = "Object" - set src in usr - - var/n_name = sanitize(copytext(input(usr, "What would you like to label the photo?", "Photo Labelling", name) as text, 1, MAX_MESSAGE_LEN)) - //loc.loc check is for making possible renaming photos in clipboards - if(( (loc == usr || (loc.loc && loc.loc == usr)) && usr.stat == 0)) - name = "[(n_name ? text("[n_name]") : "photo")]" - add_fingerprint(usr) - return - - -/************** -* photo album * -**************/ -/obj/item/storage/photo_album - name = "Photo album" - icon = 'icons/obj/items.dmi' - icon_state = "album" - item_state = "briefcase" - can_hold = list(/obj/item/photo) - resistance_flags = FLAMMABLE - -/obj/item/storage/photo_album/MouseDrop(obj/over_object as obj) - - if((istype(usr, /mob/living/carbon/human))) - var/mob/M = usr - if(!( istype(over_object, /obj/screen) )) - return ..() - playsound(loc, "rustle", 50, 1, -5) - if((!( M.restrained() ) && !( M.stat ) && M.back == src)) - switch(over_object.name) - if("r_hand") - M.unEquip(src) - M.put_in_r_hand(src) - if("l_hand") - M.unEquip(src) - M.put_in_l_hand(src) - add_fingerprint(usr) - return - if(over_object == usr && in_range(src, usr) || usr.contents.Find(src)) - if(usr.s_active) - usr.s_active.close(usr) - show_to(usr) - return - return - -/********* -* camera * -*********/ -/obj/item/camera - name = "camera" - icon = 'icons/obj/items.dmi' - desc = "A polaroid camera. 10 photos left." - icon_state = "camera" - item_state = "electropack" - w_class = WEIGHT_CLASS_SMALL - slot_flags = SLOT_BELT - var/list/matter = list("metal" = 2000) - var/pictures_max = 10 - var/pictures_left = 10 - var/on = 1 - var/blueprints = 0 - var/icon_on = "camera" - var/icon_off = "camera_off" - var/size = 3 - var/see_ghosts = 0 //for the spoop of it - - -/obj/item/camera/spooky/CheckParts(list/parts_list) - ..() - var/obj/item/camera/C = locate(/obj/item/camera) in contents - if(C) - pictures_max = C.pictures_max - pictures_left = C.pictures_left - visible_message("[C] has been imbued with godlike power!") - qdel(C) - - -var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","shadow","ghostian2") - -/obj/item/camera/spooky - name = "camera obscura" - desc = "A polaroid camera, some say it can see ghosts!" - see_ghosts = 1 - -/obj/item/camera/verb/change_size() - set name = "Set Photo Focus" - set category = "Object" - var/nsize = input("Photo Size","Pick a size of resulting photo.") as null|anything in list(1,3,5,7) - if(nsize) - size = nsize - to_chat(usr, "Camera will now take [size]x[size] photos.") - -/obj/item/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob) - return - -/obj/item/camera/attack_self(mob/user as mob) - on = !on - if(on) - src.icon_state = icon_on - else - src.icon_state = icon_off - to_chat(user, "You switch the camera [on ? "on" : "off"].") - return - -/obj/item/camera/attackby(obj/item/I as obj, mob/user as mob, params) - if(istype(I, /obj/item/camera_film)) - if(pictures_left) - to_chat(user, "[src] still has some film in it!") - return - to_chat(user, "You insert [I] into [src].") - user.drop_item() - qdel(I) - pictures_left = pictures_max - return - ..() - - -/obj/item/camera/proc/get_icon(list/turfs, turf/center, mob/user) - - //Bigger icon base to capture those icons that were shifted to the next tile - //i.e. pretty much all wall-mounted machinery - var/icon/res = icon('icons/effects/96x96.dmi', "") - res.Scale(size*32, size*32) - // Initialize the photograph to black. - res.Blend("#000", ICON_OVERLAY) - - var/atoms[] = list() - for(var/turf/the_turf in turfs) - // Add ourselves to the list of stuff to draw - atoms.Add(the_turf); - // As well as anything that isn't invisible. - for(var/atom/A in the_turf) - if(A.invisibility) - if(see_ghosts && istype(A,/mob/dead/observer)) - var/mob/dead/observer/O = A - if(O.following) - continue - if(user.mind && !(user.mind.assigned_role == "Chaplain")) - atoms.Add(image('icons/mob/mob.dmi', O.loc, pick(SpookyGhosts), 4, SOUTH)) - else - atoms.Add(image('icons/mob/mob.dmi', O.loc, "ghost", 4, SOUTH)) - else//its not a ghost - continue - else//not invisable, not a spookyghost add it. - var/disguised = null - if(user.viewing_alternate_appearances && user.viewing_alternate_appearances.len && ishuman(A) && A.alternate_appearances && A.alternate_appearances.len) //This whole thing and the stuff below just checks if the atom is a Solid Snake cosplayer. - for(var/datum/alternate_appearance/alt_appearance in user.viewing_alternate_appearances) - if(alt_appearance.owner == A) //If it turns out they are, don't blow their cover. That'd be rude. - atoms.Add(image(alt_appearance.img, A.loc, layer = 4, dir = A.dir)) //Render their disguise. - atoms.Remove(A) //Don't blow their cover. - disguised = 1 - continue - if(!disguised) //If they aren't, treat them normally. - atoms.Add(A) - - - // Sort the atoms into their layers - var/list/sorted = sort_atoms_by_layer(atoms) - var/center_offset = (size-1)/2 * 32 + 1 - for(var/i; i <= sorted.len; i++) - var/atom/A = sorted[i] - if(A) - var/icon/img = getFlatIcon(A)//build_composite_icon(A) - if(istype(A, /obj/item/areaeditor/blueprints/ce)) - blueprints = 1 - - // If what we got back is actually a picture, draw it. - if(istype(img, /icon)) - // Check if we're looking at a mob that's lying down - if(istype(A, /mob/living) && A:lying) - // If they are, apply that effect to their picture. - img.BecomeLying() - // Calculate where we are relative to the center of the photo - var/xoff = (A.x - center.x) * 32 + center_offset - var/yoff = (A.y - center.y) * 32 + center_offset - if(istype(A,/atom/movable)) - xoff+=A:step_x - yoff+=A:step_y - res.Blend(img, blendMode2iconMode(A.blend_mode), A.pixel_x + xoff, A.pixel_y + yoff) - - // Lastly, render any contained effects on top. - for(var/turf/the_turf in turfs) - // Calculate where we are relative to the center of the photo - var/xoff = (the_turf.x - center.x) * 32 + center_offset - var/yoff = (the_turf.y - center.y) * 32 + center_offset - res.Blend(getFlatIcon(the_turf.loc), blendMode2iconMode(the_turf.blend_mode),xoff,yoff) - return res - - -/obj/item/camera/proc/get_mobs(turf/the_turf as turf) - var/mob_detail - for(var/mob/M in the_turf) - if(M.invisibility) - if(see_ghosts && istype(M,/mob/dead/observer)) - var/mob/dead/observer/O = M - if(O.following) - continue - if(!mob_detail) - mob_detail = "You can see a g-g-g-g-ghooooost! " - else - mob_detail += "You can also see a g-g-g-g-ghooooost!" - else - continue - - var/holding = null - - if(istype(M, /mob/living/carbon)) - var/mob/living/carbon/A = M - if(A.l_hand || A.r_hand) - if(A.l_hand) holding = "They are holding \a [A.l_hand]" - if(A.r_hand) - if(holding) - holding += " and \a [A.r_hand]" - else - holding = "They are holding \a [A.r_hand]" - - if(!mob_detail) - mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " - else - mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." - return mob_detail - -/obj/item/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) - if(!on || !pictures_left || ismob(target.loc)) return - captureimage(target, user, flag) - - playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) - - pictures_left-- - desc = "A polaroid camera. It has [pictures_left] photos left." - to_chat(user, "[pictures_left] photos left.") - icon_state = icon_off - on = 0 - if(istype(src,/obj/item/camera/spooky)) - if(user.mind && user.mind.assigned_role == "Chaplain" && see_ghosts) - if(prob(24)) - handle_haunt(user) - spawn(64) - icon_state = icon_on - on = 1 - -/obj/item/camera/proc/can_capture_turf(turf/T, mob/user) - var/viewer = user - if(user.client) //To make shooting through security cameras possible - viewer = user.client.eye - var/can_see = (T in view(viewer)) //No x-ray vision cameras. - return can_see - -/obj/item/camera/proc/captureimage(atom/target, mob/user, flag) - var/x_c = target.x - (size-1)/2 - var/y_c = target.y + (size-1)/2 - var/z_c = target.z - var/list/turfs = list() - var/mobs = "" - for(var/i = 1; i <= size; i++) - for(var/j = 1; j <= size; j++) - var/turf/T = locate(x_c, y_c, z_c) - if(can_capture_turf(T, user)) - turfs.Add(T) - mobs += get_mobs(T) - x_c++ - y_c-- - x_c = x_c - size - - var/datum/picture/P = createpicture(target, user, turfs, mobs, flag, blueprints) - printpicture(user, P) - -/obj/item/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag) - var/icon/photoimage = get_icon(turfs, target, user) - - var/icon/small_img = icon(photoimage) - var/icon/tiny_img = icon(photoimage) - var/icon/ic = icon('icons/obj/items.dmi',"photo") - var/icon/pc = icon('icons/obj/bureaucracy.dmi', "photo") - small_img.Scale(8, 8) - tiny_img.Scale(4, 4) - ic.Blend(small_img,ICON_OVERLAY, 10, 13) - pc.Blend(tiny_img,ICON_OVERLAY, 12, 19) - - var/datum/picture/P = new() - if(istype(src,/obj/item/camera/digital)) - P.fields["name"] = input(user,"Name photo:","photo") - P.name = P.fields["name"]//So the name is displayed on the print/delete list. - else - P.fields["name"] = "photo" - P.fields["author"] = user - P.fields["icon"] = ic - P.fields["tiny"] = pc - P.fields["img"] = photoimage - P.fields["desc"] = mobs - P.fields["pixel_x"] = rand(-10, 10) - P.fields["pixel_y"] = rand(-10, 10) - P.fields["size"] = size - - return P - -/obj/item/camera/proc/printpicture(mob/user, var/datum/picture/P) - var/obj/item/photo/Photo = new/obj/item/photo() - Photo.loc = user.loc - if(!user.get_inactive_hand()) - user.put_in_inactive_hand(Photo) - - if(blueprints) - Photo.blueprints = 1 - blueprints = 0 - Photo.construct(P) - -/obj/item/photo/proc/construct(var/datum/picture/P) - name = P.fields["name"] - icon = P.fields["icon"] - tiny = P.fields["tiny"] - img = P.fields["img"] - desc = P.fields["desc"] - pixel_x = P.fields["pixel_x"] - pixel_y = P.fields["pixel_y"] - photo_size = P.fields["size"] - -/obj/item/photo/proc/copy() - var/obj/item/photo/p = new/obj/item/photo() - - p.icon = icon(icon, icon_state) - p.img = icon(img) - p.tiny = icon(tiny) - p.name = name - p.desc = desc - p.scribble = scribble - p.blueprints = blueprints - - return p - -/***************** -* digital camera * -******************/ -/obj/item/camera/digital - name = "digital camera" - desc = "A digital camera. A small screen shows there is space for 10 photos left." - var/list/datum/picture/saved_pictures = list() - pictures_left = 30 - var/max_storage = 10 - -/obj/item/camera/digital/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) - if(!on || !pictures_left || ismob(target.loc)) return - captureimage(target, user, flag) - - playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) - - desc = "A digital camera. A small screen shows that there are currently [saved_pictures.len] pictures stored." - icon_state = icon_off - on = 0 - spawn(64) - icon_state = icon_on - on = 1 - -/obj/item/camera/digital/captureimage(atom/target, mob/user, flag) - if(saved_pictures.len >= max_storage) - to_chat(user, "Maximum photo storage capacity reached.") - return - to_chat(user, "Picture saved.") - var/x_c = target.x - (size-1)/2 - var/y_c = target.y + (size-1)/2 - var/z_c = target.z - var/list/turfs = list() - var/mobs = "" - for(var/i = 1; i <= size; i++) - for(var/j = 1; j <= size; j++) - var/turf/T = locate(x_c, y_c, z_c) - if(can_capture_turf(T, user)) - turfs.Add(T) - mobs += get_mobs(T) - x_c++ - y_c-- - x_c = x_c - size - - var/datum/picture/P = createpicture(target, user, turfs, mobs, flag) - saved_pictures += P - -/obj/item/camera/digital/verb/print_picture() - set name = "Print picture" - set category = "Object" - set src in usr - - if(saved_pictures.len == 0) - to_chat(usr, "No images saved.") - return - if(pictures_left == 0) - to_chat(usr, "There is no film left to print.") - return - - var/datum/picture/P = null - P = input("Select image to print:",P) as null|anything in saved_pictures - if(P) - printpicture(usr,P) - pictures_left -- - -/obj/item/camera/digital/verb/delete_picture() - set name = "Delete picture" - set category = "Object" - set src in usr - - if(saved_pictures.len == 0) - to_chat(usr, "No images saved") - return - var/datum/picture/P = null - P = input("Select image to delete:",P) as null|anything in saved_pictures - if(P) - saved_pictures -= P - -/************** -*video camera * -***************/ - -/obj/item/videocam - name = "video camera" - icon = 'icons/obj/items.dmi' - desc = "video camera that can send live feed to the entertainment network." - icon_state = "videocam" - item_state = "videocam" - w_class = WEIGHT_CLASS_SMALL - slot_flags = SLOT_BELT - materials = list(MAT_METAL=2000) - var/on = 0 - var/obj/machinery/camera/camera - var/icon_on = "videocam_on" - var/icon_off = "videocam" - var/canhear_range = 7 - -/obj/item/videocam/attack_self(mob/user) - on = !on - if(camera) - if(on==0) - src.icon_state = icon_off - camera.c_tag = null - camera.network = list() - else - src.icon_state = icon_on - camera.network = list("news") - camera.c_tag = user.name - else - - src.icon_state = icon_on - camera = new /obj/machinery/camera(src) - camera.network = list("news") - cameranet.removeCamera(camera) - camera.c_tag = user.name - to_chat(user, "You switch the camera [on ? "on" : "off"].") - -/obj/item/videocam/examine(mob/user) - . = ..() - if(in_range(user, src)) - . += "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active." - -/obj/item/videocam/hear_talk(mob/M as mob, list/message_pieces) - var/msg = multilingual_to_message(message_pieces) - if(camera && on) - if(get_dist(src, M) <= canhear_range) - talk_into(M, msg) - for(var/obj/machinery/computer/security/telescreen/T in GLOB.machines) - if(T.watchers[M] == camera) - T.audible_message("(Newscaster) [M] says, '[msg]'", hearing_distance = 2) - -/obj/item/videocam/hear_message(mob/M as mob, msg) - if(camera && on) - for(var/obj/machinery/computer/security/telescreen/T in GLOB.machines) - if(T.watchers[M] == camera) - T.audible_message("(Newscaster) [M] [msg]", hearing_distance = 2) - - -///hauntings, like hallucinations but more spooky - -/obj/item/camera/proc/handle_haunt(mob/user as mob) - var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/screech.ogg',\ - 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ - 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ - 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ - 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - user << pick(creepyasssounds) + return + +/obj/item/photo/verb/rename() + set name = "Rename photo" + set category = "Object" + set src in usr + + var/n_name = sanitize(copytext(input(usr, "What would you like to label the photo?", "Photo Labelling", name) as text, 1, MAX_MESSAGE_LEN)) + //loc.loc check is for making possible renaming photos in clipboards + if(( (loc == usr || (loc.loc && loc.loc == usr)) && usr.stat == 0)) + name = "[(n_name ? text("[n_name]") : "photo")]" + add_fingerprint(usr) + return + + +/************** +* photo album * +**************/ +/obj/item/storage/photo_album + name = "Photo album" + icon = 'icons/obj/items.dmi' + icon_state = "album" + item_state = "briefcase" + can_hold = list(/obj/item/photo) + resistance_flags = FLAMMABLE + +/obj/item/storage/photo_album/MouseDrop(obj/over_object as obj) + + if((istype(usr, /mob/living/carbon/human))) + var/mob/M = usr + if(!( istype(over_object, /obj/screen) )) + return ..() + playsound(loc, "rustle", 50, 1, -5) + if((!( M.restrained() ) && !( M.stat ) && M.back == src)) + switch(over_object.name) + if("r_hand") + M.unEquip(src) + M.put_in_r_hand(src) + if("l_hand") + M.unEquip(src) + M.put_in_l_hand(src) + add_fingerprint(usr) + return + if(over_object == usr && in_range(src, usr) || usr.contents.Find(src)) + if(usr.s_active) + usr.s_active.close(usr) + show_to(usr) + return + return + +/********* +* camera * +*********/ +/obj/item/camera + name = "camera" + icon = 'icons/obj/items.dmi' + desc = "A polaroid camera. 10 photos left." + icon_state = "camera" + item_state = "electropack" + w_class = WEIGHT_CLASS_SMALL + slot_flags = SLOT_BELT + var/list/matter = list("metal" = 2000) + var/pictures_max = 10 + var/pictures_left = 10 + var/on = 1 + var/blueprints = 0 + var/icon_on = "camera" + var/icon_off = "camera_off" + var/size = 3 + var/see_ghosts = 0 //for the spoop of it + + +/obj/item/camera/spooky/CheckParts(list/parts_list) + ..() + var/obj/item/camera/C = locate(/obj/item/camera) in contents + if(C) + pictures_max = C.pictures_max + pictures_left = C.pictures_left + visible_message("[C] has been imbued with godlike power!") + qdel(C) + + +var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","shadow","ghostian2") + +/obj/item/camera/spooky + name = "camera obscura" + desc = "A polaroid camera, some say it can see ghosts!" + see_ghosts = 1 + +/obj/item/camera/verb/change_size() + set name = "Set Photo Focus" + set category = "Object" + var/nsize = input("Photo Size","Pick a size of resulting photo.") as null|anything in list(1,3,5,7) + if(nsize) + size = nsize + to_chat(usr, "Camera will now take [size]x[size] photos.") + +/obj/item/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob) + return + +/obj/item/camera/attack_self(mob/user as mob) + on = !on + if(on) + src.icon_state = icon_on + else + src.icon_state = icon_off + to_chat(user, "You switch the camera [on ? "on" : "off"].") + return + +/obj/item/camera/attackby(obj/item/I as obj, mob/user as mob, params) + if(istype(I, /obj/item/camera_film)) + if(pictures_left) + to_chat(user, "[src] still has some film in it!") + return + to_chat(user, "You insert [I] into [src].") + user.drop_item() + qdel(I) + pictures_left = pictures_max + return + ..() + + +/obj/item/camera/proc/get_icon(list/turfs, turf/center, mob/user) + + //Bigger icon base to capture those icons that were shifted to the next tile + //i.e. pretty much all wall-mounted machinery + var/icon/res = icon('icons/effects/96x96.dmi', "") + res.Scale(size*32, size*32) + // Initialize the photograph to black. + res.Blend("#000", ICON_OVERLAY) + + var/atoms[] = list() + for(var/turf/the_turf in turfs) + // Add ourselves to the list of stuff to draw + atoms.Add(the_turf); + // As well as anything that isn't invisible. + for(var/atom/A in the_turf) + if(A.invisibility) + if(see_ghosts && istype(A,/mob/dead/observer)) + var/mob/dead/observer/O = A + if(O.following) + continue + if(user.mind && !(user.mind.assigned_role == "Chaplain")) + atoms.Add(image('icons/mob/mob.dmi', O.loc, pick(SpookyGhosts), 4, SOUTH)) + else + atoms.Add(image('icons/mob/mob.dmi', O.loc, "ghost", 4, SOUTH)) + else//its not a ghost + continue + else//not invisable, not a spookyghost add it. + var/disguised = null + if(user.viewing_alternate_appearances && user.viewing_alternate_appearances.len && ishuman(A) && A.alternate_appearances && A.alternate_appearances.len) //This whole thing and the stuff below just checks if the atom is a Solid Snake cosplayer. + for(var/datum/alternate_appearance/alt_appearance in user.viewing_alternate_appearances) + if(alt_appearance.owner == A) //If it turns out they are, don't blow their cover. That'd be rude. + atoms.Add(image(alt_appearance.img, A.loc, layer = 4, dir = A.dir)) //Render their disguise. + atoms.Remove(A) //Don't blow their cover. + disguised = 1 + continue + if(!disguised) //If they aren't, treat them normally. + atoms.Add(A) + + + // Sort the atoms into their layers + var/list/sorted = sort_atoms_by_layer(atoms) + var/center_offset = (size-1)/2 * 32 + 1 + for(var/i; i <= sorted.len; i++) + var/atom/A = sorted[i] + if(A) + var/icon/img = getFlatIcon(A)//build_composite_icon(A) + if(istype(A, /obj/item/areaeditor/blueprints/ce)) + blueprints = 1 + + // If what we got back is actually a picture, draw it. + if(istype(img, /icon)) + // Check if we're looking at a mob that's lying down + if(istype(A, /mob/living) && A:lying) + // If they are, apply that effect to their picture. + img.BecomeLying() + // Calculate where we are relative to the center of the photo + var/xoff = (A.x - center.x) * 32 + center_offset + var/yoff = (A.y - center.y) * 32 + center_offset + if(istype(A,/atom/movable)) + xoff+=A:step_x + yoff+=A:step_y + res.Blend(img, blendMode2iconMode(A.blend_mode), A.pixel_x + xoff, A.pixel_y + yoff) + + // Lastly, render any contained effects on top. + for(var/turf/the_turf in turfs) + // Calculate where we are relative to the center of the photo + var/xoff = (the_turf.x - center.x) * 32 + center_offset + var/yoff = (the_turf.y - center.y) * 32 + center_offset + res.Blend(getFlatIcon(the_turf.loc), blendMode2iconMode(the_turf.blend_mode),xoff,yoff) + return res + + +/obj/item/camera/proc/get_mobs(turf/the_turf as turf) + var/mob_detail + for(var/mob/M in the_turf) + if(M.invisibility) + if(see_ghosts && istype(M,/mob/dead/observer)) + var/mob/dead/observer/O = M + if(O.following) + continue + if(!mob_detail) + mob_detail = "You can see a g-g-g-g-ghooooost! " + else + mob_detail += "You can also see a g-g-g-g-ghooooost!" + else + continue + + var/holding = null + + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/A = M + if(A.l_hand || A.r_hand) + if(A.l_hand) holding = "They are holding \a [A.l_hand]" + if(A.r_hand) + if(holding) + holding += " and \a [A.r_hand]" + else + holding = "They are holding \a [A.r_hand]" + + if(!mob_detail) + mob_detail = "You can see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + else + mob_detail += "You can also see [A] on the photo[A:health < 75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + return mob_detail + +/obj/item/camera/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) + if(!on || !pictures_left || ismob(target.loc)) return + captureimage(target, user, flag) + + playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) + + pictures_left-- + desc = "A polaroid camera. It has [pictures_left] photos left." + to_chat(user, "[pictures_left] photos left.") + icon_state = icon_off + on = 0 + if(istype(src,/obj/item/camera/spooky)) + if(user.mind && user.mind.assigned_role == "Chaplain" && see_ghosts) + if(prob(24)) + handle_haunt(user) + spawn(64) + icon_state = icon_on + on = 1 + +/obj/item/camera/proc/can_capture_turf(turf/T, mob/user) + var/viewer = user + if(user.client) //To make shooting through security cameras possible + viewer = user.client.eye + var/can_see = (T in view(viewer)) //No x-ray vision cameras. + return can_see + +/obj/item/camera/proc/captureimage(atom/target, mob/user, flag) + var/x_c = target.x - (size-1)/2 + var/y_c = target.y + (size-1)/2 + var/z_c = target.z + var/list/turfs = list() + var/mobs = "" + for(var/i = 1; i <= size; i++) + for(var/j = 1; j <= size; j++) + var/turf/T = locate(x_c, y_c, z_c) + if(can_capture_turf(T, user)) + turfs.Add(T) + mobs += get_mobs(T) + x_c++ + y_c-- + x_c = x_c - size + + var/datum/picture/P = createpicture(target, user, turfs, mobs, flag, blueprints) + printpicture(user, P) + +/obj/item/camera/proc/createpicture(atom/target, mob/user, list/turfs, mobs, flag) + var/icon/photoimage = get_icon(turfs, target, user) + + var/icon/small_img = icon(photoimage) + var/icon/tiny_img = icon(photoimage) + var/icon/ic = icon('icons/obj/items.dmi',"photo") + var/icon/pc = icon('icons/obj/bureaucracy.dmi', "photo") + small_img.Scale(8, 8) + tiny_img.Scale(4, 4) + ic.Blend(small_img,ICON_OVERLAY, 10, 13) + pc.Blend(tiny_img,ICON_OVERLAY, 12, 19) + + var/datum/picture/P = new() + if(istype(src,/obj/item/camera/digital)) + P.fields["name"] = input(user,"Name photo:","photo") + P.name = P.fields["name"]//So the name is displayed on the print/delete list. + else + P.fields["name"] = "photo" + P.fields["author"] = user + P.fields["icon"] = ic + P.fields["tiny"] = pc + P.fields["img"] = photoimage + P.fields["desc"] = mobs + P.fields["pixel_x"] = rand(-10, 10) + P.fields["pixel_y"] = rand(-10, 10) + P.fields["size"] = size + + return P + +/obj/item/camera/proc/printpicture(mob/user, var/datum/picture/P) + var/obj/item/photo/Photo = new/obj/item/photo() + Photo.loc = user.loc + if(!user.get_inactive_hand()) + user.put_in_inactive_hand(Photo) + + if(blueprints) + Photo.blueprints = 1 + blueprints = 0 + Photo.construct(P) + +/obj/item/photo/proc/construct(var/datum/picture/P) + name = P.fields["name"] + icon = P.fields["icon"] + tiny = P.fields["tiny"] + img = P.fields["img"] + desc = P.fields["desc"] + pixel_x = P.fields["pixel_x"] + pixel_y = P.fields["pixel_y"] + photo_size = P.fields["size"] + +/obj/item/photo/proc/copy() + var/obj/item/photo/p = new/obj/item/photo() + + p.icon = icon(icon, icon_state) + p.img = icon(img) + p.tiny = icon(tiny) + p.name = name + p.desc = desc + p.scribble = scribble + p.blueprints = blueprints + + return p + +/***************** +* digital camera * +******************/ +/obj/item/camera/digital + name = "digital camera" + desc = "A digital camera. A small screen shows there is space for 10 photos left." + var/list/datum/picture/saved_pictures = list() + pictures_left = 30 + var/max_storage = 10 + +/obj/item/camera/digital/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag) + if(!on || !pictures_left || ismob(target.loc)) return + captureimage(target, user, flag) + + playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) + + desc = "A digital camera. A small screen shows that there are currently [saved_pictures.len] pictures stored." + icon_state = icon_off + on = 0 + spawn(64) + icon_state = icon_on + on = 1 + +/obj/item/camera/digital/captureimage(atom/target, mob/user, flag) + if(saved_pictures.len >= max_storage) + to_chat(user, "Maximum photo storage capacity reached.") + return + to_chat(user, "Picture saved.") + var/x_c = target.x - (size-1)/2 + var/y_c = target.y + (size-1)/2 + var/z_c = target.z + var/list/turfs = list() + var/mobs = "" + for(var/i = 1; i <= size; i++) + for(var/j = 1; j <= size; j++) + var/turf/T = locate(x_c, y_c, z_c) + if(can_capture_turf(T, user)) + turfs.Add(T) + mobs += get_mobs(T) + x_c++ + y_c-- + x_c = x_c - size + + var/datum/picture/P = createpicture(target, user, turfs, mobs, flag) + saved_pictures += P + +/obj/item/camera/digital/verb/print_picture() + set name = "Print picture" + set category = "Object" + set src in usr + + if(saved_pictures.len == 0) + to_chat(usr, "No images saved.") + return + if(pictures_left == 0) + to_chat(usr, "There is no film left to print.") + return + + var/datum/picture/P = null + P = input("Select image to print:",P) as null|anything in saved_pictures + if(P) + printpicture(usr,P) + pictures_left -- + +/obj/item/camera/digital/verb/delete_picture() + set name = "Delete picture" + set category = "Object" + set src in usr + + if(saved_pictures.len == 0) + to_chat(usr, "No images saved") + return + var/datum/picture/P = null + P = input("Select image to delete:",P) as null|anything in saved_pictures + if(P) + saved_pictures -= P + +/************** +*video camera * +***************/ + +/obj/item/videocam + name = "video camera" + icon = 'icons/obj/items.dmi' + desc = "video camera that can send live feed to the entertainment network." + icon_state = "videocam" + item_state = "videocam" + w_class = WEIGHT_CLASS_SMALL + slot_flags = SLOT_BELT + materials = list(MAT_METAL=2000) + var/on = 0 + var/obj/machinery/camera/camera + var/icon_on = "videocam_on" + var/icon_off = "videocam" + var/canhear_range = 7 + +/obj/item/videocam/attack_self(mob/user) + on = !on + if(camera) + if(on==0) + src.icon_state = icon_off + camera.c_tag = null + camera.network = list() + else + src.icon_state = icon_on + camera.network = list("news") + camera.c_tag = user.name + else + + src.icon_state = icon_on + camera = new /obj/machinery/camera(src) + camera.network = list("news") + cameranet.removeCamera(camera) + camera.c_tag = user.name + to_chat(user, "You switch the camera [on ? "on" : "off"].") + +/obj/item/videocam/examine(mob/user) + . = ..() + if(in_range(user, src)) + . += "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active." + +/obj/item/videocam/hear_talk(mob/M as mob, list/message_pieces) + var/msg = multilingual_to_message(message_pieces) + if(camera && on) + if(get_dist(src, M) <= canhear_range) + talk_into(M, msg) + for(var/obj/machinery/computer/security/telescreen/T in GLOB.machines) + if(T.watchers[M] == camera) + T.audible_message("(Newscaster) [M] says, '[msg]'", hearing_distance = 2) + +/obj/item/videocam/hear_message(mob/M as mob, msg) + if(camera && on) + for(var/obj/machinery/computer/security/telescreen/T in GLOB.machines) + if(T.watchers[M] == camera) + T.audible_message("(Newscaster) [M] [msg]", hearing_distance = 2) + + +///hauntings, like hallucinations but more spooky + +/obj/item/camera/proc/handle_haunt(mob/user as mob) + var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + user << pick(creepyasssounds)