From 8c10df3bd3279bf8070a02d9ea3d80c931d5c219 Mon Sep 17 00:00:00 2001 From: uraniummeltdown Date: Sun, 29 Jan 2017 22:15:16 +0400 Subject: [PATCH] adds AI control beacons to exofab, mechs with these installed can be controlled by any AIs adds diag hud icons for mechs with tracking beacons installed --- code/__DEFINES/hud.dm | 1 + code/game/data_huds.dm | 13 ++- code/game/mecha/mecha.dm | 89 ++++++++++++------ code/game/mecha/mecha_control_console.dm | 63 +++++++++---- code/game/mecha/medical/medical.dm | 2 +- code/game/mecha/working/ripley.dm | 4 +- code/game/mecha/working/working.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 13 ++- .../designs/mechfabricator_designs.dm | 10 ++ icons/mob/hud.dmi | Bin 14069 -> 14239 bytes 10 files changed, 146 insertions(+), 51 deletions(-) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 1d89eea87a1..b4d18509d80 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -25,6 +25,7 @@ #define PLANT_TOXIN_HUD "20"// Toxin level #define PLANT_PEST_HUD "21"// Pest level #define PLANT_WEED_HUD "22"// Weed level +#define DIAG_TRACK_HUD "23"// Mech tracking beacon //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 aae8a668799..52858570527 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -44,7 +44,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) /datum/atom_hud/data/hydroponic hud_icons = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD) @@ -287,6 +287,17 @@ 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/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 b5fcb46b39c..d04b183cf6d 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -50,6 +50,7 @@ var/obj/machinery/atmospherics/unary/portables_connector/connected_port = null var/obj/item/device/radio/radio = null + var/list/trackers = list() var/max_temperature = 25000 var/internal_damage_threshold = 50 //health percentage below which internal damage is possible @@ -74,7 +75,7 @@ var/melee_cooldown = 10 var/melee_can_hit = 1 - 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() ..() @@ -101,6 +102,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + diag_hud_set_mechtracking() //////////////////////// ////// Helpers ///////// @@ -164,7 +166,7 @@ /obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. return -/obj/mecha/hear_talk(mob/M as mob, text) +/obj/mecha/hear_talk(mob/M, text) if(M == occupant && radio.broadcasting) radio.talk_into(M, text) @@ -464,7 +466,7 @@ qdel(src) return -/obj/mecha/attack_hand(mob/living/user as mob) +/obj/mecha/attack_hand(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) log_message("Attack by hand/paw. Attacker - [user].",1) @@ -480,7 +482,7 @@ return -/obj/mecha/attack_alien(mob/living/user as mob) +/obj/mecha/attack_alien(mob/living/user) log_message("Attack by alien. Attacker - [user].",1) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -499,7 +501,7 @@ return -/obj/mecha/attack_animal(mob/living/simple_animal/user as mob) +/obj/mecha/attack_animal(mob/living/simple_animal/user) log_message("Attack by simple animal. Attacker - [user].",1) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) @@ -512,7 +514,7 @@ take_damage(damage) check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) visible_message("[user] [user.attacktext] [src]!") - user.create_attack_log("attacked [src.name]") + user.create_attack_log("attacked [name]") else log_append_to_last("Armor saved.") playsound(loc, 'sound/weapons/slash.ogg', 50, 1, -1) @@ -796,7 +798,9 @@ to_chat(user, "\the [W] is stuck to your hand, you cannot put it in \the [src]") return W.forceMove(src) + trackers += W user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") + diag_hud_set_mechtracking() return else if(istype(W, /obj/item/weapon/paintkit)) @@ -862,20 +866,35 @@ //////////// AI piloting //////////// ///////////////////////////////////// -/obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob) +/obj/mecha/attack_ai(mob/living/silicon/ai/user) if(!isAI(user)) return //Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot. if(user.can_dominate_mechs) examine(user) //Get diagnostic information! - var/obj/item/mecha_parts/mecha_tracking/B = locate(/obj/item/mecha_parts/mecha_tracking) in src - if(B) //Beacons give the AI more detailed mech information. + for(var/obj/item/mecha_parts/mecha_tracking/B in trackers) to_chat(user, "Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:") - to_chat(user, "[B.get_mecha_info()]") + to_chat(user, "[B.get_mecha_info_text()]") + break //Nothing like a big, red link to make the player feel powerful! to_chat(user, "ASSUME DIRECT CONTROL?
") + else + examine(user) + if(occupant) + user << "This exosuit has a pilot and cannot be controlled." + return + var/can_control_mech = FALSE + for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) + can_control_mech = TRUE + to_chat(user, "[bicon(src)] Status of [name]:\n\ + [A.get_mecha_info_text()]") + break + if(!can_control_mech) + to_chat(user, "You cannot control exosuits without AI control beacons installed.") + return + to_chat(user, "Take control of exosuit?
") -/obj/mecha/transfer_ai(var/interaction, mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) +/obj/mecha/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card) if(!..()) return @@ -903,12 +922,13 @@ to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") to_chat(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? - to_chat(AI, "Pilot detected! Forced ejection initiated!") - to_chat(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? + to_chat(AI, "Pilot detected! Forced ejection initiated!") + to_chat(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. @@ -928,7 +948,7 @@ ai_enter_mech(AI, interaction) //Hack and From Card interactions share some code, so leave that here for both to use. -/obj/mecha/proc/ai_enter_mech(var/mob/living/silicon/ai/AI, var/interaction) +/obj/mecha/proc/ai_enter_mech(mob/living/silicon/ai/AI, interaction) AI.aiRestorePowerRoutine = 0 AI.loc = src occupant = AI @@ -941,7 +961,7 @@ 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. - to_chat(AI, "[interaction == AI_MECH_HACK ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ + to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!" \ : "You have been uploaded to a mech's onboard computer."]") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") @@ -1168,7 +1188,7 @@ to_chat(user, "You stop inserting the MMI.") return 0 -/obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) +/obj/mecha/proc/mmi_moved_inside(obj/item/device/mmi/mmi_as_oc,mob/user) if(mmi_as_oc && user in range(1)) if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client) to_chat(user, "Consciousness matrix not detected.") @@ -1235,7 +1255,7 @@ if(occupant && occupant == M) // The occupant exited the mech without calling go_out() go_out(1, newloc) -/obj/mecha/proc/go_out(var/forced, var/atom/newloc = loc) +/obj/mecha/proc/go_out(forced, atom/newloc = loc) if(!occupant) return var/atom/movable/mob_container @@ -1244,15 +1264,29 @@ if(ishuman(occupant)) mob_container = occupant //RemoveActions(occupant, human_occupant=1) - else if(istype(occupant, /mob/living/carbon/brain)) + else if(isbrain(occupant)) var/mob/living/carbon/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 || qdeleted(AI.linked_core)) + to_chat(AI, "Inactive core destroyed. Unable to return.") + AI.linked_core = null + return + to_chat(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 @@ -1435,6 +1469,7 @@ diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() + diag_hud_set_mechtracking() /obj/mecha/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list()) diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 11c940f7971..2bb73e2c636 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -10,10 +10,10 @@ var/screen = 0 var/stored_data -/obj/machinery/computer/mecha/attack_ai(var/mob/user as mob) +/obj/machinery/computer/mecha/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/mecha/attack_hand(var/mob/user as mob) +/obj/machinery/computer/mecha/attack_hand(mob/user) ui_interact(user) /obj/machinery/computer/mecha/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -73,11 +73,12 @@ icon_state = "motion2" w_class = 2 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()) - return 0 - var/obj/mecha/M = src.loc + return FALSE + var/obj/mecha/M = loc var/list/answer[0] answer["reference"] = "\ref[src]" answer["name"] = sanitize(replacetext(M.name,"\"","'")) // Double apostrophes break JSON @@ -101,6 +102,25 @@ return answer +/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info_text() + if(!in_mecha()) + return FALSE + var/obj/mecha/M = loc + var/cell_charge = M.get_charge() + var/area/A = get_area(M) + var/answer = {"Name: [M.name] + Integrity: [M.health/initial(M.health)*100]% + Cell charge: [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"] + Airtank: [M.return_pressure()]kPa + Pilot: [M.occupant||"None"] + Location: [sanitize(A.name)||"Unknown"] + Active equipment: [M.selected||"None"]
"} + if(istype(M, /obj/mecha/working/ripley)) + var/obj/mecha/working/ripley/RM = M + answer += "Used cargo space: [RM.cargo.len/RM.cargo_capacity*100]%
" + + return answer + /obj/item/mecha_parts/mecha_tracking/emp_act() qdel(src) return @@ -110,9 +130,9 @@ return /obj/item/mecha_parts/mecha_tracking/proc/in_mecha() - if(istype(src.loc, /obj/mecha)) - return src.loc - return 0 + if(istype(loc, /obj/mecha)) + return loc + return FALSE /obj/item/mecha_parts/mecha_tracking/proc/shock() var/obj/mecha/M = in_mecha() @@ -121,19 +141,26 @@ qdel(src) /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log() - if(!src.in_mecha()) + if(!in_mecha()) return 0 - var/obj/mecha/M = src.loc + var/obj/mecha/M = loc 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" - New() - ..() - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) - new /obj/item/mecha_parts/mecha_tracking(src) + +/obj/item/weapon/storage/box/mechabeacons/New() + ..() + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) + new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm index ce28687a9e6..8aee3ef1f4c 100644 --- a/code/game/mecha/medical/medical.dm +++ b/code/game/mecha/medical/medical.dm @@ -4,4 +4,4 @@ /obj/mecha/medical/New() ..() - new /obj/item/mecha_parts/mecha_tracking(src) + trackers += new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index f26e34834fb..bb5e0237c9b 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -110,10 +110,10 @@ //Add ore box to cargo cargo.Add(new /obj/structure/ore_box(src)) - //Attach hydrolic clamp + //Attach hydraulic clamp var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp HC.attach(src) - for(var/obj/item/mecha_parts/mecha_tracking/B in contents)//Deletes the beacon so it can't be found easily + for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)//Deletes the beacon so it can't be found easily qdel(B) var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/mining_scanner diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index ccbfe2ef21b..e4c001a508a 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -3,4 +3,4 @@ /obj/mecha/working/New() ..() - new /obj/item/mecha_parts/mecha_tracking(src) + trackers += new /obj/item/mecha_parts/mecha_tracking(src) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 710f8d8dff1..1d6349aff84 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -99,6 +99,8 @@ var/list/ai_verbs_default = list( var/obj/machinery/camera/portable/builtInCamera + var/obj/structure/AIcore/deactivated/linked_core //For exosuit control + var/arrivalmsg = "$name, $rank, has arrived on the station." /mob/living/silicon/ai/proc/add_ai_verbs() @@ -535,7 +537,16 @@ var/list/ai_verbs_default = list( if(href_list["ai_take_control"]) //Mech domination var/obj/mecha/M = locate(href_list["ai_take_control"]) if(controlled_mech) - to_chat(src, "You are already loaded into an onboard computer!") + to_chat(src, "You are already loaded into an onboard computer!") + return + if(!cameranet.checkCameraVis(M)) + to_chat(src, "Exosuit is no longer near active cameras.") + return + if(lacks_power()) + to_chat(src, "You're depowered!") + return + if(!isturf(loc)) + to_chat(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 702afa68f2f..5ea86d2c7a3 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1078,6 +1078,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/ipc_head name = "IPC Head" id = "ipc_head" diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index efff252421bb6071281f2f791c90beed2b9fdff4..1de6fc4ac1d701b471e829a8a2dc5773c9c49f0a 100644 GIT binary patch literal 14239 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 literal 14069 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