mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 18:02:57 +00:00
@@ -23646,7 +23646,10 @@
|
|||||||
/area/crew_quarters/bar/atrium)
|
/area/crew_quarters/bar/atrium)
|
||||||
"aTH" = (
|
"aTH" = (
|
||||||
/obj/structure/table/wood,
|
/obj/structure/table/wood,
|
||||||
/obj/item/reagent_containers/food/drinks/coffee,
|
/obj/item/reagent_containers/food/drinks/coffee{
|
||||||
|
pixel_x = -4;
|
||||||
|
pixel_y = 2
|
||||||
|
},
|
||||||
/obj/effect/turf_decal/tile/red{
|
/obj/effect/turf_decal/tile/red{
|
||||||
dir = 1
|
dir = 1
|
||||||
},
|
},
|
||||||
@@ -60673,10 +60676,6 @@
|
|||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||||
dir = 4
|
dir = 4
|
||||||
},
|
},
|
||||||
/obj/machinery/airalarm{
|
|
||||||
dir = 1;
|
|
||||||
pixel_y = -22
|
|
||||||
},
|
|
||||||
/obj/machinery/door/firedoor,
|
/obj/machinery/door/firedoor,
|
||||||
/obj/effect/turf_decal/stripes/line{
|
/obj/effect/turf_decal/stripes/line{
|
||||||
dir = 8
|
dir = 8
|
||||||
@@ -60691,10 +60690,6 @@
|
|||||||
dir = 4
|
dir = 4
|
||||||
},
|
},
|
||||||
/obj/machinery/light,
|
/obj/machinery/light,
|
||||||
/obj/machinery/firealarm{
|
|
||||||
dir = 1;
|
|
||||||
pixel_y = -26
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/obj/effect/turf_decal/tile/neutral{
|
||||||
dir = 8
|
dir = 8
|
||||||
},
|
},
|
||||||
@@ -62744,43 +62739,36 @@
|
|||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/plasteel/dark,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cct" = (
|
"cct" = (
|
||||||
/obj/structure/table/wood,
|
/obj/structure/table/wood/fancy,
|
||||||
/obj/item/flashlight/lamp,
|
/obj/machinery/door/window{
|
||||||
/obj/machinery/computer/security/telescreen/entertainment{
|
name = "Secure Art Exhibition"
|
||||||
pixel_x = -32
|
|
||||||
},
|
},
|
||||||
/obj/item/radio/intercom{
|
/obj/structure/sign/painting/library_secure{
|
||||||
name = "Station Intercom";
|
|
||||||
pixel_y = 26
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/library)
|
|
||||||
"ccu" = (
|
|
||||||
/obj/machinery/light/small{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/structure/table/wood,
|
|
||||||
/obj/item/folder,
|
|
||||||
/obj/item/pen,
|
|
||||||
/obj/machinery/newscaster{
|
|
||||||
pixel_y = 32
|
pixel_y = 32
|
||||||
},
|
},
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/turf/open/floor/carpet,
|
||||||
dir = 1
|
/area/library)
|
||||||
},
|
"ccu" = (
|
||||||
/obj/effect/turf_decal/tile/neutral,
|
/obj/structure/table/wood/fancy,
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/obj/structure/window/reinforced{
|
||||||
dir = 4
|
dir = 4
|
||||||
},
|
},
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/obj/structure/window/reinforced,
|
||||||
dir = 8
|
/obj/structure/sign/painting/library_secure{
|
||||||
|
pixel_y = 32
|
||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/carpet,
|
||||||
/area/library)
|
/area/library)
|
||||||
"ccv" = (
|
"ccv" = (
|
||||||
/obj/machinery/computer/libraryconsole,
|
/obj/structure/extinguisher_cabinet{
|
||||||
/obj/structure/table/wood,
|
pixel_y = 32
|
||||||
/turf/open/floor/plasteel/dark,
|
},
|
||||||
|
/obj/machinery/camera{
|
||||||
|
c_tag = "Library - Aft";
|
||||||
|
dir = 2;
|
||||||
|
name = "library camera"
|
||||||
|
},
|
||||||
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"ccw" = (
|
"ccw" = (
|
||||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||||
@@ -63922,7 +63910,7 @@
|
|||||||
/obj/structure/chair/office/dark{
|
/obj/structure/chair/office/dark{
|
||||||
dir = 8
|
dir = 8
|
||||||
},
|
},
|
||||||
/obj/effect/landmark/start/librarian,
|
/obj/effect/landmark/start/assistant,
|
||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/plasteel/dark,
|
||||||
/area/library)
|
/area/library)
|
||||||
"ceg" = (
|
"ceg" = (
|
||||||
@@ -63935,71 +63923,21 @@
|
|||||||
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
/obj/machinery/atmospherics/components/unary/vent_pump/on{
|
||||||
dir = 8
|
dir = 8
|
||||||
},
|
},
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/turf/open/floor/plasteel/grimy,
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral,
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 8
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/library)
|
|
||||||
"cei" = (
|
|
||||||
/obj/structure/chair/comfy/black{
|
|
||||||
dir = 8
|
|
||||||
},
|
|
||||||
/obj/machinery/newscaster{
|
|
||||||
pixel_x = 32
|
|
||||||
},
|
|
||||||
/obj/machinery/camera{
|
|
||||||
c_tag = "Library - Fore";
|
|
||||||
dir = 8;
|
|
||||||
name = "library camera"
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/library)
|
/area/library)
|
||||||
"cej" = (
|
"cej" = (
|
||||||
/obj/machinery/photocopier,
|
/obj/effect/landmark/start/librarian,
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/turf/open/floor/plasteel/grimy,
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral,
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 8
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/library)
|
|
||||||
"cek" = (
|
|
||||||
/obj/structure/chair/office/dark{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/library)
|
/area/library)
|
||||||
"cel" = (
|
"cel" = (
|
||||||
/obj/structure/table/wood,
|
/obj/structure/chair/sofa/right{
|
||||||
/obj/item/paper_bin,
|
icon_state = "sofaend_right";
|
||||||
/obj/item/pen,
|
|
||||||
/obj/machinery/status_display/evac{
|
|
||||||
pixel_x = 32
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral,
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 8
|
dir = 8
|
||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/dark,
|
/obj/structure/sign/painting/library{
|
||||||
|
pixel_x = 32
|
||||||
|
},
|
||||||
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cem" = (
|
"cem" = (
|
||||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||||
@@ -65176,34 +65114,16 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/grimy,
|
/turf/open/floor/plasteel/grimy,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cfY" = (
|
"cfZ" = (
|
||||||
/obj/item/twohanded/required/kirbyplants/random,
|
/obj/item/radio/intercom{
|
||||||
/obj/machinery/light/small{
|
name = "Station Intercom";
|
||||||
dir = 4
|
pixel_x = -26
|
||||||
|
},
|
||||||
|
/obj/structure/sign/painting/library{
|
||||||
|
pixel_y = -32
|
||||||
},
|
},
|
||||||
/turf/open/floor/wood,
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cfZ" = (
|
|
||||||
/obj/structure/sign/warning/nosmoking,
|
|
||||||
/turf/closed/wall,
|
|
||||||
/area/library)
|
|
||||||
"cga" = (
|
|
||||||
/obj/machinery/door/morgue{
|
|
||||||
name = "Private Study"
|
|
||||||
},
|
|
||||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral,
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
|
||||||
dir = 8
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/library)
|
|
||||||
"cgb" = (
|
"cgb" = (
|
||||||
/obj/structure/sign/plaques/kiddie/library{
|
/obj/structure/sign/plaques/kiddie/library{
|
||||||
pixel_x = -32
|
pixel_x = -32
|
||||||
@@ -66351,61 +66271,28 @@
|
|||||||
/obj/item/twohanded/required/kirbyplants/random,
|
/obj/item/twohanded/required/kirbyplants/random,
|
||||||
/turf/open/floor/wood,
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"chQ" = (
|
|
||||||
/obj/machinery/bookbinder,
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
|
||||||
"chR" = (
|
|
||||||
/obj/machinery/light{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/machinery/newscaster{
|
|
||||||
pixel_y = 32
|
|
||||||
},
|
|
||||||
/obj/structure/bookcase/random,
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
|
||||||
"chS" = (
|
|
||||||
/obj/structure/chair/comfy/brown,
|
|
||||||
/obj/effect/landmark/start/assistant,
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
|
||||||
"chT" = (
|
|
||||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
|
||||||
"chU" = (
|
|
||||||
/obj/machinery/photocopier,
|
|
||||||
/obj/structure/extinguisher_cabinet{
|
|
||||||
pixel_y = 32
|
|
||||||
},
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
|
||||||
"chV" = (
|
"chV" = (
|
||||||
/obj/machinery/light{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/machinery/newscaster{
|
/obj/machinery/newscaster{
|
||||||
pixel_y = 32
|
pixel_x = -32
|
||||||
},
|
},
|
||||||
/obj/structure/bookcase/manuals/research_and_development,
|
/turf/open/floor/plasteel/dark,
|
||||||
/obj/machinery/camera{
|
|
||||||
c_tag = "Library";
|
|
||||||
name = "library camera"
|
|
||||||
},
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
/area/library)
|
||||||
"chW" = (
|
"chW" = (
|
||||||
/obj/structure/chair/comfy/brown,
|
/obj/machinery/holopad,
|
||||||
/obj/item/radio/intercom{
|
/obj/effect/turf_decal/bot,
|
||||||
name = "Station Intercom";
|
/turf/open/floor/plasteel/grimy,
|
||||||
pixel_y = 26
|
|
||||||
},
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
/area/library)
|
||||||
"chX" = (
|
"chX" = (
|
||||||
/obj/machinery/vending/coffee,
|
/obj/structure/table/wood,
|
||||||
/turf/open/floor/wood,
|
/obj/item/newspaper{
|
||||||
|
pixel_x = 3;
|
||||||
|
pixel_y = 3
|
||||||
|
},
|
||||||
|
/obj/item/reagent_containers/food/drinks/coffee{
|
||||||
|
pixel_x = -4;
|
||||||
|
pixel_y = 2
|
||||||
|
},
|
||||||
|
/turf/open/floor/plasteel/dark,
|
||||||
/area/library)
|
/area/library)
|
||||||
"chY" = (
|
"chY" = (
|
||||||
/obj/machinery/door/poddoor/shutters/preopen{
|
/obj/machinery/door/poddoor/shutters/preopen{
|
||||||
@@ -67294,10 +67181,6 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/grimy,
|
/turf/open/floor/plasteel/grimy,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cju" = (
|
|
||||||
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
|
|
||||||
/turf/open/floor/plasteel/grimy,
|
|
||||||
/area/library)
|
|
||||||
"cjv" = (
|
"cjv" = (
|
||||||
/obj/machinery/door/airlock/public/glass{
|
/obj/machinery/door/airlock/public/glass{
|
||||||
name = "Library Access"
|
name = "Library Access"
|
||||||
@@ -68920,10 +68803,6 @@
|
|||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||||
/turf/open/floor/wood,
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cmv" = (
|
|
||||||
/obj/machinery/holopad,
|
|
||||||
/turf/open/floor/wood,
|
|
||||||
/area/library)
|
|
||||||
"cmw" = (
|
"cmw" = (
|
||||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||||
/obj/structure/extinguisher_cabinet{
|
/obj/structure/extinguisher_cabinet{
|
||||||
@@ -69800,7 +69679,7 @@
|
|||||||
/turf/open/floor/wood,
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cnP" = (
|
"cnP" = (
|
||||||
/obj/structure/bookcase/manuals/medical,
|
/obj/structure/bookcase/random,
|
||||||
/turf/open/floor/wood,
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"cnQ" = (
|
"cnQ" = (
|
||||||
@@ -74568,8 +74447,6 @@
|
|||||||
/area/library)
|
/area/library)
|
||||||
"cwr" = (
|
"cwr" = (
|
||||||
/obj/structure/easel,
|
/obj/structure/easel,
|
||||||
/obj/item/canvas/twentythreeXnineteen,
|
|
||||||
/obj/item/canvas/twentythreeXtwentythree,
|
|
||||||
/obj/item/canvas/twentythreeXtwentythree,
|
/obj/item/canvas/twentythreeXtwentythree,
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/obj/effect/turf_decal/tile/neutral{
|
||||||
dir = 1
|
dir = 1
|
||||||
@@ -78500,7 +78377,10 @@
|
|||||||
pixel_x = 3;
|
pixel_x = 3;
|
||||||
pixel_y = 3
|
pixel_y = 3
|
||||||
},
|
},
|
||||||
/obj/item/newspaper,
|
/obj/item/newspaper{
|
||||||
|
pixel_x = 3;
|
||||||
|
pixel_y = 3
|
||||||
|
},
|
||||||
/obj/machinery/status_display/evac{
|
/obj/machinery/status_display/evac{
|
||||||
pixel_x = -32
|
pixel_x = -32
|
||||||
},
|
},
|
||||||
@@ -80213,7 +80093,10 @@
|
|||||||
pixel_x = 7;
|
pixel_x = 7;
|
||||||
pixel_y = 11
|
pixel_y = 11
|
||||||
},
|
},
|
||||||
/obj/item/newspaper,
|
/obj/item/newspaper{
|
||||||
|
pixel_x = 3;
|
||||||
|
pixel_y = 3
|
||||||
|
},
|
||||||
/obj/item/pen/red,
|
/obj/item/pen/red,
|
||||||
/turf/open/floor/wood{
|
/turf/open/floor/wood{
|
||||||
icon_state = "wood-broken2"
|
icon_state = "wood-broken2"
|
||||||
@@ -110110,7 +109993,10 @@
|
|||||||
pixel_x = 3;
|
pixel_x = 3;
|
||||||
pixel_y = 3
|
pixel_y = 3
|
||||||
},
|
},
|
||||||
/obj/item/newspaper,
|
/obj/item/newspaper{
|
||||||
|
pixel_x = 3;
|
||||||
|
pixel_y = 3
|
||||||
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/security/detectives_office/private_investigators_office)
|
/area/security/detectives_office/private_investigators_office)
|
||||||
"dFu" = (
|
"dFu" = (
|
||||||
@@ -110973,7 +110859,10 @@
|
|||||||
/area/crew_quarters/theatre/abandoned)
|
/area/crew_quarters/theatre/abandoned)
|
||||||
"dGH" = (
|
"dGH" = (
|
||||||
/obj/structure/table/wood,
|
/obj/structure/table/wood,
|
||||||
/obj/item/newspaper,
|
/obj/item/newspaper{
|
||||||
|
pixel_x = 3;
|
||||||
|
pixel_y = 3
|
||||||
|
},
|
||||||
/obj/item/clothing/head/bowler,
|
/obj/item/clothing/head/bowler,
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/obj/effect/turf_decal/tile/neutral{
|
||||||
dir = 1
|
dir = 1
|
||||||
@@ -125489,6 +125378,17 @@
|
|||||||
/obj/structure/closet/crate/coffin,
|
/obj/structure/closet/crate/coffin,
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/chapel/office)
|
/area/chapel/office)
|
||||||
|
"gjg" = (
|
||||||
|
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
|
||||||
|
/obj/effect/turf_decal/tile/neutral{
|
||||||
|
dir = 8
|
||||||
|
},
|
||||||
|
/obj/machinery/airalarm{
|
||||||
|
dir = 1;
|
||||||
|
pixel_y = -22
|
||||||
|
},
|
||||||
|
/turf/open/floor/plasteel,
|
||||||
|
/area/hallway/primary/port)
|
||||||
"gmj" = (
|
"gmj" = (
|
||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||||
/turf/closed/wall/r_wall,
|
/turf/closed/wall/r_wall,
|
||||||
@@ -125557,6 +125457,12 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/plasteel/dark,
|
||||||
/area/science/mixing)
|
/area/science/mixing)
|
||||||
|
"gOM" = (
|
||||||
|
/obj/structure/sign/painting/library{
|
||||||
|
pixel_y = -32
|
||||||
|
},
|
||||||
|
/turf/open/floor/wood,
|
||||||
|
/area/library)
|
||||||
"gPv" = (
|
"gPv" = (
|
||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||||
dir = 4
|
dir = 4
|
||||||
@@ -125856,6 +125762,12 @@
|
|||||||
/obj/item/integrated_circuit_printer,
|
/obj/item/integrated_circuit_printer,
|
||||||
/turf/open/floor/plasteel/white/side,
|
/turf/open/floor/plasteel/white/side,
|
||||||
/area/science/circuit)
|
/area/science/circuit)
|
||||||
|
"jqs" = (
|
||||||
|
/obj/structure/sign/painting/library{
|
||||||
|
pixel_y = 32
|
||||||
|
},
|
||||||
|
/turf/open/floor/wood,
|
||||||
|
/area/library)
|
||||||
"jqM" = (
|
"jqM" = (
|
||||||
/obj/effect/decal/cleanable/dirt,
|
/obj/effect/decal/cleanable/dirt,
|
||||||
/obj/effect/turf_decal/stripes/line{
|
/obj/effect/turf_decal/stripes/line{
|
||||||
@@ -125974,6 +125886,17 @@
|
|||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/science/mixing)
|
/area/science/mixing)
|
||||||
|
"jVB" = (
|
||||||
|
/obj/structure/table/wood/fancy,
|
||||||
|
/obj/structure/window/reinforced{
|
||||||
|
dir = 8
|
||||||
|
},
|
||||||
|
/obj/structure/window/reinforced,
|
||||||
|
/obj/structure/sign/painting/library_secure{
|
||||||
|
pixel_y = 32
|
||||||
|
},
|
||||||
|
/turf/open/floor/carpet,
|
||||||
|
/area/library)
|
||||||
"kam" = (
|
"kam" = (
|
||||||
/obj/effect/decal/cleanable/dirt,
|
/obj/effect/decal/cleanable/dirt,
|
||||||
/obj/machinery/conveyor{
|
/obj/machinery/conveyor{
|
||||||
@@ -126386,6 +126309,12 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/white,
|
/turf/open/floor/plasteel/white,
|
||||||
/area/science/research)
|
/area/science/research)
|
||||||
|
"mRS" = (
|
||||||
|
/obj/machinery/light{
|
||||||
|
dir = 1
|
||||||
|
},
|
||||||
|
/turf/open/floor/wood,
|
||||||
|
/area/library)
|
||||||
"mWZ" = (
|
"mWZ" = (
|
||||||
/obj/machinery/atmospherics/components/binary/pump,
|
/obj/machinery/atmospherics/components/binary/pump,
|
||||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||||
@@ -126425,6 +126354,17 @@
|
|||||||
/obj/machinery/atmospherics/pipe/simple/general/hidden,
|
/obj/machinery/atmospherics/pipe/simple/general/hidden,
|
||||||
/turf/closed/wall/r_wall,
|
/turf/closed/wall/r_wall,
|
||||||
/area/maintenance/disposal/incinerator)
|
/area/maintenance/disposal/incinerator)
|
||||||
|
"oek" = (
|
||||||
|
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||||
|
dir = 4
|
||||||
|
},
|
||||||
|
/obj/machinery/camera{
|
||||||
|
c_tag = "Library - Aft";
|
||||||
|
dir = 2;
|
||||||
|
name = "library camera"
|
||||||
|
},
|
||||||
|
/turf/open/floor/plasteel/grimy,
|
||||||
|
/area/library)
|
||||||
"oHk" = (
|
"oHk" = (
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/obj/effect/turf_decal/tile/neutral{
|
||||||
dir = 1
|
dir = 1
|
||||||
@@ -126640,6 +126580,10 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/science/research/abandoned)
|
/area/science/research/abandoned)
|
||||||
|
"pLF" = (
|
||||||
|
/obj/machinery/light,
|
||||||
|
/turf/open/floor/wood,
|
||||||
|
/area/library)
|
||||||
"pQm" = (
|
"pQm" = (
|
||||||
/obj/effect/decal/cleanable/dirt,
|
/obj/effect/decal/cleanable/dirt,
|
||||||
/obj/structure/cable/white{
|
/obj/structure/cable/white{
|
||||||
@@ -126929,6 +126873,15 @@
|
|||||||
"tCh" = (
|
"tCh" = (
|
||||||
/turf/closed/wall,
|
/turf/closed/wall,
|
||||||
/area/science/misc_lab)
|
/area/science/misc_lab)
|
||||||
|
"tDx" = (
|
||||||
|
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||||
|
dir = 4
|
||||||
|
},
|
||||||
|
/obj/machinery/light{
|
||||||
|
dir = 1
|
||||||
|
},
|
||||||
|
/turf/open/floor/plasteel/grimy,
|
||||||
|
/area/library)
|
||||||
"tMk" = (
|
"tMk" = (
|
||||||
/turf/open/floor/plasteel/white/side{
|
/turf/open/floor/plasteel/white/side{
|
||||||
dir = 10
|
dir = 10
|
||||||
@@ -127085,6 +127038,16 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/engine/atmos)
|
/area/engine/atmos)
|
||||||
|
"vLX" = (
|
||||||
|
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
|
||||||
|
dir = 8
|
||||||
|
},
|
||||||
|
/obj/structure/sign/plaques/kiddie/library{
|
||||||
|
pixel_x = 32;
|
||||||
|
pixel_y = 32
|
||||||
|
},
|
||||||
|
/turf/open/floor/plasteel/grimy,
|
||||||
|
/area/library)
|
||||||
"wei" = (
|
"wei" = (
|
||||||
/obj/effect/turf_decal/stripes/line,
|
/obj/effect/turf_decal/stripes/line,
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
@@ -127104,6 +127067,19 @@
|
|||||||
/obj/effect/turf_decal/tile/purple,
|
/obj/effect/turf_decal/tile/purple,
|
||||||
/turf/open/floor/plasteel/white,
|
/turf/open/floor/plasteel/white,
|
||||||
/area/science/misc_lab)
|
/area/science/misc_lab)
|
||||||
|
"wEg" = (
|
||||||
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||||
|
dir = 4
|
||||||
|
},
|
||||||
|
/obj/effect/turf_decal/tile/neutral{
|
||||||
|
dir = 8
|
||||||
|
},
|
||||||
|
/obj/machinery/firealarm{
|
||||||
|
dir = 1;
|
||||||
|
pixel_y = -26
|
||||||
|
},
|
||||||
|
/turf/open/floor/plasteel,
|
||||||
|
/area/hallway/primary/port)
|
||||||
"wFu" = (
|
"wFu" = (
|
||||||
/obj/structure/lattice,
|
/obj/structure/lattice,
|
||||||
/obj/structure/grille,
|
/obj/structure/grille,
|
||||||
@@ -127292,6 +127268,13 @@
|
|||||||
/obj/structure/fans/tiny/invisible,
|
/obj/structure/fans/tiny/invisible,
|
||||||
/turf/open/space/basic,
|
/turf/open/space/basic,
|
||||||
/area/space)
|
/area/space)
|
||||||
|
"yin" = (
|
||||||
|
/obj/structure/chair/sofa/left{
|
||||||
|
icon_state = "sofaend_left";
|
||||||
|
dir = 8
|
||||||
|
},
|
||||||
|
/turf/open/floor/wood,
|
||||||
|
/area/library)
|
||||||
"yiv" = (
|
"yiv" = (
|
||||||
/obj/effect/decal/cleanable/dirt,
|
/obj/effect/decal/cleanable/dirt,
|
||||||
/obj/effect/turf_decal/tile/neutral{
|
/obj/effect/turf_decal/tile/neutral{
|
||||||
@@ -158292,7 +158275,7 @@ ccq
|
|||||||
ceg
|
ceg
|
||||||
ccq
|
ccq
|
||||||
chO
|
chO
|
||||||
ceg
|
vLX
|
||||||
ckQ
|
ckQ
|
||||||
cmr
|
cmr
|
||||||
ccq
|
ccq
|
||||||
@@ -158545,11 +158528,11 @@ bUt
|
|||||||
bWD
|
bWD
|
||||||
bYM
|
bYM
|
||||||
caH
|
caH
|
||||||
ccr
|
cwq
|
||||||
ceh
|
ceh
|
||||||
cfY
|
caG
|
||||||
chP
|
caG
|
||||||
cjt
|
oek
|
||||||
ckR
|
ckR
|
||||||
cms
|
cms
|
||||||
cnO
|
cnO
|
||||||
@@ -158800,12 +158783,12 @@ bDl
|
|||||||
bDl
|
bDl
|
||||||
bUu
|
bUu
|
||||||
bWE
|
bWE
|
||||||
bYO
|
gjg
|
||||||
caG
|
caG
|
||||||
ccs
|
mRS
|
||||||
cei
|
cxV
|
||||||
cfZ
|
cfZ
|
||||||
chQ
|
caG
|
||||||
cjt
|
cjt
|
||||||
ckR
|
ckR
|
||||||
cms
|
cms
|
||||||
@@ -159059,11 +159042,11 @@ bUv
|
|||||||
bWC
|
bWC
|
||||||
bYR
|
bYR
|
||||||
caG
|
caG
|
||||||
|
jqs
|
||||||
|
cxV
|
||||||
|
gOM
|
||||||
caG
|
caG
|
||||||
caG
|
tDx
|
||||||
caG
|
|
||||||
chR
|
|
||||||
cjt
|
|
||||||
ckR
|
ckR
|
||||||
cmt
|
cmt
|
||||||
cmt
|
cmt
|
||||||
@@ -159316,10 +159299,10 @@ bUq
|
|||||||
bWI
|
bWI
|
||||||
bYM
|
bYM
|
||||||
caG
|
caG
|
||||||
cct
|
jqs
|
||||||
cej
|
cxV
|
||||||
|
gOM
|
||||||
caG
|
caG
|
||||||
chS
|
|
||||||
cjt
|
cjt
|
||||||
ckR
|
ckR
|
||||||
cms
|
cms
|
||||||
@@ -159573,11 +159556,11 @@ bUq
|
|||||||
bWD
|
bWD
|
||||||
bYM
|
bYM
|
||||||
caG
|
caG
|
||||||
ccu
|
jqs
|
||||||
cek
|
cxV
|
||||||
cga
|
gOM
|
||||||
chT
|
caG
|
||||||
cju
|
cjt
|
||||||
ckR
|
ckR
|
||||||
cms
|
cms
|
||||||
cnQ
|
cnQ
|
||||||
@@ -159831,9 +159814,9 @@ bWD
|
|||||||
bYM
|
bYM
|
||||||
caG
|
caG
|
||||||
ccv
|
ccv
|
||||||
cel
|
cxV
|
||||||
|
pLF
|
||||||
caG
|
caG
|
||||||
chU
|
|
||||||
cjt
|
cjt
|
||||||
ckR
|
ckR
|
||||||
xuu
|
xuu
|
||||||
@@ -160087,9 +160070,9 @@ bUq
|
|||||||
bWD
|
bWD
|
||||||
bYS
|
bYS
|
||||||
caG
|
caG
|
||||||
caG
|
jVB
|
||||||
caG
|
cxV
|
||||||
caG
|
cmt
|
||||||
chV
|
chV
|
||||||
cjt
|
cjt
|
||||||
ckT
|
ckT
|
||||||
@@ -160346,7 +160329,7 @@ bYM
|
|||||||
caG
|
caG
|
||||||
cct
|
cct
|
||||||
cej
|
cej
|
||||||
caG
|
cxV
|
||||||
chW
|
chW
|
||||||
cjt
|
cjt
|
||||||
ckR
|
ckR
|
||||||
@@ -160602,12 +160585,12 @@ bWD
|
|||||||
bYM
|
bYM
|
||||||
caG
|
caG
|
||||||
ccu
|
ccu
|
||||||
cek
|
cmt
|
||||||
cga
|
cmt
|
||||||
chT
|
ccr
|
||||||
cju
|
cjt
|
||||||
ckR
|
ckR
|
||||||
cmv
|
cmt
|
||||||
cnU
|
cnU
|
||||||
cpy
|
cpy
|
||||||
cqT
|
cqT
|
||||||
@@ -160856,11 +160839,11 @@ bQu
|
|||||||
bQv
|
bQv
|
||||||
bUr
|
bUr
|
||||||
bWD
|
bWD
|
||||||
bYM
|
wEg
|
||||||
caG
|
caG
|
||||||
ccv
|
chP
|
||||||
cel
|
cel
|
||||||
caG
|
yin
|
||||||
chX
|
chX
|
||||||
cjt
|
cjt
|
||||||
ckR
|
ckR
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define RUST_G "rust_g"
|
#define RUST_G "rust_g"
|
||||||
|
|
||||||
#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname)
|
#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname)
|
||||||
|
#define rustg_dmi_create_png(fname,width,height,data) call(RUST_G, "dmi_create_png")(fname,width,height,data)
|
||||||
|
|
||||||
#define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev)
|
#define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev)
|
||||||
#define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev)
|
#define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev)
|
||||||
|
|||||||
@@ -122,3 +122,6 @@
|
|||||||
|
|
||||||
// misc
|
// misc
|
||||||
#define VV_HK_SPACEVINE_PURGE "spacevine_purge"
|
#define VV_HK_SPACEVINE_PURGE "spacevine_purge"
|
||||||
|
|
||||||
|
// paintings
|
||||||
|
#define VV_HK_REMOVE_PAINTING "remove_painting"
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ SUBSYSTEM_DEF(persistence)
|
|||||||
var/list/saved_votes = list()
|
var/list/saved_votes = list()
|
||||||
var/list/obj/structure/sign/picture_frame/photo_frames
|
var/list/obj/structure/sign/picture_frame/photo_frames
|
||||||
var/list/obj/item/storage/photo_album/photo_albums
|
var/list/obj/item/storage/photo_album/photo_albums
|
||||||
|
var/list/obj/structure/sign/painting/painting_frames = list()
|
||||||
|
var/list/paintings = list()
|
||||||
|
|
||||||
/datum/controller/subsystem/persistence/Initialize()
|
/datum/controller/subsystem/persistence/Initialize()
|
||||||
LoadSatchels()
|
LoadSatchels()
|
||||||
@@ -265,6 +267,7 @@ SUBSYSTEM_DEF(persistence)
|
|||||||
CollectAntagReputation()
|
CollectAntagReputation()
|
||||||
SaveRandomizedRecipes()
|
SaveRandomizedRecipes()
|
||||||
SavePanicBunker()
|
SavePanicBunker()
|
||||||
|
SavePaintings()
|
||||||
|
|
||||||
/datum/controller/subsystem/persistence/proc/LoadPanicBunker()
|
/datum/controller/subsystem/persistence/proc/LoadPanicBunker()
|
||||||
var/bunker_path = file("data/bunker_passthrough.json")
|
var/bunker_path = file("data/bunker_passthrough.json")
|
||||||
@@ -528,3 +531,19 @@ SUBSYSTEM_DEF(persistence)
|
|||||||
file_data["data"] = saved_votes[ckey]
|
file_data["data"] = saved_votes[ckey]
|
||||||
fdel(json_file)
|
fdel(json_file)
|
||||||
WRITE_FILE(json_file, json_encode(file_data))
|
WRITE_FILE(json_file, json_encode(file_data))
|
||||||
|
|
||||||
|
/datum/controller/subsystem/persistence/proc/LoadPaintings()
|
||||||
|
var/json_file = file("data/paintings.json")
|
||||||
|
if(fexists(json_file))
|
||||||
|
paintings = json_decode(file2text(json_file))
|
||||||
|
|
||||||
|
for(var/obj/structure/sign/painting/P in painting_frames)
|
||||||
|
P.load_persistent()
|
||||||
|
|
||||||
|
/datum/controller/subsystem/persistence/proc/SavePaintings()
|
||||||
|
for(var/obj/structure/sign/painting/P in painting_frames)
|
||||||
|
P.save_persistent()
|
||||||
|
|
||||||
|
var/json_file = file("data/paintings.json")
|
||||||
|
fdel(json_file)
|
||||||
|
WRITE_FILE(json_file, json_encode(paintings))
|
||||||
|
|||||||
56
code/datums/components/art.dm
Normal file
56
code/datums/components/art.dm
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
#define BAD_ART 12.5
|
||||||
|
#define GOOD_ART 25
|
||||||
|
#define GREAT_ART 50
|
||||||
|
|
||||||
|
/datum/component/art
|
||||||
|
var/impressiveness = 0
|
||||||
|
|
||||||
|
/datum/component/art/Initialize(impress)
|
||||||
|
impressiveness = impress
|
||||||
|
if(isobj(parent))
|
||||||
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_obj_examine)
|
||||||
|
else
|
||||||
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_other_examine)
|
||||||
|
if(isstructure(parent))
|
||||||
|
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand)
|
||||||
|
if(isitem(parent))
|
||||||
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/apply_moodlet)
|
||||||
|
|
||||||
|
/datum/component/art/proc/apply_moodlet(mob/M, impress)
|
||||||
|
M.visible_message("<span class='notice'>[M] stops and looks intently at [parent].</span>", \
|
||||||
|
"<span class='notice'>You stop to take in [parent].</span>")
|
||||||
|
switch(impress)
|
||||||
|
if (0 to BAD_ART)
|
||||||
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
|
||||||
|
if (BAD_ART to GOOD_ART)
|
||||||
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok)
|
||||||
|
if (GOOD_ART to GREAT_ART)
|
||||||
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood)
|
||||||
|
if(GREAT_ART to INFINITY)
|
||||||
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/component/art/proc/on_other_examine(datum/source, mob/M)
|
||||||
|
apply_moodlet(M, impressiveness)
|
||||||
|
|
||||||
|
/datum/component/art/proc/on_obj_examine(datum/source, mob/M)
|
||||||
|
var/obj/O = parent
|
||||||
|
apply_moodlet(M, impressiveness *(O.obj_integrity/O.max_integrity))
|
||||||
|
|
||||||
|
/datum/component/art/proc/on_attack_hand(datum/source, mob/M)
|
||||||
|
to_chat(M, "<span class='notice'>You start examining [parent]...</span>")
|
||||||
|
if(!do_after(M, 20, target = parent))
|
||||||
|
return
|
||||||
|
on_obj_examine(source, M)
|
||||||
|
|
||||||
|
/datum/component/art/rev
|
||||||
|
|
||||||
|
/datum/component/art/rev/apply_moodlet(mob/M, impress)
|
||||||
|
M.visible_message("<span class='notice'>[M] stops to inspect [parent].</span>", \
|
||||||
|
"<span class='notice'>You take in [parent], inspecting the fine craftsmanship of the proletariat.</span>")
|
||||||
|
|
||||||
|
if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev))
|
||||||
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
|
||||||
|
else
|
||||||
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
|
||||||
@@ -256,3 +256,7 @@
|
|||||||
/datum/mood_event/nanite_sadness/add_effects(message)
|
/datum/mood_event/nanite_sadness/add_effects(message)
|
||||||
description = "<span class='warning robot'>+++++++[message]+++++++</span>\n"
|
description = "<span class='warning robot'>+++++++[message]+++++++</span>\n"
|
||||||
|
|
||||||
|
/datum/mood_event/artbad
|
||||||
|
description = "<span class='warning'>I've produced better art than that from my ass.</span>\n"
|
||||||
|
mood_change = -2
|
||||||
|
timeout = 1200
|
||||||
|
|||||||
@@ -182,3 +182,17 @@
|
|||||||
description = "<span class='nicegreen'>What a peculiar emblem. It makes me feel hopeful for my future.</span>\n"
|
description = "<span class='nicegreen'>What a peculiar emblem. It makes me feel hopeful for my future.</span>\n"
|
||||||
mood_change = 5
|
mood_change = 5
|
||||||
|
|
||||||
|
/datum/mood_event/artok
|
||||||
|
description = "<span class='nicegreen'>It's nice to see people are making art around here.</span>\n"
|
||||||
|
mood_change = 2
|
||||||
|
timeout = 2 MINUTES
|
||||||
|
|
||||||
|
/datum/mood_event/artgood
|
||||||
|
description = "<span class='nicegreen'>What a thought-provoking piece of art. I'll remember that for a while.</span>\n"
|
||||||
|
mood_change = 3
|
||||||
|
timeout = 3 MINUTES
|
||||||
|
|
||||||
|
/datum/mood_event/artgreat
|
||||||
|
description = "<span class='nicegreen'>That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this.</span>\n"
|
||||||
|
mood_change = 4
|
||||||
|
timeout = 4 MINUTES
|
||||||
|
|||||||
@@ -91,6 +91,11 @@
|
|||||||
|
|
||||||
refill()
|
refill()
|
||||||
|
|
||||||
|
/obj/item/toy/crayon/examine(mob/user)
|
||||||
|
. = ..()
|
||||||
|
if(can_change_colour)
|
||||||
|
. += "<span class='notice'>Ctrl-click [src] while it's on your person to quickly recolour it.</span>"
|
||||||
|
|
||||||
/obj/item/toy/crayon/proc/refill()
|
/obj/item/toy/crayon/proc/refill()
|
||||||
if(charges == -1)
|
if(charges == -1)
|
||||||
charges_left = 100
|
charges_left = 100
|
||||||
@@ -160,6 +165,12 @@
|
|||||||
update_icon()
|
update_icon()
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
/obj/item/toy/crayon/CtrlClick(mob/user)
|
||||||
|
if(can_change_colour && !isturf(loc) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||||
|
select_colour(user)
|
||||||
|
else
|
||||||
|
return ..()
|
||||||
|
|
||||||
/obj/item/toy/crayon/proc/staticDrawables()
|
/obj/item/toy/crayon/proc/staticDrawables()
|
||||||
|
|
||||||
. = list()
|
. = list()
|
||||||
@@ -237,14 +248,7 @@
|
|||||||
else
|
else
|
||||||
paint_mode = PAINT_NORMAL
|
paint_mode = PAINT_NORMAL
|
||||||
if("select_colour")
|
if("select_colour")
|
||||||
if(can_change_colour)
|
. = can_change_colour && select_colour(usr)
|
||||||
var/chosen_colour = input(usr,"","Choose Color",paint_color) as color|null
|
|
||||||
|
|
||||||
if (!isnull(chosen_colour))
|
|
||||||
paint_color = chosen_colour
|
|
||||||
. = TRUE
|
|
||||||
else
|
|
||||||
. = FALSE
|
|
||||||
if("enter_text")
|
if("enter_text")
|
||||||
var/txt = stripped_input(usr,"Choose what to write.",
|
var/txt = stripped_input(usr,"Choose what to write.",
|
||||||
"Scribbles",default = text_buffer)
|
"Scribbles",default = text_buffer)
|
||||||
@@ -254,6 +258,13 @@
|
|||||||
drawtype = "a"
|
drawtype = "a"
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/toy/crayon/proc/select_colour(mob/user)
|
||||||
|
var/chosen_colour = input(user, "", "Choose Color", paint_color) as color|null
|
||||||
|
if (!isnull(chosen_colour) && user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||||
|
paint_color = chosen_colour
|
||||||
|
return TRUE
|
||||||
|
return FALSE
|
||||||
|
|
||||||
/obj/item/toy/crayon/proc/crayon_text_strip(text)
|
/obj/item/toy/crayon/proc/crayon_text_strip(text)
|
||||||
var/static/regex/crayon_r = new /regex(@"[^\w!?,.=%#&+\/\-]")
|
var/static/regex/crayon_r = new /regex(@"[^\w!?,.=%#&+\/\-]")
|
||||||
return replacetext(lowertext(text), crayon_r, "")
|
return replacetext(lowertext(text), crayon_r, "")
|
||||||
|
|||||||
@@ -267,6 +267,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
|
|||||||
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
|
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
|
||||||
null, \
|
null, \
|
||||||
new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\
|
new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\
|
||||||
|
new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\
|
||||||
new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar, 3), \
|
new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar, 3), \
|
||||||
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
|
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
|
||||||
))
|
))
|
||||||
@@ -387,6 +388,9 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
|
|||||||
null, \
|
null, \
|
||||||
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 2), \
|
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 2), \
|
||||||
null, \
|
null, \
|
||||||
|
new/datum/stack_recipe("19x19 canvas", /obj/item/canvas/nineteenXnineteen, 3), \
|
||||||
|
new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythreeXnineteen, 4), \
|
||||||
|
new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythreeXtwentythree, 5), \
|
||||||
))
|
))
|
||||||
|
|
||||||
/obj/item/stack/sheet/cloth
|
/obj/item/stack/sheet/cloth
|
||||||
|
|||||||
@@ -478,6 +478,20 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
|||||||
throw_range = 2
|
throw_range = 2
|
||||||
attack_verb = list("busted")
|
attack_verb = list("busted")
|
||||||
|
|
||||||
|
/obj/item/statuebust/attack_self(mob/living/user)
|
||||||
|
add_fingerprint(user)
|
||||||
|
user.examinate(src)
|
||||||
|
|
||||||
|
/obj/item/statuebust/examine(mob/living/user)
|
||||||
|
. = ..()
|
||||||
|
if(.)
|
||||||
|
return
|
||||||
|
if (!isliving(user))
|
||||||
|
return
|
||||||
|
user.visible_message("[user] stops to admire [src].", \
|
||||||
|
"<span class='notice'>You take in [src], admiring its fine craftsmanship.</span>")
|
||||||
|
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood)
|
||||||
|
|
||||||
/obj/item/tailclub
|
/obj/item/tailclub
|
||||||
name = "tail club"
|
name = "tail club"
|
||||||
desc = "For the beating to death of lizards with their own tails."
|
desc = "For the beating to death of lizards with their own tails."
|
||||||
|
|||||||
@@ -35,101 +35,368 @@
|
|||||||
else
|
else
|
||||||
painting = null
|
painting = null
|
||||||
|
|
||||||
|
|
||||||
//////////////
|
|
||||||
// CANVASES //
|
|
||||||
//////////////
|
|
||||||
|
|
||||||
#define AMT_OF_CANVASES 4 //Keep this up to date or shit will break.
|
|
||||||
|
|
||||||
//To safe memory on making /icons we cache the blanks..
|
|
||||||
GLOBAL_LIST_INIT(globalBlankCanvases, new(AMT_OF_CANVASES))
|
|
||||||
|
|
||||||
/obj/item/canvas
|
/obj/item/canvas
|
||||||
name = "canvas"
|
name = "canvas"
|
||||||
desc = "Draw out your soul on this canvas!"
|
desc = "Draw out your soul on this canvas!"
|
||||||
icon = 'icons/obj/artstuff.dmi'
|
icon = 'icons/obj/artstuff.dmi'
|
||||||
icon_state = "11x11"
|
icon_state = "11x11"
|
||||||
resistance_flags = FLAMMABLE
|
resistance_flags = FLAMMABLE
|
||||||
var/whichGlobalBackup = 1 //List index
|
var/width = 11
|
||||||
|
var/height = 11
|
||||||
|
var/list/grid
|
||||||
|
var/canvas_color = "#ffffff" //empty canvas color
|
||||||
|
var/ui_x = 400
|
||||||
|
var/ui_y = 400
|
||||||
|
var/used = FALSE
|
||||||
|
var/painting_name //Painting name, this is set after framing.
|
||||||
|
var/finalized = FALSE //Blocks edits
|
||||||
|
var/author_ckey
|
||||||
|
var/icon_generated = FALSE
|
||||||
|
var/icon/generated_icon
|
||||||
|
|
||||||
/obj/item/canvas/nineteenXnineteen
|
// Painting overlay offset when framed
|
||||||
icon_state = "19x19"
|
var/framed_offset_x = 11
|
||||||
whichGlobalBackup = 2
|
var/framed_offset_y = 10
|
||||||
|
|
||||||
/obj/item/canvas/twentythreeXnineteen
|
pixel_x = 10
|
||||||
icon_state = "23x19"
|
pixel_y = 9
|
||||||
whichGlobalBackup = 3
|
|
||||||
|
|
||||||
/obj/item/canvas/twentythreeXtwentythree
|
|
||||||
icon_state = "23x23"
|
|
||||||
whichGlobalBackup = 4
|
|
||||||
|
|
||||||
//HEY YOU
|
|
||||||
//ARE YOU READING THE CODE FOR CANVASES?
|
|
||||||
//ARE YOU AWARE THEY CRASH HALF THE SERVER WHEN SOMEONE DRAWS ON THEM...
|
|
||||||
//...AND NOBODY CAN FIGURE OUT WHY?
|
|
||||||
//THEN GO ON BRAVE TRAVELER
|
|
||||||
//TRY TO FIX THEM AND REMOVE THIS CODE
|
|
||||||
/obj/item/canvas/Initialize()
|
/obj/item/canvas/Initialize()
|
||||||
..()
|
. = ..()
|
||||||
return INITIALIZE_HINT_QDEL //Delete on creation
|
reset_grid()
|
||||||
|
|
||||||
//Find the right size blank canvas
|
/obj/item/canvas/proc/reset_grid()
|
||||||
/obj/item/canvas/proc/getGlobalBackup()
|
grid = new/list(width,height)
|
||||||
. = null
|
for(var/x in 1 to width)
|
||||||
if(GLOB.globalBlankCanvases[whichGlobalBackup])
|
for(var/y in 1 to height)
|
||||||
. = GLOB.globalBlankCanvases[whichGlobalBackup]
|
grid[x][y] = canvas_color
|
||||||
else
|
|
||||||
var/icon/I = icon(initial(icon),initial(icon_state))
|
|
||||||
GLOB.globalBlankCanvases[whichGlobalBackup] = I
|
|
||||||
. = I
|
|
||||||
|
|
||||||
|
/obj/item/canvas/attack_self(mob/user)
|
||||||
|
. = ..()
|
||||||
|
ui_interact(user)
|
||||||
|
|
||||||
|
/obj/item/canvas/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||||
|
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||||
|
|
||||||
//One pixel increments
|
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||||
/obj/item/canvas/attackby(obj/item/I, mob/user, params)
|
if(!ui)
|
||||||
//Click info
|
ui = new(user, src, ui_key, "canvas", name, ui_x, ui_y, master_ui, state)
|
||||||
var/list/click_params = params2list(params)
|
ui.set_autoupdate(FALSE)
|
||||||
var/pixX = text2num(click_params["icon-x"])
|
ui.open()
|
||||||
var/pixY = text2num(click_params["icon-y"])
|
|
||||||
|
|
||||||
//Should always be true, otherwise you didn't click the object, but let's check because SS13~
|
/obj/item/canvas/attackby(obj/item/I, mob/living/user, params)
|
||||||
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
|
if(user.a_intent == INTENT_HELP)
|
||||||
return
|
ui_interact(user)
|
||||||
|
|
||||||
//Cleaning one pixel with a soap or rag
|
|
||||||
if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/rag))
|
|
||||||
//Pixel info created only when needed
|
|
||||||
var/icon/masterpiece = icon(icon,icon_state)
|
|
||||||
var/thePix = masterpiece.GetPixel(pixX,pixY)
|
|
||||||
var/icon/Ico = getGlobalBackup()
|
|
||||||
if(!Ico)
|
|
||||||
qdel(masterpiece)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/theOriginalPix = Ico.GetPixel(pixX,pixY)
|
|
||||||
if(thePix != theOriginalPix) //colour changed
|
|
||||||
DrawPixelOn(theOriginalPix,pixX,pixY)
|
|
||||||
qdel(masterpiece)
|
|
||||||
|
|
||||||
//Drawing one pixel with a crayon
|
|
||||||
else if(istype(I, /obj/item/toy/crayon))
|
|
||||||
var/obj/item/toy/crayon/C = I
|
|
||||||
DrawPixelOn(C.paint_color, pixX, pixY)
|
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/canvas/ui_data(mob/user)
|
||||||
|
. = ..()
|
||||||
|
.["grid"] = grid
|
||||||
|
.["name"] = painting_name
|
||||||
|
.["finalized"] = finalized
|
||||||
|
|
||||||
//Clean the whole canvas
|
/obj/item/canvas/examine(mob/user)
|
||||||
/obj/item/canvas/attack_self(mob/user)
|
. = ..()
|
||||||
if(!user)
|
ui_interact(user)
|
||||||
|
|
||||||
|
/obj/item/canvas/ui_act(action, params)
|
||||||
|
. = ..()
|
||||||
|
if(. || finalized)
|
||||||
return
|
return
|
||||||
var/icon/blank = getGlobalBackup()
|
var/mob/user = usr
|
||||||
if(blank)
|
switch(action)
|
||||||
//it's basically a giant etch-a-sketch
|
if("paint")
|
||||||
icon = blank
|
var/obj/item/I = user.get_active_held_item()
|
||||||
user.visible_message("<span class='notice'>[user] cleans the canvas.</span>","<span class='notice'>You clean the canvas.</span>")
|
var/color = get_paint_tool_color(I)
|
||||||
|
if(!color)
|
||||||
|
return FALSE
|
||||||
|
var/x = text2num(params["x"])
|
||||||
|
var/y = text2num(params["y"])
|
||||||
|
grid[x][y] = color
|
||||||
|
used = TRUE
|
||||||
|
update_icon()
|
||||||
|
. = TRUE
|
||||||
|
if("finalize")
|
||||||
|
. = TRUE
|
||||||
|
if(!finalized)
|
||||||
|
finalize(user)
|
||||||
|
|
||||||
|
/obj/item/canvas/proc/finalize(mob/user)
|
||||||
|
finalized = TRUE
|
||||||
|
author_ckey = user.ckey
|
||||||
|
generate_proper_overlay()
|
||||||
|
try_rename(user)
|
||||||
|
|
||||||
|
/obj/item/canvas/update_overlays()
|
||||||
|
. = ..()
|
||||||
|
if(!icon_generated)
|
||||||
|
if(used)
|
||||||
|
var/mutable_appearance/detail = mutable_appearance(icon,"[icon_state]wip")
|
||||||
|
detail.pixel_x = 1
|
||||||
|
detail.pixel_y = 1
|
||||||
|
. += detail
|
||||||
|
else
|
||||||
|
var/mutable_appearance/detail = mutable_appearance(generated_icon)
|
||||||
|
detail.pixel_x = 1
|
||||||
|
detail.pixel_y = 1
|
||||||
|
. += detail
|
||||||
|
|
||||||
|
/obj/item/canvas/proc/generate_proper_overlay()
|
||||||
|
if(icon_generated)
|
||||||
|
return
|
||||||
|
var/png_filename = "data/paintings/temp_painting.png"
|
||||||
|
var/result = rustg_dmi_create_png(png_filename,"[width]","[height]",get_data_string())
|
||||||
|
if(result)
|
||||||
|
CRASH("Error generating painting png : [result]")
|
||||||
|
generated_icon = new(png_filename)
|
||||||
|
icon_generated = TRUE
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/item/canvas/proc/get_data_string()
|
||||||
|
var/list/data = list()
|
||||||
|
for(var/y in 1 to height)
|
||||||
|
for(var/x in 1 to width)
|
||||||
|
data += grid[x][y]
|
||||||
|
return data.Join("")
|
||||||
|
|
||||||
|
//Todo make this element ?
|
||||||
|
/obj/item/canvas/proc/get_paint_tool_color(obj/item/I)
|
||||||
|
if(!I)
|
||||||
|
return
|
||||||
|
if(istype(I, /obj/item/toy/crayon))
|
||||||
|
var/obj/item/toy/crayon/C = I
|
||||||
|
return C.paint_color
|
||||||
|
else if(istype(I, /obj/item/pen))
|
||||||
|
var/obj/item/pen/P = I
|
||||||
|
switch(P.colour)
|
||||||
|
if("black")
|
||||||
|
return "#000000"
|
||||||
|
if("blue")
|
||||||
|
return "#0000ff"
|
||||||
|
if("red")
|
||||||
|
return "#ff0000"
|
||||||
|
return P.colour
|
||||||
|
else if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/rag))
|
||||||
|
return canvas_color
|
||||||
|
|
||||||
|
/obj/item/canvas/proc/try_rename(mob/user)
|
||||||
|
var/new_name = stripped_input(user,"What do you want to name the painting?")
|
||||||
|
if(!painting_name && new_name && user.canUseTopic(src,BE_CLOSE))
|
||||||
|
painting_name = new_name
|
||||||
|
SStgui.update_uis(src)
|
||||||
|
|
||||||
|
/obj/item/canvas/nineteenXnineteen
|
||||||
|
icon_state = "19x19"
|
||||||
|
width = 19
|
||||||
|
height = 19
|
||||||
|
ui_x = 600
|
||||||
|
ui_y = 600
|
||||||
|
pixel_x = 6
|
||||||
|
pixel_y = 9
|
||||||
|
framed_offset_x = 8
|
||||||
|
framed_offset_y = 9
|
||||||
|
|
||||||
|
/obj/item/canvas/twentythreeXnineteen
|
||||||
|
icon_state = "23x19"
|
||||||
|
width = 23
|
||||||
|
height = 19
|
||||||
|
ui_x = 800
|
||||||
|
ui_y = 600
|
||||||
|
pixel_x = 4
|
||||||
|
pixel_y = 10
|
||||||
|
framed_offset_x = 6
|
||||||
|
framed_offset_y = 8
|
||||||
|
|
||||||
|
/obj/item/canvas/twentythreeXtwentythree
|
||||||
|
icon_state = "23x23"
|
||||||
|
width = 23
|
||||||
|
height = 23
|
||||||
|
ui_x = 800
|
||||||
|
ui_y = 800
|
||||||
|
pixel_x = 5
|
||||||
|
pixel_y = 9
|
||||||
|
framed_offset_x = 5
|
||||||
|
framed_offset_y = 6
|
||||||
|
|
||||||
|
/obj/item/wallframe/painting
|
||||||
|
name = "painting frame"
|
||||||
|
desc = "The perfect showcase for your favorite deathtrap memories."
|
||||||
|
icon = 'icons/obj/decals.dmi'
|
||||||
|
custom_materials = null
|
||||||
|
flags_1 = 0
|
||||||
|
icon_state = "frame-empty"
|
||||||
|
result_path = /obj/structure/sign/painting
|
||||||
|
|
||||||
|
/obj/structure/sign/painting
|
||||||
|
name = "Painting"
|
||||||
|
desc = "Art or \"Art\"? You decide."
|
||||||
|
icon = 'icons/obj/decals.dmi'
|
||||||
|
icon_state = "frame-empty"
|
||||||
|
buildable_sign = FALSE
|
||||||
|
var/obj/item/canvas/C
|
||||||
|
var/persistence_id
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/Initialize(mapload, dir, building)
|
||||||
|
. = ..()
|
||||||
|
SSpersistence.painting_frames += src
|
||||||
|
AddComponent(/datum/component/art, 20)
|
||||||
|
if(dir)
|
||||||
|
setDir(dir)
|
||||||
|
if(building)
|
||||||
|
pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
|
||||||
|
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/Destroy()
|
||||||
|
. = ..()
|
||||||
|
SSpersistence.painting_frames -= src
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params)
|
||||||
|
if(!C && istype(I, /obj/item/canvas))
|
||||||
|
frame_canvas(user,I)
|
||||||
|
else if(C && !C.painting_name && istype(I,/obj/item/pen))
|
||||||
|
try_rename(user)
|
||||||
|
else
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/examine(mob/user)
|
||||||
|
. = ..()
|
||||||
|
if(C)
|
||||||
|
C.ui_interact(user,state = GLOB.physical_obscured_state)
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/wirecutter_act(mob/living/user, obj/item/I)
|
||||||
|
. = ..()
|
||||||
|
if(C)
|
||||||
|
C.forceMove(drop_location())
|
||||||
|
C = null
|
||||||
|
to_chat(user, "<span class='notice'>You remove the painting from the frame.</span>")
|
||||||
|
update_icon()
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas)
|
||||||
|
if(user.transferItemToLoc(new_canvas,src))
|
||||||
|
C = new_canvas
|
||||||
|
if(!C.finalized)
|
||||||
|
C.finalize(user)
|
||||||
|
to_chat(user,"<span class='notice'>You frame [C].</span>")
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/proc/try_rename(mob/user)
|
||||||
|
if(!C.painting_name)
|
||||||
|
C.try_rename(user)
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/update_icon_state()
|
||||||
|
. = ..()
|
||||||
|
if(C && C.generated_icon)
|
||||||
|
icon_state = null
|
||||||
|
else
|
||||||
|
icon_state = "frame-empty"
|
||||||
|
|
||||||
|
|
||||||
#undef AMT_OF_CANVASES
|
/obj/structure/sign/painting/update_overlays()
|
||||||
|
. = ..()
|
||||||
|
if(C && C.generated_icon)
|
||||||
|
var/mutable_appearance/MA = mutable_appearance(C.generated_icon)
|
||||||
|
MA.pixel_x = C.framed_offset_x
|
||||||
|
MA.pixel_y = C.framed_offset_y
|
||||||
|
. += MA
|
||||||
|
var/mutable_appearance/frame = mutable_appearance(C.icon,"[C.icon_state]frame")
|
||||||
|
frame.pixel_x = C.framed_offset_x - 1
|
||||||
|
frame.pixel_y = C.framed_offset_y - 1
|
||||||
|
. += frame
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/proc/load_persistent()
|
||||||
|
if(!persistence_id)
|
||||||
|
return
|
||||||
|
if(!SSpersistence.paintings || !SSpersistence.paintings[persistence_id] || !length(SSpersistence.paintings[persistence_id]))
|
||||||
|
return
|
||||||
|
var/list/chosen = pick(SSpersistence.paintings[persistence_id])
|
||||||
|
var/title = chosen["title"]
|
||||||
|
var/author = chosen["ckey"]
|
||||||
|
var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png"
|
||||||
|
if(!fexists(png))
|
||||||
|
stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.")
|
||||||
|
return
|
||||||
|
var/icon/I = new(png)
|
||||||
|
var/obj/item/canvas/new_canvas
|
||||||
|
var/w = I.Width()
|
||||||
|
var/h = I.Height()
|
||||||
|
for(var/T in typesof(/obj/item/canvas))
|
||||||
|
new_canvas = T
|
||||||
|
if(initial(new_canvas.width) == w && initial(new_canvas.height) == h)
|
||||||
|
new_canvas = new T(src)
|
||||||
|
break
|
||||||
|
new_canvas.fill_grid_from_icon(I)
|
||||||
|
new_canvas.generated_icon = I
|
||||||
|
new_canvas.icon_generated = TRUE
|
||||||
|
new_canvas.finalized = TRUE
|
||||||
|
new_canvas.painting_name = title
|
||||||
|
new_canvas.author_ckey = author
|
||||||
|
C = new_canvas
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/proc/save_persistent()
|
||||||
|
if(!persistence_id || !C)
|
||||||
|
return
|
||||||
|
if(sanitize_filename(persistence_id) != persistence_id)
|
||||||
|
stack_trace("Invalid persistence_id - [persistence_id]")
|
||||||
|
return
|
||||||
|
var/data = C.get_data_string()
|
||||||
|
var/md5 = md5(data)
|
||||||
|
var/list/current = SSpersistence.paintings[persistence_id]
|
||||||
|
if(!current)
|
||||||
|
current = list()
|
||||||
|
for(var/list/entry in current)
|
||||||
|
if(entry["md5"] == md5)
|
||||||
|
return
|
||||||
|
var/png_directory = "data/paintings/[persistence_id]/"
|
||||||
|
var/png_path = png_directory + "[md5].png"
|
||||||
|
var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data)
|
||||||
|
if(result)
|
||||||
|
CRASH("Error saving persistent painting: [result]")
|
||||||
|
current += list(list("title" = C.painting_name , "md5" = md5, "ckey" = C.author_ckey))
|
||||||
|
SSpersistence.paintings[persistence_id] = current
|
||||||
|
|
||||||
|
/obj/item/canvas/proc/fill_grid_from_icon(icon/I)
|
||||||
|
var/h = I.Height() + 1
|
||||||
|
for(var/x in 1 to width)
|
||||||
|
for(var/y in 1 to height)
|
||||||
|
grid[x][y] = I.GetPixel(x,h-y)
|
||||||
|
|
||||||
|
//Presets for art gallery mapping, for paintings to be shared across stations
|
||||||
|
/obj/structure/sign/painting/library
|
||||||
|
persistence_id = "library"
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/library_secure
|
||||||
|
persistence_id = "library_secure"
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least
|
||||||
|
persistence_id = "library_private"
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/vv_get_dropdown()
|
||||||
|
. = ..()
|
||||||
|
VV_DROPDOWN_OPTION(VV_HK_REMOVE_PAINTING, "Remove Persistent Painting")
|
||||||
|
|
||||||
|
/obj/structure/sign/painting/vv_do_topic(list/href_list)
|
||||||
|
. = ..()
|
||||||
|
if(href_list[VV_HK_REMOVE_PAINTING])
|
||||||
|
if(!check_rights(NONE))
|
||||||
|
return
|
||||||
|
var/mob/user = usr
|
||||||
|
if(!persistence_id || !C)
|
||||||
|
to_chat(user,"<span class='warning'>This is not a persistent painting.</span>")
|
||||||
|
return
|
||||||
|
var/md5 = md5(C.get_data_string())
|
||||||
|
var/author = C.author_ckey
|
||||||
|
var/list/current = SSpersistence.paintings[persistence_id]
|
||||||
|
if(current)
|
||||||
|
for(var/list/entry in current)
|
||||||
|
if(entry["md5"] == md5)
|
||||||
|
current -= entry
|
||||||
|
var/png = "data/paintings/[persistence_id]/[md5].png"
|
||||||
|
fdel(png)
|
||||||
|
for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames)
|
||||||
|
if(P.C && md5(P.C.get_data_string()) == md5)
|
||||||
|
QDEL_NULL(P.C)
|
||||||
|
log_admin("[key_name(user)] has deleted a persistent painting made by [author].")
|
||||||
|
message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")
|
||||||
|
|||||||
@@ -8,12 +8,11 @@
|
|||||||
max_integrity = 100
|
max_integrity = 100
|
||||||
var/oreAmount = 5
|
var/oreAmount = 5
|
||||||
var/material_drop_type = /obj/item/stack/sheet/metal
|
var/material_drop_type = /obj/item/stack/sheet/metal
|
||||||
|
var/impressiveness = 15
|
||||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||||
|
|
||||||
|
|
||||||
/obj/structure/statue/attackby(obj/item/W, mob/living/user, params)
|
/obj/structure/statue/attackby(obj/item/W, mob/living/user, params)
|
||||||
add_fingerprint(user)
|
add_fingerprint(user)
|
||||||
user.changeNext_move(CLICK_CD_MELEE)
|
|
||||||
if(!(flags_1 & NODECONSTRUCT_1))
|
if(!(flags_1 & NODECONSTRUCT_1))
|
||||||
if(default_unfasten_wrench(user, W))
|
if(default_unfasten_wrench(user, W))
|
||||||
return
|
return
|
||||||
@@ -36,8 +35,22 @@
|
|||||||
return
|
return
|
||||||
user.changeNext_move(CLICK_CD_MELEE)
|
user.changeNext_move(CLICK_CD_MELEE)
|
||||||
add_fingerprint(user)
|
add_fingerprint(user)
|
||||||
user.visible_message("[user] rubs some dust off from the [name]'s surface.", \
|
if(!do_after(user, 20, target = src))
|
||||||
"<span class='notice'>You rub some dust off from the [name]'s surface.</span>")
|
return
|
||||||
|
user.visible_message("[user] rubs some dust off [src].", \
|
||||||
|
"<span class='notice'>You take in [src], rubbing some dust off its surface.</span>")
|
||||||
|
if(!ishuman(user)) // only humans have the capacity to appreciate art
|
||||||
|
return
|
||||||
|
var/totalimpressiveness = (impressiveness *(obj_integrity/max_integrity))
|
||||||
|
switch(totalimpressiveness)
|
||||||
|
if(GREAT_ART to 100)
|
||||||
|
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
|
||||||
|
if (GOOD_ART to GREAT_ART)
|
||||||
|
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood)
|
||||||
|
if (BAD_ART to GOOD_ART)
|
||||||
|
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok)
|
||||||
|
if (0 to BAD_ART)
|
||||||
|
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
|
||||||
|
|
||||||
/obj/structure/statue/deconstruct(disassembled = TRUE)
|
/obj/structure/statue/deconstruct(disassembled = TRUE)
|
||||||
if(!(flags_1 & NODECONSTRUCT_1))
|
if(!(flags_1 & NODECONSTRUCT_1))
|
||||||
@@ -58,6 +71,7 @@
|
|||||||
material_drop_type = /obj/item/stack/sheet/mineral/uranium
|
material_drop_type = /obj/item/stack/sheet/mineral/uranium
|
||||||
var/last_event = 0
|
var/last_event = 0
|
||||||
var/active = null
|
var/active = null
|
||||||
|
impressiveness = 25 // radiation makes an impression
|
||||||
|
|
||||||
/obj/structure/statue/uranium/nuke
|
/obj/structure/statue/uranium/nuke
|
||||||
name = "statue of a nuclear fission explosive"
|
name = "statue of a nuclear fission explosive"
|
||||||
@@ -101,6 +115,7 @@
|
|||||||
max_integrity = 200
|
max_integrity = 200
|
||||||
material_drop_type = /obj/item/stack/sheet/mineral/plasma
|
material_drop_type = /obj/item/stack/sheet/mineral/plasma
|
||||||
desc = "This statue is suitably made from plasma."
|
desc = "This statue is suitably made from plasma."
|
||||||
|
impressiveness = 20
|
||||||
|
|
||||||
/obj/structure/statue/plasma/scientist
|
/obj/structure/statue/plasma/scientist
|
||||||
name = "statue of a scientist"
|
name = "statue of a scientist"
|
||||||
@@ -151,6 +166,7 @@
|
|||||||
max_integrity = 300
|
max_integrity = 300
|
||||||
material_drop_type = /obj/item/stack/sheet/mineral/gold
|
material_drop_type = /obj/item/stack/sheet/mineral/gold
|
||||||
desc = "This is a highly valuable statue made from gold."
|
desc = "This is a highly valuable statue made from gold."
|
||||||
|
impressiveness = 30
|
||||||
|
|
||||||
/obj/structure/statue/gold/hos
|
/obj/structure/statue/gold/hos
|
||||||
name = "statue of the head of security"
|
name = "statue of the head of security"
|
||||||
@@ -178,6 +194,7 @@
|
|||||||
max_integrity = 300
|
max_integrity = 300
|
||||||
material_drop_type = /obj/item/stack/sheet/mineral/silver
|
material_drop_type = /obj/item/stack/sheet/mineral/silver
|
||||||
desc = "This is a valuable statue made from silver."
|
desc = "This is a valuable statue made from silver."
|
||||||
|
impressiveness = 25
|
||||||
|
|
||||||
/obj/structure/statue/silver/md
|
/obj/structure/statue/silver/md
|
||||||
name = "statue of a medical officer"
|
name = "statue of a medical officer"
|
||||||
@@ -205,6 +222,7 @@
|
|||||||
max_integrity = 1000
|
max_integrity = 1000
|
||||||
material_drop_type = /obj/item/stack/sheet/mineral/diamond
|
material_drop_type = /obj/item/stack/sheet/mineral/diamond
|
||||||
desc = "This is a very expensive diamond statue."
|
desc = "This is a very expensive diamond statue."
|
||||||
|
impressiveness = 60
|
||||||
|
|
||||||
/obj/structure/statue/diamond/captain
|
/obj/structure/statue/diamond/captain
|
||||||
name = "statue of THE captain."
|
name = "statue of THE captain."
|
||||||
@@ -225,6 +243,7 @@
|
|||||||
material_drop_type = /obj/item/stack/sheet/mineral/bananium
|
material_drop_type = /obj/item/stack/sheet/mineral/bananium
|
||||||
desc = "A bananium statue with a small engraving:'HOOOOOOONK'."
|
desc = "A bananium statue with a small engraving:'HOOOOOOONK'."
|
||||||
var/spam_flag = 0
|
var/spam_flag = 0
|
||||||
|
impressiveness = 65
|
||||||
|
|
||||||
/obj/structure/statue/bananium/clown
|
/obj/structure/statue/bananium/clown
|
||||||
name = "statue of a clown"
|
name = "statue of a clown"
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
/obj/item/wallframe/picture/examine(mob/user)
|
/obj/item/wallframe/picture/examine(mob/user)
|
||||||
if(user.is_holding(src) && displayed)
|
if(user.is_holding(src) && displayed)
|
||||||
displayed.show(user)
|
displayed.show(user)
|
||||||
|
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok)
|
||||||
return list()
|
return list()
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
@@ -109,6 +110,7 @@
|
|||||||
/obj/structure/sign/picture_frame/examine(mob/user)
|
/obj/structure/sign/picture_frame/examine(mob/user)
|
||||||
if(in_range(src, user) && framed)
|
if(in_range(src, user) && framed)
|
||||||
framed.show(user)
|
framed.show(user)
|
||||||
|
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok)
|
||||||
return list()
|
return list()
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* tgui state: physical_state
|
* tgui state: physical_state
|
||||||
*
|
*
|
||||||
* Short-circuits the default state to only check physical distance.
|
* Short-circuits the default state to only check physical distance.
|
||||||
**/
|
*/
|
||||||
|
|
||||||
GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new)
|
GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new)
|
||||||
|
|
||||||
@@ -22,3 +22,28 @@ GLOBAL_DATUM_INIT(physical_state, /datum/ui_state/physical, new)
|
|||||||
|
|
||||||
/mob/living/silicon/ai/physical_can_use_topic(src_object)
|
/mob/living/silicon/ai/physical_can_use_topic(src_object)
|
||||||
return UI_UPDATE // AIs are not physical.
|
return UI_UPDATE // AIs are not physical.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tgui state: physical_obscured_state
|
||||||
|
*
|
||||||
|
* Short-circuits the default state to only check physical distance, being in view doesn't matter
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLOBAL_DATUM_INIT(physical_obscured_state, /datum/ui_state/physical_obscured_state, new)
|
||||||
|
|
||||||
|
/datum/ui_state/physical_obscured_state/can_use_topic(src_object, mob/user)
|
||||||
|
. = user.shared_ui_interaction(src_object)
|
||||||
|
if(. > UI_CLOSE)
|
||||||
|
return min(., user.physical_obscured_can_use_topic(src_object))
|
||||||
|
|
||||||
|
/mob/proc/physical_obscured_can_use_topic(src_object)
|
||||||
|
return UI_CLOSE
|
||||||
|
|
||||||
|
/mob/living/physical_obscured_can_use_topic(src_object)
|
||||||
|
return shared_living_ui_distance(src_object)
|
||||||
|
|
||||||
|
/mob/living/silicon/physical_obscured_can_use_topic(src_object)
|
||||||
|
return max(UI_UPDATE, shared_living_ui_distance(src_object)) // Silicons can always see.
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/physical_obscured_can_use_topic(src_object)
|
||||||
|
return UI_UPDATE // AIs are not physical.
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 435 B After Width: | Height: | Size: 908 B |
Binary file not shown.
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 35 KiB |
BIN
rust_g.dll
BIN
rust_g.dll
Binary file not shown.
@@ -389,6 +389,7 @@
|
|||||||
#include "code\datums\components\_component.dm"
|
#include "code\datums\components\_component.dm"
|
||||||
#include "code\datums\components\anti_magic.dm"
|
#include "code\datums\components\anti_magic.dm"
|
||||||
#include "code\datums\components\armor_plate.dm"
|
#include "code\datums\components\armor_plate.dm"
|
||||||
|
#include "code\datums\components\art.dm"
|
||||||
#include "code\datums\components\bane.dm"
|
#include "code\datums\components\bane.dm"
|
||||||
#include "code\datums\components\bouncy.dm"
|
#include "code\datums\components\bouncy.dm"
|
||||||
#include "code\datums\components\butchering.dm"
|
#include "code\datums\components\butchering.dm"
|
||||||
|
|||||||
90
tgui-next/packages/tgui/interfaces/Canvas.js
Normal file
90
tgui-next/packages/tgui/interfaces/Canvas.js
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
import { Fragment } from 'inferno';
|
||||||
|
import { useBackend } from '../backend';
|
||||||
|
import { Box } from '../components';
|
||||||
|
import { Component, createRef } from 'inferno';
|
||||||
|
import { pureComponentHooks } from 'common/react';
|
||||||
|
|
||||||
|
|
||||||
|
class PaintCanvas extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.canvasRef = createRef();
|
||||||
|
this.onCVClick = props.onCanvasClick;
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.drawCanvas(this.props);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate() {
|
||||||
|
this.drawCanvas(this.props);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawCanvas(propSource) {
|
||||||
|
const ctx = this.canvasRef.current.getContext("2d");
|
||||||
|
const grid = propSource.value;
|
||||||
|
const x_size = grid.length;
|
||||||
|
if (!x_size) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const y_size = grid[0].length;
|
||||||
|
const x_scale = Math.round(this.canvasRef.current.width / x_size);
|
||||||
|
const y_scale = Math.round(this.canvasRef.current.height / y_size);
|
||||||
|
ctx.save();
|
||||||
|
ctx.scale(x_scale, y_scale);
|
||||||
|
for (let x = 0; x < grid.length; x++) {
|
||||||
|
const element = grid[x];
|
||||||
|
for (let y = 0; y < element.length; y++) {
|
||||||
|
const color = element[y];
|
||||||
|
ctx.fillStyle = color;
|
||||||
|
ctx.fillRect(x, y, 1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
clickwrapper(event) {
|
||||||
|
const x_size = this.props.value.length;
|
||||||
|
if (!x_size)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const y_size = this.props.value[0].length;
|
||||||
|
const x_scale = this.canvasRef.current.width / x_size;
|
||||||
|
const y_scale = this.canvasRef.current.height / y_size;
|
||||||
|
const x = Math.floor(event.offsetX / x_scale)+1;
|
||||||
|
const y = Math.floor(event.offsetY / y_scale)+1;
|
||||||
|
this.onCVClick(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
res = 1,
|
||||||
|
value,
|
||||||
|
px_per_unit = 28,
|
||||||
|
...rest
|
||||||
|
} = this.props;
|
||||||
|
const x_size = value.length * px_per_unit;
|
||||||
|
const y_size = x_size !== 0 ? value[0].length * px_per_unit : 0;
|
||||||
|
return (
|
||||||
|
<canvas
|
||||||
|
ref={this.canvasRef}
|
||||||
|
width={x_size || 300}
|
||||||
|
height={y_size || 300}
|
||||||
|
{...rest}
|
||||||
|
onClick={e => this.clickwrapper(e)}>
|
||||||
|
Canvas failed to render.
|
||||||
|
</canvas>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export const Canvas = props => {
|
||||||
|
const { act, data } = useBackend(props);
|
||||||
|
return (
|
||||||
|
<Box textAlign="center">
|
||||||
|
<PaintCanvas
|
||||||
|
value={data.grid}
|
||||||
|
onCanvasClick={(x, y) => act("paint", { x, y })} />
|
||||||
|
<Box>{data.name}</Box>
|
||||||
|
</Box>);
|
||||||
|
};
|
||||||
File diff suppressed because one or more lines are too long
@@ -13,6 +13,7 @@ import { BluespaceArtillery } from './interfaces/BluespaceArtillery';
|
|||||||
import { Bepis } from './interfaces/Bepis';
|
import { Bepis } from './interfaces/Bepis';
|
||||||
import { BorgPanel } from './interfaces/BorgPanel';
|
import { BorgPanel } from './interfaces/BorgPanel';
|
||||||
import { BrigTimer } from './interfaces/BrigTimer';
|
import { BrigTimer } from './interfaces/BrigTimer';
|
||||||
|
import { Canvas } from './interfaces/Canvas';
|
||||||
import { Canister } from './interfaces/Canister';
|
import { Canister } from './interfaces/Canister';
|
||||||
import { Cargo, CargoExpress } from './interfaces/Cargo';
|
import { Cargo, CargoExpress } from './interfaces/Cargo';
|
||||||
import { CellularEmporium } from './interfaces/CellularEmporium';
|
import { CellularEmporium } from './interfaces/CellularEmporium';
|
||||||
@@ -166,6 +167,10 @@ const ROUTES = {
|
|||||||
component: () => BluespaceArtillery,
|
component: () => BluespaceArtillery,
|
||||||
scrollable: false,
|
scrollable: false,
|
||||||
},
|
},
|
||||||
|
canvas: {
|
||||||
|
component: () => Canvas,
|
||||||
|
scrollable: false,
|
||||||
|
},
|
||||||
canister: {
|
canister: {
|
||||||
component: () => Canister,
|
component: () => Canister,
|
||||||
scrollable: false,
|
scrollable: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user