Merge pull request #6964 from Citadel-Station-13/upstream-merge-37695

[MIRROR] AI Multicamera mode
This commit is contained in:
LetterJay
2018-06-02 06:13:27 -05:00
committed by GitHub
28 changed files with 3983 additions and 4532 deletions
File diff suppressed because it is too large Load Diff
@@ -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,
+56 -115
View File
@@ -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
+13 -12
View File
@@ -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
+72 -105
View File
@@ -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
File diff suppressed because it is too large Load Diff
+8
View File
@@ -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
+2
View File
@@ -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"
+29 -1
View File
@@ -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)
+4 -2
View File
@@ -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
+144
View File
@@ -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
+15
View File
@@ -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)
-3
View File
@@ -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
+2 -1
View File
@@ -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
-2
View File
@@ -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
+20 -3
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

+2
View File
@@ -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"