From bdb383ae40ef03f9dfaacd98b0d13a2b0bede705 Mon Sep 17 00:00:00 2001 From: Xhuis Date: Sat, 28 Jan 2017 12:10:08 -0500 Subject: [PATCH] Adds AI control beacons for exosuits (Winter Thaw 2017) (#23320) * Adds AI control beacons for exosuits * Diagnostic HUD entry + Design Fix - Adds Diagnostic HUD entries for mecha beacons. (Green for normal, Blue for AI) - Fixes AI beacon research designs to havep roper requirements * Sanity checks for mech hijacking --- code/__DEFINES/atom_hud.dm | 3 +- code/game/data_huds.dm | 15 ++++- code/game/mecha/mecha.dm | 61 +++++++++++++----- code/game/mecha/mecha_actions.dm | 2 +- code/game/mecha/mecha_control_console.dm | 8 +++ code/game/mecha/mecha_defense.dm | 1 + code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 13 +++- .../designs/mechfabricator_designs.dm | 10 +++ icons/mob/hud.dmi | Bin 11940 -> 12158 bytes 10 files changed, 95 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index cb2c3adab5c..ef8a55e7d2e 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -14,8 +14,9 @@ #define DIAG_BATT_HUD "10"// Borg/Mech power meter #define DIAG_MECH_HUD "11"// Mech health bar #define DIAG_BOT_HUD "12"// Bot HUDs +#define DIAG_TRACK_HUD "13"// Mech tracking beacon //for antag huds. these are used at the /mob level -#define ANTAG_HUD "13" +#define ANTAG_HUD "14" //data HUD (medhud, sechud) defines //Don't forget to update human/New() if you change these! diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 4fafd007042..af2a1912730 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -45,7 +45,7 @@ hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD) /datum/atom_hud/data/diagnostic - hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD) + hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_TRACK_HUD) /* MED/SEC/DIAG HUD HOOKS */ @@ -326,6 +326,19 @@ if(internal_damage) holder.icon_state = "hudwarn" +/obj/mecha/proc/diag_hud_set_mechtracking() //Shows tracking beacons on the mech + var/image/holder = hud_list[DIAG_TRACK_HUD] + var/icon/I = icon(icon, icon_state, dir) + holder.pixel_y = I.Height() - world.icon_size + var/new_icon_state //This var exists so that the holder's icon state is set only once in the event of multiple mech beacons. + for(var/obj/item/mecha_parts/mecha_tracking/T in trackers) + if(T.ai_beacon) //Beacon with AI uplink + new_icon_state = "hudtrackingai" + break //Immediately terminate upon finding an AI beacon to ensure it is always shown over the normal one, as mechs can have several trackers. + else + new_icon_state = "hudtracking" + holder.icon_state = new_icon_state + /*~~~~~~~~~ Bots! ~~~~~~~~~~*/ diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index a1ab848cc8d..03eff51f755 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -49,7 +49,6 @@ var/lights_power = 6 var/last_user_hud = 1 // used to show/hide the mecha hud while preserving previous preference - var/bumpsmash = 0 //Whether or not the mech destroys walls by running into it. //inner atmos var/use_internal_tank = 0 @@ -117,7 +116,7 @@ var/occupant_sight_flags = 0 //sight flags to give to the occupant (e.g. mech mining scanner gives meson-like vision) - hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD) + hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) /obj/mecha/New() @@ -142,6 +141,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + diag_hud_set_mechtracking() /obj/mecha/Destroy() @@ -373,6 +373,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + diag_hud_set_mechtracking() /obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. @@ -627,6 +628,21 @@ break //Nothing like a big, red link to make the player feel powerful! user << "ASSUME DIRECT CONTROL?
" + else + examine(user) + if(occupant) + user << "This exosuit has a pilot and cannot be controlled." + return + var/can_control_mech = 0 + for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) + can_control_mech = 1 + user << "\icon[src] Status of [name]:\n\ + [A.get_mecha_info()]" + break + if(!can_control_mech) + user << "You cannot control exosuits without AI control beacons installed." + return + user << "Take control of exosuit?
" /obj/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card) if(!..()) @@ -654,12 +670,13 @@ AI << "You have been downloaded to a mobile storage device. Wireless connection offline." user << "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory." - if(AI_MECH_HACK) //Called by Malf AI mob on the mech. - new /obj/structure/AIcore/deactivated(AI.loc) - if(occupant) //Oh, I am sorry, were you using that? - AI << "Pilot detected! Forced ejection initiated!" - occupant << "You have been forcibly ejected!" - go_out(1) //IT IS MINE, NOW. SUCK IT, RD! + if(AI_MECH_HACK) //Called by AIs on the mech + AI.linked_core = new /obj/structure/AIcore/deactivated(AI.loc) + if(AI.can_dominate_mechs) + if(occupant) //Oh, I am sorry, were you using that? + AI << "Pilot detected! Forced ejection initiated!" + occupant << "You have been forcibly ejected!" + go_out(1) //IT IS MINE, NOW. SUCK IT, RD! ai_enter_mech(AI, interaction) if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech. @@ -693,10 +710,10 @@ AI.remote_control = src AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES. - AI << "[interaction == AI_MECH_HACK ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" \ + AI << "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" \ : "You have been uploaded to a mech's onboard computer."]" AI << "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions." - GrantActions(AI) + GrantActions(AI, !AI.can_dominate_mechs) //An actual AI (simple_animal mecha pilot) entering the mech @@ -916,11 +933,25 @@ var/mob/living/brain/brain = occupant RemoveActions(brain) mob_container = brain.container - else if(isAI(occupant) && forced) //This should only happen if there are multiple AIs in a round, and at least one is Malf. - RemoveActions(occupant) - occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. - occupant = null - return + else if(isAI(occupant)) + var/mob/living/silicon/ai/AI = occupant + if(forced)//This should only happen if there are multiple AIs in a round, and at least one is Malf. + RemoveActions(occupant) + occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced. + occupant = null + return + else + if(!AI.linked_core) + AI << "Inactive core destroyed. Unable to return." + AI.linked_core = null + return + AI << "Returning to core..." + AI.controlled_mech = null + AI.remote_control = null + RemoveActions(occupant, 1) + mob_container = AI + newloc = get_turf(AI.linked_core) + qdel(AI.linked_core) else return var/mob/living/L = occupant diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 869801152e4..9d9505a01ef 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -37,7 +37,7 @@ button_icon_state = "mech_eject" /datum/action/innate/mecha/mech_eject/Activate() - if(!owner || !iscarbon(owner)) + if(!owner) return if(!chassis || chassis.occupant != owner) return diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 2f4eab7b37e..97b3cd959b4 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -68,6 +68,7 @@ icon_state = "motion2" w_class = WEIGHT_CLASS_SMALL origin_tech = "programming=2;magnets=2" + var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking. /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() if(!in_mecha()) @@ -115,6 +116,13 @@ return M.get_log_html() +/obj/item/mecha_parts/mecha_tracking/ai_control + name = "exosuit AI control beacon" + desc = "A device used to transmit exosuit data. Also allows active AI units to take control of said exosuit." + origin_tech = "programming=3;magnets=2;engineering=2" + ai_beacon = TRUE + + /obj/item/weapon/storage/box/mechabeacons name = "exosuit tracking beacons" diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm index 07f71f838ae..2a27a20cde4 100644 --- a/code/game/mecha/mecha_defense.dm +++ b/code/game/mecha/mecha_defense.dm @@ -264,6 +264,7 @@ W.forceMove(src) trackers += W user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") + diag_hud_set_mechtracking() return else return ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 10817470c91..76677b2ac95 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -900,7 +900,7 @@ //Mobs on Fire end // used by secbot and monkeys Crossed -/mob/living/proc/knockOver(var/mob/living/carbon/C) +/mob/living/proc/knockOver(var/mob/living/carbon/C) C.visible_message("[pick( \ "[C] dives out of [src]'s way!", \ "[C] stumbles over [src]!", \ diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f6365f5a23b..c3eea0e6dd2 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -82,6 +82,8 @@ var/list/ai_list = list() var/obj/machinery/camera/portable/builtInCamera + var/obj/structure/AIcore/deactivated/linked_core //For exosuit control + /mob/living/silicon/ai/New(loc, datum/ai_laws/L, mob/target_ai) ..() if(!target_ai) //If there is no player/brain inside. @@ -419,7 +421,16 @@ var/list/ai_list = list() if (href_list["ai_take_control"]) //Mech domination var/obj/mecha/M = locate(href_list["ai_take_control"]) if(controlled_mech) - src << "You are already loaded into an onboard computer!" + src << "You are already loaded into an onboard computer!" + return + if(!cameranet.checkCameraVis(M)) + src << "Exosuit is no longer near active cameras." + return + if(lacks_power()) + src << "You're depowered!" + return + if(!isturf(loc)) + src << "You aren't in your core!" return if(M) M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself. diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 3cf340ba549..6ce54089fea 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -728,6 +728,16 @@ construction_time = 50 category = list("Misc") +/datum/design/mecha_tracking_ai_control + name = "AI Control Beacon" + id = "mecha_tracking_ai_control" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_tracking/ai_control + materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 200) + req_tech = list("programming" = 3, "magnets" = 2, "engineering" = 2) + construction_time = 50 + category = list("Misc") + /datum/design/drone_shell name = "Drone Shell" desc = "A shell of a maintenance drone, an expendable robot built to perform station repairs." diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 105f56cc8ce897030610e27ea9af2aa7383bacac..ce8da26271c3cf0a3a51453159d01150088fd530 100644 GIT binary patch literal 12158 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 M+K)>gJ$v=v05XA%Q2+n{ literal 11940 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 RdLBT(AR2n=r4OFG{U5+wHIe`T