Remote Mech Revision (#8903)

The AI can now remotely control mechs in its network. It has one mapped in near its core.
    Messages received by your old body will now reach your VR body (does not affect Skrell Srom).
    Exosuit pilots can now interact with elevator panels without having to get out.
    Robotics and RnD can now create remote controlled mechs. The control centre is in the protolathe, while the exosuit upgrade is in the circuit imprinter.
    Mechs can no longer be dismantled if it has a pilot in it.
    Dismantling a mech now takes a while.
This commit is contained in:
Geeves
2020-05-30 15:20:16 +02:00
committed by GitHub
parent aa39c8ca42
commit 19b1ddb869
37 changed files with 878 additions and 2937 deletions

View File

@@ -236,6 +236,9 @@ var/obj/item/card/id/all_access/ghost_all_access
/mob/living/bot/GetIdCard()
return botcard
/mob/living/simple_animal/spiderbot/GetIdCard()
return internal_id
/mob/living/carbon/human/GetIdCard()
if(wear_id)
var/id = wear_id.GetID()

View File

@@ -341,3 +341,17 @@ for reference:
w_class = 3
kit_product = /obj/machinery/iv_drip
assembly_time = 4 SECONDS
/obj/item/deployable_kit/remote_mech
name = "mech control centre assembly kit"
desc = "A quick assembly kit to put together a mech control centre."
icon = 'icons/obj/storage.dmi'
icon_state = "barrier_kit"
w_class = ITEMSIZE_LARGE
kit_product = /obj/structure/bed/chair/remote/mech/portable
assembly_time = 20 SECONDS
/obj/item/deployable_kit/remote_mech/brig
name = "brig mech control centre assembly kit"
desc = "A quick assembly kit to put together a brig mech control centre."
kit_product = /obj/structure/bed/chair/remote/mech/prison/portable

View File

@@ -162,6 +162,13 @@
open()
return
if(istype(AM, /mob/living/simple_animal/spiderbot))
var/mob/living/simple_animal/spiderbot/bot = AM
if(src.check_access(bot.internal_id))
if(density)
open()
return
if(istype(AM, /obj/structure/bed/chair/wheelchair))
var/obj/structure/bed/chair/wheelchair/wheel = AM
if(density)

View File

@@ -58,13 +58,20 @@
return ..()
/obj/machinery/door/window/CollidedWith(atom/movable/AM as mob|obj)
if (istype(AM, /obj))
if (istype(AM, /mob/living/bot))
var/mob/living/bot/bot = AM
if(istype(bot))
if(density && src.check_access(bot.botcard))
open()
addtimer(CALLBACK(src, .proc/close), 50)
return
if(istype(AM, /mob/living/simple_animal/spiderbot))
var/mob/living/simple_animal/spiderbot/bot = AM
if(istype(bot))
if(density && src.check_access(bot.internal_id))
open()
addtimer(CALLBACK(src, .proc/close), 50)
return
if (!( ROUND_IS_STARTED ))
return
if (src.operating)

View File

@@ -582,7 +582,9 @@
var/mob/living/heavy_vehicle/M = L
if(!M.pilots?.len)
return TURRET_NOT_TARGET
for(var/mob/pilot in M.pilots)
if(allowed(pilot)) // don't shoot if the mech contains at least one person with access
return TURRET_NOT_TARGET
return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee
/obj/machinery/porta_turret/proc/assess_perp(var/mob/living/carbon/human/H)

View File

@@ -55,16 +55,19 @@
/obj/proc/user_buckle_mob(mob/living/M, mob/user)
if(!ROUND_IS_STARTED)
to_chat(user, "<span class='warning'>You can't buckle anyone in before the game starts.</span>")
to_chat(user, SPAN_WARNING("You can't buckle anyone in before the game starts."))
if(!user.Adjacent(M) || user.restrained() || user.stat || istype(user, /mob/living/silicon/pai))
return
if(!M.can_buckle)
to_chat(user, SPAN_WARNING("\The [M] can't be buckled!"))
return
if(M == buckled_mob)
return
if(istype(M, /mob/living/carbon/slime))
to_chat(user, "<span class='warning'>The [M] is too squishy to buckle in.</span>")
to_chat(user, SPAN_WARNING("\The [M] is too squishy to buckle in."))
return
if (buckled_mob)
to_chat(user, "<span class='warning'>[buckled_mob.name] is already there, unbuckle them first!.</span>")
if(buckled_mob)
to_chat(user, SPAN_WARNING("\The [buckled_mob.name] is already there, unbuckle them first!."))
return
add_fingerprint(user)

View File

@@ -2,12 +2,34 @@
name = "virtual reality centre"
desc = "A comfortable chair with full audio-visual transposition centres."
icon_state = "shuttlechair_down"
var/portable = FALSE // can it be moved around 'n shit
var/portable_type
can_dismantle = FALSE
var/list/remote_network // Which network does this remote control belong to?
/obj/structure/bed/chair/remote/Initialize()
. = ..()
if(portable && portable_type)
name = "portable [name]"
/obj/structure/bed/chair/remote/examine(mob/user)
..()
if(portable && portable_type)
to_chat(user, FONT_SMALL(SPAN_NOTICE("Can be packed up by using a wrench on it.")))
/obj/structure/bed/chair/remote/update_icon()
return
/obj/structure/bed/chair/remote/attackby(obj/item/W, mob/user)
if(portable && portable_type && W.iswrench())
user.visible_message(SPAN_NOTICE("\The [user] starts dismantling \the [src]..."), SPAN_NOTICE("You start dismantling \the [src]..."))
if(do_after(user, 20 SECONDS, TRUE, src))
user.visible_message(SPAN_NOTICE("\The [user] dismantles \the [src]."), SPAN_NOTICE("You dismantle \the [src]."))
var/obj/kit = new portable_type(get_turf(src))
user.put_in_hands(kit)
return
..()
/obj/structure/bed/chair/remote/user_buckle_mob(mob/user)
..()
if(ishuman(user))
@@ -19,8 +41,9 @@
// Return to our body in the unfortunate event that we get unbuckled while plugged in
/obj/structure/bed/chair/remote/user_unbuckle_mob(mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.body_return()
cut_overlays()
if(buckled_mob)
var/mob/M = buckled_mob
if(istype(M) && M.vr_mob)
M.vr_mob.body_return()
cut_overlays()
..()

View File

@@ -9,7 +9,15 @@
var/mob/living/carbon/human/H = user
SSvirtualreality.mech_selection(H, remote_network)
/obj/structure/bed/chair/remote/mech/portable
portable = TRUE
portable_type = /obj/item/deployable_kit/remote_mech
/obj/structure/bed/chair/remote/mech/prison
name = "brig mech control centre"
desc = "A comfortable chair with full audio-visual transposition centres. This one gives you access to exosuits attached to the brig network."
remote_network = "prisonmechs"
remote_network = "prisonmechs"
/obj/structure/bed/chair/remote/mech/prison/portable
portable = TRUE
portable_type = /obj/item/deployable_kit/remote_mech/brig