From 53df094bab83cc12295a9bfab96dc509ebde363f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 9 Feb 2021 00:38:53 +0100 Subject: [PATCH] [MIRROR] Add pAI internal GPS to possible software (#3184) * Add pAI internal GPS to possible software (#56404) pAIs are now a useful space travelling companion, they can help you navigate if lost (although only the pAI has the GPS view, so they'll need to communicate the information). If you're holding a GPS, then the pAI can find you even if you get separated. * Add pAI internal GPS to possible software Co-authored-by: coiax --- code/_onclick/hud/_defines.dm | 1 + code/_onclick/hud/pai.dm | 19 ++++++++++++++++++ code/datums/components/gps.dm | 12 ++++++++++- code/game/objects/items/devices/gps.dm | 13 ++++++++++++ code/modules/mob/living/silicon/pai/pai.dm | 6 ++++++ .../mob/living/silicon/pai/software.dm | 9 +++++++++ icons/hud/screen_pai.dmi | Bin 2018 -> 2209 bytes 7 files changed, 59 insertions(+), 1 deletion(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index a3b7a7e3269..47df75473b5 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -164,6 +164,7 @@ #define ui_pai_state_laws "SOUTH:6,WEST+8" #define ui_pai_pda_send "SOUTH:6,WEST+9" #define ui_pai_pda_log "SOUTH:6,WEST+10" +#define ui_pai_internal_gps "SOUTH:6,WEST+11" #define ui_pai_take_picture "SOUTH:6,WEST+12" #define ui_pai_view_images "SOUTH:6,WEST+13" diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm index 86256d9ce0e..9b7016da21a 100644 --- a/code/_onclick/hud/pai.dm +++ b/code/_onclick/hud/pai.dm @@ -136,6 +136,20 @@ var/mob/living/silicon/pai/pAI = usr pAI.cmd_show_message_log(usr) +/atom/movable/screen/pai/internal_gps + name = "Internal GPS" + icon_state = "internal_gps" + required_software = "internal gps" + +/atom/movable/screen/pai/internal_gps/Click() + . = ..() + if(!.) + return + var/mob/living/silicon/pai/pAI = usr + if(!pAI.internal_gps) + pAI.internal_gps = new(pAI) + pAI.internal_gps.attack_self(pAI) + /atom/movable/screen/pai/image_take name = "Take Image" icon_state = "take_picture" @@ -233,6 +247,11 @@ using.screen_loc = ui_pai_pda_log static_inventory += using +// Internal GPS + using = new /atom/movable/screen/pai/internal_gps() + using.screen_loc = ui_pai_internal_gps + static_inventory += using + // Take image using = new /atom/movable/screen/pai/image_take() using.screen_loc = ui_pai_take_picture diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index 433d967bf8e..2c13a6860e3 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -20,11 +20,18 @@ GLOBAL_LIST_EMPTY(GPS_list) /datum/component/gps/item var/updating = TRUE //Automatic updating of GPS list. Can be set to manual by user. var/global_mode = TRUE //If disabled, only GPS signals of the same Z level are shown + /// UI state of GPS, altering when it can be used. + var/datum/ui_state/state = null -/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE) +/datum/component/gps/item/Initialize(_gpstag = "COM0", emp_proof = FALSE, state = null) . = ..() if(. == COMPONENT_INCOMPATIBLE || !isitem(parent)) return COMPONENT_INCOMPATIBLE + + if(isnull(state)) + state = GLOB.default_state + src.state = state + var/atom/A = parent A.add_overlay("working") A.name = "[initial(A.name)] ([gpstag])" @@ -98,6 +105,9 @@ GLOBAL_LIST_EMPTY(GPS_list) ui.open() ui.set_autoupdate(updating) +/datum/component/gps/item/ui_state(mob/user) + return state + /datum/component/gps/item/ui_data(mob/user) var/list/data = list() data["power"] = tracking diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index a7bc794a145..31875ac5a90 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -13,6 +13,10 @@ /obj/item/gps/Initialize() . = ..() + add_gps_component() + +/// Adds the GPS component to this item. +/obj/item/gps/proc/add_gps_component() AddComponent(/datum/component/gps/item, gpstag) /obj/item/gps/spaceruin @@ -45,6 +49,15 @@ gpstag = "MINER" desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life." +/* + * GPS for pAIS, which only allows access if it's contained within the user. + */ +/obj/item/gps/pai + gpstag = "PAI0" + +/obj/item/gps/pai/add_gps_component() + AddComponent(/datum/component/gps/item, gpstag, state = GLOB.inventory_state) + /obj/item/gps/visible_debug name = "visible GPS" gpstag = "ADMIN" diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index f95a1de03ae..92dd0c5066e 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -66,6 +66,9 @@ var/obj/machinery/newscaster //pAI Newscaster var/obj/item/healthanalyzer/hostscan //pAI healthanalyzer + /// Internal pAI GPS, enabled if pAI downloads GPS software, and then uses it. + var/obj/item/gps/pai/internal_gps = null + var/encryptmod = FALSE var/holoform = FALSE var/canholo = TRUE @@ -103,6 +106,8 @@ signaler = null if(A == hostscan) hostscan = null + if(A == internal_gps) + internal_gps = null return ..() /mob/living/silicon/pai/Destroy() @@ -111,6 +116,7 @@ QDEL_NULL(newscaster) QDEL_NULL(signaler) QDEL_NULL(hostscan) + QDEL_NULL(internal_gps) if(!QDELETED(card) && loc != card) card.forceMove(drop_location()) card.pai = null //these are otherwise handled by paicard/handle_atom_del() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 27a354839b1..272f37d4516 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -22,6 +22,7 @@ "security HUD" = 20, "loudness booster" = 20, "newscaster" = 20, + "internal gps" = 35, "door jack" = 25, "encryption keys" = 25, "universal translator" = 35 @@ -283,6 +284,11 @@ if(subscreen == 1) // Open Instrument internal_instrument.interact(src) + if("internalgps") + if(!internal_gps) + internal_gps = new(src) + internal_gps.attack_self(src) + paiInterface() // MENUS @@ -315,6 +321,9 @@ dat += "Remote Signaller
" if(s == "loudness booster") dat += "Loudness Booster
" + if(s == "internal gps") + dat += "Internal GPS
" + dat += "
" // Advanced diff --git a/icons/hud/screen_pai.dmi b/icons/hud/screen_pai.dmi index 4868d26cc081aaeab82c8ea69663fb375c1a943b..a8856712fad410570e88a572aee839e3d5393a49 100644 GIT binary patch delta 2203 zcmV;M2xRx-51|nyiBL{Q4GJ0x0000DNk~Le0002M0001>1Oos70H_9jZU6uP9+4#< zf55=Nv(d;)00001bW%=J06^y0W&i*I0D4qdbVOxyV{&P5bZKvH004NLos+?8!!Qhn z&+$`)_Buwl^}5SwDLt&OV1%Q@VzwMCH=%D|r)7}Af=j`NU*fZVOSaeb*Zy!k)w}Pb z8ZZh4u0QMT>qb>0HOc1S<6Tu2sk7-Ge@KFaS+07Zm8u$wlA||OwGlkt^_}Sm;_(9#1N#}?~7?{JE4SM8- zqs_4Ib}*K^_rTOH&Upqhj$%L(#v*EiB<%xJ3T4<$e{Zx% z5ocotr@Q`v8%5u{te3!by+7@4pXUlPSMc%TPn=}{00$*WL_t(&f$f^ncAGd5hO=+5 z%^P$dp)9Vid%)d$(Af8hWM4NnaGwTv>>UY7j07^a1KpFYbxxc96}IMMq|qD1YjoEAJATS6!M4TLPy(5du)-c-!-ue@3Wu7V6I& ztqE}ILx><}1;8oKUCr}QKjT!VJY}*0W1$={%nt{ixte9cexMrbLRE;WU@QvFA_n+% zg5|D;Jk$@4P6h0R*bB~*5CK3Yo&YjO%YXv?F{3&bvSA7c0aK--pG9nwL&_3Y^CZ~M z9Swr30s30B0+kd?5c5^Ee^Qfy=qQUq{ZZyfSvRx02(?ZUfBo0zUtzo!w~qJr z-?#hu;G*-v%q!W^zmmW|;Y{hv2{JXB_Vd2Kf7G(?znVasN$ux-fB&eZ)z=e%F_YPt zzkd{&tFI^MPAA6C`~Ln>A6~4!njr2%G=ARq_mAM|s|h?mKdG-LaQ*zGzJb8;^OO1p z0>{r!>L}LX#kxOpf3?>?@bi<}oQV@iyIE!yiq>BLz|T+W2)dACG_!Qw813~B{QL#l zEDXJFgsZ*&fuFxXcM;;bDZ4-q{QL#Fix5Q3FVF)&KdnK|C;Sh@x+FFdtu?j%O}@fgbqzNzF*R zK;O>?_clYjpAUYk^MS4Zs*L34BTQxgQR|J@PxaXI9%Uo4vk`XN!;98qPsGj<$Tu!P z2s92MNI^aaJ|0cAHOwP=jDU9+*odIR5l<$<7`XHpFPcDZzqkW1yMItUN&xB#qxHvYBNIk)} z*q_W9Zj^x4gn;p#(JJd*_}1Tp8ej_<$-(weoX!%kf1)Q~auOAmz}REs?=?YL7y>oG zzMdc;vuFom$NE`hj+MsW$MTKF4hJv<1vYhy^m$>NpmuY>`dI|#7-`SJjPvrewKwn5?|LF;Qe;=&`5CR-~+f*mJC&#=xh=XtmdJN1`X#xo~ekx zcOy#sBnJs_4N2zUETVp1&EwbhwOzj&f&(UjAIiGVK{r58fTbWK1na13oOQ5!W7OXd z3C_+URm@VFgP%#&(3R}_dpQrRB@;k@>$skgL|8yEuN&wY4+YWxf0(! zz|=~7_W=J7f-ir4`L-y*w;$hrZ7fQl%ll#kn+xgHqC-_Jn}dDRESm$oMdgwNTTF7fBtfiSzJA~xjYRzM2o^V9 dcYi<8{srPRXJJF%XK(-j002ovPDHLkV1hGzM@Rqw delta 2011 zcmV<12PF8R5#kReiBL{Q4GJ0x0000DNk~Le0001>0001>1Oos70D0kh9smFU8<8a+ ze`PCE_W%F@0d!JMQvg8b*k%9#0QY)SSad{Xb7OL8aCB*JZU6vyoSl=;YQr!L#?SFn znD#nG*Y&!~Xc;}MuV93u)MEY%Zylz$Fkj_r-h6MzRe_ZuIE7i1=xwseAbQuEP^_(#-`P8Kx{)TrY ziXOhF@aE}f{mx(=FcUwXAS26Ty9dJ2P=GTol%F*#@P(!)E0>H_7-CG9Xfa@1INE%S zE&PWmeOjcUUVLI1V_OAp!gv_#-3N%&EzWrcMjY7!3+5{75{n5blB7E9r#D)^e%(b(`wv&BP2)}EEO(6n00weNL_t(&f$f@Ka-%p9#vP8)ojI@nn`^lBK_P_OP_?Fp8ovu*E1`B->;vZ|6%3% ze*N?#V&&z2{q#c!0iZNMCd7-?e@&U8sfSoeDNiT07~vYU)>Q=y5*Anj!c~Xhc5MhZ zHI_3cq=1T9ntE8d2AdvJkdUU)EZs+#C{x5N-Af3vJOLw^qWcL?CC(x-OZO9g?N!AI zj82E@Q?C06GnoUNvMkgp8>*Lz={`cKrBa~MP|I|%9+>VUlz_jkWfp44e}?LT>pnt& zRKEeFftE5Fs*fephEST+Ye!kGGf1QewGxB%ifKa#xY|f)2xGO1RMkt9#JphJwz9Ti*NLcTaib(zkE}FxM-&QM#8RxovItc z)V3bKrQQjIx>N5Yd%i6VFB%W1QqCRy-qvN4-h8k zFKmz2jW)Vl@62lZ`~YFB4>~nO7NOOhdg$n3LalZ$GxQK49xZ?qf8DHm2oq_nh?Fj7 z({vA^MB`BAWUpRk=qUCR(-Ug4HhbLb?aZI5{TW3-;s`Yr42dV0s3UNhh33fSG8z%{ zfX~gz+D}a7a@jr5c;?C45~43o9U=N-iGPLfajLe2petnwW2%=XKVIf&pz+54Kx|8x zP-ls59O+aI`?I8(f25Tsq#(rY*=?!@jg9RwuFAzw&OAa%0dx|-N zuye>XjV&phL!7_s`aOzSN7Iew78~@0ITrJgy@L(>UDxlSR-vXtlqyb}CWh3Y z85HjiEs^tgf8(0&t<^?uffH()Hr~Mo{%%}T@~YEm3p|E4cN}5h@5Z%>C!2?D>UqMz z-;HaEr(&5B&eIEjH?E1$01cf+Lw`4_M>6Tc-;L^#T)*&lqk4?+;Sawm^N>3k4H{ukH7D($G$f_f7dix#`OK26DC0K6_1WE@zzD$ zrt#MyJ95Gp6y0&WJ3`}JRC9AQs-u;LfDrkVq98azFwRB$o1;-J)|wNd5un%2DFQk| z*c7;JR}BGdPBPHj8Vy&g$y6{xbOcnW3s1PM>l*TwX#1rCy*a6ZX>&)y2<;1T>LMW2 zoKOXNe+zocG!~!_*xVoX63U7Zk~v~p(wJ0?P$WB?B-aUL-V&JxnBI`L$vL6B?7m9K zMwLEdpfRRQclPC2_Y+oO46o?u^`ri%Uq6_0=*&Yy$VVBcNua+Z*BwHeD8W25nZ-tR zL`Sa#ShMwzQibI*y?YHZV?a$}{0`-R=?^b*bxP*+&3y33--YfE?fVk*#>9CU zvN1o4*@TJO*zYj8^KgPIbS8eC=M$>@Q0e;Y?-XKlc>j5Bh}`n`aXVpYzqaKG6`HG} ze>fLMPxML8{yRvBA=;eFle;q@!t$UGIwYh%-rM!BCbk-o*#M#J5Q<-Q zeH@G-0qpBKCk`J&T~&vDODMw_MiKUS9vtOFpR4PHm!nJ#ULh=Vb$~M8H-sgIuxeu1 zormZXN{j&h7$$Tdxu39S-j(I~8X?B8e}ep+^BC6cJdDiMp?=iyB0nTOb*Zs(yPOxfy!xxD?l zlFM!C_2)7XCgCUx1)&ad`Es?nj3H)9FsknB81vRcTv%up9p@8vS8N1|I)tmYEeV7@ td&)Yf7w!V!<~Kfz?|OIXhd;c#{0GlQ51tdz_s{?U002ovPDHLkV1j8}(N+Ke