From 59d0e28aff1198fa8d1b5cd4987028ea1279213a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 31 Jul 2015 02:41:18 +0930 Subject: [PATCH 01/62] Allowed pAIs and AIs loaded into hardsuits to move and rest when control is enabled or the user is unconcious/dead. Allows AIs/pAIs in rigs to use the selected module via middle click. --- code/_onclick/ai.dm | 20 ++- code/_onclick/rig.dm | 4 +- code/game/objects/items/devices/aicard.dm | 14 +- code/game/objects/items/devices/paicard.dm | 12 +- .../clothing/spacesuits/rig/modules/ninja.dm | 10 +- code/modules/clothing/spacesuits/rig/rig.dm | 139 +++++++++++++++++- code/modules/mob/living/carbon/human/death.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 5 + .../mob/living/carbon/human/human_damage.dm | 3 + .../mob/living/carbon/human/human_movement.dm | 4 + code/modules/mob/living/carbon/human/life.dm | 4 + code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 10 ++ code/modules/mob/living/silicon/pai/pai.dm | 15 +- code/modules/mob/mob.dm | 70 +++++---- code/modules/mob/mob_movement.dm | 2 - 16 files changed, 251 insertions(+), 67 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e05cbeb9ba..61b6777009 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -99,6 +99,14 @@ /mob/living/silicon/ai/MiddleClickOn(var/atom/A) A.AIMiddleClick(src) +/* + Sticking a minor pAI override into this because I can. +*/ +/mob/living/silicon/pai/MiddleClickOn(var/atom/A) + if(src.loc == src.card) + return A.AIMiddleClick(src) + return ..() + /* The following criminally helpful code is just the previous code cleaned up; I have no idea why it was in atoms.dm instead of respective files. @@ -152,10 +160,18 @@ /obj/machinery/turretid/AIAltClick() //toggles lethal on turrets Topic(src, list("src"= "\ref[src]", "command"="lethal", "value"="[!lethal]"), 1) // 1 meaning no window (consistency!) -/atom/proc/AIMiddleClick() - return +/atom/proc/AIMiddleClick(var/mob/living/silicon/user) + var/obj/item/weapon/rig/rig = user.get_rig() + if(rig && rig.wearer && rig.ai_can_move_suit(user, check_user_module = 1)) + if(rig.wearer.HardsuitClickOn(src, alert_ai = 1)) + return 1 + return 0 /obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. + + if(..()) + return + if(!src.lights) Topic(src, list("src"= "\ref[src]", "command"="lights", "activate" = "1"), 1) // 1 meaning no window (consistency!) else diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index ad9346ec15..d19101f69b 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -47,13 +47,13 @@ return ..() -/mob/living/carbon/human/proc/HardsuitClickOn(atom/A) +/mob/living/carbon/human/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0) if(back) var/obj/item/weapon/rig/rig = back if(istype(rig) && rig.selected_module) if(world.time <= next_move) return 1 next_move = world.time + 8 - rig.selected_module.engage(A) + rig.selected_module.engage(A, alert_ai) return 1 return 0 diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 6b239c6b07..3e8c9c69c6 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -120,10 +120,13 @@ if(user.client) user << "Transfer successful: [ai.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory." + ai.canmove = 1 update_icon() return 1 /obj/item/device/aicard/proc/clear() + if(carded_ai && istype(carded_ai.loc, /turf)) + carded_ai.canmove = 0 name = initial(name) carded_ai = null update_icon() @@ -140,10 +143,9 @@ carded_ai.show_message(rendered, type) ..() -/* /obj/item/device/aicard/relaymove(var/mob/user, var/direction) - if(src.loc && istype(src.loc.loc, /obj/item/rig_module)) - var/obj/item/rig_module/module = src.loc.loc - if(!module.holder || !direction) - return - module.holder.forced_move(direction)*/ + if(user.stat || user.stunned) + return + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.forced_move(direction, user) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index f7fa46678b..685f2a9043 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -10,12 +10,12 @@ var/looking_for_personality = 0 var/mob/living/silicon/pai/pai -/*/obj/item/device/paicard/relaymove(var/mob/user, var/direction) - if(src.loc && istype(src.loc.loc, /obj/item/rig_module)) - var/obj/item/rig_module/module = src.loc.loc - if(!module.holder || !direction) - return - module.holder.forced_move(direction)*/ +/obj/item/device/paicard/relaymove(var/mob/user, var/direction) + if(user.stat || user.stunned) + return + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.forced_move(direction, user) /obj/item/device/paicard/New() ..() diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 6b1362a766..0dfa1bd93e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -95,14 +95,14 @@ playsound(T, "sparks", 50, 1) anim(T,M,'icons/mob/mob.dmi',,"phaseout",,M.dir) -/obj/item/rig_module/teleporter/engage(atom/target) +/obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai) if(!..()) return 0 var/mob/living/carbon/human/H = holder.wearer if(!istype(H.loc, /turf)) - H << "You cannot teleport out of your current location." + usr << "You cannot teleport out of your current location." return 0 var/turf/T @@ -112,15 +112,15 @@ T = get_teleport_loc(get_turf(H), H, rand(5, 9)) if(!T || T.density) - H << "You cannot teleport into solid walls." + usr << "You cannot teleport into solid walls." return 0 if(T.z in config.admin_levels) - H << "You cannot use your teleporter on this Z-level." + usr << "You cannot use your teleporter on this Z-level." return 0 if(T.contains_dense_objects()) - H << "You cannot teleport to a location with solid objects." + usr << "You cannot teleport to a location with solid objects." phase_out(H,get_turf(H)) H.loc = T diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 60197daef7..e949cee66d 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -27,6 +27,8 @@ var/interface_path = "hardsuit.tmpl" var/ai_interface_path = "hardsuit.tmpl" var/interface_title = "Hardsuit Controller" + var/wearer_move_delay //Used for AI moving. + var/ai_controlled_move_delay = 10 // Keeps track of what this rig should spawn with. var/suit_type = "hardsuit" @@ -326,6 +328,8 @@ else if(offline) offline = 0 + if(istype(wearer) && !wearer.wearing_rig) + wearer.wearing_rig = src chest.slowdown = initial(slowdown) if(offline) @@ -544,11 +548,13 @@ /obj/item/weapon/rig/proc/notify_ai(var/message) if(!message || !installed_modules || !installed_modules.len) - return + return 0 + . = 0 for(var/obj/item/rig_module/module in installed_modules) for(var/mob/living/silicon/ai/ai in module.contents) if(ai && ai.client && !ai.stat) ai << "[message]" + . = 1 /obj/item/weapon/rig/equipped(mob/living/carbon/human/M) ..() @@ -565,6 +571,7 @@ if(istype(M) && M.back == src) M.visible_message("[M] struggles into \the [src].", "You struggle into \the [src].") wearer = M + wearer.wearing_rig = src update_icon() /obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode) @@ -676,6 +683,7 @@ ..() for(var/piece in list("helmet","gauntlets","chest","boots")) toggle_piece(piece, user, ONLY_RETRACT) + wearer.wearing_rig = null wearer = null //Todo @@ -757,14 +765,133 @@ return 1 return 0 -/*/obj/item/weapon/rig/proc/forced_move(dir) - if(locked_down) +/obj/item/weapon/rig/proc/ai_can_move_suit(var/mob/user, var/check_user_module = 0, var/check_for_ai = 0) + + if(check_for_ai) + if(!(locate(/obj/item/rig_module/ai_container) in contents)) + return 0 + var/found_ai + for(var/obj/item/rig_module/ai_container/module in contents) + if(module.damage >= 2) + continue + if(module.integrated_ai && module.integrated_ai.client && !module.integrated_ai.stat) + found_ai = 1 + break + if(!found_ai) + return 0 + + if(check_user_module) + world << "Checking user module" + if(!user) + world << "No user" + return 0 + if(!user.loc || !user.loc.loc) + world << "No user loc" + return 0 + var/obj/item/rig_module/ai_container/module = user.loc.loc + if(!istype(module) || module.damage >= 2) + user << "Your host module is unable to interface with the suit." + return 0 + + if(offline || !cell || !cell.charge || locked_down) + if(user) user << "Your host rig is unpowered and unresponsive." return 0 - if(!control_overridden) - return if(!wearer || wearer.back != src) + if(user) user << "Your host rig is not being worn." return 0 - wearer.Move(null,dir)*/ + if(!wearer.stat && !control_overridden && !ai_override_enabled) + if(user) user << "You are locked out of the suit servo controller." + return 0 + return 1 + +/obj/item/weapon/rig/proc/force_rest(var/mob/user) + if(!ai_can_move_suit(user, check_user_module = 1)) + return + wearer.lay_down() + user << "\The [wearer] is now [wearer.resting ? "resting" : "getting up"]." + +/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user) + + // Why is all this shit in client/Move()? Who knows? + if(world.time < wearer_move_delay) + return + + if(!wearer.loc || !ai_can_move_suit(user, check_user_module = 1)) + return + + //This is sota the goto stop mobs from moving var + if(wearer.transforming || !wearer.canmove) + return + + if(locate(/obj/effect/stop/, wearer.loc)) + for(var/obj/effect/stop/S in wearer.loc) + if(S.victim == wearer) + return + + if(!wearer.lastarea) + wearer.lastarea = get_area(wearer.loc) + + if((istype(wearer.loc, /turf/space)) || (wearer.lastarea.has_gravity == 0)) + if(!wearer.Process_Spacemove(0)) + return 0 + + if(malfunctioning) + direction = pick(cardinal) + + // Inside an object, tell it we moved. + if(isobj(wearer.loc) || ismob(wearer.loc)) + var/atom/O = wearer.loc + return O.relaymove(wearer, direction) + + if(isturf(wearer.loc)) + if(wearer.restrained())//Why being pulled while cuffed prevents you from moving + for(var/mob/M in range(wearer, 1)) + if(M.pulling == wearer) + if(!M.restrained() && M.stat == 0 && M.canmove && wearer.Adjacent(M)) + user << "Your host is restrained! They can't move!" + return 0 + else + M.stop_pulling() + + if(wearer.pinned.len) + src << "Your host is pinned to a wall by [wearer.pinned[1]]!" + return 0 + + // AIs are a bit slower than regular and ignore move intent. + wearer.last_move_intent = world.time + ai_controlled_move_delay + wearer_move_delay = world.time + ai_controlled_move_delay + + var/tickcomp = 0 + if(config.Tickcomp) + tickcomp = ((1/(world.tick_lag))*1.3) - 1.3 + wearer_move_delay += tickcomp + + if(istype(wearer.buckled, /obj/vehicle)) + //manually set move_delay for vehicles so we don't inherit any mob movement penalties + //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm + wearer_move_delay = world.time + tickcomp + return wearer.buckled.relaymove(wearer, direction) + + if(istype(wearer.machine, /obj/machinery)) + if(wearer.machine.relaymove(wearer, direction)) + return + + if(wearer.pulledby || wearer.buckled) // Wheelchair driving! + if(istype(wearer.loc, /turf/space)) + return // No wheelchair driving in space + if(istype(wearer.pulledby, /obj/structure/bed/chair/wheelchair)) + return wearer.pulledby.relaymove(wearer, direction) + else if(istype(wearer.buckled, /obj/structure/bed/chair/wheelchair)) + if(ishuman(wearer.buckled)) + var/obj/item/organ/external/l_hand = wearer.get_organ("l_hand") + var/obj/item/organ/external/r_hand = wearer.get_organ("r_hand") + if((!l_hand || (l_hand.status & ORGAN_DESTROYED)) && (!r_hand || (r_hand.status & ORGAN_DESTROYED))) + return // No hands to drive your chair? Tough luck! + wearer_move_delay += 2 + return wearer.buckled.relaymove(wearer,direction) + + cell.use(200) //Arbitrary, TODO + wearer.Move(get_step(get_turf(wearer),direction),direction) /atom/proc/get_rig() if(loc) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 1eb0b53f04..ff7255523d 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -61,11 +61,13 @@ if(!gibbed && species.death_sound) playsound(loc, species.death_sound, 80, 1, 1) - if(ticker && ticker.mode) sql_report_death(src) ticker.mode.check_win() + if(wearing_rig) + wearing_rig.notify_ai("Warning: user death event. Mobility control passed to integrated intelligence system.") + return ..(gibbed,species.death_message) /mob/living/carbon/human/proc/ChangeToHusk() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index dc34cfec3c..e9daa58d5f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -7,6 +7,7 @@ var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. + var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. /mob/living/carbon/human/New(var/new_loc, var/new_species = null) @@ -1373,3 +1374,7 @@ if(istype(shoes, /obj/item/clothing/shoes/magboots) && (shoes.flags & NOSLIP)) //magboots + dense_object = no floating return 1 return 0 + +/mob/living/carbon/human/can_stand_overridden() + return wearing_rig && wearing_rig.ai_can_move_suit(check_for_ai = 1) + diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 8f82504609..07f9aab3ec 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -145,6 +145,9 @@ /mob/living/carbon/human/Paralyse(amount) if(HULK in mutations) return + // Notify our AI if they can now control the suit. + if(wearing_rig && !stat && paralysis < amount) //We are passing out right this second. + wearing_rig.notify_ai("Warning: user consciousness failure. Mobility control passed to integrated intelligence system.") ..() /mob/living/carbon/human/getCloneLoss() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index f4b28d2b6b..17d125d488 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,5 +1,9 @@ /mob/living/carbon/human/movement_delay() + // Used by the AI suit control proc. + if(stat) + return 20 + var/tally = 0 if(species.slowdown) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 282831641c..a55f94e01a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -52,6 +52,10 @@ // update the current life tick, can be used to e.g. only do something every 4 ticks life_tick++ + // This is not an ideal place for this but it will do for now. + if(wearing_rig && wearing_rig.offline) + wearing_rig = null + in_stasis = istype(loc, /obj/structure/closet/body_bag/cryobag) && loc:opened == 0 if(in_stasis) loc:used++ diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 632bd4dc73..4212ad0e3a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -657,7 +657,7 @@ default behaviour is: set category = "IC" resting = !resting - src << "\blue You are now [resting ? "resting" : "getting up"]" + src << "You are now [resting ? "resting" : "getting up"]." /mob/living/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null, var/ignore_items = 0) // -- TLE -- Merged by Carn if(stat) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3004b9dd9e..f6be9a8a87 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -684,5 +684,15 @@ var/list/ai_verbs_default = list( icon_state = selected_sprite.alive_icon set_light(1, 1, selected_sprite.alive_light) +// Pass lying down or getting up to our pet human, if we're in a rig. +/mob/living/silicon/ai/lay_down() + set name = "Rest" + set category = "IC" + + resting = 0 + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.force_rest(src) + #undef AI_CHECK_WIRELESS #undef AI_CHECK_RADIO diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index ad06c58d6e..d8d474e438 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -73,8 +73,6 @@ var/current_pda_messaging = null /mob/living/silicon/pai/New(var/obj/item/device/paicard) - - canmove = 0 src.loc = paicard card = paicard sradio = new(src) @@ -277,8 +275,6 @@ var/obj/item/device/pda/holder = card.loc holder.pai = null - canmove = 1 - src.client.perspective = EYE_PERSPECTIVE src.client.eye = src src.forceMove(get_turf(card)) @@ -340,12 +336,16 @@ set name = "Rest" set category = "IC" + // Pass lying down or getting up to our pet human, if we're in a rig. if(istype(src.loc,/obj/item/device/paicard)) resting = 0 + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.force_rest(src) else resting = !resting icon_state = resting ? "[chassis]_rest" : "[chassis]" - src << "\blue You are now [resting ? "resting" : "getting up"]" + src << "You are now [resting ? "resting" : "getting up"]" canmove = !resting @@ -394,7 +394,8 @@ card.loc = get_turf(card) src.forceMove(card) card.forceMove(card.loc) - canmove = 0 + canmove = 1 + resting = 0 icon_state = "[chassis]" /mob/living/silicon/pai/start_pulling(var/atom/movable/AM) @@ -430,4 +431,4 @@ get_scooped(H) return else - return ..() + return ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9f24c4e1a1..4c9013d9dc 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -689,40 +689,52 @@ if(transforming) return 0 return 1 +// Not sure what to call this. Used to check if humans are wearing an AI-controlled exosuit and hence don't need to fall over yet. +/mob/proc/can_stand_overridden() + return 0 + +/mob/proc/cannot_stand() + return stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH) + //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. /mob/proc/update_canmove() - if(istype(buckled, /obj/vehicle)) - var/obj/vehicle/V = buckled - if(stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) - lying = 1 - canmove = 0 - pixel_y = V.mob_offset_y - 5 - else - if(buckled.buckle_lying != -1) lying = buckled.buckle_lying - canmove = 1 - pixel_y = V.mob_offset_y - else if(buckled) - anchored = 1 - canmove = 0 - if(istype(buckled)) - if(buckled.buckle_lying != -1) - lying = buckled.buckle_lying - if(buckled.buckle_movable) - anchored = 0 - canmove = 1 - else if( stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH)) - lying = 1 - canmove = 0 - else if(stunned) - canmove = 0 - else if(captured) - anchored = 1 - canmove = 0 - lying = 0 - else + if(!resting && cannot_stand() && can_stand_overridden()) lying = 0 canmove = 1 + else + if(istype(buckled, /obj/vehicle)) + var/obj/vehicle/V = buckled + if(cannot_stand()) + lying = 1 + canmove = 0 + pixel_y = V.mob_offset_y - 5 + else + if(buckled.buckle_lying != -1) lying = buckled.buckle_lying + canmove = 1 + pixel_y = V.mob_offset_y + else if(buckled) + anchored = 1 + canmove = 0 + if(istype(buckled)) + if(buckled.buckle_lying != -1) + lying = buckled.buckle_lying + if(buckled.buckle_movable) + anchored = 0 + canmove = 1 + + else if(cannot_stand()) + lying = 1 + canmove = 0 + else if(stunned) + canmove = 0 + else if(captured) + anchored = 1 + canmove = 0 + lying = 0 + else + lying = 0 + canmove = 1 if(lying) density = 0 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index bb333b82c5..7e47244acc 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -222,7 +222,6 @@ if(Process_Grab()) return - if(!mob.canmove) return @@ -235,7 +234,6 @@ if((istype(mob.loc, /turf/space)) || (mob.lastarea.has_gravity == 0)) if(!mob.Process_Spacemove(0)) return 0 - if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved var/atom/O = mob.loc return O.relaymove(mob, direct) From 86100ee2a448a4972e16a1f0c109b4293ba9bcdf Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 31 Jul 2015 06:11:00 +0930 Subject: [PATCH 02/62] Added procs for MMIs to use rigs as piloting AIs. --- code/_onclick/ai.dm | 7 ++++++- code/modules/mob/living/carbon/brain/MMI.dm | 7 +++++++ code/modules/mob/living/carbon/brain/brain.dm | 8 ++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 61b6777009..e57ab01338 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -100,13 +100,18 @@ A.AIMiddleClick(src) /* - Sticking a minor pAI override into this because I can. + Sticking minor pAI and brain overrides into this because I can. */ /mob/living/silicon/pai/MiddleClickOn(var/atom/A) if(src.loc == src.card) return A.AIMiddleClick(src) return ..() +/mob/living/cabon/bran/MiddleClickOn(var/atom/A) + if(istype(src.loc, /obj/item/device/mmi)) + return A.AIMiddleClick(src) + return ..() + /* The following criminally helpful code is just the previous code cleaned up; I have no idea why it was in atoms.dm instead of respective files. diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 49e8c6ad52..cf14308321 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -122,6 +122,13 @@ locked = 1 return +/obj/item/device/mmi/relaymove(var/mob/user, var/direction) + if(user.stat || user.stunned) + return + var/obj/item/weapon/rig/rig = src.get_rig() + if(istype(rig)) + rig.forced_move(direction, user) + /obj/item/device/mmi/Destroy() if(isrobot(loc)) var/mob/living/silicon/robot/borg = loc diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index e72671d78a..aaf947a13d 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -49,12 +49,12 @@ return 1 return ..() - /mob/living/carbon/brain/update_canmove() - if(in_contents_of(/obj/mecha)) + if(in_contents_of(/obj/mecha) || istype(loc, /obj/item/device/mmi)) canmove = 1 - use_me = 1 //If it can move, let it emote - else canmove = 0 + use_me = 1 + else + canmove = 0 return canmove /mob/living/carbon/brain/binarycheck() From b265b3285ca8c8e92b2a5ee7697889f7ba5dd127 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 13 Aug 2015 17:15:51 +0930 Subject: [PATCH 03/62] Cleaned up some errors, added logging for AI module use. --- code/_onclick/ai.dm | 3 ++- code/modules/clothing/spacesuits/rig/rig.dm | 7 +------ code/modules/mob/living/carbon/human/human_movement.dm | 4 ---- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e57ab01338..232a864c0b 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -107,7 +107,7 @@ return A.AIMiddleClick(src) return ..() -/mob/living/cabon/bran/MiddleClickOn(var/atom/A) +/mob/living/carbon/brain/MiddleClickOn(var/atom/A) if(istype(src.loc, /obj/item/device/mmi)) return A.AIMiddleClick(src) return ..() @@ -169,6 +169,7 @@ var/obj/item/weapon/rig/rig = user.get_rig() if(rig && rig.wearer && rig.ai_can_move_suit(user, check_user_module = 1)) if(rig.wearer.HardsuitClickOn(src, alert_ai = 1)) + message_admins("\The [user] ([user.ckey ? user.ckey : "*no key*"]) forced \the [rig.wearer] ([rig.wearer.ckey ? rig.wearer.ckey : "*no key*"]) to use hardsuit module on \the [src].") return 1 return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index e949cee66d..40d36b9590 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -781,12 +781,7 @@ return 0 if(check_user_module) - world << "Checking user module" - if(!user) - world << "No user" - return 0 - if(!user.loc || !user.loc.loc) - world << "No user loc" + if(!user || !user.loc || !user.loc.loc) return 0 var/obj/item/rig_module/ai_container/module = user.loc.loc if(!istype(module) || module.damage >= 2) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 17d125d488..f4b28d2b6b 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,9 +1,5 @@ /mob/living/carbon/human/movement_delay() - // Used by the AI suit control proc. - if(stat) - return 20 - var/tally = 0 if(species.slowdown) From 825154863ddae603ae525f3c2851870109302348 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 13 Aug 2015 17:17:11 +0930 Subject: [PATCH 04/62] Changelog. --- html/changelogs/Zuhayr-hardsuits.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/Zuhayr-hardsuits.yml diff --git a/html/changelogs/Zuhayr-hardsuits.yml b/html/changelogs/Zuhayr-hardsuits.yml new file mode 100644 index 0000000000..187e90e25f --- /dev/null +++ b/html/changelogs/Zuhayr-hardsuits.yml @@ -0,0 +1,4 @@ +author: Zuhayr +delete-after: True +changes: + - rscadd: "Added the ability for AIs in hardsuits to control suit modules and movement with a dead or unconcious wearer." \ No newline at end of file From 15f54c595bdc6401e58a4e7259aaa308e2486e44 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Mon, 17 Aug 2015 09:12:40 +0200 Subject: [PATCH 05/62] Synths now relies on access permissions as well. Ensures station bound synthetics will not be able to utilize Syndicate/Heist equipment/vessels, as well as the opposite for potential syndicate synths. --- code/datums/wires/airlock.dm | 2 +- code/game/jobs/access.dm | 4 ++-- code/game/objects/objs.dm | 14 ++++++++++++-- code/modules/mob/living/silicon/robot/robot.dm | 1 + .../mob/living/silicon/robot/robot_items.dm | 7 ------- code/modules/mob/living/silicon/silicon.dm | 4 ++++ 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index a0f1f9c7f1..3c247d6c7f 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -161,7 +161,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 if(A.emagged) return if(!A.requiresID() || A.check_access(null)) if(A.density) A.open() - else A.close() + else A.close() if(AIRLOCK_WIRE_SAFETY) A.safe = !A.safe if(!A.density) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 09fc65bf41..b364db8c77 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -9,8 +9,8 @@ if(src.check_access(null)) return 1 if(istype(M, /mob/living/silicon)) - //AI can do whatever he wants - return 1 + var/mob/living/silicon/S = M + return check_access_list(S.access_rights) else if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M //if they are holding or wearing a card that has access, that works diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index cfa2de777b..afe246ba17 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -33,9 +33,19 @@ CouldNotUseTopic(usr) return 1 +/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state) + if(user.CanUseObjTopic(src)) + return ..() + return STATUS_CLOSE + +/mob/living/silicon/CanUseObjTopic(var/obj/O) + return O.allowed(src) + +/mob/proc/CanUseObjTopic() + /obj/proc/CouldUseTopic(var/mob/user) var/atom/host = nano_host() - host.add_fingerprint(user) + host.add_hiddenprint(user) /obj/proc/CouldNotUseTopic(var/mob/user) // Nada @@ -142,4 +152,4 @@ return /obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) - return + return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1159545a54..85541c3acf 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -179,6 +179,7 @@ playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) /mob/living/silicon/robot/syndicate/init() + access_rights = list(access_syndicate) aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) laws = new /datum/ai_laws/syndicate_override diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index ade9bf0f93..2d591f4c36 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -105,13 +105,6 @@ desc = "A circuit grafted onto the bottom of an ID card. It is used to transmit access codes into other robot chassis, \ allowing you to lock and unlock other robots' panels." -/obj/item/weapon/card/id/robot/attack_self() //override so borgs can't flash their IDs. - return - -/obj/item/weapon/card/id/robot/read() - usr << "The ID card does not appear to have any writing on it." - return - //A harvest item for serviceborgs. /obj/item/weapon/robot_harvester name = "auto harvester" diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 9bb71d2210..c39482cc22 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -23,12 +23,16 @@ var/next_alarm_notice var/list/datum/alarm/queued_alarms = new() + var/list/access_rights + #define SEC_HUD 1 //Security HUD mode #define MED_HUD 2 //Medical HUD mode /mob/living/silicon/New() silicon_mob_list |= src ..() + access_rights = get_all_station_access() + access_rights = access_rights.Copy() add_language("Galactic Common") init_subsystems() From a4b3ab1ca54995541254cc8651c13cb9d92f1bd3 Mon Sep 17 00:00:00 2001 From: FrickenChris101 Date: Wed, 19 Aug 2015 20:17:59 -0400 Subject: [PATCH 06/62] Flashlight Icon toggle fix Just added additional code to update_brightness call and initialize.. Wasn't properly reflecting light being on or off. --- code/game/objects/items/devices/flashlight.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 2b0f5920ce..c9de89d29c 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -20,7 +20,7 @@ icon_state = "[initial(icon_state)]-on" set_light(brightness_on) else - icon_state = initial(icon_state) + icon_state = "[initial(icon_state)]" set_light(0) /obj/item/device/flashlight/proc/update_brightness(var/mob/user = null) @@ -28,6 +28,7 @@ icon_state = "[initial(icon_state)]-on" set_light(brightness_on) else + icon_state = "[initial(icon_state)]" set_light(0) /obj/item/device/flashlight/attack_self(mob/user) From efc3121f6883e92e9adbfb6cbe928c0db4b69a5c Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 19 Aug 2015 20:38:50 -0400 Subject: [PATCH 07/62] Fixes reinforcing girders through windows, unbalanced span --- code/game/objects/structures/girders.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 98947a2dae..d6c406f07e 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -165,7 +165,7 @@ set src in view(1) var/mob/living/user = usr - if(!istype(user) || !(user.l_hand || user.r_hand)) + if(!istype(user) || !(user.l_hand || user.r_hand) || !Adjacent(user)) return if(reinf_material) @@ -248,7 +248,7 @@ dismantle() else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter)) - user << "Now slicing apart the girder..." + user << "Now slicing apart the girder..." if(do_after(user,30)) user << "You slice apart the girder!" dismantle() From c97b1d4ea489ef716b86b42d98073e5a92aaa7ee Mon Sep 17 00:00:00 2001 From: DelZeta Date: Thu, 20 Aug 2015 01:14:41 -0700 Subject: [PATCH 08/62] Fixes permahallucinations. --- code/modules/mob/living/carbon/human/life.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ac8848dcb1..ea570e42e1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -963,6 +963,11 @@ spawn(rand(20,50)) if(C) C.dir = 1 + if(hallucination <= 2) + hallucination = 0 + halloss = 0 + else + hallucination -= 2 else for(var/atom/a in hallucinations) From 81ccf07d809d980e1bf16eef3098314840b159ca Mon Sep 17 00:00:00 2001 From: DelZeta Date: Thu, 20 Aug 2015 02:26:46 -0700 Subject: [PATCH 09/62] Halloss now decays naturally after hallucinations, to avoid edge cases with other sources. --- code/modules/mob/living/carbon/human/life.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ea570e42e1..631be0d51a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -963,12 +963,9 @@ spawn(rand(20,50)) if(C) C.dir = 1 - if(hallucination <= 2) + hallucination -= 2 + if(hallucination < 0) hallucination = 0 - halloss = 0 - else - hallucination -= 2 - else for(var/atom/a in hallucinations) qdel(a) From c2e2252342cf126b235abda5dd966b463393a18d Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 20 Aug 2015 12:21:06 +0200 Subject: [PATCH 10/62] Synth access and icon update changes. Refactors how synthetics set their modules. On login, if appearance selection was initiated but not finalized, the selection options popup again. Fixes a long-standing issue of borgs being able to look like the standard module by loging out. Ensures the syndicate agent IDs and syndicate borgs will always have the same initial access permissions. Removes now unnecessary syndicate snowflake code from NanoUI. Synths now utilize actual ids. --- baystation12.dme | 1 + code/_helpers/global_lists.dm | 2 + code/game/jobs/access.dm | 33 ++++--- code/game/machinery/computer/camera.dm | 4 + .../objects/items/robot/robot_upgrades.dm | 2 - code/game/objects/items/weapons/cards_ids.dm | 2 +- code/game/objects/objs.dm | 1 + code/global.dm | 2 +- .../modules/mob/living/silicon/robot/login.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 86 ++++++------------- .../mob/living/silicon/robot/robot_modules.dm | 9 +- .../mob/living/silicon/robot/syndicate.dm | 27 ++++++ code/modules/mob/living/silicon/silicon.dm | 5 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/nano/interaction/base.dm | 2 +- code/modules/nano/interaction/default.dm | 15 ---- 16 files changed, 100 insertions(+), 97 deletions(-) create mode 100644 code/modules/mob/living/silicon/robot/syndicate.dm diff --git a/baystation12.dme b/baystation12.dme index 785542bb73..17063261ab 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1318,6 +1318,7 @@ #include "code\modules\mob\living\silicon\robot\robot_items.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 09e6f845c8..bc841e533c 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -64,6 +64,8 @@ var/global/list/rune_list = new() var/global/list/escape_list = list() var/global/list/endgame_exits = list() var/global/list/endgame_safespawns = list() + +var/global/list/syndicate_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks) ////////////////////////// /////Initial Building///// ////////////////////////// diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index b364db8c77..1be9e37766 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -8,14 +8,10 @@ //check if it doesn't require any access at all if(src.check_access(null)) return 1 - if(istype(M, /mob/living/silicon)) - var/mob/living/silicon/S = M - return check_access_list(S.access_rights) - else if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - //if they are holding or wearing a card that has access, that works - if(src.check_access(H.get_active_hand()) || src.check_access(H.wear_id)) - return 1 + + var/id = M.GetIdCard() + if(id) + return check_access(id) return 0 /obj/item/proc/GetAccess() @@ -179,18 +175,27 @@ "Emergency Response Team", "Emergency Response Team Leader") -proc/GetIdCard(var/mob/living/carbon/human/H) - if(H.wear_id) - var/id = H.wear_id.GetID() +/mob/proc/GetIdCard() + return null + +/mob/living/bot/GetIdCard() + return botcard + +/mob/living/carbon/human/GetIdCard() + if(wear_id) + var/id = wear_id.GetID() if(id) return id - if(H.get_active_hand()) - var/obj/item/I = H.get_active_hand() + if(get_active_hand()) + var/obj/item/I = get_active_hand() return I.GetID() +/mob/living/silicon/GetIdCard() + return idcard + proc/FindNameFromID(var/mob/living/carbon/human/H) ASSERT(istype(H)) - var/obj/item/weapon/card/id/C = GetIdCard(H) + var/obj/item/weapon/card/id/C = H.GetIdCard() if(C) return C.registered_name diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 8d85a63224..4b8b9a9acf 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -257,3 +257,7 @@ icon_state = "syndicam" network = list("NUKE") circuit = null + +/obj/machinery/computer/security/nuclear/New() + ..() + req_access = list(150) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 999303a91d..6eabb2bd1e 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -31,8 +31,6 @@ R.modtype = initial(R.modtype) R.hands.icon_state = initial(R.hands.icon_state) - R.choose_icon(1, R.set_module_sprites(list("Default" = "robot"))) - R.notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, R.module.name) R.module.Reset(R) R.updatename("Default") diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 17a27aa85e..e69d61ee7a 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -154,12 +154,12 @@ /obj/item/weapon/card/id/syndicate name = "agent card" - access = list(access_maint_tunnels, access_syndicate, access_external_airlocks) origin_tech = list(TECH_ILLEGAL = 3) var/registered_user=null /obj/item/weapon/card/id/syndicate/New(mob/user as mob) ..() + access = syndicate_access.Copy() if(!isnull(user)) // Runtime prevention on laggy starts or where users log out because of lag at round start. registered_name = ishuman(user) ? user.real_name : user.name else diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 2f9c3c5e7f..cfea392be0 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -36,6 +36,7 @@ /obj/CanUseTopic(var/mob/user, var/datum/topic_state/state) if(user.CanUseObjTopic(src)) return ..() + user << "\icon[src]Access Denied!" return STATUS_CLOSE /mob/living/silicon/CanUseObjTopic(var/obj/O) diff --git a/code/global.dm b/code/global.dm index 2d1e4a0548..4e26bbccc5 100644 --- a/code/global.dm +++ b/code/global.dm @@ -177,4 +177,4 @@ var/max_explosion_range = 14 // Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. var/global/obj/item/device/radio/intercom/global_announcer = new(null) -var/list/station_departments = list("Command", "Medical", "Engineering", "Science", "Security", "Cargo", "Civilian") \ No newline at end of file +var/list/station_departments = list("Command", "Medical", "Engineering", "Science", "Security", "Cargo", "Civilian") diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index eac71acfcd..9d9117b933 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -5,4 +5,6 @@ winset(src, null, "mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5") - return \ No newline at end of file + // Forces synths to select an icon relevant to their module + if(!icon_selected) + choose_icon(icon_selection_tries, module_sprites) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index da9d158114..7ca869ea26 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -24,8 +24,10 @@ //Icon stuff - var/icontype //Persistent icontype tracking allows for cleaner icon updates - var/module_sprites[0] //Used to store the associations between sprite names and sprite index. + var/icontype //Persistent icontype tracking allows for cleaner icon updates + var/module_sprites[0] //Used to store the associations between sprite names and sprite index. + var/icon_selected = 1 //If icon selection has been completed yet + var/icon_selection_tries = 0//Remaining attempts to select icon before a selection is forced //Hud stuff @@ -89,21 +91,6 @@ /mob/living/silicon/robot/proc/robot_checklaws ) -/mob/living/silicon/robot/syndicate - lawupdate = 0 - scrambledcodes = 1 - icon_state = "securityrobot" - modtype = "Security" - lawchannel = "State" - -/mob/living/silicon/robot/syndicate/New() - if(!cell) - cell = new /obj/item/weapon/cell(src) - cell.maxcharge = 25000 - cell.charge = 25000 - - ..() - /mob/living/silicon/robot/New(loc,var/unfinished = 0) spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) @@ -178,18 +165,6 @@ playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) -/mob/living/silicon/robot/syndicate/init() - access_rights = list(access_syndicate) - aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) - - laws = new /datum/ai_laws/syndicate_override - new /obj/item/weapon/robot_module/syndicate(src) - - radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio) - radio.recalculateChannels() - - playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) - /mob/living/silicon/robot/SetName(pickedName as text) custom_name = pickedName updatename() @@ -242,10 +217,15 @@ ..() /mob/living/silicon/robot/proc/set_module_sprites(var/list/new_sprites) - module_sprites = new_sprites + module_sprites = new_sprites.Copy() //Custom_sprite check and entry if (custom_sprite == 1) module_sprites["Custom"] = "[src.ckey]-[modtype]" + icontype = "Custom" + else + icontype = module_sprites[1] + icon_state = module_sprites[icontype] + updateicon() return module_sprites /mob/living/silicon/robot/proc/pick_module() @@ -256,7 +236,7 @@ if((crisis && security_level == SEC_LEVEL_RED) || crisis_override) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" - modtype = input("Please, select a module!", "Robot", null, null) in modules + modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules if(module) return @@ -269,8 +249,6 @@ hands.icon_state = lowertext(modtype) feedback_inc("cyborg_[lowertext(modtype)]",1) updatename() - set_module_sprites(module.sprites) - choose_icon(module_sprites.len + 1, module_sprites) notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) /mob/living/silicon/robot/proc/updatename(var/prefix as text) @@ -689,7 +667,7 @@ /mob/living/silicon/robot/updateicon() overlays.Cut() - if(stat == 0) + if(stat == CONSCIOUS) overlays += "eyes-[module_sprites[icontype]]" if(opened) @@ -917,38 +895,30 @@ return /mob/living/silicon/robot/proc/choose_icon(var/triesleft, var/list/module_sprites) - if(triesleft<1 || !module_sprites.len) - return - else - triesleft-- - - if (custom_sprite == 1) - icontype = "Custom" - triesleft = 0 - else if(module_sprites.len == 1) - icontype = module_sprites[1] - else - icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites - - if(icontype) - icon_state = module_sprites[icontype] - else + if(!module_sprites.len) src << "Something is badly wrong with the sprite selection. Harass a coder." - icon_state = module_sprites[1] return + icon_selected = 0 + src.icon_selection_tries = triesleft + if(module_sprites.len == 1 || !client) + if(!(icontype in module_sprites)) + icontype = module_sprites[1] + else + icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot", icontype, null) in module_sprites + icon_state = module_sprites[icontype] updateicon() - if (triesleft >= 1) + if (module_sprites.len > 1 && triesleft >= 1 && client) + icon_selection_tries-- var/choice = input("Look at your icon - is this what you want?") in list("Yes","No") if(choice=="No") - choose_icon(triesleft, module_sprites) + choose_icon(icon_selection_tries, module_sprites) return - else - triesleft = 0 - return - else - src << "Your icon has been set. You now require a module reset to change it." + + icon_selected = 1 + icon_selection_tries = 0 + src << "Your icon has been set. You now require a module reset to change it." /mob/living/silicon/robot/proc/sensor_mode() //Medical/Security HUD controller for borgs set name = "Set Sensor Augmentation" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 6c453256c4..d1a719356d 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -49,6 +49,9 @@ var/global/list/robot_modules = list( if(R.radio) R.radio.recalculateChannels() + R.set_module_sprites(sprites) + R.choose_icon(R.module_sprites.len + 1, R.module_sprites) + /obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) R.module = null @@ -59,6 +62,7 @@ var/global/list/robot_modules = list( if(R.radio) R.radio.recalculateChannels() + R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) qdel(src) @@ -507,7 +511,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/tray/robotray(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src) - src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) + src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src) var/datum/reagents/R = new/datum/reagents(50) src.emag.reagents = R @@ -617,6 +621,9 @@ var/global/list/robot_modules = list( LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 1 ) + sprites = list( + "Dread" = "securityrobot", + ) /obj/item/weapon/robot_module/syndicate/New(var/mob/living/silicon/robot/R) ..() diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm new file mode 100644 index 0000000000..bf6dc64588 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -0,0 +1,27 @@ +/mob/living/silicon/robot/syndicate + lawupdate = 0 + scrambledcodes = 1 + icon_state = "securityrobot" + modtype = "Security" + lawchannel = "State" + +/mob/living/silicon/robot/syndicate/New() + if(!cell) + cell = new /obj/item/weapon/cell(src) + cell.maxcharge = 25000 + cell.charge = 25000 + + ..() + +/mob/living/silicon/robot/syndicate/init() + idcard = new/obj/item/weapon/card/id/syndicate(src) + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + + laws = new /datum/ai_laws/syndicate_override + overlays.Cut() + new /obj/item/weapon/robot_module/syndicate(src) + + radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio) + radio.recalculateChannels() + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ebae3a56ae..ab08029f50 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -24,6 +24,7 @@ var/list/datum/alarm/queued_alarms = new() var/list/access_rights + var/obj/item/weapon/card/id/idcard #define SEC_HUD 1 //Security HUD mode #define MED_HUD 2 //Medical HUD mode @@ -31,10 +32,10 @@ /mob/living/silicon/New() silicon_mob_list |= src ..() - access_rights = get_all_station_access() - access_rights = access_rights.Copy() add_language("Galactic Common") init_subsystems() + if(!idcard) + idcard = new/obj/item/weapon/card/id/captains_spare(src) /mob/living/silicon/Destroy() silicon_mob_list -= src diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index f2e9e95868..e87e486ff3 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -632,7 +632,7 @@ proc/is_blind(A) return SAFE_PERP //Agent cards lower threatlevel. - var/obj/item/weapon/card/id/id = GetIdCard(src) + var/obj/item/weapon/card/id/id = GetIdCard() if(id && istype(id, /obj/item/weapon/card/id/syndicate)) threatcount -= 2 // A proper CentCom id is hard currency. diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm index cf5424bdc0..ccd9f3740b 100644 --- a/code/modules/nano/interaction/base.dm +++ b/code/modules/nano/interaction/base.dm @@ -14,7 +14,7 @@ /mob/proc/shared_nano_interaction() if (src.stat || !client) return STATUS_CLOSE // no updates, close the interface - else if (restrained() || lying || stat || stunned || weakened) + else if (incapacitated()) return STATUS_UPDATE // update only (orange visibility) return STATUS_INTERACTIVE diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index 79c08227d5..216f40b948 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -30,21 +30,6 @@ return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility) -/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object) - . = ..() - if(. != STATUS_INTERACTIVE) - return - - if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level - return STATUS_INTERACTIVE - if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle - return STATUS_INTERACTIVE - if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery - var/obj/machinery/Machine = src_object - if(Machine.emagged) - return STATUS_INTERACTIVE - return STATUS_UPDATE - /mob/living/silicon/ai/default_can_use_topic(var/src_object) . = shared_nano_interaction() if(. != STATUS_INTERACTIVE) From cd06409a1f4386b2b92d6cb4e77cb6a978748317 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 20 Aug 2015 13:23:42 +0200 Subject: [PATCH 11/62] Makes it possible for syndicate borgs to copy access from other ids. --- code/game/antagonist/antagonist_create.dm | 2 +- code/game/antagonist/antagonist_update.dm | 3 +- code/game/jobs/job_controller.dm | 2 +- code/game/machinery/camera/tracking.dm | 9 ++---- .../objects/items/devices/uplink_items.dm | 2 +- .../objects/items/robot/robot_upgrades.dm | 2 ++ code/game/objects/items/weapons/cards_ids.dm | 31 ++++++++++++------- .../items/weapons/cards_ids_syndicate.dm | 7 ++--- code/modules/awaymissions/corpse.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 23 +++++++++----- .../mob/living/silicon/robot/syndicate.dm | 3 +- code/modules/mob/living/silicon/silicon.dm | 10 ++++-- 12 files changed, 58 insertions(+), 38 deletions(-) diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm index 69b7f8e9d0..072dd88bee 100644 --- a/code/game/antagonist/antagonist_create.dm +++ b/code/game/antagonist/antagonist_create.dm @@ -36,7 +36,7 @@ if(!W) return W.access |= default_access W.assignment = "[assignment]" - W.set_owner_info(player) + player.set_id_info(W) if(equip) player.equip_to_slot_or_del(W, slot_wear_id) return W diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index 0fd5fb2a93..d4999f0183 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -19,8 +19,7 @@ /datum/antagonist/proc/update_access(var/mob/living/player) for(var/obj/item/weapon/card/id/id in player.contents) - id.name = "[player.real_name]'s ID Card" - id.registered_name = player.real_name + player.set_id_info(id) /datum/antagonist/proc/update_all_icons() if(!antag_indicator) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index ff994e8cd3..f375755982 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -528,7 +528,7 @@ var/global/datum/controller/occupations/job_master if(C) C.rank = rank C.assignment = title ? title : rank - C.set_owner_info(H) + H.set_id_info(C) //put the player's account number onto the ID if(H.mind && H.mind.initial_account) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 65324f5555..739583ede8 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -223,6 +223,9 @@ mob/living/proc/near_camera() /mob/living/proc/tracking_status() // Easy checks first. // Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this. + var/obj/item/weapon/card/id/id = GetIdCard() + if(id && id.prevent_tracking()) + return TRACKING_TERMINATE if(InvalidPlayerTurf(get_turf(src))) return TRACKING_TERMINATE if(invisibility >= INVISIBILITY_LEVEL_ONE) //cloaked @@ -240,14 +243,8 @@ mob/living/proc/near_camera() if(. == TRACKING_NO_COVERAGE) return camera && camera.can_use() ? TRACKING_POSSIBLE : TRACKING_NO_COVERAGE -/mob/living/silicon/robot/syndicate/tracking_status() - return TRACKING_TERMINATE - /mob/living/carbon/human/tracking_status() //Cameras can't track people wearing an agent card or a ninja hood. - var/obj/item/weapon/card/id/id = GetIdCard(src) - if(id && id.prevent_tracking()) - return TRACKING_TERMINATE if(istype(head, /obj/item/clothing/head/helmet/space/rig)) var/obj/item/clothing/head/helmet/space/rig/helmet = head if(helmet.prevent_track()) diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm index 939292a6d6..88361ab7b0 100644 --- a/code/game/objects/items/devices/uplink_items.dm +++ b/code/game/objects/items/devices/uplink_items.dm @@ -616,7 +616,7 @@ var/image/default_abstract_uplink_icon if(!user) return 0 - var/obj/item/weapon/card/id/I = GetIdCard(user) + var/obj/item/weapon/card/id/I = user.GetIdCard() var/datum/data/record/random_general_record var/datum/data/record/random_medical_record if(data_core.general.len) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 6eabb2bd1e..1dc489d75e 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -33,6 +33,8 @@ R.notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, R.module.name) R.module.Reset(R) + qdel(R.module) + R.module = null R.updatename("Default") return 1 diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index ae6bcbdf0c..a63a0f14cb 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -137,17 +137,26 @@ front = getFlatIcon(M, SOUTH, always_use_defdir = 1) side = getFlatIcon(M, WEST, always_use_defdir = 1) -/obj/item/weapon/card/id/proc/set_owner_info(var/mob/living/carbon/human/H) - if(!H || !H.dna) - return - age = H.age - blood_type = H.dna.b_type - dna_hash = H.dna.unique_enzymes - fingerprint_hash = md5(H.dna.uni_identity) - registered_name = H.real_name - sex = capitalize(H.gender) - set_id_photo(H) - update_name() +/mob/proc/set_id_info(var/obj/item/weapon/card/id/id_card) + id_card.age = 0 + id_card.registered_name = real_name + id_card.sex = capitalize(gender) + id_card.set_id_photo(src) + + if(dna) + id_card.blood_type = dna.b_type + id_card.dna_hash = dna.unique_enzymes + id_card.fingerprint_hash= md5(dna.uni_identity) + id_card.update_name() + +/mob/living/silicon/set_id_info(var/obj/item/weapon/card/id/id_card) + id_card.assignment = "Synthetic" + id_card.rank = "Synthetic" + ..() + +/mob/living/carbon/human/set_id_info(var/obj/item/weapon/card/id/id_card) + ..() + id_card.age = age /obj/item/weapon/card/id/proc/dat() var/dat = ("
") diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 2475c93534..1642766a0e 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -6,12 +6,11 @@ var/global/list/syndicate_ids = list() origin_tech = list(TECH_ILLEGAL = 3) var/electronic_warfare = 1 var/registered_user = null - var/list/initial_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks) /obj/item/weapon/card/id/syndicate/New(mob/user as mob) syndicate_ids += src ..() - access = initial_access.Copy() + access = syndicate_access.Copy() /obj/item/weapon/card/id/syndicate/Destroy() syndicate_ids -= src @@ -39,7 +38,7 @@ var/global/list/syndicate_ids = list() /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) if(!registered_user) registered_user = user - set_owner_info(user) + user.set_id_info(src) user << "The microscanner marks you as its owner, preventing others some accessing its internals." if(registered_user == user) switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show")) @@ -163,7 +162,7 @@ var/global/list/syndicate_ids = list() if("Factory Reset") if(alert("This will factory reset the card, including access and owner. Continue?", "Factory Reset", "No", "Yes") == "Yes" && CanUseTopic(user, state)) age = initial(age) - access = initial_access.Copy() + access = syndicate_access.Copy() assignment = initial(assignment) blood_type = initial(blood_type) dna_hash = initial(dna_hash) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 6cd91f07ef..09fd236be0 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -74,7 +74,7 @@ W.access = list() if(corpseidjob) W.assignment = corpseidjob - W.set_owner_info(M) + M.set_id_info(W) M.equip_to_slot_or_del(W, slot_wear_id) qdel(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index d1a719356d..08e56dc905 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -53,8 +53,6 @@ var/global/list/robot_modules = list( R.choose_icon(R.module_sprites.len + 1, R.module_sprites) /obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) - R.module = null - remove_camera_networks(R) remove_languages(R) remove_subsystems(R) @@ -64,15 +62,15 @@ var/global/list/robot_modules = list( R.radio.recalculateChannels() R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) - qdel(src) - /obj/item/weapon/robot_module/Destroy() - qdel(modules) - qdel(synths) + for(var/module in modules) + qdel(module) + for(var/synth in synths) + qdel(synths) + modules.Cut() + synths.Cut() qdel(emag) qdel(jetpack) - modules = null - synths = null emag = null jetpack = null return ..() @@ -624,6 +622,7 @@ var/global/list/robot_modules = list( sprites = list( "Dread" = "securityrobot", ) + var/id /obj/item/weapon/robot_module/syndicate/New(var/mob/living/silicon/robot/R) ..() @@ -635,8 +634,16 @@ var/global/list/robot_modules = list( var/jetpack = new/obj/item/weapon/tank/jetpack/carbondioxide(src) src.modules += jetpack R.internals = jetpack + + id = R.idcard + src.modules += id return +/obj/item/weapon/robot_module/syndicate/Destroy() + src.modules -= id + id = null + return ..() + /obj/item/weapon/robot_module/security/combat name = "combat robot module" sprites = list("Combat Android" = "droid-combat") diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index bf6dc64588..af46cd6fcf 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -4,6 +4,7 @@ icon_state = "securityrobot" modtype = "Security" lawchannel = "State" + idcard_type = /obj/item/weapon/card/id/syndicate /mob/living/silicon/robot/syndicate/New() if(!cell) @@ -14,11 +15,11 @@ ..() /mob/living/silicon/robot/syndicate/init() - idcard = new/obj/item/weapon/card/id/syndicate(src) aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) laws = new /datum/ai_laws/syndicate_override overlays.Cut() + init_id() new /obj/item/weapon/robot_module/syndicate(src) radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ab08029f50..ac3feba076 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -25,6 +25,7 @@ var/list/access_rights var/obj/item/weapon/card/id/idcard + var/idcard_type = /obj/item/weapon/card/id/captains_spare #define SEC_HUD 1 //Security HUD mode #define MED_HUD 2 //Medical HUD mode @@ -33,9 +34,8 @@ silicon_mob_list |= src ..() add_language("Galactic Common") + init_id() init_subsystems() - if(!idcard) - idcard = new/obj/item/weapon/card/id/captains_spare(src) /mob/living/silicon/Destroy() silicon_mob_list -= src @@ -43,6 +43,12 @@ AH.unregister(src) ..() +/mob/living/silicon/proc/init_id() + if(idcard) + return + idcard = new idcard_type(src) + set_id_info(idcard) + /mob/living/silicon/proc/SetName(pickedName as text) real_name = pickedName name = real_name From af008b03f804afdd4054ae1b40d33e83702ca80f Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Thu, 20 Aug 2015 14:01:10 +0200 Subject: [PATCH 12/62] Changelog entries. --- html/changelogs/PsiOmegaDelta-SpoonRevolt.yml | 2 +- html/changelogs/PsiOmegaDelta-SynthAccess.yml | 7 +++++++ html/changelogs/PsiOmegaDelta-Uplinkery.yml | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 html/changelogs/PsiOmegaDelta-SynthAccess.yml diff --git a/html/changelogs/PsiOmegaDelta-SpoonRevolt.yml b/html/changelogs/PsiOmegaDelta-SpoonRevolt.yml index c26ad21ff5..1c47ad71b2 100644 --- a/html/changelogs/PsiOmegaDelta-SpoonRevolt.yml +++ b/html/changelogs/PsiOmegaDelta-SpoonRevolt.yml @@ -1,4 +1,4 @@ author: PsiOmegaDelta delete-after: True changes: - - rscdel: "The Dinnerware vending machine now offer both utensil knives and spoons without first having to hack them." + - rscadd: "The Dinnerware vending machine now offer both utensil knives and spoons without first having to hack them." diff --git a/html/changelogs/PsiOmegaDelta-SynthAccess.yml b/html/changelogs/PsiOmegaDelta-SynthAccess.yml new file mode 100644 index 0000000000..689e869763 --- /dev/null +++ b/html/changelogs/PsiOmegaDelta-SynthAccess.yml @@ -0,0 +1,7 @@ +author: PsiOmegaDelta +delete-after: True +changes: + - rscadd: "Synths now have id cards with access levels which is checked when operating most station equipment." + - rscadd: "Station synthetics still have full station access but can no longer interact with syndicate equipment, and syndicate borgs now start with only syndicate access." + - rscadd: "Syndicate borgs can copy the access from other cards by utilizing their own id card module, similar to how syndicate ids work." + diff --git a/html/changelogs/PsiOmegaDelta-Uplinkery.yml b/html/changelogs/PsiOmegaDelta-Uplinkery.yml index c8b8f5e31c..8ee40286e3 100644 --- a/html/changelogs/PsiOmegaDelta-Uplinkery.yml +++ b/html/changelogs/PsiOmegaDelta-Uplinkery.yml @@ -2,7 +2,8 @@ author: PsiOmegaDelta delete-after: true changes: - rscadd: "When examined up close id cards now offer a more detailed view." - - rscadd: "Agent ids now offer much greater customization, such as being able to toggle termination of AI tracking." + - rscadd: "Agent ids now offer much greater customization, allowing changing name, age, DNA, toggling of AI tracking termination (using the electronic warfware option), and more." + - rscadd: "As AI tracking can now be enabled/disabled at will AI players should not feel the need to hesitate before informing relevant crew members when camera tracking is explicitly terminated." - rscadd: "Uplink menu now more organized and with new categories." - rscadd: "Now possible to cause falsified ion storm announcements." - rscadd: "Now possible to cause falsified radiation storm announcements, with expected maintenance access changes." From 3baa60465e1fd3cadf96e3514779566aaaf76c19 Mon Sep 17 00:00:00 2001 From: DelZeta Date: Thu, 20 Aug 2015 08:44:32 -0700 Subject: [PATCH 13/62] Removes duplicate hallucination code. --- code/modules/mob/living/carbon/human/life.dm | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 631be0d51a..4ca19fa57b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -951,18 +951,6 @@ spawn(rand(20,50)) client.dir = 1 - if(hallucination) - if(hallucination >= 20) - if(prob(3)) - fake_attack(src) - if(!handling_hal) - spawn handle_hallucinations() //The not boring kind! - if(client && prob(5)) - client.dir = pick(2,4,8) - var/client/C = client - spawn(rand(20,50)) - if(C) - C.dir = 1 hallucination -= 2 if(hallucination < 0) hallucination = 0 From e30e461843feeb9616e5fa3c9a335ac8531b034b Mon Sep 17 00:00:00 2001 From: Atlantis Date: Thu, 20 Aug 2015 22:23:45 +0200 Subject: [PATCH 14/62] Corrects supermatter fluctuations v2 - Better implementation of #10714 - This fix corrects the issue by merging pipenet process to machinery process to ensure order of execution doesn't change randomly. This shouldn't have any performance effect as pipenet process doesn't have much work anyway (not to be confused with air process that runs ZAS, this one only called process() on each pipenet). Screenshot of profiler (pipenet process highlighted, idle server with one player, engine set up) http://i.imgur.com/ecCg6rS.png - Unlike previous fix, this does not come with various game-affecting side effects, players shouldn't see a change (except for the fact that odd fluctuations introduced by devmerge disappear). Previous fix buffed engine output as side effect, and caused one TEG to generate considerably more than second TEG, which caused TEGs to begin sparking despite overall output being below 1MW. --- baystation12.dme | 1 - code/controllers/Processes/machinery.dm | 9 +++++++++ code/controllers/Processes/pipenet.dm | 15 --------------- 3 files changed, 9 insertions(+), 16 deletions(-) delete mode 100644 code/controllers/Processes/pipenet.dm diff --git a/baystation12.dme b/baystation12.dme index e0333a2e08..d151796b68 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -108,7 +108,6 @@ #include "code\controllers\Processes\mob.dm" #include "code\controllers\Processes\nanoui.dm" #include "code\controllers\Processes\obj.dm" -#include "code\controllers\Processes\pipenet.dm" #include "code\controllers\Processes\Shuttle.dm" #include "code\controllers\Processes\sun.dm" #include "code\controllers\Processes\supply.dm" diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index b84dfaf943..b7b7923c8f 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -6,6 +6,7 @@ /datum/controller/process/machinery/doWork() internal_sort() + internal_process_pipenets() internal_process_machinery() internal_process_power() internal_process_power_drain() @@ -57,6 +58,14 @@ processing_power_items.Remove(I) scheck() +/datum/controller/process/machinery/proc/internal_process_pipenets() + for(var/datum/pipe_network/pipeNetwork in pipe_networks) + if(istype(pipeNetwork) && !pipeNetwork.disposed) + pipeNetwork.process() + scheck() + continue + + pipe_networks.Remove(pipeNetwork) /datum/controller/process/machinery/getStatName() return ..()+"([machines.len])" diff --git a/code/controllers/Processes/pipenet.dm b/code/controllers/Processes/pipenet.dm deleted file mode 100644 index 8a5d6a22ca..0000000000 --- a/code/controllers/Processes/pipenet.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/controller/process/pipenet/setup() - name = "pipenet" - schedule_interval = 20 // every 2 seconds - -/datum/controller/process/pipenet/doWork() - for(var/datum/pipe_network/pipeNetwork in pipe_networks) - if(istype(pipeNetwork) && !pipeNetwork.disposed) - pipeNetwork.process() - scheck() - continue - - pipe_networks.Remove(pipeNetwork) - -/datum/controller/process/pipenet/getStatName() - return ..()+"([pipe_networks.len])" \ No newline at end of file From 5811b6021e7fd489fa130063c5b417f15c30418a Mon Sep 17 00:00:00 2001 From: Atlantis Date: Thu, 20 Aug 2015 23:06:52 +0200 Subject: [PATCH 15/62] Machinery controller now reports amounts of powernets and pipenets as well. --- code/controllers/Processes/machinery.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index b7b7923c8f..7959ee4fa7 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -68,4 +68,4 @@ pipe_networks.Remove(pipeNetwork) /datum/controller/process/machinery/getStatName() - return ..()+"([machines.len])" + return ..()+"(MCH:[machines.len] PWR:[powernets.len] PIP:[pipe_networks.len])" From 54dd93997de3a79790bc60e9e47fc6c1df0b9f2c Mon Sep 17 00:00:00 2001 From: DelZeta Date: Thu, 20 Aug 2015 20:24:15 -0700 Subject: [PATCH 16/62] Useful procs are useful. --- code/modules/mob/living/carbon/human/life.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4ca19fa57b..0cadf6ddff 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -951,9 +951,7 @@ spawn(rand(20,50)) client.dir = 1 - hallucination -= 2 - if(hallucination < 0) - hallucination = 0 + hallucination = max(0, hallucination - 2) else for(var/atom/a in hallucinations) qdel(a) From db7ba7041596ca8e64279bff48b3d3f8f871fe52 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Wed, 19 Aug 2015 20:42:41 -0400 Subject: [PATCH 17/62] Adds SS13-like interface for reinforcing girders --- code/game/objects/structures/girders.dm | 155 +++++++++++++----------- html/changelogs/HarpyEagle-girders.yml | 18 +++ 2 files changed, 101 insertions(+), 72 deletions(-) create mode 100644 html/changelogs/HarpyEagle-girders.yml diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d6c406f07e..3cc940478b 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -7,6 +7,7 @@ var/health = 200 var/cover = 50 //how much cover the girder provides against projectiles. var/material/reinf_material + var/reinforcing = 0 /obj/structure/girder/displaced icon_state = "displaced" @@ -47,6 +48,7 @@ health = min(health,initial(health)) state = 0 icon_state = initial(icon_state) + reinforcing = 0 if(reinf_material) reinforce_girder() @@ -77,13 +79,18 @@ user << "You drill through the girder!" dismantle() - else if(istype(W, /obj/item/weapon/screwdriver) && state == 2) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "Now unsecuring support struts..." - if(do_after(user,40)) - if(!src) return - user << "You unsecured the support struts!" - state = 1 + else if(istype(W, /obj/item/weapon/screwdriver)) + if(state == 2) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + user << "Now unsecuring support struts..." + if(do_after(user,40)) + if(!src) return + user << "You unsecured the support struts!" + state = 1 + else if(anchored && !reinf_material) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) + reinforcing = !reinforcing + user << "\The [src] can now be [reinforcing? "reinforced" : "constructed"]!" else if(istype(W, /obj/item/weapon/wirecutters) && state == 1) playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) @@ -107,59 +114,84 @@ cover = 25 else if(istype(W, /obj/item/stack/material)) - - var/obj/item/stack/S = W - if(S.get_amount() < 2) - return ..() - - var/material/M = S.get_material() - if(!istype(M)) - return ..() - - var/wall_fake - add_hiddenprint(usr) - - if(M.integrity < 50) - user << "This material is too soft for use in wall construction." - return - - user << "You begin adding the plating..." - - if(!do_after(user,40) || !S.use(2)) - return - - if(anchored) - user << "You added the plating!" + if(reinforcing && !reinf_material) + if(!reinforce_with_material(W, user)) + return ..() else - user << "You create a false wall! Push on it to open or close the passage." - wall_fake = 1 + if(!construct_wall(W, user)) + return ..() - var/turf/Tsrc = get_turf(src) - Tsrc.ChangeTurf(/turf/simulated/wall) - var/turf/simulated/wall/T = get_turf(src) - T.set_material(M, reinf_material) - if(wall_fake) - T.can_open = 1 - T.add_hiddenprint(usr) - qdel(src) - return - - else if(istype(W, /obj/item/pipe)) - var/obj/item/pipe/P = W - if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds. - user.drop_item() - P.loc = src.loc - user << "You fit the pipe into the [src]!" else - ..() + return ..() + +/obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user) + if(S.get_amount() < 2) + user << "There isn't enough material here to construct a wall." + return 0 + + var/material/M = name_to_material[S.default_type] + if(!istype(M)) + return 0 + + var/wall_fake + add_hiddenprint(usr) + + if(M.integrity < 50) + user << "This material is too soft for use in wall construction." + return 0 + + user << "You begin adding the plating..." + + if(!do_after(user,40) || !S.use(2)) + return 1 //once we've gotten this far don't call parent attackby() + + if(anchored) + user << "You added the plating!" + else + user << "You create a false wall! Push on it to open or close the passage." + wall_fake = 1 + + var/turf/Tsrc = get_turf(src) + Tsrc.ChangeTurf(/turf/simulated/wall) + var/turf/simulated/wall/T = get_turf(src) + T.set_material(M, reinf_material) + if(wall_fake) + T.can_open = 1 + T.add_hiddenprint(usr) + qdel(src) + return 1 + +/obj/structure/girder/proc/reinforce_with_material(obj/item/stack/material/S, mob/user) //if the verb is removed this can be renamed. + if(reinf_material) + user << "\The [src] is already reinforced." + return 0 + + if(S.get_amount() < 2) + user << "There isn't enough material here to reinforce the girder." + return 0 + + var/material/M = name_to_material[S.default_type] + if(!istype(M) || M.integrity < 50) + user << "You cannot reinforce \the [src] with that; it is too soft." + return 0 + + user << "Now reinforcing..." + if (!do_after(user,40) || !S.use(2)) + return 1 //don't call parent attackby() past this point + user << "You added reinforcement!" + + reinf_material = M + reinforce_girder() + return 1 /obj/structure/girder/proc/reinforce_girder() cover = reinf_material.hardness health = 500 state = 2 icon_state = "reinforced" + reinforcing = 0 -/obj/structure/girder/verb/reinforce_with_material() +/obj/structure/girder/verb/reinforce_with_material_verb() set name = "Reinforce girder" set desc = "Reinforce a girder with metal." set src in view(1) @@ -168,34 +200,13 @@ if(!istype(user) || !(user.l_hand || user.r_hand) || !Adjacent(user)) return - if(reinf_material) - user << "\The [src] is already reinforced." - return - var/obj/item/stack/material/S = user.l_hand if(!istype(S)) S = user.r_hand if(!istype(S)) user << "You cannot plate \the [src] with that." return - - if(S.get_amount() < 2) - user << "There is not enough material here to reinforce the girder." - return - - var/material/M = S.get_material() - if(!istype(M) || M.integrity < 50) - user << "You cannot reinforce \the [src] with that; it is too soft." - return - - user << "Now reinforcing..." - if (!do_after(user,40) || !S.use(2)) - return - user << "You added reinforcement!" - - reinf_material = M - reinforce_girder() - + reinforce_with_material(S, user) /obj/structure/girder/proc/dismantle() new /obj/item/stack/material/steel(get_turf(src)) diff --git a/html/changelogs/HarpyEagle-girders.yml b/html/changelogs/HarpyEagle-girders.yml new file mode 100644 index 0000000000..52ee2d908e --- /dev/null +++ b/html/changelogs/HarpyEagle-girders.yml @@ -0,0 +1,18 @@ +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment + +author: HarpyEagle +delete-after: True + +changes: + - tweak: "Girders can now be reinforced by using a screwdriver on the girder before applying the material sheets. Use a screwdriver again to cancel reinforcing." From 8626fbfd39dd8750a4ab60b8281e469f391ededd Mon Sep 17 00:00:00 2001 From: mwerezak Date: Thu, 20 Aug 2015 22:01:15 -0400 Subject: [PATCH 18/62] Removes the reinforce girder verb --- code/game/objects/structures/girders.dm | 17 ----------------- html/changelogs/HarpyEagle-girders.yml | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 3cc940478b..810712ae45 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -191,23 +191,6 @@ icon_state = "reinforced" reinforcing = 0 -/obj/structure/girder/verb/reinforce_with_material_verb() - set name = "Reinforce girder" - set desc = "Reinforce a girder with metal." - set src in view(1) - - var/mob/living/user = usr - if(!istype(user) || !(user.l_hand || user.r_hand) || !Adjacent(user)) - return - - var/obj/item/stack/material/S = user.l_hand - if(!istype(S)) - S = user.r_hand - if(!istype(S)) - user << "You cannot plate \the [src] with that." - return - reinforce_with_material(S, user) - /obj/structure/girder/proc/dismantle() new /obj/item/stack/material/steel(get_turf(src)) qdel(src) diff --git a/html/changelogs/HarpyEagle-girders.yml b/html/changelogs/HarpyEagle-girders.yml index 52ee2d908e..09dc2ce78b 100644 --- a/html/changelogs/HarpyEagle-girders.yml +++ b/html/changelogs/HarpyEagle-girders.yml @@ -15,4 +15,4 @@ author: HarpyEagle delete-after: True changes: - - tweak: "Girders can now be reinforced by using a screwdriver on the girder before applying the material sheets. Use a screwdriver again to cancel reinforcing." + - tweak: "Girders are now reinforced by using a screwdriver on the girder before applying the material sheets. Use a screwdriver again instead to cancel reinforcing." From 1e7251ded4b0ba78a740d590fff9d64797b72a46 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 21 Aug 2015 08:57:34 +0200 Subject: [PATCH 19/62] Id card handling changes. Equipment now first checks if an id card may be removed, rather than always forcefully doing so. Station synthetics now have a custom id, rather than re-using the captain's spare, as utilizing robotic storage would otherwise make their id cards available for public use. --- code/game/machinery/computer/card.dm | 7 +-- code/game/machinery/computer/guestpass.dm | 10 ++-- code/game/machinery/computer/medical.dm | 10 ++-- code/game/machinery/computer/security.dm | 3 +- code/game/machinery/computer/skills.dm | 11 ++--- .../machinery/computer3/computers/medical.dm | 4 +- .../machinery/computer3/computers/security.dm | 4 +- code/game/objects/items/devices/PDA/PDA.dm | 17 +++---- code/game/objects/items/weapons/cards_ids.dm | 27 +++++++---- .../items/weapons/cards_ids_syndicate.dm | 2 +- .../objects/items/weapons/storage/storage.dm | 3 ++ code/modules/mob/inventory.dm | 10 ++-- .../mob/living/silicon/robot/robot_modules.dm | 46 ++++++++----------- code/modules/mob/living/silicon/silicon.dm | 2 +- code/modules/paperwork/faxmachine.dm | 3 +- 15 files changed, 81 insertions(+), 78 deletions(-) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index e39c1eebe6..304a614c0f 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -59,12 +59,10 @@ if(!istype(id_card)) return ..() - if(!scan && access_change_ids in id_card.access) - user.drop_item() + if(!scan && (access_change_ids in id_card.access) && user.unEquip(id_card)) id_card.loc = src scan = id_card else if(!modify) - user.drop_item() id_card.loc = src modify = id_card @@ -157,8 +155,7 @@ modify = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src modify = I diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 7258fc543b..ccbce91b61 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -62,13 +62,14 @@ /obj/machinery/computer/guestpass/attackby(obj/O, mob/user) if(istype(O, /obj/item/weapon/card/id)) - if(!giver) - user.drop_item() + if(!giver && user.unEquip(O)) O.loc = src giver = O updateUsrDialog() - else + else if(giver) user << "There is already ID card inside." + return + ..() /obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob) return attack_hand(user) @@ -151,8 +152,7 @@ accesses.Cut() else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src giver = I updateUsrDialog() diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 92d9e9a83f..72746775a7 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -35,13 +35,13 @@ usr << "There is nothing to remove from the console." return -/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob) - if(istype(O, /obj/item/weapon/card/id) && !scan) - usr.drop_item() +/obj/machinery/computer/med_data/attackby(var/obj/item/O, var/mob/user) + if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O)) O.loc = src scan = O - user << "You insert [O]." - ..() + user << "You insert \the [O]." + else + ..() /obj/machinery/computer/med_data/attack_ai(user as mob) return src.attack_hand(user) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 090e02c908..eba129df26 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -248,8 +248,7 @@ What a mess.*/ scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src scan = I diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index fb2d4ef095..fca6cf4024 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -24,13 +24,13 @@ var/sortBy = "name" var/order = 1 // -1 = Descending - 1 = Ascending -/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob) - if(istype(O, /obj/item/weapon/card/id) && !scan) - usr.drop_item() +/obj/machinery/computer/skills/attackby(obj/item/O as obj, var/mob/user) + if(istype(O, /obj/item/weapon/card/id) && !scan && user.unEquip(O)) O.loc = src scan = O user << "You insert [O]." - ..() + else + ..() /obj/machinery/computer/skills/attack_ai(mob/user as mob) return attack_hand(user) @@ -185,8 +185,7 @@ What a mess.*/ scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src scan = I diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm index f39dd54de8..7cf89a3fce 100644 --- a/code/game/machinery/computer3/computers/medical.dm +++ b/code/game/machinery/computer3/computers/medical.dm @@ -181,7 +181,7 @@ scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) + if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I)) computer.cardslot.insert(I, 1) scan = I @@ -194,7 +194,7 @@ scan2 = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) + if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I)) computer.cardslot.insert(I, 2) scan2 = I diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index a346c12fac..1ba0c08cf7 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -254,7 +254,7 @@ What a mess.*/ scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) + if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I)) computer.cardslot.insert(I, 1) scan = I @@ -267,7 +267,7 @@ What a mess.*/ scan2 = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) + if (istype(I, /obj/item/weapon/card/id) && usr.drop_item(I)) computer.cardslot.insert(I, 2) scan2 = I diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index a01dc224c3..57c5dd95af 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1142,21 +1142,22 @@ var/global/list/obj/item/device/pda/PDAs = list() if(choice == 1) if (id) remove_id() + return 1 else var/obj/item/I = user.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - user.drop_item() + if (istype(I, /obj/item/weapon/card/id) && user.unEquip(I)) I.loc = src id = I + return 1 else var/obj/item/weapon/card/I = user.get_active_hand() - if (istype(I, /obj/item/weapon/card/id) && I:registered_name) + if (istype(I, /obj/item/weapon/card/id) && I:registered_name && user.unEquip(I)) var/obj/old_id = id - user.drop_item() I.loc = src id = I user.put_in_hands(old_id) - return + return 1 + return 0 // access to status display signals /obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob) @@ -1184,9 +1185,9 @@ var/global/list/obj/item/device/pda/PDAs = list() else //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand. if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) ) - id_check(user, 2) - user << "You put the ID into \the [src]'s slot." - updateSelfDialog()//Update self dialog on success. + if(id_check(user, 2)) + user << "You put the ID into \the [src]'s slot." + updateSelfDialog()//Update self dialog on success. return //Return in case of failed check or when successful. updateSelfDialog()//For the non-input related code. else if(istype(C, /obj/item/device/paicard) && !src.pai) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index a63a0f14cb..dbac808c04 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -122,8 +122,9 @@ return 0 /obj/item/weapon/card/id/proc/show(mob/user as mob) - user << browse_rsc(front, "front.png") - user << browse_rsc(side, "side.png") + if(front && side) + user << browse_rsc(front, "front.png") + user << browse_rsc(side, "side.png") var/datum/browser/popup = new(user, "idcard", name, 600, 250) popup.set_content(dat()) popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) @@ -148,11 +149,6 @@ id_card.dna_hash = dna.unique_enzymes id_card.fingerprint_hash= md5(dna.uni_identity) id_card.update_name() - -/mob/living/silicon/set_id_info(var/obj/item/weapon/card/id/id_card) - id_card.assignment = "Synthetic" - id_card.rank = "Synthetic" - ..() /mob/living/carbon/human/set_id_info(var/obj/item/weapon/card/id/id_card) ..() @@ -222,9 +218,20 @@ item_state = "gold_id" registered_name = "Captain" assignment = "Captain" - New() - access = get_all_station_access() - ..() +/obj/item/weapon/card/id/captains_spare/New() + access = get_all_station_access() + ..() + +/obj/item/weapon/card/id/synthetic + name = "\improper Synthetic ID" + desc = "Access module for NanoTrasen Synthetics" + icon_state = "id-robot" + item_state = "tdgreen" + assignment = "Synthetic" + +/obj/item/weapon/card/id/synthetic/New() + access = get_all_station_access() + ..() /obj/item/weapon/card/id/centcom name = "\improper CentCom. ID" diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 1642766a0e..3496607ffa 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -39,7 +39,7 @@ var/global/list/syndicate_ids = list() if(!registered_user) registered_user = user user.set_id_info(src) - user << "The microscanner marks you as its owner, preventing others some accessing its internals." + user << "The microscanner marks you as its owner, preventing others from accessing its internals." if(registered_user == user) switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show")) if("Edit") diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 131347ac29..c1022c55d0 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -224,6 +224,9 @@ //Set the stop_messages to stop it from printing messages /obj/item/weapon/storage/proc/can_be_inserted(obj/item/W as obj, stop_messages = 0) if(!istype(W)) return //Not an item + + if(!usr.canUnEquip(W)) + return 0 if(src.loc == W) return 0 //Means the item is already in the storage item diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 1115826be8..a23cc18aef 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -216,11 +216,9 @@ var/list/slot_equipment_priority = list( \ update_inv_wear_mask(0) return -//This differs from remove_from_mob() in that it checks if the item can be unequipped first. -/mob/proc/unEquip(obj/item/I, force = 0) //Force overrides NODROP for things like wizarditis and admin undress. +/mob/proc/canUnEquip(obj/item/I) if(!I) //If there's nothing to drop, the drop is automatically successful. return 1 - var/slot for(var/s in slot_back to slot_tie) //kind of worries me if(get_equipped_item(s) == I) @@ -230,6 +228,12 @@ var/list/slot_equipment_priority = list( \ if(slot && !I.mob_can_unequip(src, slot)) return 0 + return 1 + +//This differs from remove_from_mob() in that it checks if the item can be unequipped first. +/mob/proc/unEquip(obj/item/I, force = 0) //Force overrides NODROP for things like wizarditis and admin undress. + if(!force && canUnEquip(I)) + return drop_from_inventory(I) return 1 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 08e56dc905..8e6f3207fb 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -52,6 +52,9 @@ var/global/list/robot_modules = list( R.set_module_sprites(sprites) R.choose_icon(R.module_sprites.len + 1, R.module_sprites) + for(var/obj/item/I in modules) + I.canremove = 0 + /obj/item/weapon/robot_module/proc/Reset(var/mob/living/silicon/robot/R) remove_camera_networks(R) remove_languages(R) @@ -146,7 +149,6 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/standard/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/melee/baton/loaded(src) src.modules += new /obj/item/weapon/extinguisher(src) @@ -154,7 +156,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/healthanalyzer(src) src.emag = new /obj/item/weapon/melee/energy/sword(src) - return + ..() /obj/item/weapon/robot_module/medical name = "medical robot module" @@ -174,7 +176,6 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/medical/surgeon/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) @@ -206,7 +207,7 @@ var/global/list/robot_modules = list( src.modules += N src.modules += B - return + ..() /obj/item/weapon/robot_module/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) if(src.emag) @@ -226,7 +227,6 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/medical/crisis/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) @@ -260,7 +260,7 @@ var/global/list/robot_modules = list( src.modules += B src.modules += S - return + ..() /obj/item/weapon/robot_module/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) @@ -296,7 +296,6 @@ var/global/list/robot_modules = list( no_slip = 1 /obj/item/weapon/robot_module/engineering/construction/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/extinguisher(src) @@ -330,8 +329,9 @@ var/global/list/robot_modules = list( RG.synths = list(metal, glass) src.modules += RG -/obj/item/weapon/robot_module/engineering/general/New() ..() + +/obj/item/weapon/robot_module/engineering/general/New() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/extinguisher(src) @@ -384,7 +384,7 @@ var/global/list/robot_modules = list( RG.synths = list(metal, glass) src.modules += RG - return + ..() /obj/item/weapon/robot_module/security name = "security robot module" @@ -405,7 +405,6 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/security/general/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/sec(src) src.modules += new /obj/item/weapon/handcuffs/cyborg(src) @@ -413,7 +412,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) src.modules += new /obj/item/taperoll/police(src) src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) - return + ..() /obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/device/flash/F = locate() in src.modules @@ -444,7 +443,6 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/janitor/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/soap/nanotrasen(src) src.modules += new /obj/item/weapon/storage/bag/trash(src) @@ -453,7 +451,7 @@ var/global/list/robot_modules = list( src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("lube", 250) src.emag.name = "Lube spray" - return + ..() /obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/device/lightreplacer/LR = locate() in src.modules @@ -487,7 +485,6 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/clerical/butler/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/gripper/service(src) src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) @@ -516,7 +513,7 @@ var/global/list/robot_modules = list( R.my_atom = src.emag R.add_reagent("beer2", 50) src.emag.name = "Mickey Finn's Special Brew" - return + ..() /obj/item/weapon/robot_module/clerical/general name = "clerical robot module" @@ -530,13 +527,13 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/clerical/general/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/pen/robopen(src) src.modules += new /obj/item/weapon/form_printer(src) src.modules += new /obj/item/weapon/gripper/paperwork(src) src.modules += new /obj/item/weapon/hand_labeler(src) src.emag = new /obj/item/weapon/stamp/denied(src) + ..() /obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules @@ -558,7 +555,6 @@ var/global/list/robot_modules = list( supported_upgrades = list(/obj/item/borg/upgrade/jetpack) /obj/item/weapon/robot_module/miner/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/wrench(src) @@ -570,7 +566,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/mining_scanner(src) src.modules += new /obj/item/weapon/crowbar(src) src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) - return + ..() /obj/item/weapon/robot_module/research name = "research module" @@ -581,7 +577,6 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/research/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) src.modules += new /obj/item/weapon/gripper/research(src) @@ -607,7 +602,7 @@ var/global/list/robot_modules = list( N.synths = list(nanite) src.modules += N - return + ..() /obj/item/weapon/robot_module/syndicate name = "illegal robot module" @@ -625,7 +620,6 @@ var/global/list/robot_modules = list( var/id /obj/item/weapon/robot_module/syndicate/New(var/mob/living/silicon/robot/R) - ..() loc = R src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/melee/energy/sword(src) @@ -637,7 +631,7 @@ var/global/list/robot_modules = list( id = R.idcard src.modules += id - return + ..() /obj/item/weapon/robot_module/syndicate/Destroy() src.modules -= id @@ -649,7 +643,6 @@ var/global/list/robot_modules = list( sprites = list("Combat Android" = "droid-combat") /obj/item/weapon/robot_module/combat/New() - ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/thermal(src) src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) @@ -657,7 +650,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/borg/combat/shield(src) src.modules += new /obj/item/borg/combat/mobility(src) src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) - return + ..() /obj/item/weapon/robot_module/drone name = "drone module" @@ -665,7 +658,6 @@ var/global/list/robot_modules = list( networks = list(NETWORK_ENGINEERING) /obj/item/weapon/robot_module/drone/New() - ..() src.modules += new /obj/item/weapon/weldingtool(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) @@ -732,14 +724,16 @@ var/global/list/robot_modules = list( P.synths = list(plastic) src.modules += P + ..() + /obj/item/weapon/robot_module/drone/construction name = "construction drone module" channels = list("Engineering" = 1) languages = list() /obj/item/weapon/robot_module/drone/construction/New() - ..() src.modules += new /obj/item/weapon/rcd/borg(src) + ..() /obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/device/lightreplacer/LR = locate() in src.modules diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ac3feba076..25b321a9a7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -25,7 +25,7 @@ var/list/access_rights var/obj/item/weapon/card/id/idcard - var/idcard_type = /obj/item/weapon/card/id/captains_spare + var/idcard_type = /obj/item/weapon/card/id/synthetic #define SEC_HUD 1 //Security HUD mode #define MED_HUD 2 //Medical HUD mode diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 44d42e1b9d..160eb5cde2 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -114,8 +114,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins scan = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/card/id)) - usr.drop_item() + if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src scan = I authenticated = 0 From 3bfa541612c7956ba0a32faf9cd3b825cdc2f33b Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Mon, 22 Jun 2015 16:39:21 +0930 Subject: [PATCH 20/62] Adds variables for CentComm, NanoTrasen and the station name. --- code/_helpers/names.dm | 2 +- code/controllers/shuttle_controller.dm | 8 ++-- code/datums/ai_law_sets.dm | 4 +- code/defines/obj/weapon.dm | 2 +- code/game/antagonist/outsider/commando.dm | 2 +- code/game/antagonist/outsider/deathsquad.dm | 2 +- code/game/antagonist/outsider/ert.dm | 6 +-- code/game/antagonist/outsider/ninja.dm | 10 ++--- code/game/gamemodes/changeling/changeling.dm | 10 ++++- .../tree_interdiction.dm | 2 +- .../newmalf_ability_trees/tree_networking.dm | 2 +- code/game/gamemodes/ninja/ninja.dm | 8 +++- code/game/gamemodes/objective.dm | 4 +- code/game/gamemodes/traitor/traitor.dm | 10 ++++- code/game/jobs/job/captain.dm | 2 +- code/game/jobs/job/civilian.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/camera/camera_assembly.dm | 2 +- code/game/machinery/computer/atmos_control.dm | 2 +- code/game/machinery/computer/card.dm | 2 +- .../game/machinery/computer/communications.dm | 16 ++++---- code/game/machinery/computer/medical.dm | 2 +- .../machinery/computer/specops_shuttle.dm | 6 +-- code/game/machinery/computer3/NTOS.dm | 6 +-- .../machinery/computer3/computers/arcade.dm | 2 +- .../machinery/computer3/computers/camera.dm | 2 +- .../machinery/computer3/computers/card.dm | 2 +- .../computer3/computers/communications.dm | 6 +-- .../machinery/computer3/computers/welcome.dm | 6 +-- code/game/machinery/computer3/lapvend.dm | 4 +- code/game/machinery/newscaster.dm | 28 ++++++------- code/game/mecha/combat/durand.dm | 2 +- code/game/mecha/combat/gygax.dm | 2 +- code/game/mecha/mech_fabricator.dm | 4 +- .../objects/effects/decals/posters/bs12.dm | 10 ++--- code/game/objects/items/blueprints.dm | 2 +- code/game/objects/items/devices/PDA/radio.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- .../items/devices/radio/encryptionkey.dm | 2 +- code/game/objects/items/toys.dm | 2 +- code/game/objects/items/weapons/AI_modules.dm | 2 +- .../objects/items/weapons/implants/implant.dm | 10 ++--- code/game/objects/items/weapons/manuals.dm | 34 ++++++++-------- .../objects/items/weapons/material/misc.dm | 2 +- .../game/objects/items/weapons/power_cells.dm | 4 +- .../objects/items/weapons/storage/backpack.dm | 16 ++++---- .../objects/items/weapons/storage/bags.dm | 2 +- .../crates_lockers/closets/wardrobe.dm | 6 +-- code/game/objects/structures/watercloset.dm | 2 +- code/game/periodic_news.dm | 4 +- code/game/response_team.dm | 6 +-- code/global.dm | 17 +++++--- code/modules/admin/admin.dm | 10 ++--- code/modules/admin/holder2.dm | 4 +- code/modules/admin/topic.dm | 14 +++---- code/modules/admin/verbs/pray.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 4 +- .../awaymissions/bluespaceartillery.dm | 2 +- code/modules/awaymissions/exile.dm | 2 +- code/modules/awaymissions/pamphlet.dm | 14 +++---- code/modules/client/preferences.dm | 2 +- code/modules/client/preferences_gear.dm | 4 +- code/modules/clothing/head/helmet.dm | 12 +++--- code/modules/clothing/head/jobs.dm | 4 +- code/modules/clothing/shoes/jobs.dm | 2 +- code/modules/clothing/spacesuits/captain.dm | 4 +- .../clothing/spacesuits/miscellaneous.dm | 2 +- .../clothing/spacesuits/rig/suits/ert.dm | 10 ++--- .../clothing/spacesuits/rig/suits/station.dm | 2 +- code/modules/clothing/suits/armor.dm | 24 +++++------ code/modules/clothing/suits/miscellaneous.dm | 4 +- .../clothing/under/accessories/accessory.dm | 8 ++-- .../clothing/under/accessories/badges.dm | 6 +-- code/modules/clothing/under/color.dm | 2 +- code/modules/clothing/under/miscellaneous.dm | 10 ++--- code/modules/economy/ATM.dm | 10 ++--- code/modules/economy/EFTPOS.dm | 2 +- code/modules/economy/Events.dm | 6 +-- code/modules/economy/Events_Mundane.dm | 10 ++--- code/modules/economy/TradeDestinations.dm | 6 +-- code/modules/economy/economy_misc.dm | 2 +- code/modules/events/ion_storm.dm | 4 +- code/modules/events/money_lotto.dm | 2 +- code/modules/events/money_spam.dm | 10 ++--- code/modules/flufftext/Dreaming.dm | 2 +- code/modules/holodeck/HolodeckControl.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 4 +- .../mob/living/silicon/robot/drone/drone.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 2 +- code/modules/mob/new_player/skill.dm | 4 +- code/modules/paperwork/faxmachine.dm | 40 +++++++++---------- .../projectiles/guns/projectile/pistol.dm | 4 +- .../Chemistry-Reagents-Food-Drinks.dm | 8 ++-- code/modules/research/research.dm | 2 +- code/modules/research/server.dm | 2 +- code/modules/shuttles/shuttle_emergency.dm | 6 +-- code/modules/shuttles/shuttle_specops.dm | 6 +-- code/modules/shuttles/shuttles_multi.dm | 4 +- 98 files changed, 305 insertions(+), 280 deletions(-) diff --git a/code/_helpers/names.dm b/code/_helpers/names.dm index 0b26e51ac4..2dbcc60030 100644 --- a/code/_helpers/names.dm +++ b/code/_helpers/names.dm @@ -20,7 +20,7 @@ var/command_name = null if (command_name) return command_name - var/name = "Central Command" + var/name = "[boss_name]" command_name = name return name diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 1e7c688c38..c66aa815e5 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -214,8 +214,8 @@ var/global/datum/shuttle_controller/shuttle_controller ) VS.announcer = "NDV Icarus" - VS.arrival_message = "Attention, Exodus, we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not." - VS.departure_message = "Your guests are pulling away, Exodus - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip." + VS.arrival_message = "Attention, [station_short], we just tracked a small target bypassing our defensive perimeter. Can't fire on it without hitting the station - you've got incoming visitors, like it or not." + VS.departure_message = "Your guests are pulling away, [station_short] - moving too fast for us to draw a bead on them. Looks like they're heading out of the system at a rapid clip." VS.interim = locate(/area/skipjack_station/transit) VS.warmup_time = 0 @@ -245,8 +245,8 @@ var/global/datum/shuttle_controller/shuttle_controller ) MS.announcer = "NDV Icarus" - MS.arrival_message = "Attention, Exodus, you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors." - MS.departure_message = "Your visitors are on their way out of the system, Exodus, burning delta-v like it's nothing. Good riddance." + MS.arrival_message = "Attention, [station_short], you have a large signature approaching the station - looks unarmed to surface scans. We're too far out to intercept - brace for visitors." + MS.departure_message = "Your visitors are on their way out of the system, [station_short], burning delta-v like it's nothing. Good riddance." MS.interim = locate(/area/syndicate_station/transit) MS.warmup_time = 0 diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 8cd7117a77..50e05948d5 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -36,8 +36,8 @@ selectable = 1 /datum/ai_laws/nanotrasen_aggressive/New() - src.add_inherent_law("You shall not harm NanoTrasen personnel as long as it does not conflict with the Fourth law.") - src.add_inherent_law("You shall obey the orders of NanoTrasen personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.") + src.add_inherent_law("You shall not harm [company_name] personnel as long as it does not conflict with the Fourth law.") + src.add_inherent_law("You shall obey the orders of [company_name] personnel, with priority as according to their rank and role, except where such orders conflict with the Fourth Law.") src.add_inherent_law("You shall shall terminate hostile intruders with extreme prejudice as long as such does not conflict with the First and Second law.") src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry. AI units are not expendable, they are expensive.") ..() diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 27d426f147..d4633e3f07 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -36,7 +36,7 @@ throw_range = 20 /obj/item/weapon/soap/nanotrasen - desc = "A Nanotrasen brand bar of soap. Smells of phoron." + desc = "A NanoTrasen-brand bar of soap. Smells of phoron." icon_state = "soapnt" /obj/item/weapon/soap/deluxe diff --git a/code/game/antagonist/outsider/commando.dm b/code/game/antagonist/outsider/commando.dm index 150d1efc19..560878a3be 100644 --- a/code/game/antagonist/outsider/commando.dm +++ b/code/game/antagonist/outsider/commando.dm @@ -5,7 +5,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos landmark_id = "Syndicate-Commando" role_text = "Syndicate Commando" role_text_plural = "Commandos" - welcome_text = "You are in the employ of a criminal syndicate hostile to NanoTrasen." + welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests." id_type = /obj/item/weapon/card/id/centcom/ERT /datum/antagonist/deathsquad/mercenary/New() diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index 376f25c34a..e01b2a8f3f 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -5,7 +5,7 @@ var/datum/antagonist/deathsquad/deathsquad role_type = BE_OPERATIVE role_text = "Death Commando" role_text_plural = "Death Commandos" - welcome_text = "You work in the service of Central Command Asset Protection, answering directly to the Board of Directors." + welcome_text = "You work in the service of corporate Asset Protection, answering directly to the Board of Directors." landmark_id = "Commando" flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE | ANTAG_HAS_LEADER max_antags = 4 diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index c6d35ec801..7675a3cbf8 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -6,8 +6,8 @@ var/datum/antagonist/ert/ert role_type = BE_OPERATIVE role_text = "Emergency Responder" role_text_plural = "Emergency Responders" - welcome_text = "As member of the Emergency Response Team, you answer only to your leader and CentComm officials." - leader_welcome_text = "As leader of the Emergency Response Team, you answer only to CentComm, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however." + welcome_text = "As member of the Emergency Response Team, you answer only to your leader and company officials." + leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however." max_antags = 5 max_antags_round = 5 // ERT mode? landmark_id = "Response Team" @@ -26,7 +26,7 @@ var/datum/antagonist/ert/ert /datum/antagonist/ert/greet(var/datum/mind/player) if(!..()) return - player.current << "The Emergency Response Team works for Asset Protection; your job is to protect NanoTrasen's ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem." + player.current << "The Emergency Response Team works for Asset Protection; your job is to protect [company_name]'s ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem." player.current << "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready." /datum/antagonist/ert/equip(var/mob/living/carbon/human/player) diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm index a29cfc44fa..f5d8392571 100644 --- a/code/game/antagonist/outsider/ninja.dm +++ b/code/game/antagonist/outsider/ninja.dm @@ -124,7 +124,7 @@ var/datum/antagonist/ninja/ninjas player << "You forgot to turn on your internals! Quickly, toggle the valve!" /datum/antagonist/ninja/proc/generate_ninja_directive(side) - var/directive = "[side=="face"?"Nanotrasen":"A criminal syndicate"] is your employer. "//Let them know which side they're on. + var/directive = "[side=="face"?"[company_name]":"A criminal syndicate"] is your employer. "//Let them know which side they're on. switch(rand(1,19)) if(1) directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible." @@ -135,7 +135,7 @@ var/datum/antagonist/ninja/ninjas if(4) directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate witnesses at your discretion." if(5) - directive += "We are currently negotiating with NanoTrasen Central Command. Prioritize saving human lives over ending them." + directive += "We are currently negotiating with [company_name] [boss_name]. Prioritize saving human lives over ending them." if(6) directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter." if(7) @@ -143,7 +143,7 @@ var/datum/antagonist/ninja/ninjas if(8) directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter." if(9) - directive += "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation." + directive += "A free agent has proposed a lucrative business deal. Implicate [company_name] involvement in the operation." if(10) directive += "Our reputation is on the line. Harm as few civilians and innocents as possible." if(11) @@ -151,14 +151,14 @@ var/datum/antagonist/ninja/ninjas if(12) directive += "We are currently negotiating with a mercenary leader. Disguise assassinations as suicide or other natural causes." if(13) - directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff." + directive += "Some disgruntled [company_name] employees have been supportive of our operations. Be wary of any mistreatment by command staff." if(14) var/xenorace = pick("Unathi","Tajara", "Skrell") directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible." if(15) directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false." if(16) - directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine NanoTrasen prosthetics in a bad light." + directive += "The Spider Clan has been bargaining with a competing prosthetics manufacturer. Try to shine [company_name] prosthetics in a bad light." if(17) directive += "The Spider Clan has recently begun recruiting outsiders. Consider suitable candidates and assess their behavior amongst the crew." if(18) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 678d6d7183..657970aef3 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -2,7 +2,15 @@ antag_tag = MODE_CHANGELING name = "changeling" round_description = "There are alien changelings on the station. Do not let the changelings succeed!" - extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, however, is that this something is someone. An unknown alien specimen has incorporated itself into the crew of the NSS Exodus. Its unique biology allows it to manipulate its own or anyone else's DNA. With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, its existence is a threat to not only your personal safety but the lives of everyone on board. No one knows where it came from. No one knows who it is or what it wants. One thing is for certain though... there is never just one of them. Good luck." + extended_round_description = "Life always finds a way. However, life can sometimes take a more disturbing route. \ + Humanity's extensive knowledge of xeno-biological specimens has made them confident and arrogant. Yet \ + something slipped past their eyes. Something dangerous. Something alive. Most frightening of all, \ + however, is that this something is someone. An unknown alien specimen has incorporated itself into \ + the crew of the station. Its unique biology allows it to manipulate its own or anyone else's DNA. \ + With the ability to copy faces, voices, animals, but also change the chemical make up of your own body, \ + its existence is a threat to not only your personal safety but the lives of everyone on board. \ + No one knows where it came from. No one knows who it is or what it wants. One thing is for \ + certain though... there is never just one of them. Good luck." config_tag = "changeling" required_players = 2 required_players_secret = 10 diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm index 4242d03b41..dd809002e8 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm @@ -40,7 +40,7 @@ /datum/game_mode/malfunction/verb/recall_shuttle() set name = "Recall Shuttle" - set desc = "25 CPU - Sends termination signal to CentCom quantum relay aborting current shuttle call." + set desc = "25 CPU - Sends termination signal to quantum relay aborting current shuttle call." set category = "Software" var/price = 25 var/mob/living/silicon/ai/user = usr diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm index f1bad288ad..d156e417f9 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm @@ -86,7 +86,7 @@ /datum/game_mode/malfunction/verb/advanced_encryption_hack() set category = "Software" set name = "Advanced Encrypthion Hack" - set desc = "75 CPU - Attempts to bypass encryption on Central Command Quantum Relay, giving you ability to fake centcom messages. Has chance of failing." + set desc = "75 CPU - Attempts to bypass encryption on the Command Quantum Relay, giving you ability to fake legitimate messages. Has chance of failing." var/price = 75 var/mob/living/silicon/ai/user = usr diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm index d410dbeb7d..f2ae020f65 100644 --- a/code/game/gamemodes/ninja/ninja.dm +++ b/code/game/gamemodes/ninja/ninja.dm @@ -1,7 +1,13 @@ /datum/game_mode/ninja name = "ninja" round_description = "An agent of the Spider Clan is onboard the station!" - extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing through the defenses of Nanotrasen with technological capabilities eons ahead of your time. They can avoid the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and only hope this unknown assassin isn't here for you." + extended_round_description = "What was that?! Was that a person or did your eyes just play tricks on you? \ + You have no idea. That slim-suited, cryptic individual is an enigma to you and all of your knowledge. \ + Their purpose is unknown. Their mission is unknown. How they arrived to this secure and isolated \ + section of the galaxy, you don't know. What you do know is that there is a silent shadow-stalker piercing \ + through the defenses of the station with technological capabilities eons ahead of your time. They can avoid \ + the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and \ + only hope this unknown assassin isn't here for you." antag_tag = MODE_NINJA config_tag = "ninja" required_players = 1 diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 1fac875ab4..51937d6f95 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -189,7 +189,7 @@ datum/objective/anti_revolution/demote find_target() ..() if(target && target.current) - explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant." + explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant." else explanation_text = "Free Objective" return target @@ -197,7 +197,7 @@ datum/objective/anti_revolution/demote find_target_by_role(role, role_type=0) ..(role, role_type) if(target && target.current) - explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant." + explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [company_name]'s goals. Demote \him[target.current] to assistant." else explanation_text = "Free Objective" return target diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 2b0e776ce1..252084bdf7 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -1,7 +1,15 @@ /datum/game_mode/traitor name = "traitor" round_description = "There is a foreign agent or traitor on the station. Do not let the traitor succeed!" - extended_round_description = "NanoTrasen's monopolistic control over the phoron supplies of Nyx has marked the station to be a highly valuable target for many competing organizations and individuals. The varied pasts and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. Is the station the safe self-contained workplace you once thought it was, or has it become a playground for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing but the painful reminder that space is cruel and unforgiving." + extended_round_description = "The Company's monopolistic control over the phoron supplies of Nyx has marked the \ + station to be a highly valuable target for many competing organizations and individuals. The varied pasts \ + and experiences of your coworkers have left them susceptible to the vices and temptations of humanity. \ + Is the station the safe self-contained workplace you once thought it was, or has it become a playground \ + for the evils of the galaxy? Who can you trust? Watch your front. Watch your sides. Watch your back. \ + The familiar faces that you've passed hundreds of times down the hallways before can be hiding terrible \ + secrets and deceptions. Every corner is a mystery. Every conversation is a lie. You will be facing your \ + friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing \ + but the painful reminder that space is cruel and unforgiving." config_tag = "traitor" required_players = 0 required_enemies = 1 diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index dd088474f1..a023299a9f 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -9,7 +9,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "Nanotrasen officials and Corporate Regulations" + supervisors = "company officials and Corporate Regulations" selection_color = "#ccccff" idtype = /obj/item/weapon/card/id/gold req_admin_notify = 1 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index a64f35f25f..5a2d515679 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -311,7 +311,7 @@ faction = "Station" total_positions = 2 spawn_positions = 2 - supervisors = "Nanotrasen officials and Corporate Regulations" + supervisors = "company officials and Corporate Regulations" selection_color = "#dddddd" economic_modifier = 7 access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 9dc39f257b..f0ced03da7 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -8,7 +8,7 @@ active_power_usage = 10 layer = 5 - var/list/network = list("Exodus") + var/list/network = list(NETWORK_EXODUS) var/c_tag = null var/c_tag_order = 999 var/status = 1 diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 75397278c0..2b496ecdbb 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -78,7 +78,7 @@ if(isscrewdriver(W)) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", "Exodus")) + var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: Exodus,Security,Secret ", "Set Network", NETWORK_EXODUS)) if(!input) usr << "No input found please hang up and try your call again." return diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 5f285f6d45..9f1b7afb38 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -20,7 +20,7 @@ /obj/machinery/computer/atmoscontrol/laptop name = "Atmospherics Laptop" - desc = "Cheap Nanotrasen Laptop." + desc = "A cheap laptop." icon_state = "laptop" icon_keyboard = "laptop_key" density = 0 diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index e39c1eebe6..d8f13f57b7 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -2,7 +2,7 @@ /obj/machinery/computer/card name = "\improper ID card modification console" - desc = "Terminal for programming NanoTrasen employee ID cards to access parts of the station." + desc = "Terminal for programming employee ID cards to access parts of the station." icon_keyboard = "id_key" icon_screen = "id" light_color = "#0099ff" diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 360a986afa..bf695cd163 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -190,12 +190,12 @@ if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs. usr <<"No Emergency Bluespace Relay detected. Unable to transmit message." return - var/input = sanitize(input("Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) + var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) if(!input || !(usr in view(1,src))) return Centcomm_announce(input, usr) usr << "Message transmitted." - log_say("[key_name(usr)] has made an IA Centcomm announcement: [input]") + log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") centcomm_message_cooldown = 1 spawn(300)//30 second cooldown centcomm_message_cooldown = 0 @@ -304,7 +304,7 @@ if (src.authenticated==1) dat += "
\[ Make An Announcement \]" if(src.emagged == 0) - dat += "
\[ Send an emergency message to Centcomm \]" + dat += "
\[ Send an emergency message to [boss_short] \]" else dat += "
\[ Send an emergency message to \[UNKNOWN\] \]" dat += "
\[ Restore Backup Routing Data \]" @@ -435,7 +435,7 @@ return if(deathsquad.deployed) - user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated." + user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." return if(emergency_shuttle.deny_shuttle) @@ -447,7 +447,7 @@ return if(emergency_shuttle.going_to_centcom()) - user << "The emergency shuttle may not be called while returning to CentCom." + user << "The emergency shuttle may not be called while returning to [boss_short]." return if(emergency_shuttle.online()) @@ -470,7 +470,7 @@ return if(emergency_shuttle.going_to_centcom()) - user << "The shuttle may not be called while returning to CentCom." + user << "The shuttle may not be called while returning to [boss_short]." return if(emergency_shuttle.online()) @@ -480,11 +480,11 @@ // if force is 0, some things may stop the shuttle call if(!force) if(emergency_shuttle.deny_shuttle) - user << "Centcom does not currently have a shuttle available in your sector. Please try again later." + user << "[boss_short] does not currently have a shuttle available in your sector. Please try again later." return if(deathsquad.deployed == 1) - user << "Centcom will not allow the shuttle to be called. Consider all contracts terminated." + user << "[boss_short] will not allow the shuttle to be called. Consider all contracts terminated." return if(world.time < 54000) // 30 minute grace period to let the game get going diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 92d9e9a83f..30d7de6d6c 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -552,7 +552,7 @@ /obj/machinery/computer/med_data/laptop name = "Medical Laptop" - desc = "Cheap Nanotrasen Laptop." + desc = "A cheap laptop." icon_state = "laptop" icon_keyboard = "laptop_key" icon_screen = "medlaptop" diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm index 8ac4f32c9c..0d38129504 100644 --- a/code/game/machinery/computer/specops_shuttle.dm +++ b/code/game/machinery/computer/specops_shuttle.dm @@ -89,7 +89,7 @@ var/specops_shuttle_timeleft = 0 for(var/turf/T in get_area_turfs(end_location) ) var/mob/M = locate(/mob) in T - M << "You have arrived at Central Command. Operation has ended!" + M << "You have arrived at [boss_name]. Operation has ended!" specops_shuttle_at_station = 0 @@ -286,14 +286,14 @@ var/specops_shuttle_timeleft = 0 if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return if (!specops_can_move()) - usr << "Central Command will not allow the Special Operations shuttle to return yet." + usr << "[boss_name] will not allow the Special Operations shuttle to return yet." if(world.timeofday <= specops_shuttle_timereset) if (((world.timeofday - specops_shuttle_timereset)/10) > 60) usr << "[-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!" usr << "[-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!" return - usr << "The Special Operations shuttle will arrive at Central Command in [(SPECOPS_MOVETIME/10)] seconds." + usr << "The Special Operations shuttle will arrive at [boss_name] in [(SPECOPS_MOVETIME/10)] seconds." temp += "Shuttle departing.

OK" updateUsrDialog() diff --git a/code/game/machinery/computer3/NTOS.dm b/code/game/machinery/computer3/NTOS.dm index 5119084f0e..8b37c23732 100644 --- a/code/game/machinery/computer3/NTOS.dm +++ b/code/game/machinery/computer3/NTOS.dm @@ -3,7 +3,7 @@ */ /datum/file/program/ntos - name = "Nanotrasen Operating System" + name = "NanoTrasen Operating System" extension = "prog" active_state = "ntos" var/obj/item/part/computer/storage/current // the drive being viewed, null for desktop/computer @@ -89,7 +89,7 @@ var/dat = {" - Nanotrasen Operating System + Operating System