Porting tg painting code. (#12305)

* Porting tg painting code.

* yes.
This commit is contained in:
Ghom
2020-05-21 03:45:36 +02:00
committed by GitHub
parent 6696560656
commit 3ac61c0704
21 changed files with 831 additions and 313 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View File

@@ -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))

View 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)

View File

@@ -248,7 +248,7 @@
description = "<span class='boldwarning'>Something I recently ate was horrifyingly disgusting.</span>\n" description = "<span class='boldwarning'>Something I recently ate was horrifyingly disgusting.</span>\n"
mood_change = -5 mood_change = -5
timeout = 5 MINUTES timeout = 5 MINUTES
/datum/mood_event/nanite_sadness /datum/mood_event/nanite_sadness
description = "<span class='warning robot'>+++++++HAPPINESS SUPPRESSION+++++++</span>\n" description = "<span class='warning robot'>+++++++HAPPINESS SUPPRESSION+++++++</span>\n"
mood_change = -7 mood_change = -7
@@ -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

View File

@@ -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

View File

@@ -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, "")

View File

@@ -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

View File

@@ -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."

View File

@@ -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>")

View File

@@ -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"

View File

@@ -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 ..()

View File

@@ -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

Binary file not shown.

View File

@@ -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"

View 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

View File

@@ -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,