diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 12404d0574e..614f4d8f53f 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -203,6 +203,10 @@ var/emotion = "Neutral" +/obj/machinery/ai_status_display/attack_ai(mob/living/silicon/ai/user) + if(isAI(user)) + user.ai_statuschange() + /obj/machinery/ai_status_display/process() if(stat & NOPOWER) overlays.Cut() diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 4d7e1011686..3269cf146c5 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -10,10 +10,10 @@ species_restricted = list("exclude", "Diona", "Wryn") species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Drask" = 'icons/mob/species/drask/helmet.dmi' + "Vox" = 'icons/mob/species/vox/helmet.dmi' ) -/obj/item/clothing/head/helmet/space/capspace/equipped(var/mob/living/carbon/human/user, var/slot) + +/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot) if(ishuman(user) && slot == slot_head) if(user.species.name == "Vox") if(flags & BLOCKHAIR) @@ -33,11 +33,9 @@ species_restricted = list("exclude", "Diona", "Wryn") species_fit = list("Vox") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi', - "Drask" = 'icons/mob/species/drask/suit.dmi' + "Vox" = 'icons/mob/species/vox/suit.dmi' ) - //Deathsquad space suit, not hardsuits because no flashlight! /obj/item/clothing/head/helmet/space/deathsquad name = "deathsquad helmet" @@ -106,7 +104,6 @@ flags_size = ONESIZEFITSALL allowed = list(/obj/item) //for stuffing exta special presents - //Space pirate outfit /obj/item/clothing/head/helmet/space/pirate name = "pirate hat" @@ -136,12 +133,22 @@ desc = "A paramedic EVA helmet. Used in the recovery of bodies from space." icon_state = "paramedic-eva-helmet" item_state = "paramedic-eva-helmet" + species_restricted = list("exclude","Diona","Wryn") + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/helmet.dmi' + ) /obj/item/clothing/suit/space/eva/paramedic name = "Paramedic EVA suit" icon_state = "paramedic-eva" item_state = "paramedic-eva" desc = "A paramedic EVA suit. Used in the recovery of bodies from space." + species_restricted = list("exclude","Diona","Wryn") + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) /obj/item/clothing/suit/space/eva name = "EVA suit" @@ -207,4 +214,4 @@ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT unacidable = 1 - strip_delay = 130 \ No newline at end of file + strip_delay = 130 diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 44a2f5b1c49..cae5fbd28f0 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -74,6 +74,10 @@ strip_delay = 70 put_on_delay = 70 burn_state = FIRE_PROOF + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) /obj/item/clothing/suit/bomb_suit name = "bomb suit" @@ -99,17 +103,20 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) - hide_tail_by_species = list("Vox") /obj/item/clothing/head/bomb_hood/security icon_state = "bombsuitsec" item_state = "bombsuitsec" + species_fit = null + sprite_sheets = null /obj/item/clothing/suit/bomb_suit/security icon_state = "bombsuitsec" item_state = "bombsuitsec" allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs) + species_fit = null + sprite_sheets = null /* * Radiation protection @@ -123,6 +130,10 @@ strip_delay = 60 put_on_delay = 60 burn_state = FIRE_PROOF + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/head.dmi' + ) /obj/item/clothing/suit/radiation name = "Radiation suit" @@ -140,4 +151,8 @@ flags_inv = HIDEJUMPSUIT|HIDETAIL strip_delay = 60 put_on_delay = 60 - burn_state = FIRE_PROOF \ No newline at end of file + burn_state = FIRE_PROOF + species_fit = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/suit.dmi' + ) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 44bb237848a..3235c6899c1 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -104,12 +104,12 @@ var/list/ai_verbs_default = list( var/arrivalmsg = "$name, $rank, has arrived on the station." /mob/living/silicon/ai/proc/add_ai_verbs() - src.verbs |= ai_verbs_default - src.verbs |= silicon_subsystems + verbs |= ai_verbs_default + verbs |= silicon_subsystems /mob/living/silicon/ai/proc/remove_ai_verbs() - src.verbs -= ai_verbs_default - src.verbs -= silicon_subsystems + verbs -= ai_verbs_default + verbs -= silicon_subsystems /mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0) announcement = new() @@ -156,7 +156,7 @@ var/list/ai_verbs_default = list( aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src) - if(istype(loc, /turf)) + if(isturf(loc)) add_ai_verbs(src) //Languages @@ -228,7 +228,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/rename_character(oldname, newname) if(!..(oldname, newname)) - return 0 + return FALSE if(oldname != real_name) announcement.announcer = name @@ -240,7 +240,7 @@ var/list/ai_verbs_default = list( if(aiPDA) aiPDA.set_name_and_job(newname, "AI") - return 1 + return TRUE /mob/living/silicon/ai/Destroy() ai_list -= src @@ -263,7 +263,7 @@ var/list/ai_verbs_default = list( var/mob/living/silicon/ai/powered_ai = null invisibility = 100 -/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null) +/obj/machinery/ai_powersupply/New(mob/living/silicon/ai/ai=null) powered_ai = ai if(isnull(powered_ai)) qdel(src) @@ -309,31 +309,83 @@ var/list/ai_verbs_default = list( //if(icon_state == initial(icon_state)) var/icontype = "" - if(custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available - else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT") + if(custom_sprite == 1) + icontype = ("Custom")//automagically selects custom sprite if one is available + else + icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT", "NT2", "Rainbow", "Angel", "Heartline", "Hades", "Helios", "Syndicat Meow", "Too Deep", "Goon", "Murica", "Fuzzy", "Glitchman", "House", "Database") switch(icontype) - if("Custom") icon_state = "[ckey]-ai" - if("Clown") icon_state = "ai-clown2" - if("Monochrome") icon_state = "ai-mono" - if("Inverted") icon_state = "ai-u" - if("Firewall") icon_state = "ai-magma" - if("Green") icon_state = "ai-wierd" - if("Red") icon_state = "ai-red" - if("Static") icon_state = "ai-static" - if("Text") icon_state = "ai-text" - if("Smiley") icon_state = "ai-smiley" - if("Matrix") icon_state = "ai-matrix" - if("Angry") icon_state = "ai-angryface" - if("Dorf") icon_state = "ai-dorf" - if("Bliss") icon_state = "ai-bliss" - if("Triumvirate") icon_state = "ai-triumvirate" - if("Triumvirate Static") icon_state = "ai-triumvirate-malf" - if("Red October") icon_state = "ai-redoctober" - if("Sparkles") icon_state = "ai-sparkles" - if("ANIMA") icon_state = "ai-anima" - if("President") icon_state = "ai-president" - if("NT") icon_state = "ai-nt" - else icon_state = "ai" + if("Custom") + icon_state = "[ckey]-ai" + if("Clown") + icon_state = "ai-clown" + if("Monochrome") + icon_state = "ai-mono" + if("Inverted") + icon_state = "ai-u" + if("Firewall") + icon_state = "ai-magma" + if("Green") + icon_state = "ai-weird" + if("Red") + icon_state = "ai-red" + if("Static") + icon_state = "ai-static" + if("Text") + icon_state = "ai-text" + if("Smiley") + icon_state = "ai-smiley" + if("Matrix") + icon_state = "ai-matrix" + if("Angry") + icon_state = "ai-angryface" + if("Dorf") + icon_state = "ai-dorf" + if("Bliss") + icon_state = "ai-bliss" + if("Triumvirate") + icon_state = "ai-triumvirate" + if("Triumvirate Static") + icon_state = "ai-triumvirate-malf" + if("Red October") + icon_state = "ai-redoctober" + if("Sparkles") + icon_state = "ai-sparkles" + if("ANIMA") + icon_state = "ai-anima" + if("President") + icon_state = "ai-president" + if("NT") + icon_state = "ai-nt" + if("NT2") + icon_state = "ai-nanotrasen" + if("Rainbow") + icon_state = "ai-rainbow" + if("Angel") + icon_state = "ai-angel" + if("Heartline") + icon_state = "ai-heartline" + if("Hades") + icon_state = "ai-hades" + if("Helios") + icon_state = "ai-helios" + if("Syndicat Meow") + icon_state = "ai-syndicatmeow" + if("Too Deep") + icon_state = "ai-toodeep" + if("Goon") + icon_state = "ai-goon" + if("Murica") + icon_state = "ai-murica" + if("Fuzzy") + icon_state = "ai-fuzz" + if("Glitchman") + icon_state = "ai-glitchman" + if("House") + icon_state = "ai-house" + if("Database") + icon_state = "ai-database" + else + icon_state = "ai" //else // to_chat(usr, "You can only change your display once!") //return @@ -402,7 +454,7 @@ var/list/ai_verbs_default = list( cancel_call_proc(src) /mob/living/silicon/ai/cancel_camera() - src.view_core() + view_core() /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" @@ -416,7 +468,7 @@ var/list/ai_verbs_default = list( to_chat(src, "[anchored ? "You are now anchored." : "You are now unanchored."]") /mob/living/silicon/ai/update_canmove() - return 0 + return FALSE /mob/living/silicon/ai/proc/announcement() set name = "Announcement" @@ -428,21 +480,21 @@ var/list/ai_verbs_default = list( ai_announcement() -/mob/living/silicon/ai/check_eye(var/mob/user as mob) +/mob/living/silicon/ai/check_eye(mob/user) if(!current) return null user.reset_perspective(current) - return 1 + return TRUE /mob/living/silicon/ai/blob_act() if(stat != 2) adjustBruteLoss(60) updatehealth() - return 1 - return 0 + return TRUE + return FALSE /mob/living/silicon/ai/restrained() - return 0 + return FALSE /mob/living/silicon/ai/emp_act(severity) if(prob(30)) @@ -518,7 +570,7 @@ var/list/ai_verbs_default = list( if(href_list["callbot"]) //Command a bot to move to a selected location. Bot = locate(href_list["callbot"]) in simple_animal_list - if(!Bot || Bot.remote_disabled || src.control_disabled) + if(!Bot || Bot.remote_disabled || control_disabled) return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off. waypoint_mode = 1 to_chat(src, "Set your waypoint by clicking on a valid location free of obstructions.") @@ -526,7 +578,7 @@ var/list/ai_verbs_default = list( if(href_list["interface"]) //Remotely connect to a bot! Bot = locate(href_list["interface"]) in simple_animal_list - if(!Bot || Bot.remote_disabled || src.control_disabled) + if(!Bot || Bot.remote_disabled || control_disabled) return Bot.attack_ai(src) @@ -561,7 +613,7 @@ var/list/ai_verbs_default = list( if(usr.machine == null) usr.machine = usr - while(src.cameraFollow == target) + while(cameraFollow == target) to_chat(usr, "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb).") sleep(40) continue @@ -576,12 +628,12 @@ var/list/ai_verbs_default = list( return 2 -/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob) +/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) if(!ticker) to_chat(M, "You cannot attack people before the game has started.") return - if(istype(loc, /turf) && istype(loc.loc, /area/start)) + if(isturf(loc) && istype(loc.loc, /area/start)) to_chat(M, "No attacking people at spawn, you jackass.") return @@ -606,7 +658,7 @@ var/list/ai_verbs_default = list( return -/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M as mob) +/mob/living/silicon/ai/attack_animal(mob/living/simple_animal/M) if(M.melee_damage_upper == 0) M.custom_emote(1, "[M.friendly] [src]") else @@ -664,7 +716,7 @@ var/list/ai_verbs_default = list( popup.set_content(d) popup.open() -/mob/living/silicon/ai/proc/set_waypoint(var/atom/A) +/mob/living/silicon/ai/proc/set_waypoint(atom/A) var/turf/turf_check = get_turf(A) //The target must be in view of a camera or near the core. if(turf_check in range(get_turf(src))) @@ -674,7 +726,7 @@ var/list/ai_verbs_default = list( else to_chat(src, "Selected location is not visible.") -/mob/living/silicon/ai/proc/call_bot(var/turf/waypoint) +/mob/living/silicon/ai/proc/call_bot(turf/waypoint) if(!Bot) return @@ -685,22 +737,22 @@ var/list/ai_verbs_default = list( Bot.call_bot(src, waypoint) -/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C) +/mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C) if(!tracking) cameraFollow = null if(!C || stat == DEAD) //C.can_use()) - return 0 + return FALSE - if(!src.eyeobj) + if(!eyeobj) view_core() return // ok, we're alive, camera is good and in our network... eyeobj.setLoc(get_turf(C)) //machine = src - return 1 + return TRUE //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead @@ -931,7 +983,7 @@ var/list/ai_verbs_default = list( set category = "Malfunction" set name = "Return to Main Core" - var/obj/machinery/power/apc/apc = src.loc + var/obj/machinery/power/apc/apc = loc if(!istype(apc)) to_chat(src, "\blue You are already in your Main Core.") return @@ -1005,7 +1057,7 @@ var/list/ai_verbs_default = list( lit_cameras |= C -/mob/living/silicon/ai/attackby(obj/item/weapon/W as obj, mob/user as mob, params) +/mob/living/silicon/ai/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/wrench)) if(anchored) user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...") @@ -1036,14 +1088,15 @@ var/list/ai_verbs_default = list( return to_chat(src, "Accessing Subspace Transceiver control...") - if(src.aiRadio) - src.aiRadio.interact(src) + if(aiRadio) + aiRadio.interact(src) -/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target as mob) - if(!istype(target)) return +/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target) + if(!istype(target)) + return spawn(0) - if(istype(target, /mob/living/carbon/human)) + if(ishuman(target)) var/mob/living/carbon/human/H = target var/obj/item/weapon/card/id/id = H.wear_id if(istype(id) && id.is_untrackable()) @@ -1058,7 +1111,8 @@ var/list/ai_verbs_default = list( var/obj/machinery/door/airlock/tobeopened var/dist = -1 for(var/obj/machinery/door/airlock/D in range(3,target)) - if(!D.density) continue + if(!D.density) + continue if(dist < 0) dist = get_dist(D, target) // to_chat(world, dist) @@ -1084,27 +1138,27 @@ var/list/ai_verbs_default = list( return -/mob/living/silicon/ai/proc/check_unable(var/flags = 0) +/mob/living/silicon/ai/proc/check_unable(flags = 0) if(stat == DEAD) to_chat(usr, "You are dead!") - return 1 + return TRUE if(lacks_power()) to_chat(usr, "Power systems failure!") - return 1 + return TRUE - if((flags & AI_CHECK_WIRELESS) && src.control_disabled) + if((flags & AI_CHECK_WIRELESS) && control_disabled) to_chat(usr, "Wireless control is disabled!") - return 1 - if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi) + return TRUE + if((flags & AI_CHECK_RADIO) && aiRadio.disabledAi) to_chat(src, "System Error - Transceiver Disabled!") - return 1 - return 0 + return TRUE + return FALSE /mob/living/silicon/ai/proc/is_in_chassis() - return istype(loc, /turf) + return isturf(loc) -/mob/living/silicon/ai/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card) +/mob/living/silicon/ai/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/device/aicard/card) if(!..()) return if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card. @@ -1125,17 +1179,17 @@ var/list/ai_verbs_default = list( set category = "IC" resting = 0 - var/obj/item/weapon/rig/rig = src.get_rig() + var/obj/item/weapon/rig/rig = get_rig() if(rig) rig.force_rest(src) -/mob/living/silicon/ai/switch_to_camera(var/obj/machinery/camera/C) +/mob/living/silicon/ai/switch_to_camera(obj/machinery/camera/C) if(!C.can_use() || !is_in_chassis()) - return 0 + return FALSE eyeobj.setLoc(get_turf(C)) client.eye = eyeobj - return 1 + return TRUE /mob/living/silicon/ai/proc/relay_speech(mob/living/M, text, verb, datum/language/speaking) if(!say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad. diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 1c977296a8a..9947e6faeec 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -1,9 +1,13 @@ /mob/living/silicon/ai/death(gibbed) - if(stat == DEAD) return + if(stat == DEAD) + return stat = DEAD - if(src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no. - icon_state = "[ckey]-ai-crash" - else icon_state = "ai-crash" + if(custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no. + icon_state = "[ckey]-ai_dead" + else if("[icon_state]_dead" in icon_states(icon,1)) + icon_state = "[icon_state]_dead" + else + icon_state = "ai_dead" update_canmove() if(eyeobj) eyeobj.setLoc(get_turf(src)) diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 4c879d066b1..8146e8c6a86 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi index 21ed6e38001..bca96cddb8f 100644 Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi index 05c31e1e1d6..869d98223cf 100644 Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi index 12be5447f34..311bc31623a 100644 Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ