Merge pull request #6964 from Citadel-Station-13/upstream-merge-37695
[MIRROR] AI Multicamera mode
@@ -92691,7 +92691,6 @@
|
|||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/port/aft)
|
/area/maintenance/port/aft)
|
||||||
"dQF" = (
|
"dQF" = (
|
||||||
/obj/machinery/droneDispenser,
|
|
||||||
/obj/effect/decal/cleanable/dirt,
|
/obj/effect/decal/cleanable/dirt,
|
||||||
/obj/effect/turf_decal/bot,
|
/obj/effect/turf_decal/bot,
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||||
"aaa" = (
|
"aaa" = (
|
||||||
/turf/open/space/basic,
|
/turf/open/space/basic,
|
||||||
/area/space)
|
/area/space)
|
||||||
@@ -897,6 +897,13 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/floorgrime,
|
/turf/open/floor/plasteel/floorgrime,
|
||||||
/area/security/prison)
|
/area/security/prison)
|
||||||
|
"acx" = (
|
||||||
|
/obj/machinery/airalarm{
|
||||||
|
dir = 8;
|
||||||
|
pixel_x = 24
|
||||||
|
},
|
||||||
|
/turf/open/floor/plasteel/floorgrime,
|
||||||
|
/area/security/prison)
|
||||||
"acy" = (
|
"acy" = (
|
||||||
/obj/machinery/door/airlock/external{
|
/obj/machinery/door/airlock/external{
|
||||||
name = "Escape Pod Two"
|
name = "Escape Pod Two"
|
||||||
@@ -1042,6 +1049,15 @@
|
|||||||
/obj/machinery/light,
|
/obj/machinery/light,
|
||||||
/turf/open/floor/plasteel/floorgrime,
|
/turf/open/floor/plasteel/floorgrime,
|
||||||
/area/security/prison)
|
/area/security/prison)
|
||||||
|
"acM" = (
|
||||||
|
/obj/structure/table,
|
||||||
|
/obj/item/paper_bin{
|
||||||
|
pixel_x = -3;
|
||||||
|
pixel_y = 7
|
||||||
|
},
|
||||||
|
/obj/item/pen,
|
||||||
|
/turf/open/floor/plasteel/floorgrime,
|
||||||
|
/area/security/prison)
|
||||||
"acN" = (
|
"acN" = (
|
||||||
/obj/structure/table/glass,
|
/obj/structure/table/glass,
|
||||||
/obj/item/reagent_containers/syringe,
|
/obj/item/reagent_containers/syringe,
|
||||||
@@ -6013,6 +6029,11 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/port/fore)
|
/area/maintenance/port/fore)
|
||||||
|
"amU" = (
|
||||||
|
/turf/open/floor/plating{
|
||||||
|
icon_state = "platingdmg2"
|
||||||
|
},
|
||||||
|
/area/maintenance/port)
|
||||||
"amW" = (
|
"amW" = (
|
||||||
/obj/structure/table/reinforced,
|
/obj/structure/table/reinforced,
|
||||||
/obj/item/folder,
|
/obj/item/folder,
|
||||||
@@ -21724,6 +21745,18 @@
|
|||||||
"aUM" = (
|
"aUM" = (
|
||||||
/turf/closed/wall,
|
/turf/closed/wall,
|
||||||
/area/crew_quarters/locker)
|
/area/crew_quarters/locker)
|
||||||
|
"aUN" = (
|
||||||
|
/obj/structure/closet/wardrobe/black,
|
||||||
|
/turf/open/floor/plasteel/vault,
|
||||||
|
/area/crew_quarters/locker)
|
||||||
|
"aUO" = (
|
||||||
|
/obj/structure/closet/wardrobe/grey,
|
||||||
|
/turf/open/floor/plasteel/vault,
|
||||||
|
/area/crew_quarters/locker)
|
||||||
|
"aUP" = (
|
||||||
|
/obj/structure/closet/wardrobe/white,
|
||||||
|
/turf/open/floor/plasteel/vault,
|
||||||
|
/area/crew_quarters/locker)
|
||||||
"aUQ" = (
|
"aUQ" = (
|
||||||
/turf/open/floor/plasteel/vault,
|
/turf/open/floor/plasteel/vault,
|
||||||
/area/crew_quarters/locker)
|
/area/crew_quarters/locker)
|
||||||
@@ -25533,6 +25566,12 @@
|
|||||||
dir = 4
|
dir = 4
|
||||||
},
|
},
|
||||||
/area/security/checkpoint/engineering)
|
/area/security/checkpoint/engineering)
|
||||||
|
"bcO" = (
|
||||||
|
/obj/structure/easel,
|
||||||
|
/turf/open/floor/plating{
|
||||||
|
icon_state = "platingdmg3"
|
||||||
|
},
|
||||||
|
/area/maintenance/starboard/fore)
|
||||||
"bcP" = (
|
"bcP" = (
|
||||||
/obj/machinery/light{
|
/obj/machinery/light{
|
||||||
dir = 8
|
dir = 8
|
||||||
@@ -54314,8 +54353,7 @@
|
|||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/starboard/aft)
|
/area/maintenance/starboard/aft)
|
||||||
"cmb" = (
|
"cmb" = (
|
||||||
/obj/machinery/chem_master/condimaster{
|
/obj/machinery/chem_master{
|
||||||
name = "CondiMaster Neo";
|
|
||||||
pixel_x = -4
|
pixel_x = -4
|
||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
@@ -71412,6 +71450,10 @@
|
|||||||
/obj/structure/easel,
|
/obj/structure/easel,
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/port)
|
/area/maintenance/port)
|
||||||
|
"dbl" = (
|
||||||
|
/obj/structure/easel,
|
||||||
|
/turf/open/floor/plating,
|
||||||
|
/area/maintenance/starboard/aft)
|
||||||
"dbm" = (
|
"dbm" = (
|
||||||
/obj/effect/landmark/event_spawn,
|
/obj/effect/landmark/event_spawn,
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
@@ -76191,14 +76233,6 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/security/prison)
|
/area/security/prison)
|
||||||
"hAJ" = (
|
|
||||||
/obj/machinery/airalarm{
|
|
||||||
dir = 8;
|
|
||||||
pixel_x = 24
|
|
||||||
},
|
|
||||||
/obj/machinery/cryopod,
|
|
||||||
/turf/open/floor/plasteel/floorgrime,
|
|
||||||
/area/security/prison)
|
|
||||||
"ioI" = (
|
"ioI" = (
|
||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||||
dir = 4
|
dir = 4
|
||||||
@@ -76447,10 +76481,6 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/white,
|
/turf/open/floor/plasteel/white,
|
||||||
/area/science/circuit)
|
/area/science/circuit)
|
||||||
"mEW" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plasteel/vault,
|
|
||||||
/area/crew_quarters/locker)
|
|
||||||
"nnK" = (
|
"nnK" = (
|
||||||
/obj/item/stack/sheet/glass/fifty,
|
/obj/item/stack/sheet/glass/fifty,
|
||||||
/obj/item/paper_bin,
|
/obj/item/paper_bin,
|
||||||
@@ -76711,12 +76741,6 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/wood,
|
/turf/open/floor/wood,
|
||||||
/area/library)
|
/area/library)
|
||||||
"rhY" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plating{
|
|
||||||
icon_state = "platingdmg2"
|
|
||||||
},
|
|
||||||
/area/maintenance/port)
|
|
||||||
"rzX" = (
|
"rzX" = (
|
||||||
/obj/structure/chair/office/light{
|
/obj/structure/chair/office/light{
|
||||||
dir = 1;
|
dir = 1;
|
||||||
@@ -76930,15 +76954,6 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
/area/science/misc_lab)
|
/area/science/misc_lab)
|
||||||
"vlg" = (
|
|
||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/green/side,
|
|
||||||
/turf/open/floor/plasteel/neutral/corner{
|
|
||||||
dir = 2
|
|
||||||
},
|
|
||||||
/area/crew_quarters/locker)
|
|
||||||
"vlx" = (
|
"vlx" = (
|
||||||
/obj/machinery/vr_sleeper,
|
/obj/machinery/vr_sleeper,
|
||||||
/turf/open/floor/plasteel/neutral/corner{
|
/turf/open/floor/plasteel/neutral/corner{
|
||||||
@@ -76994,7 +77009,6 @@
|
|||||||
/turf/closed/wall,
|
/turf/closed/wall,
|
||||||
/area/science/circuit)
|
/area/science/circuit)
|
||||||
"wOE" = (
|
"wOE" = (
|
||||||
/obj/machinery/droneDispenser,
|
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/aft)
|
/area/maintenance/aft)
|
||||||
"wPk" = (
|
"wPk" = (
|
||||||
@@ -77083,79 +77097,6 @@
|
|||||||
/obj/machinery/light,
|
/obj/machinery/light,
|
||||||
/turf/open/floor/plasteel/white,
|
/turf/open/floor/plasteel/white,
|
||||||
/area/science/circuit)
|
/area/science/circuit)
|
||||||
"AIY" = (
|
|
||||||
/obj/machinery/computer/cryopod{
|
|
||||||
pixel_y = -24
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/stripes/line{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/box/white/corners,
|
|
||||||
/obj/effect/turf_decal/box/white/corners{
|
|
||||||
dir = 8
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/vault,
|
|
||||||
/area/crew_quarters/locker)
|
|
||||||
"FiY" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plating{
|
|
||||||
icon_state = "platingdmg3"
|
|
||||||
},
|
|
||||||
/area/maintenance/starboard/fore)
|
|
||||||
"KHe" = (
|
|
||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/green/corner{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/neutral/corner{
|
|
||||||
dir = 2
|
|
||||||
},
|
|
||||||
/area/crew_quarters/locker)
|
|
||||||
"RbF" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plating,
|
|
||||||
/area/maintenance/starboard/aft)
|
|
||||||
"SuJ" = (
|
|
||||||
/obj/machinery/cryopod,
|
|
||||||
/obj/effect/turf_decal/stripes/line{
|
|
||||||
dir = 5
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/vault,
|
|
||||||
/area/crew_quarters/locker)
|
|
||||||
"WoM" = (
|
|
||||||
/obj/machinery/cryopod{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/stripes/line{
|
|
||||||
dir = 1
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/vault,
|
|
||||||
/area/crew_quarters/locker)
|
|
||||||
"Xvm" = (
|
|
||||||
/obj/structure/table,
|
|
||||||
/obj/item/paper_bin{
|
|
||||||
pixel_x = -3;
|
|
||||||
pixel_y = 7
|
|
||||||
},
|
|
||||||
/obj/item/pen,
|
|
||||||
/obj/machinery/computer/cryopod{
|
|
||||||
pixel_x = 30;
|
|
||||||
pixel_y = 6
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/floorgrime,
|
|
||||||
/area/security/prison)
|
|
||||||
"XMx" = (
|
|
||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/tile/green/corner,
|
|
||||||
/turf/open/floor/plasteel/neutral/corner{
|
|
||||||
dir = 2
|
|
||||||
},
|
|
||||||
/area/crew_quarters/locker)
|
|
||||||
|
|
||||||
(1,1,1) = {"
|
(1,1,1) = {"
|
||||||
aaa
|
aaa
|
||||||
@@ -95026,7 +94967,7 @@ bHQ
|
|||||||
bvW
|
bvW
|
||||||
bLg
|
bLg
|
||||||
bLf
|
bLf
|
||||||
rhY
|
amU
|
||||||
bPL
|
bPL
|
||||||
alK
|
alK
|
||||||
bOf
|
bOf
|
||||||
@@ -101641,8 +101582,8 @@ aay
|
|||||||
abs
|
abs
|
||||||
abK
|
abK
|
||||||
ace
|
ace
|
||||||
hAJ
|
acx
|
||||||
Xvm
|
acM
|
||||||
abe
|
abe
|
||||||
ady
|
ady
|
||||||
adT
|
adT
|
||||||
@@ -110487,7 +110428,7 @@ cGl
|
|||||||
cHg
|
cHg
|
||||||
cIh
|
cIh
|
||||||
dAh
|
dAh
|
||||||
RbF
|
dbl
|
||||||
dyc
|
dyc
|
||||||
dxQ
|
dxQ
|
||||||
dvY
|
dvY
|
||||||
@@ -110675,8 +110616,8 @@ aOx
|
|||||||
aPJ
|
aPJ
|
||||||
aQT
|
aQT
|
||||||
aOu
|
aOu
|
||||||
XMx
|
aTt
|
||||||
WoM
|
aUN
|
||||||
aUM
|
aUM
|
||||||
aYc
|
aYc
|
||||||
aTC
|
aTC
|
||||||
@@ -110932,8 +110873,8 @@ aOy
|
|||||||
aOt
|
aOt
|
||||||
aQU
|
aQU
|
||||||
aSg
|
aSg
|
||||||
vlg
|
aTt
|
||||||
AIY
|
aUO
|
||||||
aUM
|
aUM
|
||||||
boW
|
boW
|
||||||
aZt
|
aZt
|
||||||
@@ -111189,8 +111130,8 @@ aOz
|
|||||||
aOu
|
aOu
|
||||||
aQV
|
aQV
|
||||||
aOv
|
aOv
|
||||||
KHe
|
aTt
|
||||||
SuJ
|
aUP
|
||||||
aUM
|
aUM
|
||||||
dCD
|
dCD
|
||||||
aZt
|
aZt
|
||||||
@@ -112475,7 +112416,7 @@ aPL
|
|||||||
aQZ
|
aQZ
|
||||||
aSh
|
aSh
|
||||||
aTA
|
aTA
|
||||||
mEW
|
aUT
|
||||||
aUM
|
aUM
|
||||||
aYh
|
aYh
|
||||||
aCM
|
aCM
|
||||||
@@ -118361,7 +118302,7 @@ aaf
|
|||||||
aaf
|
aaf
|
||||||
ack
|
ack
|
||||||
dni
|
dni
|
||||||
FiY
|
bcO
|
||||||
dnS
|
dnS
|
||||||
dnS
|
dnS
|
||||||
dnS
|
dnS
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||||
"aaa" = (
|
"aaa" = (
|
||||||
/turf/open/space/basic,
|
/turf/open/space/basic,
|
||||||
/area/space)
|
/area/space)
|
||||||
@@ -7629,7 +7629,6 @@
|
|||||||
},
|
},
|
||||||
/area/teleporter)
|
/area/teleporter)
|
||||||
"aoJ" = (
|
"aoJ" = (
|
||||||
/obj/machinery/droneDispenser,
|
|
||||||
/obj/effect/turf_decal/stripes/line{
|
/obj/effect/turf_decal/stripes/line{
|
||||||
dir = 10
|
dir = 10
|
||||||
},
|
},
|
||||||
@@ -14629,6 +14628,18 @@
|
|||||||
dir = 5
|
dir = 5
|
||||||
},
|
},
|
||||||
/area/crew_quarters/dorms)
|
/area/crew_quarters/dorms)
|
||||||
|
"aEL" = (
|
||||||
|
/obj/item/twohanded/required/kirbyplants{
|
||||||
|
icon_state = "plant-21"
|
||||||
|
},
|
||||||
|
/obj/machinery/status_display{
|
||||||
|
pixel_y = -32
|
||||||
|
},
|
||||||
|
/obj/effect/turf_decal/bot,
|
||||||
|
/turf/open/floor/plasteel/vault{
|
||||||
|
dir = 5
|
||||||
|
},
|
||||||
|
/area/crew_quarters/dorms)
|
||||||
"aEM" = (
|
"aEM" = (
|
||||||
/obj/structure/closet/crate/bin,
|
/obj/structure/closet/crate/bin,
|
||||||
/obj/effect/turf_decal/bot,
|
/obj/effect/turf_decal/bot,
|
||||||
@@ -35974,16 +35985,6 @@
|
|||||||
dir = 5
|
dir = 5
|
||||||
},
|
},
|
||||||
/area/engine/atmos)
|
/area/engine/atmos)
|
||||||
"ZwS" = (
|
|
||||||
/obj/machinery/status_display{
|
|
||||||
pixel_y = -32
|
|
||||||
},
|
|
||||||
/obj/effect/turf_decal/bot,
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plasteel/vault{
|
|
||||||
dir = 5
|
|
||||||
},
|
|
||||||
/area/crew_quarters/dorms)
|
|
||||||
|
|
||||||
(1,1,1) = {"
|
(1,1,1) = {"
|
||||||
aaa
|
aaa
|
||||||
@@ -72590,7 +72591,7 @@ aAF
|
|||||||
aBO
|
aBO
|
||||||
aCN
|
aCN
|
||||||
aDD
|
aDD
|
||||||
ZwS
|
aEL
|
||||||
awQ
|
awQ
|
||||||
aGz
|
aGz
|
||||||
aGM
|
aGM
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||||
"aaa" = (
|
"aaa" = (
|
||||||
/turf/open/space/basic,
|
/turf/open/space/basic,
|
||||||
/area/space)
|
/area/space)
|
||||||
@@ -3054,6 +3054,10 @@
|
|||||||
},
|
},
|
||||||
/turf/open/space,
|
/turf/open/space,
|
||||||
/area/space/nearstation)
|
/area/space/nearstation)
|
||||||
|
"ajB" = (
|
||||||
|
/obj/item/storage/box/mousetraps,
|
||||||
|
/turf/open/floor/plating,
|
||||||
|
/area/maintenance/department/security/brig)
|
||||||
"ajC" = (
|
"ajC" = (
|
||||||
/obj/structure/chair/stool,
|
/obj/structure/chair/stool,
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
@@ -3448,6 +3452,10 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/department/security/brig)
|
/area/maintenance/department/security/brig)
|
||||||
|
"aks" = (
|
||||||
|
/obj/machinery/light/small,
|
||||||
|
/turf/open/floor/plating,
|
||||||
|
/area/maintenance/department/security/brig)
|
||||||
"akt" = (
|
"akt" = (
|
||||||
/obj/structure/bed,
|
/obj/structure/bed,
|
||||||
/obj/item/bedsheet,
|
/obj/item/bedsheet,
|
||||||
@@ -10349,6 +10357,14 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
/area/hallway/primary/central)
|
/area/hallway/primary/central)
|
||||||
|
"aBK" = (
|
||||||
|
/obj/structure/table,
|
||||||
|
/obj/machinery/light{
|
||||||
|
dir = 4
|
||||||
|
},
|
||||||
|
/obj/item/crowbar,
|
||||||
|
/turf/open/floor/plasteel,
|
||||||
|
/area/hallway/primary/central)
|
||||||
"aBL" = (
|
"aBL" = (
|
||||||
/obj/effect/spawner/structure/window/reinforced,
|
/obj/effect/spawner/structure/window/reinforced,
|
||||||
/obj/machinery/door/poddoor/shutters/preopen{
|
/obj/machinery/door/poddoor/shutters/preopen{
|
||||||
@@ -10422,6 +10438,10 @@
|
|||||||
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
/obj/machinery/atmospherics/components/unary/vent_pump/on,
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
/area/crew_quarters/dorms)
|
/area/crew_quarters/dorms)
|
||||||
|
"aBT" = (
|
||||||
|
/obj/structure/closet/wardrobe/white,
|
||||||
|
/turf/open/floor/plasteel/arrival,
|
||||||
|
/area/crew_quarters/fitness/recreation)
|
||||||
"aBU" = (
|
"aBU" = (
|
||||||
/obj/structure/closet/wardrobe/mixed,
|
/obj/structure/closet/wardrobe/mixed,
|
||||||
/turf/open/floor/plasteel/arrival,
|
/turf/open/floor/plasteel/arrival,
|
||||||
@@ -12047,6 +12067,14 @@
|
|||||||
/obj/machinery/vending/snack,
|
/obj/machinery/vending/snack,
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
/area/hallway/primary/central)
|
/area/hallway/primary/central)
|
||||||
|
"aFD" = (
|
||||||
|
/obj/structure/table,
|
||||||
|
/obj/machinery/light{
|
||||||
|
dir = 4
|
||||||
|
},
|
||||||
|
/obj/item/taperecorder,
|
||||||
|
/turf/open/floor/plasteel,
|
||||||
|
/area/hallway/primary/central)
|
||||||
"aFE" = (
|
"aFE" = (
|
||||||
/obj/structure/cable{
|
/obj/structure/cable{
|
||||||
icon_state = "1-2"
|
icon_state = "1-2"
|
||||||
@@ -12420,6 +12448,13 @@
|
|||||||
/obj/machinery/vending/cigarette,
|
/obj/machinery/vending/cigarette,
|
||||||
/turf/open/floor/plasteel,
|
/turf/open/floor/plasteel,
|
||||||
/area/hallway/primary/central)
|
/area/hallway/primary/central)
|
||||||
|
"aGA" = (
|
||||||
|
/obj/structure/cable{
|
||||||
|
icon_state = "1-2"
|
||||||
|
},
|
||||||
|
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||||
|
/turf/open/floor/plating,
|
||||||
|
/area/storage/emergency/starboard)
|
||||||
"aGB" = (
|
"aGB" = (
|
||||||
/obj/machinery/space_heater,
|
/obj/machinery/space_heater,
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
@@ -21173,7 +21208,6 @@
|
|||||||
},
|
},
|
||||||
/area/maintenance/department/cargo)
|
/area/maintenance/department/cargo)
|
||||||
"bdA" = (
|
"bdA" = (
|
||||||
/obj/machinery/droneDispenser,
|
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/department/cargo)
|
/area/maintenance/department/cargo)
|
||||||
"bdB" = (
|
"bdB" = (
|
||||||
@@ -33115,6 +33149,10 @@
|
|||||||
},
|
},
|
||||||
/turf/open/space/basic,
|
/turf/open/space/basic,
|
||||||
/area/space/nearstation)
|
/area/space/nearstation)
|
||||||
|
"bHP" = (
|
||||||
|
/obj/effect/decal/cleanable/cobweb,
|
||||||
|
/turf/open/floor/plasteel/dark,
|
||||||
|
/area/maintenance/department/engine)
|
||||||
"bHQ" = (
|
"bHQ" = (
|
||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/plasteel/dark,
|
||||||
/area/maintenance/department/engine)
|
/area/maintenance/department/engine)
|
||||||
@@ -43077,6 +43115,19 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/plasteel/dark,
|
||||||
/area/chapel/main/monastery)
|
/area/chapel/main/monastery)
|
||||||
|
"cjO" = (
|
||||||
|
/obj/effect/decal/cleanable/cobweb{
|
||||||
|
icon_state = "cobweb2"
|
||||||
|
},
|
||||||
|
/obj/item/stack/sheet/glass/fifty{
|
||||||
|
layer = 4
|
||||||
|
},
|
||||||
|
/obj/item/stack/sheet/metal{
|
||||||
|
amount = 20;
|
||||||
|
layer = 3.1
|
||||||
|
},
|
||||||
|
/turf/open/floor/plating,
|
||||||
|
/area/maintenance/department/chapel/monastery)
|
||||||
"cjP" = (
|
"cjP" = (
|
||||||
/obj/item/twohanded/required/kirbyplants{
|
/obj/item/twohanded/required/kirbyplants{
|
||||||
icon_state = "plant-22"
|
icon_state = "plant-22"
|
||||||
@@ -47905,7 +47956,6 @@
|
|||||||
/obj/structure/cable{
|
/obj/structure/cable{
|
||||||
icon_state = "1-2"
|
icon_state = "1-2"
|
||||||
},
|
},
|
||||||
/obj/machinery/atmospherics/pipe/simple/general/hidden,
|
|
||||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/maintenance/department/cargo)
|
/area/maintenance/department/cargo)
|
||||||
@@ -48014,16 +48064,6 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/engine/engineering)
|
/area/engine/engineering)
|
||||||
"eWf" = (
|
|
||||||
/obj/machinery/light{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/machinery/cryopod,
|
|
||||||
/obj/machinery/computer/cryopod{
|
|
||||||
pixel_y = 24
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/hallway/primary/central)
|
|
||||||
"eWi" = (
|
"eWi" = (
|
||||||
/obj/structure/reagent_dispensers/fueltank,
|
/obj/structure/reagent_dispensers/fueltank,
|
||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/plasteel/dark,
|
||||||
@@ -50991,11 +51031,6 @@
|
|||||||
/obj/structure/disposalpipe/segment,
|
/obj/structure/disposalpipe/segment,
|
||||||
/turf/open/floor/wood,
|
/turf/open/floor/wood,
|
||||||
/area/lawoffice)
|
/area/lawoffice)
|
||||||
"nSH" = (
|
|
||||||
/obj/effect/decal/cleanable/cobweb,
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/maintenance/department/engine)
|
|
||||||
"nVU" = (
|
"nVU" = (
|
||||||
/obj/item/twohanded/spear,
|
/obj/item/twohanded/spear,
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
@@ -51957,15 +51992,6 @@
|
|||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/crew_quarters/heads/chief)
|
/area/crew_quarters/heads/chief)
|
||||||
"qHi" = (
|
|
||||||
/obj/structure/table,
|
|
||||||
/obj/machinery/light{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/obj/item/crowbar,
|
|
||||||
/obj/item/taperecorder,
|
|
||||||
/turf/open/floor/plasteel,
|
|
||||||
/area/hallway/primary/central)
|
|
||||||
"qHI" = (
|
"qHI" = (
|
||||||
/obj/structure/disposalpipe/segment{
|
/obj/structure/disposalpipe/segment{
|
||||||
dir = 9
|
dir = 9
|
||||||
@@ -52354,7 +52380,7 @@
|
|||||||
width = 9
|
width = 9
|
||||||
},
|
},
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/shuttle/auxillary_base)
|
/area/construction/mining/aux_base)
|
||||||
"rKr" = (
|
"rKr" = (
|
||||||
/obj/structure/cable{
|
/obj/structure/cable{
|
||||||
icon_state = "4-8"
|
icon_state = "4-8"
|
||||||
@@ -53135,7 +53161,7 @@
|
|||||||
/area/construction/mining/aux_base)
|
/area/construction/mining/aux_base)
|
||||||
"uoS" = (
|
"uoS" = (
|
||||||
/turf/open/floor/plating,
|
/turf/open/floor/plating,
|
||||||
/area/shuttle/auxillary_base)
|
/area/construction/mining/aux_base)
|
||||||
"uqJ" = (
|
"uqJ" = (
|
||||||
/obj/effect/spawner/structure/window/reinforced,
|
/obj/effect/spawner/structure/window/reinforced,
|
||||||
/obj/structure/cable,
|
/obj/structure/cable,
|
||||||
@@ -54452,65 +54478,6 @@
|
|||||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||||
/turf/open/floor/plasteel/dark,
|
/turf/open/floor/plasteel/dark,
|
||||||
/area/engine/engineering)
|
/area/engine/engineering)
|
||||||
"yzM" = (
|
|
||||||
/obj/machinery/light/small,
|
|
||||||
/obj/item/storage/box/mousetraps,
|
|
||||||
/turf/open/floor/plating,
|
|
||||||
/area/maintenance/department/security/brig)
|
|
||||||
"Drm" = (
|
|
||||||
/obj/effect/turf_decal/stripes/corner,
|
|
||||||
/turf/open/floor/plasteel/green/corner,
|
|
||||||
/area/hallway/primary/central)
|
|
||||||
"EjC" = (
|
|
||||||
/obj/machinery/cryopod,
|
|
||||||
/turf/open/floor/plasteel/dark,
|
|
||||||
/area/hallway/primary/central)
|
|
||||||
"JAb" = (
|
|
||||||
/obj/structure/cable{
|
|
||||||
icon_state = "1-2"
|
|
||||||
},
|
|
||||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
|
||||||
/obj/item/taperecorder,
|
|
||||||
/turf/open/floor/plating,
|
|
||||||
/area/storage/emergency/starboard)
|
|
||||||
"KhG" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plating,
|
|
||||||
/area/maintenance/department/security/brig)
|
|
||||||
"QYc" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/obj/effect/decal/cleanable/cobweb{
|
|
||||||
icon_state = "cobweb2"
|
|
||||||
},
|
|
||||||
/turf/open/floor/plating,
|
|
||||||
/area/maintenance/department/chapel/monastery)
|
|
||||||
"RST" = (
|
|
||||||
/obj/effect/turf_decal/stripes/line{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/turf/open/floor/plasteel/green/side{
|
|
||||||
dir = 4
|
|
||||||
},
|
|
||||||
/area/hallway/primary/central)
|
|
||||||
"Xmf" = (
|
|
||||||
/obj/item/stack/sheet/metal{
|
|
||||||
amount = 20;
|
|
||||||
layer = 3.1
|
|
||||||
},
|
|
||||||
/obj/item/stack/sheet/glass/fifty{
|
|
||||||
layer = 4
|
|
||||||
},
|
|
||||||
/turf/open/floor/plating,
|
|
||||||
/area/maintenance/department/chapel/monastery)
|
|
||||||
"YSB" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/closed/wall,
|
|
||||||
/area/storage/emergency/starboard)
|
|
||||||
"Zud" = (
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/obj/machinery/vending/kink,
|
|
||||||
/turf/open/floor/plasteel/arrival,
|
|
||||||
/area/crew_quarters/fitness/recreation)
|
|
||||||
|
|
||||||
(1,1,1) = {"
|
(1,1,1) = {"
|
||||||
aaa
|
aaa
|
||||||
@@ -70775,7 +70742,7 @@ aaa
|
|||||||
aaa
|
aaa
|
||||||
ait
|
ait
|
||||||
aiV
|
aiV
|
||||||
KhG
|
ajB
|
||||||
akr
|
akr
|
||||||
aiu
|
aiu
|
||||||
ait
|
ait
|
||||||
@@ -71149,7 +71116,7 @@ cvw
|
|||||||
cvI
|
cvI
|
||||||
ckQ
|
ckQ
|
||||||
clf
|
clf
|
||||||
Xmf
|
cwA
|
||||||
cwA
|
cwA
|
||||||
cwS
|
cwS
|
||||||
cjm
|
cjm
|
||||||
@@ -71290,7 +71257,7 @@ aaa
|
|||||||
aiu
|
aiu
|
||||||
aiX
|
aiX
|
||||||
ajD
|
ajD
|
||||||
yzM
|
aks
|
||||||
aiu
|
aiu
|
||||||
ait
|
ait
|
||||||
ait
|
ait
|
||||||
@@ -71405,7 +71372,7 @@ cgG
|
|||||||
cfn
|
cfn
|
||||||
ciR
|
ciR
|
||||||
cwa
|
cwa
|
||||||
QYc
|
cjO
|
||||||
ckk
|
ckk
|
||||||
ckC
|
ckC
|
||||||
ckR
|
ckR
|
||||||
@@ -75731,7 +75698,7 @@ bDg
|
|||||||
bEj
|
bEj
|
||||||
bFF
|
bFF
|
||||||
bva
|
bva
|
||||||
nSH
|
bHP
|
||||||
bJb
|
bJb
|
||||||
bJb
|
bJb
|
||||||
bJb
|
bJb
|
||||||
@@ -90583,12 +90550,12 @@ awd
|
|||||||
abI
|
abI
|
||||||
awd
|
awd
|
||||||
aAM
|
aAM
|
||||||
qHi
|
aBK
|
||||||
aDa
|
aDa
|
||||||
aEb
|
aEb
|
||||||
Drm
|
aAM
|
||||||
RST
|
aFD
|
||||||
RST
|
aDa
|
||||||
aAN
|
aAN
|
||||||
aIf
|
aIf
|
||||||
aJe
|
aJe
|
||||||
@@ -90844,8 +90811,8 @@ awd
|
|||||||
awd
|
awd
|
||||||
aAN
|
aAN
|
||||||
aAN
|
aAN
|
||||||
eWf
|
awd
|
||||||
EjC
|
awd
|
||||||
aAN
|
aAN
|
||||||
aIg
|
aIg
|
||||||
aJf
|
aJf
|
||||||
@@ -91100,10 +91067,10 @@ aaa
|
|||||||
aaa
|
aaa
|
||||||
aaa
|
aaa
|
||||||
aaa
|
aaa
|
||||||
aAN
|
aaa
|
||||||
aAN
|
aaa
|
||||||
aAN
|
aaa
|
||||||
aAN
|
awd
|
||||||
aHN
|
aHN
|
||||||
aIU
|
aIU
|
||||||
aJI
|
aJI
|
||||||
@@ -92387,7 +92354,7 @@ aDd
|
|||||||
apX
|
apX
|
||||||
aEU
|
aEU
|
||||||
aFE
|
aFE
|
||||||
JAb
|
aGA
|
||||||
aHn
|
aHn
|
||||||
aIi
|
aIi
|
||||||
aJi
|
aJi
|
||||||
@@ -92901,7 +92868,7 @@ com
|
|||||||
apX
|
apX
|
||||||
aET
|
aET
|
||||||
lKL
|
lKL
|
||||||
YSB
|
aET
|
||||||
aET
|
aET
|
||||||
aHN
|
aHN
|
||||||
aIU
|
aIU
|
||||||
@@ -95209,7 +95176,7 @@ axw
|
|||||||
ayu
|
ayu
|
||||||
azC
|
azC
|
||||||
axw
|
axw
|
||||||
Zud
|
aBT
|
||||||
atn
|
atn
|
||||||
aEf
|
aEf
|
||||||
aFc
|
aFc
|
||||||
|
|||||||
@@ -26,6 +26,14 @@
|
|||||||
return
|
return
|
||||||
next_click = world.time + 1
|
next_click = world.time + 1
|
||||||
|
|
||||||
|
if(multicam_on)
|
||||||
|
var/turf/T = get_turf(A)
|
||||||
|
if(T)
|
||||||
|
for(var/obj/screen/movable/pic_in_pic/ai/P in T.vis_locs)
|
||||||
|
if(P.ai == src)
|
||||||
|
P.Click(params)
|
||||||
|
break
|
||||||
|
|
||||||
if(check_click_intercept(params,A))
|
if(check_click_intercept(params,A))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,8 @@
|
|||||||
#define ui_ai_take_picture "SOUTH:6,WEST+12"
|
#define ui_ai_take_picture "SOUTH:6,WEST+12"
|
||||||
#define ui_ai_view_images "SOUTH:6,WEST+13"
|
#define ui_ai_view_images "SOUTH:6,WEST+13"
|
||||||
#define ui_ai_sensor "SOUTH:6,WEST+14"
|
#define ui_ai_sensor "SOUTH:6,WEST+14"
|
||||||
|
#define ui_ai_multicam "SOUTH+1:6,WEST+13"
|
||||||
|
#define ui_ai_add_multicam "SOUTH+1:6,WEST+14"
|
||||||
|
|
||||||
//Pop-up inventory
|
//Pop-up inventory
|
||||||
#define ui_shoes "WEST+1:8,SOUTH:5"
|
#define ui_shoes "WEST+1:8,SOUTH:5"
|
||||||
|
|||||||
@@ -164,6 +164,26 @@
|
|||||||
var/mob/living/silicon/S = usr
|
var/mob/living/silicon/S = usr
|
||||||
S.toggle_sensors()
|
S.toggle_sensors()
|
||||||
|
|
||||||
|
/obj/screen/ai/multicam
|
||||||
|
name = "Multicamera Mode"
|
||||||
|
icon_state = "multicam"
|
||||||
|
|
||||||
|
/obj/screen/ai/multicam/Click()
|
||||||
|
if(..())
|
||||||
|
return
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.toggle_multicam()
|
||||||
|
|
||||||
|
/obj/screen/ai/add_multicam
|
||||||
|
name = "New Camera"
|
||||||
|
icon_state = "new_cam"
|
||||||
|
|
||||||
|
/obj/screen/ai/add_multicam/Click()
|
||||||
|
if(..())
|
||||||
|
return
|
||||||
|
var/mob/living/silicon/ai/AI = usr
|
||||||
|
AI.drop_new_multicam()
|
||||||
|
|
||||||
|
|
||||||
/datum/hud/ai
|
/datum/hud/ai
|
||||||
ui_style_icon = 'icons/mob/screen_ai.dmi'
|
ui_style_icon = 'icons/mob/screen_ai.dmi'
|
||||||
@@ -247,12 +267,20 @@
|
|||||||
using.screen_loc = ui_ai_view_images
|
using.screen_loc = ui_ai_view_images
|
||||||
static_inventory += using
|
static_inventory += using
|
||||||
|
|
||||||
|
|
||||||
//Medical/Security sensors
|
//Medical/Security sensors
|
||||||
using = new /obj/screen/ai/sensors()
|
using = new /obj/screen/ai/sensors()
|
||||||
using.screen_loc = ui_ai_sensor
|
using.screen_loc = ui_ai_sensor
|
||||||
static_inventory += using
|
static_inventory += using
|
||||||
|
|
||||||
|
//Multicamera mode
|
||||||
|
using = new /obj/screen/ai/multicam()
|
||||||
|
using.screen_loc = ui_ai_multicam
|
||||||
|
static_inventory += using
|
||||||
|
|
||||||
|
//Add multicamera camera
|
||||||
|
using = new /obj/screen/ai/add_multicam()
|
||||||
|
using.screen_loc = ui_ai_add_multicam
|
||||||
|
static_inventory += using
|
||||||
|
|
||||||
/mob/living/silicon/ai/create_mob_hud()
|
/mob/living/silicon/ai/create_mob_hud()
|
||||||
if(client && !hud_used)
|
if(client && !hud_used)
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
var/snap2grid = FALSE
|
var/snap2grid = FALSE
|
||||||
var/moved = FALSE
|
var/moved = FALSE
|
||||||
var/locked = FALSE
|
var/locked = FALSE
|
||||||
|
var/x_off = -16
|
||||||
|
var/y_off = -16
|
||||||
|
|
||||||
//Snap Screen Object
|
//Snap Screen Object
|
||||||
//Tied to the grid, snaps to the nearest turf
|
//Tied to the grid, snaps to the nearest turf
|
||||||
@@ -42,8 +44,8 @@
|
|||||||
screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]"
|
screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]"
|
||||||
|
|
||||||
else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off)
|
else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off)
|
||||||
var/pix_X = text2num(screen_loc_X[2]) - 16
|
var/pix_X = text2num(screen_loc_X[2]) + x_off
|
||||||
var/pix_Y = text2num(screen_loc_Y[2]) - 16
|
var/pix_Y = text2num(screen_loc_Y[2]) + y_off
|
||||||
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
|
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
|
||||||
|
|
||||||
moved = screen_loc
|
moved = screen_loc
|
||||||
|
|||||||
@@ -0,0 +1,144 @@
|
|||||||
|
/obj/screen/movable/pic_in_pic
|
||||||
|
name = "Picture-in-picture"
|
||||||
|
screen_loc = "CENTER"
|
||||||
|
plane = GAME_PLANE
|
||||||
|
var/atom/center
|
||||||
|
var/width = 0
|
||||||
|
var/height = 0
|
||||||
|
var/list/shown_to = list()
|
||||||
|
var/list/viewing_turfs = list()
|
||||||
|
var/obj/screen/component_button/button_x
|
||||||
|
var/obj/screen/component_button/button_expand
|
||||||
|
var/obj/screen/component_button/button_shrink
|
||||||
|
|
||||||
|
var/mutable_appearance/standard_background
|
||||||
|
var/const/max_dimensions = 10
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/Initialize()
|
||||||
|
. = ..()
|
||||||
|
make_backgrounds()
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/Destroy()
|
||||||
|
for(var/C in shown_to)
|
||||||
|
unshow_to(C)
|
||||||
|
QDEL_NULL(button_x)
|
||||||
|
QDEL_NULL(button_shrink)
|
||||||
|
QDEL_NULL(button_expand)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/component_click(obj/screen/component_button/component, params)
|
||||||
|
if(component == button_x)
|
||||||
|
qdel(src)
|
||||||
|
else if(component == button_expand)
|
||||||
|
set_view_size(width+1, height+1)
|
||||||
|
else if(component == button_shrink)
|
||||||
|
set_view_size(width-1, height-1)
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/make_backgrounds()
|
||||||
|
standard_background = new /mutable_appearance()
|
||||||
|
standard_background.icon = 'icons/misc/pic_in_pic.dmi'
|
||||||
|
standard_background.icon_state = "background"
|
||||||
|
standard_background.layer = SPACE_LAYER
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/add_buttons()
|
||||||
|
var/static/mutable_appearance/move_tab
|
||||||
|
if(!move_tab)
|
||||||
|
move_tab = new /mutable_appearance()
|
||||||
|
//all these properties are always the same, and since adding something to the overlay
|
||||||
|
//list makes a copy, there is no reason to make a new one each call
|
||||||
|
move_tab.icon = 'icons/misc/pic_in_pic.dmi'
|
||||||
|
move_tab.icon_state = "move"
|
||||||
|
move_tab.plane = HUD_PLANE
|
||||||
|
var/matrix/M = matrix()
|
||||||
|
M.Translate(0, (height + 0.25) * world.icon_size)
|
||||||
|
move_tab.transform = M
|
||||||
|
add_overlay(move_tab)
|
||||||
|
|
||||||
|
if(!button_x)
|
||||||
|
button_x = new /obj/screen/component_button(null, src)
|
||||||
|
var/mutable_appearance/MA = new /mutable_appearance()
|
||||||
|
MA.name = "close"
|
||||||
|
MA.icon = 'icons/misc/pic_in_pic.dmi'
|
||||||
|
MA.icon_state = "x"
|
||||||
|
MA.plane = HUD_PLANE
|
||||||
|
button_x.appearance = MA
|
||||||
|
M = matrix()
|
||||||
|
M.Translate((max(4, width) - 0.75) * world.icon_size, (height + 0.25) * world.icon_size)
|
||||||
|
button_x.transform = M
|
||||||
|
vis_contents += button_x
|
||||||
|
|
||||||
|
if(!button_expand)
|
||||||
|
button_expand = new /obj/screen/component_button(null, src)
|
||||||
|
var/mutable_appearance/MA = new /mutable_appearance()
|
||||||
|
MA.name = "expand"
|
||||||
|
MA.icon = 'icons/misc/pic_in_pic.dmi'
|
||||||
|
MA.icon_state = "expand"
|
||||||
|
MA.plane = HUD_PLANE
|
||||||
|
button_expand.appearance = MA
|
||||||
|
M = matrix()
|
||||||
|
M.Translate(world.icon_size, (height + 0.25) * world.icon_size)
|
||||||
|
button_expand.transform = M
|
||||||
|
vis_contents += button_expand
|
||||||
|
|
||||||
|
if(!button_shrink)
|
||||||
|
button_shrink = new /obj/screen/component_button(null, src)
|
||||||
|
var/mutable_appearance/MA = new /mutable_appearance()
|
||||||
|
MA.name = "shrink"
|
||||||
|
MA.icon = 'icons/misc/pic_in_pic.dmi'
|
||||||
|
MA.icon_state = "shrink"
|
||||||
|
MA.plane = HUD_PLANE
|
||||||
|
button_shrink.appearance = MA
|
||||||
|
M = matrix()
|
||||||
|
M.Translate(2 * world.icon_size, (height + 0.25) * world.icon_size)
|
||||||
|
button_shrink.transform = M
|
||||||
|
vis_contents += button_shrink
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/add_background()
|
||||||
|
if((width > 0) && (height > 0))
|
||||||
|
var/matrix/M = matrix()
|
||||||
|
M.Scale(width + 0.5, height + 0.5)
|
||||||
|
M.Translate((width-1)/2 * world.icon_size, (height-1)/2 * world.icon_size)
|
||||||
|
standard_background.transform = M
|
||||||
|
add_overlay(standard_background)
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE)
|
||||||
|
width = CLAMP(width, 0, max_dimensions)
|
||||||
|
height = CLAMP(height, 0, max_dimensions)
|
||||||
|
src.width = width
|
||||||
|
src.height = height
|
||||||
|
|
||||||
|
y_off = -height * world.icon_size - 16
|
||||||
|
|
||||||
|
cut_overlays()
|
||||||
|
add_background()
|
||||||
|
add_buttons()
|
||||||
|
if(do_refresh)
|
||||||
|
refresh_view()
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE)
|
||||||
|
center = target
|
||||||
|
if(do_refresh)
|
||||||
|
refresh_view()
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/refresh_view()
|
||||||
|
vis_contents -= viewing_turfs
|
||||||
|
if(!width || !height)
|
||||||
|
return
|
||||||
|
var/turf/T = get_turf(center)
|
||||||
|
if(!T)
|
||||||
|
return
|
||||||
|
var/turf/lowerleft = locate(max(1, T.x - round(width/2)), max(1, T.y - round(height/2)), T.z)
|
||||||
|
var/turf/upperright = locate(min(world.maxx, lowerleft.x + width - 1), min(world.maxy, lowerleft.y + height - 1), lowerleft.z)
|
||||||
|
viewing_turfs = block(lowerleft, upperright)
|
||||||
|
vis_contents += viewing_turfs
|
||||||
|
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/show_to(client/C)
|
||||||
|
if(C)
|
||||||
|
shown_to[C] = 1
|
||||||
|
C.screen += src
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/proc/unshow_to(client/C)
|
||||||
|
if(C)
|
||||||
|
shown_to -= C
|
||||||
|
C.screen -= src
|
||||||
@@ -30,6 +30,9 @@
|
|||||||
/obj/screen/orbit()
|
/obj/screen/orbit()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/obj/screen/proc/component_click(obj/screen/component_button/component, params)
|
||||||
|
return
|
||||||
|
|
||||||
/obj/screen/text
|
/obj/screen/text
|
||||||
icon = null
|
icon = null
|
||||||
icon_state = null
|
icon_state = null
|
||||||
@@ -604,3 +607,15 @@
|
|||||||
holder.screen -= src
|
holder.screen -= src
|
||||||
holder = null
|
holder = null
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|
||||||
|
/obj/screen/component_button
|
||||||
|
var/obj/screen/parent
|
||||||
|
|
||||||
|
/obj/screen/component_button/Initialize(mapload, obj/screen/parent)
|
||||||
|
. = ..()
|
||||||
|
src.parent = parent
|
||||||
|
|
||||||
|
/obj/screen/component_button/Click(params)
|
||||||
|
if(parent)
|
||||||
|
parent.component_click(src, params)
|
||||||
|
|||||||
@@ -60,9 +60,6 @@
|
|||||||
user.remote_control = null
|
user.remote_control = null
|
||||||
|
|
||||||
if(!QDELETED(eye))
|
if(!QDELETED(eye))
|
||||||
if(user_good && user.client)
|
|
||||||
for(var/datum/camerachunk/chunk in eye.visibleCameraChunks)
|
|
||||||
chunk.remove(eye)
|
|
||||||
qdel(eye)
|
qdel(eye)
|
||||||
eye = null
|
eye = null
|
||||||
|
|
||||||
@@ -284,7 +281,7 @@
|
|||||||
else
|
else
|
||||||
var/datum/preset_holoimage/H = new preset_image_type
|
var/datum/preset_holoimage/H = new preset_image_type
|
||||||
record.caller_image = H.build_image()
|
record.caller_image = H.build_image()
|
||||||
|
|
||||||
//These build caller image from outfit and some additional data, for use by mappers for ruin holorecords
|
//These build caller image from outfit and some additional data, for use by mappers for ruin holorecords
|
||||||
/datum/preset_holoimage
|
/datum/preset_holoimage
|
||||||
var/nonhuman_mobtype //Fill this if you just want something nonhuman
|
var/nonhuman_mobtype //Fill this if you just want something nonhuman
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
var/alarm_on = FALSE
|
var/alarm_on = FALSE
|
||||||
var/busy = FALSE
|
var/busy = FALSE
|
||||||
var/emped = FALSE //Number of consecutive EMP's on this camera
|
var/emped = FALSE //Number of consecutive EMP's on this camera
|
||||||
|
var/in_use_lights = 0
|
||||||
|
|
||||||
// Upgrades bitflag
|
// Upgrades bitflag
|
||||||
var/upgrades = 0
|
var/upgrades = 0
|
||||||
@@ -285,7 +286,7 @@
|
|||||||
else if (stat & EMPED)
|
else if (stat & EMPED)
|
||||||
icon_state = "[initial(icon_state)]emp"
|
icon_state = "[initial(icon_state)]emp"
|
||||||
else
|
else
|
||||||
icon_state = "[initial(icon_state)]"
|
icon_state = "[initial(icon_state)][in_use_lights ? "_in_use" : ""]"
|
||||||
|
|
||||||
/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1)
|
/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1)
|
||||||
status = !status
|
status = !status
|
||||||
|
|||||||
@@ -190,7 +190,7 @@
|
|||||||
else
|
else
|
||||||
moveToNullspace()
|
moveToNullspace()
|
||||||
if(use_static)
|
if(use_static)
|
||||||
GLOB.cameranet.visibility(src)
|
GLOB.cameranet.visibility(src, GetViewerClient())
|
||||||
if(visible_icon)
|
if(visible_icon)
|
||||||
if(eye_user.client)
|
if(eye_user.client)
|
||||||
eye_user.client.images -= user_image
|
eye_user.client.images -= user_image
|
||||||
|
|||||||
@@ -11,8 +11,6 @@
|
|||||||
layer = LIGHTING_LAYER
|
layer = LIGHTING_LAYER
|
||||||
invisibility = INVISIBILITY_LIGHTING
|
invisibility = INVISIBILITY_LIGHTING
|
||||||
|
|
||||||
blend_mode = BLEND_ADD
|
|
||||||
|
|
||||||
var/needs_update = FALSE
|
var/needs_update = FALSE
|
||||||
var/turf/myturf
|
var/turf/myturf
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
var/nuking = FALSE
|
var/nuking = FALSE
|
||||||
var/obj/machinery/doomsday_device/doomsday_device
|
var/obj/machinery/doomsday_device/doomsday_device
|
||||||
|
|
||||||
var/mob/camera/aiEye/eyeobj = new
|
var/mob/camera/aiEye/eyeobj
|
||||||
var/sprint = 10
|
var/sprint = 10
|
||||||
var/cooldown = 0
|
var/cooldown = 0
|
||||||
var/acceleration = 1
|
var/acceleration = 1
|
||||||
@@ -85,6 +85,13 @@
|
|||||||
var/datum/action/innate/deploy_last_shell/redeploy_action = new
|
var/datum/action/innate/deploy_last_shell/redeploy_action = new
|
||||||
var/chnotify = 0
|
var/chnotify = 0
|
||||||
|
|
||||||
|
var/multicam_allowed = FALSE
|
||||||
|
var/multicam_on = FALSE
|
||||||
|
var/obj/screen/movable/pic_in_pic/ai/master_multicam
|
||||||
|
var/list/multicam_screens = list()
|
||||||
|
var/list/all_eyes = list()
|
||||||
|
var/max_multicams = 6
|
||||||
|
|
||||||
/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
|
/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!target_ai) //If there is no player/brain inside.
|
if(!target_ai) //If there is no player/brain inside.
|
||||||
@@ -116,8 +123,7 @@
|
|||||||
|
|
||||||
job = "AI"
|
job = "AI"
|
||||||
|
|
||||||
eyeobj.ai = src
|
create_eye()
|
||||||
eyeobj.forceMove(src.loc)
|
|
||||||
rename_self("ai")
|
rename_self("ai")
|
||||||
|
|
||||||
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default"))
|
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default"))
|
||||||
@@ -871,9 +877,12 @@
|
|||||||
current = A
|
current = A
|
||||||
if(client)
|
if(client)
|
||||||
if(ismovableatom(A))
|
if(ismovableatom(A))
|
||||||
|
if(A != GLOB.ai_camera_room_landmark)
|
||||||
|
end_multicam()
|
||||||
client.perspective = EYE_PERSPECTIVE
|
client.perspective = EYE_PERSPECTIVE
|
||||||
client.eye = A
|
client.eye = A
|
||||||
else
|
else
|
||||||
|
end_multicam()
|
||||||
if(isturf(loc))
|
if(isturf(loc))
|
||||||
if(eyeobj)
|
if(eyeobj)
|
||||||
client.eye = eyeobj
|
client.eye = eyeobj
|
||||||
@@ -993,3 +1002,11 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(!target_ai)
|
if(!target_ai)
|
||||||
target_ai = src //cheat! just give... ourselves as the spawned AI, because that's technically correct
|
target_ai = src //cheat! just give... ourselves as the spawned AI, because that's technically correct
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/camera_visibility(mob/camera/aiEye/moved_eye)
|
||||||
|
GLOB.cameranet.visibility(moved_eye, client, all_eyes)
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/forceMove(atom/destination)
|
||||||
|
. = ..()
|
||||||
|
if(.)
|
||||||
|
end_multicam()
|
||||||
|
|||||||
@@ -38,29 +38,63 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new)
|
|||||||
|
|
||||||
// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set.
|
// Updates what the aiEye can see. It is recommended you use this when the aiEye moves or it's location is set.
|
||||||
|
|
||||||
/datum/cameranet/proc/visibility(mob/camera/aiEye/ai)
|
/datum/cameranet/proc/visibility(list/moved_eyes, client/C, list/other_eyes)
|
||||||
// 0xf = 15
|
if(!islist(moved_eyes))
|
||||||
var/x1 = max(0, ai.x - 16) & ~(CHUNK_SIZE - 1)
|
moved_eyes = moved_eyes ? list(moved_eyes) : list()
|
||||||
var/y1 = max(0, ai.y - 16) & ~(CHUNK_SIZE - 1)
|
if(islist(other_eyes))
|
||||||
var/x2 = min(world.maxx, ai.x + 16) & ~(CHUNK_SIZE - 1)
|
other_eyes = (other_eyes - moved_eyes)
|
||||||
var/y2 = min(world.maxy, ai.y + 16) & ~(CHUNK_SIZE - 1)
|
else
|
||||||
|
other_eyes = list()
|
||||||
|
|
||||||
var/list/visibleChunks = list()
|
var/list/chunks_pre_seen = list()
|
||||||
|
var/list/chunks_post_seen = list()
|
||||||
|
|
||||||
for(var/x = x1; x <= x2; x += CHUNK_SIZE)
|
for(var/V in moved_eyes)
|
||||||
for(var/y = y1; y <= y2; y += CHUNK_SIZE)
|
var/mob/camera/aiEye/eye = V
|
||||||
visibleChunks |= getCameraChunk(x, y, ai.z)
|
if(C)
|
||||||
|
chunks_pre_seen |= eye.visibleCameraChunks
|
||||||
|
// 0xf = 15
|
||||||
|
var/static_range = eye.static_visibility_range
|
||||||
|
var/x1 = max(0, eye.x - static_range) & ~(CHUNK_SIZE - 1)
|
||||||
|
var/y1 = max(0, eye.y - static_range) & ~(CHUNK_SIZE - 1)
|
||||||
|
var/x2 = min(world.maxx, eye.x + static_range) & ~(CHUNK_SIZE - 1)
|
||||||
|
var/y2 = min(world.maxy, eye.y + static_range) & ~(CHUNK_SIZE - 1)
|
||||||
|
|
||||||
var/list/remove = ai.visibleCameraChunks - visibleChunks
|
var/list/visibleChunks = list()
|
||||||
var/list/add = visibleChunks - ai.visibleCameraChunks
|
|
||||||
|
|
||||||
for(var/chunk in remove)
|
for(var/x = x1; x <= x2; x += CHUNK_SIZE)
|
||||||
var/datum/camerachunk/c = chunk
|
for(var/y = y1; y <= y2; y += CHUNK_SIZE)
|
||||||
c.remove(ai)
|
visibleChunks |= getCameraChunk(x, y, eye.z)
|
||||||
|
|
||||||
for(var/chunk in add)
|
var/list/remove = eye.visibleCameraChunks - visibleChunks
|
||||||
var/datum/camerachunk/c = chunk
|
var/list/add = visibleChunks - eye.visibleCameraChunks
|
||||||
c.add(ai)
|
|
||||||
|
for(var/chunk in remove)
|
||||||
|
var/datum/camerachunk/c = chunk
|
||||||
|
c.remove(eye, FALSE)
|
||||||
|
|
||||||
|
for(var/chunk in add)
|
||||||
|
var/datum/camerachunk/c = chunk
|
||||||
|
c.add(eye, FALSE)
|
||||||
|
|
||||||
|
if(C)
|
||||||
|
chunks_post_seen |= eye.visibleCameraChunks
|
||||||
|
|
||||||
|
if(C)
|
||||||
|
for(var/V in other_eyes)
|
||||||
|
var/mob/camera/aiEye/eye = V
|
||||||
|
chunks_post_seen |= eye.visibleCameraChunks
|
||||||
|
|
||||||
|
var/list/remove = chunks_pre_seen - chunks_post_seen
|
||||||
|
var/list/add = chunks_post_seen - chunks_pre_seen
|
||||||
|
|
||||||
|
for(var/chunk in remove)
|
||||||
|
var/datum/camerachunk/c = chunk
|
||||||
|
C.images -= c.obscured
|
||||||
|
|
||||||
|
for(var/chunk in add)
|
||||||
|
var/datum/camerachunk/c = chunk
|
||||||
|
C.images += c.obscured
|
||||||
|
|
||||||
// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open.
|
// Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open.
|
||||||
|
|
||||||
|
|||||||
@@ -20,10 +20,11 @@
|
|||||||
|
|
||||||
// Add an AI eye to the chunk, then update if changed.
|
// Add an AI eye to the chunk, then update if changed.
|
||||||
|
|
||||||
/datum/camerachunk/proc/add(mob/camera/aiEye/eye)
|
/datum/camerachunk/proc/add(mob/camera/aiEye/eye, add_images = TRUE)
|
||||||
var/client/client = eye.GetViewerClient()
|
if(add_images)
|
||||||
if(client)
|
var/client/client = eye.GetViewerClient()
|
||||||
client.images += obscured
|
if(client)
|
||||||
|
client.images += obscured
|
||||||
eye.visibleCameraChunks += src
|
eye.visibleCameraChunks += src
|
||||||
visible++
|
visible++
|
||||||
seenby += eye
|
seenby += eye
|
||||||
@@ -32,10 +33,11 @@
|
|||||||
|
|
||||||
// Remove an AI eye from the chunk, then update if changed.
|
// Remove an AI eye from the chunk, then update if changed.
|
||||||
|
|
||||||
/datum/camerachunk/proc/remove(mob/camera/aiEye/eye)
|
/datum/camerachunk/proc/remove(mob/camera/aiEye/eye, remove_images = TRUE)
|
||||||
var/client/client = eye.GetViewerClient()
|
if(remove_images)
|
||||||
if(client)
|
var/client/client = eye.GetViewerClient()
|
||||||
client.images -= obscured
|
if(client)
|
||||||
|
client.images -= obscured
|
||||||
eye.visibleCameraChunks -= src
|
eye.visibleCameraChunks -= src
|
||||||
seenby -= eye
|
seenby -= eye
|
||||||
if(visible > 0)
|
if(visible > 0)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
var/mob/living/silicon/ai/ai = null
|
var/mob/living/silicon/ai/ai = null
|
||||||
var/relay_speech = FALSE
|
var/relay_speech = FALSE
|
||||||
var/use_static = TRUE
|
var/use_static = TRUE
|
||||||
|
var/static_visibility_range = 16
|
||||||
|
|
||||||
// Use this when setting the aiEye's location.
|
// Use this when setting the aiEye's location.
|
||||||
// It will also stream the chunk that the new loc is in.
|
// It will also stream the chunk that the new loc is in.
|
||||||
@@ -25,8 +26,8 @@
|
|||||||
else
|
else
|
||||||
moveToNullspace() // ????
|
moveToNullspace() // ????
|
||||||
if(use_static)
|
if(use_static)
|
||||||
GLOB.cameranet.visibility(src)
|
ai.camera_visibility(src)
|
||||||
if(ai.client)
|
if(ai.client && !ai.multicam_on)
|
||||||
ai.client.eye = src
|
ai.client.eye = src
|
||||||
update_parallax_contents()
|
update_parallax_contents()
|
||||||
//Holopad
|
//Holopad
|
||||||
@@ -35,6 +36,8 @@
|
|||||||
H.move_hologram(ai, T)
|
H.move_hologram(ai, T)
|
||||||
if(ai.camera_light_on)
|
if(ai.camera_light_on)
|
||||||
ai.light_cameras()
|
ai.light_cameras()
|
||||||
|
if(ai.master_multicam)
|
||||||
|
ai.master_multicam.refresh_view()
|
||||||
|
|
||||||
/mob/camera/aiEye/Move()
|
/mob/camera/aiEye/Move()
|
||||||
return 0
|
return 0
|
||||||
@@ -45,20 +48,27 @@
|
|||||||
return null
|
return null
|
||||||
|
|
||||||
/mob/camera/aiEye/proc/RemoveImages()
|
/mob/camera/aiEye/proc/RemoveImages()
|
||||||
if(use_static)
|
var/client/C = GetViewerClient()
|
||||||
for(var/datum/camerachunk/chunk in visibleCameraChunks)
|
if(C && use_static)
|
||||||
chunk.remove(src)
|
for(var/V in visibleCameraChunks)
|
||||||
|
var/datum/camerachunk/c = V
|
||||||
|
C.images -= c.obscured
|
||||||
|
|
||||||
/mob/camera/aiEye/Destroy()
|
/mob/camera/aiEye/Destroy()
|
||||||
ai = null
|
if(ai)
|
||||||
|
ai.all_eyes -= src
|
||||||
|
ai = null
|
||||||
|
for(var/V in visibleCameraChunks)
|
||||||
|
var/datum/camerachunk/c = V
|
||||||
|
c.remove(src)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/atom/proc/move_camera_by_click()
|
/atom/proc/move_camera_by_click()
|
||||||
if(isAI(usr))
|
if(isAI(usr))
|
||||||
var/mob/living/silicon/ai/AI = usr
|
var/mob/living/silicon/ai/AI = usr
|
||||||
if(AI.eyeobj && AI.client.eye == AI.eyeobj)
|
if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z))
|
||||||
AI.cameraFollow = null
|
AI.cameraFollow = null
|
||||||
if (isturf(src.loc) || isturf(src))
|
if (isturf(loc) || isturf(src))
|
||||||
AI.eyeobj.setLoc(src)
|
AI.eyeobj.setLoc(src)
|
||||||
|
|
||||||
// This will move the AIEye. It will also cause lights near the eye to light up, if toggled.
|
// This will move the AIEye. It will also cause lights near the eye to light up, if toggled.
|
||||||
@@ -95,12 +105,19 @@
|
|||||||
|
|
||||||
if(!eyeobj || !eyeobj.loc || QDELETED(eyeobj))
|
if(!eyeobj || !eyeobj.loc || QDELETED(eyeobj))
|
||||||
to_chat(src, "ERROR: Eyeobj not found. Creating new eye...")
|
to_chat(src, "ERROR: Eyeobj not found. Creating new eye...")
|
||||||
eyeobj = new(loc)
|
create_eye()
|
||||||
eyeobj.ai = src
|
|
||||||
eyeobj.name = "[src.name] (AI Eye)" // Give it a name
|
|
||||||
|
|
||||||
eyeobj.setLoc(loc)
|
eyeobj.setLoc(loc)
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/create_eye()
|
||||||
|
if(eyeobj)
|
||||||
|
return
|
||||||
|
eyeobj = new /mob/camera/aiEye()
|
||||||
|
all_eyes += eyeobj
|
||||||
|
eyeobj.ai = src
|
||||||
|
eyeobj.setLoc(loc)
|
||||||
|
eyeobj.name = "[name] (AI Eye)"
|
||||||
|
|
||||||
/mob/living/silicon/ai/verb/toggle_acceleration()
|
/mob/living/silicon/ai/verb/toggle_acceleration()
|
||||||
set category = "AI Commands"
|
set category = "AI Commands"
|
||||||
set name = "Toggle Camera Acceleration"
|
set name = "Toggle Camera Acceleration"
|
||||||
|
|||||||
@@ -96,6 +96,7 @@
|
|||||||
|
|
||||||
/mob/living/silicon/ai/proc/start_RestorePowerRoutine()
|
/mob/living/silicon/ai/proc/start_RestorePowerRoutine()
|
||||||
to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.")
|
to_chat(src, "Backup battery online. Scanners, camera, and radio interface offline. Beginning fault-detection.")
|
||||||
|
end_multicam()
|
||||||
sleep(50)
|
sleep(50)
|
||||||
var/turf/T = get_turf(src)
|
var/turf/T = get_turf(src)
|
||||||
var/area/AIarea = get_area(src)
|
var/area/AIarea = get_area(src)
|
||||||
|
|||||||
@@ -4,4 +4,6 @@
|
|||||||
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
for(var/obj/machinery/ai_status_display/O in GLOB.ai_status_displays) //change status
|
||||||
O.mode = 1
|
O.mode = 1
|
||||||
O.emotion = "Neutral"
|
O.emotion = "Neutral"
|
||||||
|
if(multicam_on)
|
||||||
|
end_multicam()
|
||||||
view_core()
|
view_core()
|
||||||
|
|||||||
@@ -0,0 +1,266 @@
|
|||||||
|
//Picture in picture
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai
|
||||||
|
var/mob/living/silicon/ai/ai
|
||||||
|
var/mutable_appearance/highlighted_background
|
||||||
|
var/highlighted = FALSE
|
||||||
|
var/mob/camera/aiEye/pic_in_pic/aiEye
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/Initialize()
|
||||||
|
. = ..()
|
||||||
|
aiEye = new /mob/camera/aiEye/pic_in_pic()
|
||||||
|
aiEye.screen = src
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/Destroy()
|
||||||
|
set_ai(null)
|
||||||
|
QDEL_NULL(aiEye)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/Click()
|
||||||
|
..()
|
||||||
|
if(ai)
|
||||||
|
ai.select_main_multicam_window(src)
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/make_backgrounds()
|
||||||
|
..()
|
||||||
|
highlighted_background = new /mutable_appearance()
|
||||||
|
highlighted_background.icon = 'icons/misc/pic_in_pic.dmi'
|
||||||
|
highlighted_background.icon_state = "background_highlight"
|
||||||
|
highlighted_background.layer = SPACE_LAYER
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/add_background()
|
||||||
|
if((width > 0) && (height > 0))
|
||||||
|
var/matrix/M = matrix()
|
||||||
|
M.Scale(width + 0.5, height + 0.5)
|
||||||
|
M.Translate((width-1)/2 * world.icon_size, (height-1)/2 * world.icon_size)
|
||||||
|
highlighted_background.transform = M
|
||||||
|
standard_background.transform = M
|
||||||
|
add_overlay(highlighted ? highlighted_background : standard_background)
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE)
|
||||||
|
aiEye.static_visibility_range = (round(max(width, height) / 2) + 1)
|
||||||
|
if(ai)
|
||||||
|
ai.camera_visibility(aiEye)
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE)
|
||||||
|
..()
|
||||||
|
aiEye.setLoc(get_turf(target))
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/refresh_view()
|
||||||
|
..()
|
||||||
|
aiEye.setLoc(get_turf(center))
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/proc/highlight()
|
||||||
|
if(highlighted)
|
||||||
|
return
|
||||||
|
highlighted = TRUE
|
||||||
|
cut_overlay(standard_background)
|
||||||
|
add_overlay(highlighted_background)
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/proc/unhighlight()
|
||||||
|
if(!highlighted)
|
||||||
|
return
|
||||||
|
highlighted = FALSE
|
||||||
|
cut_overlay(highlighted_background)
|
||||||
|
add_overlay(standard_background)
|
||||||
|
|
||||||
|
/obj/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai)
|
||||||
|
if(ai)
|
||||||
|
ai.multicam_screens -= src
|
||||||
|
ai.all_eyes -= aiEye
|
||||||
|
if(ai.master_multicam == src)
|
||||||
|
ai.master_multicam = null
|
||||||
|
if(ai.multicam_on)
|
||||||
|
unshow_to(ai.client)
|
||||||
|
ai = new_ai
|
||||||
|
if(new_ai)
|
||||||
|
new_ai.multicam_screens += src
|
||||||
|
ai.all_eyes += aiEye
|
||||||
|
if(new_ai.multicam_on)
|
||||||
|
show_to(new_ai.client)
|
||||||
|
|
||||||
|
//Turf, area, and landmark for the viewing room
|
||||||
|
|
||||||
|
/turf/open/ai_visible
|
||||||
|
name = ""
|
||||||
|
icon = 'icons/misc/pic_in_pic.dmi'
|
||||||
|
icon_state = "room_background"
|
||||||
|
flags_1 = NOJAUNT_1
|
||||||
|
|
||||||
|
/turf/open/ai_visible/Initialize()
|
||||||
|
. = ..()
|
||||||
|
obscured = image(null, src, null)
|
||||||
|
|
||||||
|
/area/ai_multicam_room
|
||||||
|
name = "ai_multicam_room"
|
||||||
|
icon_state = "ai_camera_room"
|
||||||
|
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||||
|
valid_territory = FALSE
|
||||||
|
ambientsounds = list()
|
||||||
|
blob_allowed = FALSE
|
||||||
|
noteleport = TRUE
|
||||||
|
hidden = TRUE
|
||||||
|
safe = TRUE
|
||||||
|
|
||||||
|
GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room)
|
||||||
|
|
||||||
|
/obj/effect/landmark/ai_multicam_room
|
||||||
|
name = "ai camera room"
|
||||||
|
icon = 'icons/mob/landmarks.dmi'
|
||||||
|
icon_state = "x"
|
||||||
|
|
||||||
|
/obj/effect/landmark/ai_multicam_room/Initialize()
|
||||||
|
. = ..()
|
||||||
|
qdel(GLOB.ai_camera_room_landmark)
|
||||||
|
GLOB.ai_camera_room_landmark = src
|
||||||
|
|
||||||
|
/obj/effect/landmark/ai_multicam_room/Destroy()
|
||||||
|
if(GLOB.ai_camera_room_landmark == src)
|
||||||
|
GLOB.ai_camera_room_landmark = null
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
//Dummy camera eyes
|
||||||
|
|
||||||
|
/mob/camera/aiEye/pic_in_pic
|
||||||
|
name = "Secondary AI Eye"
|
||||||
|
var/obj/screen/movable/pic_in_pic/ai/screen
|
||||||
|
var/list/cameras_telegraphed = list()
|
||||||
|
var/telegraph_cameras = TRUE
|
||||||
|
var/telegraph_range = 7
|
||||||
|
|
||||||
|
/mob/camera/aiEye/pic_in_pic/GetViewerClient()
|
||||||
|
if(screen && screen.ai)
|
||||||
|
return screen.ai.client
|
||||||
|
|
||||||
|
/mob/camera/aiEye/pic_in_pic/setLoc(turf/T)
|
||||||
|
if (T)
|
||||||
|
forceMove(T)
|
||||||
|
else
|
||||||
|
moveToNullspace()
|
||||||
|
if(screen && screen.ai)
|
||||||
|
screen.ai.camera_visibility(src)
|
||||||
|
else
|
||||||
|
GLOB.cameranet.visibility(src)
|
||||||
|
update_camera_telegraphing()
|
||||||
|
|
||||||
|
/mob/camera/aiEye/pic_in_pic/proc/update_camera_telegraphing()
|
||||||
|
if(!telegraph_cameras)
|
||||||
|
return
|
||||||
|
var/list/obj/machinery/camera/add = list()
|
||||||
|
var/list/obj/machinery/camera/remove = list()
|
||||||
|
var/list/obj/machinery/camera/visible = list()
|
||||||
|
for (var/VV in visibleCameraChunks)
|
||||||
|
var/datum/camerachunk/CC = VV
|
||||||
|
for (var/V in CC.cameras)
|
||||||
|
var/obj/machinery/camera/C = V
|
||||||
|
if (!C.can_use() || (get_dist(C, src) > telegraph_range))
|
||||||
|
continue
|
||||||
|
visible |= C
|
||||||
|
|
||||||
|
add = visible - cameras_telegraphed
|
||||||
|
remove = cameras_telegraphed - visible
|
||||||
|
|
||||||
|
for (var/V in remove)
|
||||||
|
var/obj/machinery/camera/C = V
|
||||||
|
if(QDELETED(C))
|
||||||
|
continue
|
||||||
|
cameras_telegraphed -= C
|
||||||
|
C.in_use_lights--
|
||||||
|
C.update_icon()
|
||||||
|
for (var/V in add)
|
||||||
|
var/obj/machinery/camera/C = V
|
||||||
|
if(QDELETED(C))
|
||||||
|
continue
|
||||||
|
cameras_telegraphed |= C
|
||||||
|
C.in_use_lights++
|
||||||
|
C.update_icon()
|
||||||
|
|
||||||
|
/mob/camera/aiEye/pic_in_pic/proc/disable_camera_telegraphing()
|
||||||
|
telegraph_cameras = FALSE
|
||||||
|
for (var/V in cameras_telegraphed)
|
||||||
|
var/obj/machinery/camera/C = V
|
||||||
|
if(QDELETED(C))
|
||||||
|
continue
|
||||||
|
C.in_use_lights--
|
||||||
|
C.update_icon()
|
||||||
|
cameras_telegraphed.Cut()
|
||||||
|
|
||||||
|
/mob/camera/aiEye/pic_in_pic/Destroy()
|
||||||
|
disable_camera_telegraphing()
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
//AI procs
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/drop_new_multicam(silent = FALSE)
|
||||||
|
if(!multicam_allowed)
|
||||||
|
if(!silent)
|
||||||
|
to_chat(src, "<span class='warning'>This action is currently disabled. Contact an administrator to enable this feature.</span>")
|
||||||
|
return
|
||||||
|
if(!eyeobj)
|
||||||
|
return
|
||||||
|
if(multicam_screens.len >= max_multicams)
|
||||||
|
if(!silent)
|
||||||
|
to_chat(src, "<span class='warning'>Cannot place more than [max_multicams] multicamera windows.</span>")
|
||||||
|
return
|
||||||
|
var/obj/screen/movable/pic_in_pic/ai/C = new /obj/screen/movable/pic_in_pic/ai()
|
||||||
|
C.set_view_size(3, 3, FALSE)
|
||||||
|
C.set_view_center(get_turf(eyeobj))
|
||||||
|
C.set_ai(src)
|
||||||
|
if(!silent)
|
||||||
|
to_chat(src, "<span class='notice'>Added new multicamera window.</span>")
|
||||||
|
return C
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/toggle_multicam()
|
||||||
|
if(!multicam_allowed)
|
||||||
|
to_chat(src, "<span class='warning'>This action is currently disabled. Contact an administrator to enable this feature.</span>")
|
||||||
|
return
|
||||||
|
if(multicam_on)
|
||||||
|
end_multicam()
|
||||||
|
else
|
||||||
|
start_multicam()
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/start_multicam()
|
||||||
|
if(multicam_on || aiRestorePowerRoutine || !isturf(loc))
|
||||||
|
return
|
||||||
|
if(!GLOB.ai_camera_room_landmark)
|
||||||
|
to_chat(src, "<span class='warning'>This function is not available at this time.</span>")
|
||||||
|
return
|
||||||
|
multicam_on = TRUE
|
||||||
|
refresh_multicam()
|
||||||
|
to_chat(src, "<span class='notice'>Multiple-camera viewing mode activated.</span>")
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/refresh_multicam()
|
||||||
|
reset_perspective(GLOB.ai_camera_room_landmark)
|
||||||
|
if(client)
|
||||||
|
for(var/V in multicam_screens)
|
||||||
|
var/obj/screen/movable/pic_in_pic/P = V
|
||||||
|
P.show_to(client)
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/end_multicam()
|
||||||
|
if(!multicam_on)
|
||||||
|
return
|
||||||
|
multicam_on = FALSE
|
||||||
|
select_main_multicam_window(null)
|
||||||
|
if(client)
|
||||||
|
for(var/V in multicam_screens)
|
||||||
|
var/obj/screen/movable/pic_in_pic/P = V
|
||||||
|
P.unshow_to(client)
|
||||||
|
reset_perspective()
|
||||||
|
to_chat(src, "<span class='notice'>Multiple-camera viewing mode deactivated.</span>")
|
||||||
|
|
||||||
|
|
||||||
|
/mob/living/silicon/ai/proc/select_main_multicam_window(obj/screen/movable/pic_in_pic/ai/P)
|
||||||
|
if(master_multicam == P)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(master_multicam)
|
||||||
|
master_multicam.set_view_center(get_turf(eyeobj), FALSE)
|
||||||
|
master_multicam.unhighlight()
|
||||||
|
master_multicam = null
|
||||||
|
|
||||||
|
if(P)
|
||||||
|
P.highlight()
|
||||||
|
eyeobj.setLoc(get_turf(P.center))
|
||||||
|
P.set_view_center(eyeobj)
|
||||||
|
master_multicam = P
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
@@ -181,6 +181,7 @@
|
|||||||
#include "code\_onclick\hud\monkey.dm"
|
#include "code\_onclick\hud\monkey.dm"
|
||||||
#include "code\_onclick\hud\movable_screen_objects.dm"
|
#include "code\_onclick\hud\movable_screen_objects.dm"
|
||||||
#include "code\_onclick\hud\parallax.dm"
|
#include "code\_onclick\hud\parallax.dm"
|
||||||
|
#include "code\_onclick\hud\picture_in_picture.dm"
|
||||||
#include "code\_onclick\hud\plane_master.dm"
|
#include "code\_onclick\hud\plane_master.dm"
|
||||||
#include "code\_onclick\hud\revenanthud.dm"
|
#include "code\_onclick\hud\revenanthud.dm"
|
||||||
#include "code\_onclick\hud\robot.dm"
|
#include "code\_onclick\hud\robot.dm"
|
||||||
@@ -1949,6 +1950,7 @@
|
|||||||
#include "code\modules\mob\living\silicon\ai\life.dm"
|
#include "code\modules\mob\living\silicon\ai\life.dm"
|
||||||
#include "code\modules\mob\living\silicon\ai\login.dm"
|
#include "code\modules\mob\living\silicon\ai\login.dm"
|
||||||
#include "code\modules\mob\living\silicon\ai\logout.dm"
|
#include "code\modules\mob\living\silicon\ai\logout.dm"
|
||||||
|
#include "code\modules\mob\living\silicon\ai\multicam.dm"
|
||||||
#include "code\modules\mob\living\silicon\ai\say.dm"
|
#include "code\modules\mob\living\silicon\ai\say.dm"
|
||||||
#include "code\modules\mob\living\silicon\ai\vox_sounds.dm"
|
#include "code\modules\mob\living\silicon\ai\vox_sounds.dm"
|
||||||
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
|
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
|
||||||
|
|||||||