From 58339aaee88a488889a60dc2fbbe5fb3cf0c5810 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Sun, 31 May 2015 09:32:42 -0700 Subject: [PATCH] Malf factory-builder overlay. Added an overlay for the AI when she tries to spawn a robotic factory so the user gets some feedback of where they are building. Fixes numerous exploits to spawn several factories. Fixes tgstation/-tg-station#1259 --- .../gamemodes/malfunction/Malf_Modules.dm | 106 ++++++++++-------- icons/turf/overlays.dmi | Bin 6730 -> 5978 bytes 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index d27cb3d4162..12760904359 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -234,63 +234,71 @@ rcd light flash thingy on matter drain mod_pick_name = "cyborgtransformer" description = "Build a machine anywhere, using expensive nanomachines, that can convert a living human into a loyal cyborg slave when placed inside." cost = 100 - power_type = /mob/living/silicon/ai/proc/place_transformer + var/list/turfOverlays = list() + +/datum/AI_Module/large/place_cyborg_transformer/New() + for(var/i=0;i<3;i++) + var/image/I = image("icon"='icons/turf/overlays.dmi') + turfOverlays += I + ..() /mob/living/silicon/ai/proc/place_transformer() set name = "Place Robotic Factory" set category = "Malfunction" - - if(!eyeobj) + if(!canPlaceTransformer()) return - - if(!isturf(src.loc)) // AI must be in it's core. - return - - var/datum/AI_Module/large/place_cyborg_transformer/PCT = locate() in src.current_modules - if(!PCT) - return - - if(PCT.uses < 1) - src << "Out of uses." - return - - var/sure = alert(src, "Make sure the room it is in is big enough, there is camera vision and that there is a 1x3 area for the machine. Are you sure you want to place the machine here?", "Are you sure?", "Yes", "No") - if(sure != "Yes") - return - - // Make sure there is enough room. - var/turf/middle = get_turf(eyeobj.loc) - var/list/turfs = list(middle, locate(middle.x - 1, middle.y, middle.z), locate(middle.x + 1, middle.y, middle.z)) - - var/alert_msg = "There isn't enough room. Make sure you are placing the machine in a clear area and on a floor." - -/* - var/datum/camerachunk/C = cameranet.getCameraChunk(middle.x, middle.y, middle.z) - if(!C.visibleTurfs[middle]) - alert(src, "We cannot get camera vision of this location.") - return -*/ - for(var/T in turfs) - - // Make sure the turfs are clear and the correct type. - if(!istype(T, /turf/simulated/floor)) - alert(src, alert_msg) + var/sure = alert(src, "Are you sure you want to place the machine here?", "Are you sure?", "Yes", "No") + if(sure == "Yes") + if(!canPlaceTransformer()) return + var/turf/T = get_turf(eyeobj) + new /obj/machinery/transformer/conveyor(T) + playsound(T, 'sound/effects/phasein.ogg', 100, 1) + var/datum/AI_Module/large/place_cyborg_transformer/PCT = locate() in current_modules + PCT.uses -- + can_shunt = 0 + src << "You cannot shunt anymore." - var/turf/simulated/floor/F = T - for(var/atom/movable/AM in F.contents) - if(AM.density) - alert(src, alert_msg) - return - - // All clear, place the transformer - new /obj/machinery/transformer/conveyor(middle) - playsound(middle, 'sound/effects/phasein.ogg', 100, 1) - src.can_shunt = 0 - PCT.uses -= 1 - src << "You cannot shunt anymore." - +/mob/living/silicon/ai/proc/canPlaceTransformer() + if(!eyeobj || !isturf(src.loc)) + return + var/datum/AI_Module/large/place_cyborg_transformer/PCT = locate() in current_modules + if(!PCT || PCT.uses < 1) + alert(src, "Out of uses.") + return + var/turf/middle = get_turf(eyeobj) + var/list/turfs = list(middle, locate(middle.x - 1, middle.y, middle.z), locate(middle.x + 1, middle.y, middle.z)) + var/alert_msg = "There isn't enough room. Make sure you are placing the machine in a clear area and on a floor." + var/success = 1 + if(turfs.len == 3) + for(var/n=1;n<4,n++) + var/fail + var/turf/T = turfs[n] + if(!istype(T, /turf/simulated/floor)) + fail = 1 + var/datum/camerachunk/C = cameranet.getCameraChunk(T.x, T.y, T.z) + if(!C.visibleTurfs[T]) + alert_msg = "We cannot get camera vision of this location." + fail = 1 + for(var/atom/movable/AM in T.contents) + if(AM.density) + fail = 1 + var/image/I = PCT.turfOverlays[n] + I.loc = T + client.images += I + if(fail) + success = 0 + I.icon_state = "redOverlay" + else + I.icon_state = "greenOverlay" + spawn(30) + if(client && (I.loc == T)) + client.images -= I + if(success) + return 1 + alert(src, alert_msg) + return /datum/AI_Module/small/blackout module_name = "Blackout" diff --git a/icons/turf/overlays.dmi b/icons/turf/overlays.dmi index 4a489751273a1d2ff4c2ab211278426d17e8dffd..34819bdca92e3a73ec0acbf07181e50c3a29b910 100644 GIT binary patch literal 5978 zcmV-g7p3TlP)V=-0C=30&pQgkFbsg<**=9x_R`ntr6d#&NsmxOqa>!P4YG;p?K@=Z6las* zL;R}Y*4}LoO=tB&5?%0M;CeV}mEDkLFmO3*HItj>v@S7WA}~-zA2K@O@OoET4Nf8$ zIB7KserTQl?8qU=lgjOmtA2-#J8Ukp8JPm)?}v5+u+H?h#L zL2GFH2Aa<5A1zX>Y=1V3NdN#AXh}ptRCt{2oquo~XL-jzx3_oFT2jxEymlm~7e!cc zz{ZA997No1gCQYdLP=;lEuoOMLz#BkFw<%1K!=iscG@XZrVKM}VFo%4;YZU6Nr4j5 z!IUKd6VsSLY(gxMt#d5@xab@qSts2OUH^FANBe4h^3O=8YV)1h+1+>Fckg}odEV#e zyL+idqw#TI2-pZTfG2_DKpybT`BlIXzy+=VdVpiV!@#Y;<-lgs?pfd~z_q|W;D3Pk znRX8Y_X4L8bO3)JhT$h@5w>sN{=xS4_U$t>Ge4|UDkT8V^YX6i_BxK!U8z(KxUSn< ztJRJHWV6{Vl}hCRfa|)w0ORB1|2=&0;4@pcZhc)>SJ!p5TJ2c5TrPBVbzPUqWCp6$ z>d55eiTK?n*^H2af47WgONSAbi9H=1*RjM?7{ zyaOR_7Wg*sH^A$G^``tO;0A<2J_VG_y#V@v3h-TEM-T)z0>v;4fAFG@@Eqvu?0oC- z{*l zSS$|fH9gMf^SksOp6BJu<#NIEynIJT$DP$`^+(G+-Z;|t+;h(XU=EqFzX;p~bONKm z)j%EiH=uyb@I62cVTLi_N>lfnK$|Ih0`N@z5roldz(JtP)O!JVHNq&*0Mq^b{m$s< z=;Trl+D2br-9Hlbh

JzcWP^!)P6FTVvywYRqqmP(~3 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