diff --git a/code/WorkInProgress/message_server.dm b/code/WorkInProgress/message_server.dm index 452d43a5fe7..7585e6cc08a 100644 --- a/code/WorkInProgress/message_server.dm +++ b/code/WorkInProgress/message_server.dm @@ -44,7 +44,7 @@ /obj/machinery/message_server icon = 'stationobjs.dmi' icon_state = "server" - name = "Messanging Server" + name = "Messaging Server" density = 1 anchored = 1.0 use_power = 1 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d024a32428a..1dfdcdae6eb 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -61,15 +61,15 @@ datum/mind if (ticker.mode.config_tag=="revolution") text = uppertext(text) text = "[text]: " - if (src.assigned_role in head_positions) + if (assigned_role in head_positions) text += "HEAD|officer|employee|headrev|rev" - else if (src.assigned_role in list("Security Officer", "Detective", "Warden")) + else if (assigned_role in list("Security Officer", "Detective", "Warden")) text += "head|OFFICER|employee|headre|rev" else if (src in ticker.mode.head_revolutionaries) text = "head|officer|employee|HEADREV|rev" text += "
Flash: give" - var/list/L = src.current.get_contents() + var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (flash) if (flash.status) @@ -93,9 +93,9 @@ datum/mind if (ticker.mode.config_tag=="cult") text = uppertext(text) text = "[text]: " - if (src.assigned_role in head_positions) + if (assigned_role in head_positions) text += "HEAD|officer|employee|cultist" - else if (src.assigned_role in list("Security Officer", "Detective", "Warden")) + else if (assigned_role in list("Security Officer", "Detective", "Warden")) text += "head|OFFICER|employee|cultist" else if (src in ticker.mode.cult) text += "head|officer|employee|CULTIST" @@ -167,7 +167,7 @@ datum/mind if (src in ticker.mode.traitors) text += "TRAITOR|loyal" if (objectives.len==0) - text += "
Objectives are empty! Randomize!." + text += "
Objectives are empty! Randomize!" else text += "traitor|LOYAL" sections["traitor"] = text @@ -466,14 +466,14 @@ datum/mind usr << "\red Spawning flash failed!" if("takeflash") - var/list/L = src.current.get_contents() + var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (!flash) usr << "\red Deleting flash failed!" del(flash) if("repairflash") - var/list/L = src.current.get_contents() + var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L if (!flash) usr << "\red Repairing flash failed!" @@ -481,7 +481,7 @@ datum/mind flash.status = 1 if("reequip") - var/list/L = src.current.get_contents() + var/list/L = current.get_contents() var/obj/item/device/flash/flash = locate() in L del(flash) take_uplink() @@ -532,7 +532,7 @@ datum/mind H << "A tome, a message from your new master, appears in your [where]." if("amulet") - if (!ticker.mode.equip_cultist(src.current)) + if (!ticker.mode.equip_cultist(current)) usr << "\red Spawning amulet failed!" else if (href_list["wizard"]) @@ -542,7 +542,7 @@ datum/mind ticker.mode.wizards -= src special_role = null current.spellremove(current, config.feature_object_spell_system? "object":"verb") - src.current << "\red You have been brainwashed! You are no longer a wizard!" + current << "\red You have been brainwashed! You are no longer a wizard!" if("wizard") if(!(src in ticker.mode.wizards)) ticker.mode.wizards += src @@ -647,7 +647,8 @@ datum/mind if(src in ticker.mode.traitors) ticker.mode.traitors -= src special_role = null - src.current << "\red You have been brainwashed! You are no longer a traitor!" + current << "\red You have been brainwashed! You are no longer a traitor!" + if("traitor") if(!(src in ticker.mode.traitors)) ticker.mode.traitors += src @@ -785,6 +786,7 @@ datum/mind current.drop_from_slot(W) if("takeuplink") take_uplink() + memory = null//Remove any memory they may have had. if("crystals") if (usr.client.holder.level >= 3) var/obj/item/weapon/syndicate_uplink/suplink = find_syndicate_uplink() @@ -846,7 +848,7 @@ datum/mind proc/find_syndicate_uplink() var/obj/item/weapon/syndicate_uplink/uplink = null - var/list/L = src.current.get_contents() + var/list/L = current.get_contents() for (var/obj/item/device/radio/radio in L) uplink = radio.traitorradio if (uplink) @@ -857,7 +859,7 @@ datum/mind proc/find_integrated_uplink() //world << "DEBUG: find_integrated_uplink()" var/obj/item/weapon/integrated_uplink/uplink = null - var/list/L = src.current.get_contents() + var/list/L = current.get_contents() for (var/obj/item/device/pda/pda in L) uplink = pda.uplink if (uplink) @@ -865,7 +867,7 @@ datum/mind return uplink proc/take_uplink() //assuming only one uplink because I am tired of all this uplink shit --rastaf0 - var/list/L = src.current.get_contents() + var/list/L = current.get_contents() var/obj/item/weapon/syndicate_uplink/suplink = null var/obj/item/weapon/integrated_uplink/iuplink = null for (var/obj/item/device/radio/radio in L) diff --git a/code/defines/obj/clothing/gimmick.dm b/code/defines/obj/clothing/gimmick.dm index 5ae10664b1c..d31fad3c7a3 100644 --- a/code/defines/obj/clothing/gimmick.dm +++ b/code/defines/obj/clothing/gimmick.dm @@ -264,12 +264,6 @@ item_state = "b_suit" color = "police" -/obj/item/clothing/head/helmet/bobby - name = "Custodian Helmet" - desc = "Heh. Lookit dat fukken helmet." - icon_state = "policehelm" - item_state = "helmet" - /obj/item/clothing/head/flatcap name = "flat cap" desc = "A working man's cap." diff --git a/code/defines/obj/clothing/head.dm b/code/defines/obj/clothing/head.dm index 5466d0c7f0b..52e4bf7eec6 100644 --- a/code/defines/obj/clothing/head.dm +++ b/code/defines/obj/clothing/head.dm @@ -257,6 +257,7 @@ item_state = "s-ninja_mask" radiation_protection = 0.25 see_face = 1 + allowed = list(/obj/item/weapon/cell) armor = list(melee = 60, bullet = 50, laser = 30, taser = 15, bomb = 30, bio = 30, rad = 30) /obj/item/clothing/head/helmet/swat @@ -297,12 +298,19 @@ armor = list(melee = 10, bullet = 10, laser = 10, taser = 5, bomb = 10, bio = 5, rad = 10) /obj/item/clothing/head/helmet/HoS - name = "HoS helmet" + name = "HoS Hat" icon_state = "hoscap" desc = "A hat that shows the security grunts who's in charge!" flags = FPRINT | TABLEPASS | SUITSPACE | HEADCOVERSEYES armor = list(melee = 80, bullet = 60, laser = 50, taser = 10, bomb = 25, bio = 10, rad = 0) +/obj/item/clothing/head/helmet/warden + name = "Warden Hat" + desc = "Stop right there, criminal scum!" + icon_state = "policehelm" + flags = FPRINT | TABLEPASS | SUITSPACE | HEADCOVERSEYES + armor = list(melee = 70, bullet = 50, laser = 40, taser = 10, bomb = 25, bio = 10, rad = 0) + /obj/item/clothing/head/helmet/that name = "Sturdy Top hat" desc = "An amish looking helmet" diff --git a/code/defines/obj/clothing/suit.dm b/code/defines/obj/clothing/suit.dm index e61455b506a..ca19e980014 100644 --- a/code/defines/obj/clothing/suit.dm +++ b/code/defines/obj/clothing/suit.dm @@ -478,7 +478,7 @@ desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins." icon_state = "s-ninja" item_state = "s-ninja_suit" - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/cell) radiation_protection = 0.75 slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30, taser = 15, bomb = 30, bio = 30, rad = 30) diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index f6ad486da1c..1f69320aa8d 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -797,6 +797,8 @@ Turf and target are seperate in case you want to teleport some distance from a t mob_list.Add(M) for(var/mob/living/carbon/human/M in world) mob_list.Add(M) + for(var/mob/living/carbon/brain/M in world) + mob_list.Add(M) for(var/mob/living/carbon/alien/M in world) mob_list.Add(M) for(var/mob/dead/observer/M in world) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 607c2e6c7cd..7d39ac5fe21 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -5,7 +5,7 @@ /datum/game_mode/traitor/changeling/announce() world << "The current game mode is - Traitor+Changeling!" - world << "There is an alien changeling on the station. Also there are traitors pursuing tyeir own interests. Do not let the changeling and the traitors succeed!" + world << "There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!" /datum/game_mode/traitor/changeling/can_start() var/count = 0 diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm index eb86421c09c..e44b0516b25 100644 --- a/code/game/gamemodes/events/ninja_equipment.dm +++ b/code/game/gamemodes/events/ninja_equipment.dm @@ -717,6 +717,7 @@ ________________________________________________________________________________ if(!hologram)//If there is not already a hologram. hologram = new(T)//Spawn a blank effect at the location. hologram.invisibility = 101//So that it doesn't show up, ever. This also means one could attach a number of images to a single obj and display them differently to differnet people. + hologram.anchored = 1//So it cannot be dragged by space wind and the like. hologram.dir = get_dir(T,affecting.loc) var/image/I = image('mob.dmi',hologram,"ai-holo")//Attach an image to object. hologram.i_attached = I//To attach the image in order to later reference. @@ -820,7 +821,7 @@ ________________________________________________________________________________ U << "Replenished a total of [total_reagent_transfer ? total_reagent_transfer : "zero"] chemical units."//Let the player know how much total volume was added. return else if(istype(I, /obj/item/weapon/cell)) - if(I:maxcharge>cell.maxcharge) + if(I:maxcharge>cell.maxcharge&&n_gloves&&n_gloves.candrain) U << "\blue Higher maximum capacity detected.\nUpgrading..." if (n_gloves&&n_gloves.candrain&&do_after(U,s_delay)) U.drop_item() diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index 0019f3458fb..67bc1658be9 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -72,7 +72,7 @@ ________________________________________________________________________________ Suit Upgrade Unsure Instead of losing energy each second, the suit would regain the same amount of energy. - This would not count in activating stealth and smiliar. + This would not count in activating stealth and similar. Extended Battery Life: Suit Upgrade Battery of higher capacity @@ -81,7 +81,6 @@ ________________________________________________________________________________ Suit Upgrade Syndicate Cloaking Device? Remove cloak failure rate. - */ //=======//RANDOM EVENT//=======// @@ -97,76 +96,40 @@ When I already created about 4 new objectives, this doesn't seem terribly import /proc/space_ninja_arrival() var/datum/game_mode/current_mode = ticker.mode - var/datum/mind/current_mind = new() + var/datum/mind/current_mind /*Is the ninja playing for the good or bad guys? Is the ninja helping or hurting the station? Their directives also influence behavior. At least in theory.*/ var/side = pick("face","heel") var/antagonist_list[] = list()//The main bad guys. Evil minds that plot destruction. - var/sec_antagonist_list[] = current_mode.traitors//The OTHER bad guys. Mostly admin made. - var/ter_antagonist_list[] = list()//The bad guys no-one really cares about. For now just revs. - var/living_heads_of_staff[] = current_mode.get_living_heads() var/protagonist_list[] = current_mode.get_living_heads()//The good guys. Mostly Heads. Who are alive. var/xeno_list[] = list()//Aliens. var/commando_list[] = list()//Commandos. - //First we determine what mode it is and add the bad guys approprietly. - switch (current_mode.config_tag) - if("traitor") - for(current_mind in current_mode:traitors)//For traitor minds in in the traitors list. - if(current_mind.current&¤t_mind.current.stat!=2)//If the traitor mob exists and they are not dead. - antagonist_list += current_mind//Add them to the list. + //We want the ninja to appear only in certain modes. + var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey") + if((!current_mode.config_tag) in acceptable_modes_list) + return - if ("revolution")//Rev is divided into regular and heads. There are also heads of staff to consider. - for(current_mind in current_mode:head_revolutionaries) - if(current_mind.current&¤t_mind.current.stat!=2) - antagonist_list += current_mind + /*No longer need to determine what mode it is since bad guys are basically universal. + And there is now a mode with two types of bad guys.*/ - for(current_mind in current_mode:revolutionaries) - if(current_mind.current&¤t_mind.current.stat!=2) - ter_antagonist_list += current_mind + var/possible_bad_dudes[] = list(current_mode.traitors,current_mode.head_revolutionaries,current_mode.head_revolutionaries, + current_mode.cult,current_mode.wizards,current_mode.changelings,current_mode.syndicates) + for(var/list in possible_bad_dudes)//For every possible antagonist type. + for(current_mind in list)//For each mind in that list. + if(current_mind.current&¤t_mind.current.stat!=2)//If they are not destroyed and not dead. + antagonist_list += current_mind//Add them. - protagonist_list |= living_heads_of_staff - /* seems unused or infinished --rastaf0 - var/heads_list[] = list()//Now we manually override the list made prior. Target Heads take priority. - if(heads_list.len)//Or not, if there are none. - protagonist_list = heads_list - */ - - if ("cult")//Always a few of these around. - for(current_mind in current_mode.cult) - if(current_mind.current&¤t_mind.current.stat!=2) - antagonist_list += current_mind - - if ("wizard") - for(current_mind in current_mode.wizards) - if(current_mind.current&¤t_mind.current.stat!=2) - antagonist_list += current_mind - - if ("changeling") - for(current_mind in current_mode.changelings) - if(current_mind.current&¤t_mind.current.stat!=2) - antagonist_list += current_mind + if(protagonist_list.len)//If the mind is both a protagonist and antagonist. + for(current_mind in protagonist_list) + if(current_mind in antagonist_list) + protagonist_list -= current_mind//We only want it in one list. /* -I originally intended for space ninjas to appear in Malfunction but after some consideration -this is not worth the trouble. Particularly with how objective mind completion is tracked. -Not to mention that Malfunction does not use declare_completion (at least, not in the way the other modes do). -With that said, a ninja on the side of the station would murder the AI very quickly--and the rounds usually -last long enough for the ninja to appear, too. - - //not only one anymore. --rastaf0 - if ("malfunction") - if(current_mode:malf_ai) - antagonist_list += current_mode:malf_ai +Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective completion. Only humans are added. */ - if ("nuclear")//Can be a few of these guys. - for(current_mind in current_mode:syndicates) - if(current_mind.current&¤t_mind.current.stat!=2) - antagonist_list += current_mind - else - return//Don't want to summon a ninja during meteor or extended, or something. //Here we pick a location and spawn the ninja. var/list/spawn_list = list() @@ -222,9 +185,9 @@ last long enough for the ninja to appear, too. ninja_mind.objectives += ninja_objective mission_set = 1 - if(sent_strike_team&&side=="heel")//If a strike team was sent, murder them all like a champ. - for(current_mind in ticker.minds)//Search and destroy. - if(current_mind.special_role=="Death Commando"&¤t_mind.current&¤t_mind.current.stat!=2) + if(sent_strike_team&&side=="heel"&&antagonist_list.len)//If a strike team was sent, murder them all like a champ. + for(current_mind in antagonist_list)//Search and destroy. Since we already have an antagonist list, they should appear there. + if(current_mind.special_role=="Death Commando") commando_list += current_mind if(commando_list.len)//If there are living commandos still in play. for(var/mob/living/carbon/human/commando in commando_list) @@ -241,36 +204,22 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob */ if(!mission_set)//If mission was not set. - //To pick a person for each list. - var/datum/mind/antagonist_target - if(antagonist_list.len) - antagonist_target = pick(antagonist_list) - - var/datum/mind/secondary_target - if(sec_antagonist_list.len) - secondary_target = pick(sec_antagonist_list) - - var/datum/mind/tertiary_target - if(ter_antagonist_list.len) - tertiary_target = pick(ter_antagonist_list) - - var/datum/mind/protagonist_target - if(protagonist_list.len) - protagonist_target = pick(protagonist_list) - + var/current_minds[]//List being looked on in the following code. + var/side_list = side=="face" ? 2 : 1//For logic gating. var/hostile_targets[] = list()//The guys actually picked for the assassination or whatever. var/friendly_targets[] = list()//The guys the ninja must protect. - if(side=="face") - friendly_targets += protagonist_target//Will add null if the variable is empty. - hostile_targets += antagonist_target - hostile_targets += secondary_target - hostile_targets += tertiary_target - else - hostile_targets += protagonist_target - friendly_targets += antagonist_target - friendly_targets += secondary_target - friendly_targets += tertiary_target + for(var/i=2,i>0,i--)//Two lists. + current_minds = i==2 ? antagonist_list : protagonist_list//Which list are we looking at? + for(var/t=3,(current_minds.len&&t>0),t--)//While the list is not empty and targets remain. Also, 3 targets is good. + current_mind = pick(current_minds)//Pick a random person. + /*I'm creating a logic gate here based on the ninja affiliation that compares the list being + looked at to the affiliation. Affiliation is just a number used to compare. Meaning comes from the logic involved. + If the list being looked at is equal to the ninja's affiliation, add the mind to hostiles. + If not, add the mind to friendlies. Since it can't be both, it will be added only to one or the other.*/ + hostile_targets += i==side_list ? current_mind : null//Adding null doesn't add anything. + friendly_targets += i!=side_list ? current_mind : null + current_minds -= current_mind//Remove the mind so it's not picked again. var/objective_list[] = list(1,2,3,4,5,6)//To remove later. for(var/i=rand(1,3),i>0,i--)//Want to get a few random objectives. Currently up to 3. diff --git a/code/game/jobs/jobprocs.dm b/code/game/jobs/jobprocs.dm index 5f9ae25a3a6..3cfb82170a8 100644 --- a/code/game/jobs/jobprocs.dm +++ b/code/game/jobs/jobprocs.dm @@ -427,7 +427,7 @@ src.equip_if_possible(new /obj/item/device/pda/security(src), slot_belt) src.equip_if_possible(new /obj/item/clothing/under/rank/warden(src), slot_w_uniform) src.equip_if_possible(new /obj/item/clothing/suit/armor/vest(src), slot_wear_suit) - src.equip_if_possible(new /obj/item/clothing/head/helmet(src), slot_head) + src.equip_if_possible(new /obj/item/clothing/head/helmet/warden(src), slot_head) src.equip_if_possible(new /obj/item/clothing/shoes/black(src), slot_shoes) src.equip_if_possible(new /obj/item/clothing/gloves/black(src), slot_gloves) src.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(src), slot_glasses) diff --git a/code/game/machinery/camera.dm b/code/game/machinery/camera.dm index f5a48af89d1..db4d3ea3326 100644 --- a/code/game/machinery/camera.dm +++ b/code/game/machinery/camera.dm @@ -185,7 +185,7 @@ var/list/D = list() D["Cancel"] = "Cancel" for (var/obj/machinery/camera/C in L) - if (C.network == src.network) + if (C.network == network) D[text("[][]", C.c_tag, (C.status ? null : " (Deactivated)"))] = C var/t = input(user, "Which camera should you change to?") as null|anything in D diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 59b72426c2b..be7dca256b4 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -11,7 +11,7 @@ Possible to do for anyone motivated enough: Give an AI variable for different hologram icons. Itegrate EMP effects to disable the unit. */ -/obj/machinery/holopad/attack_ai(var/mob/living/silicon/ai/user as mob) +/obj/machinery/holopad/attack_ai(mob/living/silicon/ai/user) if (!istype(user)) return /*There are pretty much only three ways to interact here. @@ -26,7 +26,7 @@ Possible to do for anyone motivated enough: clear_holo() return -/obj/machinery/holopad/proc/activate_holo(var/mob/living/silicon/ai/user as mob) +/obj/machinery/holopad/proc/activate_holo(mob/living/silicon/ai/user) if(!(stat & NOPOWER)&&user.client.eye==src)//If the projector has power and client eye is on it. if(!hologram)//If there is not already a hologram. create_holo(user)//Create one. @@ -40,7 +40,7 @@ Possible to do for anyone motivated enough: /*This is the proc for special two-way communication between AI and holopad/people talking near holopad. For the other part of the code, check silicon say.dm. Particularly robot talk.*/ -/obj/machinery/holopad/hear_talk(mob/M as mob, text) +/obj/machinery/holopad/hear_talk(mob/M, text) if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something. if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad. text = stars(text) @@ -52,13 +52,14 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ master.show_message(rendered, 2) return -/obj/machinery/holopad/proc/create_holo(var/mob/living/silicon/ai/A, var/turf/T = loc) +/obj/machinery/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) hologram = new(T)//Spawn a blank effect at the location. hologram.icon = 'mob.dmi' hologram.icon_state = "ai-holo" hologram.mouse_opacity = 0//So you can't click on it. hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. hologram.sd_SetLuminosity(1)//To make it glowy. + hologram.anchored = 1//So space wind cannot drag it. sd_SetLuminosity(1)//To make the pad glowy. icon_state = "holopad1" master = A//AI is the master. @@ -112,4 +113,27 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/holopad/Del() if(hologram) clear_holo() - ..() \ No newline at end of file + ..() + +/* +Holographic project of everything else. + + +/obj/machinery/holoprojector/attack_hand() + +/obj/machinery/holoprojector/create_holo(turf/T = loc, mob/living/M) + hologram = new(T)//Spawn a blank effect at the location. + //Here we don't want to actually change icon directly. We're looking to create an image. + var/flat_image = getFlatIcon(M,2)//Get the flat icon facing south. Respect cache. + + hologram.overlay += flat_image + hologram.mouse_opacity = 0//So you can't click on it. + hologram.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. + hologram.sd_SetLuminosity(1)//To make it glowy. + sd_SetLuminosity(1)//To make the pad glowy. + icon_state = "holopad1" + use_power = 2//Active power usage. + return 1 + +/obj/machinery/holoprojector/clear_holo() +*/ \ No newline at end of file diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm index 971f0a62799..da128a62124 100644 --- a/code/game/magic/cultist/ritual.dm +++ b/code/game/magic/cultist/ritual.dm @@ -425,8 +425,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", // usr << browse(null, "window=tank") attack(mob/living/M as mob, mob/living/user as mob) - M.attack_log += text("[world.time] - has has had the [src.name] used on him by [user.name] ([user.ckey])") - user.attack_log += text("[world.time] - has used [src.name] on [M.name] ([M.ckey])") + M.attack_log += text("[world.time] - has had the [name] used on him by [user.name] ([user.ckey])") + user.attack_log += text("[world.time] - has used [name] on [M.name] ([M.ckey])") if(istype(M,/mob/dead)) M.invisibility = 0 diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm index ff10315987f..a8c5b84eb8a 100644 --- a/code/game/objects/devices/PDA/PDA.dm +++ b/code/game/objects/devices/PDA/PDA.dm @@ -210,7 +210,7 @@ if (1) dat += "

Notekeeper V2.1

" - if ((!isnull(uplink)) && (uplink.active)) + if ((!isnull(uplink)) && uplink.active) dat += " Lock
" else dat += " Edit
" @@ -411,9 +411,13 @@ var/t = input(U, "Please enter new ringtone", name, ttone) as text if (in_range(src, U) && loc == U) if (t) - if ((uplink) && (cmptext(t,uplink.lock_code)) && (!uplink.active)) - U << "The PDA softly beeps." - uplink.unlock() + if ((uplink) && (cmptext(t,uplink.lock_code))) + if(uplink.active) + U << "The PDA uplink is already unlocked." + mode = 1 + else + U << "The PDA softly beeps." + uplink.unlock() else t = copytext(sanitize(t), 1, 20) ttone = t diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 1c1169f0569..26c432ccb33 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -1,7 +1,7 @@ /obj/item/weapon/plastique/attack_self(mob/user as mob) var/newtime = input(usr, "Please set the timer.", "Timer", 10) - src.timer = newtime - user << "Timer set for [src.timer] seconds." + timer = newtime + user << "Timer set for [timer] seconds." /obj/item/weapon/plastique/afterattack(atom/target as obj|turf, mob/user as mob, flag) if (!flag) @@ -9,23 +9,29 @@ if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle)) return user << "Planting explosives..." - if(do_after(user, 50) && get_dist(user, target) <= 1) + if(ismob(target)) + user.attack_log += "[world.time] - [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])" + user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!") + if(do_after(user, 50) && in_range(user, target)) user.drop_item() - src.target = target - src.loc = null + target = target + loc = null var/location if (isturf(target)) location = target if (isobj(target)) location = target.loc + if (ismob(target)) + target:attack_log += "[world.time] - had the [name] planted on them by [user.real_name] ([user.ckey])" + user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") target.overlays += image('assemblies.dmi', "plastic-explosive2") - user << "Bomb has been planted. Timer counting down from [src.timer]." - spawn(src.timer*10) + user << "Bomb has been planted. Timer counting down from [timer]." + spawn(timer*10) if(target) explosion(location, -1, -1, 2, 3) - if (istype(src.target, /turf/simulated/wall)) src.target:dismantle_wall(1) - else src.target.ex_act(1) - if (isobj(src.target)) - if (src.target) - del(src.target) + if (istype(target, /turf/simulated/wall)) target:dismantle_wall(1) + else target.ex_act(1) + if (isobj(target)) + if (target) + del(target) if (src) del(src) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 9efde93adf8..0ebbfb724f9 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -8,12 +8,12 @@ /obj/item/weapon/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons. - src.icon_state = text("fireaxe[]",src.wielded) + icon_state = text("fireaxe[]",wielded) return /obj/item/weapon/fireaxe/pickup(mob/user) - src.wielded = 0 - src.name = "Fire Axe (Unwielded)" + wielded = 0 + name = "Fire Axe (Unwielded)" /obj/item/weapon/fireaxe/attack_self(mob/user as mob) if( istype(user,/mob/living/carbon/monkey) ) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 72c1992bd8f..80f2e3753cf 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -3,7 +3,7 @@ /mob/living/carbon/human/verb/suicide() set hidden = 1 - if (src.stat == 2) + if (stat == 2) src << "You're already dead!" return @@ -21,15 +21,40 @@ suiciding = 1 //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while viewers(src) << "\red [src] is holding \his breath. It looks like \he's trying to commit suicide." - src.oxyloss = max(175 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss) - src.updatehealth() + oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss) + updatehealth() spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds - src.suiciding = 0 + suiciding = 0 + +/mob/living/carbon/brain/verb/suicide() + set hidden = 1 + + if (stat == 2) + src << "You're already dead!" + return + + if (!ticker) + src << "You can't commit suicide before the game starts!" + return + + if (suiciding) + src << "You're already committing suicide! Be patient!" + return + + var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No") + + if(confirm == "Yes") + suiciding = 1 + viewers(loc) << "\red [src]'s brain is growing dull and lifeless. It looks like it's trying to commit suicide. Somehow." + oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss) + updatehealth() + spawn(200) + suiciding = 0 /mob/living/carbon/monkey/verb/suicide() set hidden = 1 - if (src.stat == 2) + if (stat == 2) src << "You're already dead!" return @@ -47,15 +72,15 @@ suiciding = 1 //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while viewers(src) << "\red [src] is holding \his breath. It looks like \he's trying to commit suicide." - src.oxyloss = max(175 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss) - src.updatehealth() + oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss) + updatehealth() spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds - src.suiciding = 0 + suiciding = 0 /mob/living/silicon/ai/verb/suicide() set hidden = 1 - if (src.stat == 2) + if (stat == 2) src << "You're already dead!" return @@ -69,12 +94,13 @@ suiciding = 1 viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." //put em at -175 - src.oxyloss = max(175 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss) - src.updatehealth() + oxyloss = max(175 - toxloss - fireloss - bruteloss, oxyloss) + updatehealth() + /mob/living/silicon/robot/verb/suicide() set hidden = 1 - if (src.stat == 2) + if (stat == 2) src << "You're already dead!" return @@ -88,13 +114,28 @@ suiciding = 1 viewers(src) << "\red [src] is powering down. It looks like \he's trying to commit suicide." //put em at -175 - src.oxyloss = max(475 - src.toxloss - src.fireloss - src.bruteloss, src.oxyloss) - src.updatehealth() + oxyloss = max(475 - toxloss - fireloss - bruteloss, oxyloss) + updatehealth() + +/mob/living/silicon/pai/verb/suicide() + set category = "pAI Commands" + set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)" + set name = "pAI Suicide" + var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No") + if(answer == "Yes") + var/obj/item/device/paicard/card = loc + card.pai = null + var/turf/T = get_turf_or_move(card.loc) + for (var/mob/M in viewers(T)) + M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2) + death(0) + else + src << "Aborting suicide attempt." /mob/living/carbon/alien/humanoid/verb/suicide() set hidden = 1 - if (src.stat == 2) + if (stat == 2) src << "You're already dead!" return @@ -106,7 +147,7 @@ if(confirm == "Yes") suiciding = 1 - viewers(src) << "\red [src] is holding his breath. It looks like \he's trying to commit suicide." + viewers(src) << "\red [src] is thrashing wildly! It looks like \he's trying to commit suicide." //put em at -175 - src.oxyloss = max(100 - src.fireloss - src.bruteloss, src.oxyloss) - src.updatehealth() \ No newline at end of file + oxyloss = max(100 - fireloss - bruteloss, oxyloss) + updatehealth() \ No newline at end of file diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e01c978b199..e2ede09709f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1517,7 +1517,7 @@ var/showadminmessages = 1 else if(ishuman(M)) foo += text("Make AI | ") foo += text("Make Robot | ") - foo += text("Make Alium | ") + foo += text("Make Alien | ") foo += text("Thunderdome 1 | ") foo += text("Thunderdome 2 | ") foo += text("Thunderdome Admin | ") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e3dec091720..01c9bdaaea7 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1,15 +1,15 @@ /client/proc/Debug2() set category = "Debug" set name = "Debug-Game" - if(!src.authenticated || !src.holder) + if(!authenticated || !holder) src << "Only administrators may use this command." return - if(src.holder.rank == "Game Admin") + if(holder.rank == "Game Admin") Debug2 = !Debug2 world << "Debugging [Debug2 ? "On" : "Off"]" log_admin("[key_name(src)] toggled debugging to [Debug2]") - else if(src.holder.rank == "Game Master") + else if(holder.rank == "Game Master") Debug2 = !Debug2 world << "Debugging [Debug2 ? "On" : "Off"]" @@ -32,7 +32,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/callproc() set category = "Debug" set name = "Advanced ProcCall" - if(!src.authenticated || !src.holder) + if(!authenticated || !holder) src << "Only administrators may use this command." return var/target = null @@ -120,9 +120,9 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/Cell() set category = "Debug" set name = "Air Status in Location" - if(!src.mob) + if(!mob) return - var/turf/T = src.mob.loc + var/turf/T = mob.loc if (!( istype(T, /turf) )) return @@ -351,6 +351,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that "pirate", "space pirate", //"soviet soldier", + "tunnel clown", + "death commando", ) var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks if (isnull(dresscode)) @@ -429,7 +431,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_if_possible(new /obj/item/clothing/shoes/brown(M), M.slot_shoes) M.equip_if_possible(new /obj/item/clothing/head/bandana(M), M.slot_head) M.equip_if_possible(new /obj/item/clothing/glasses/eyepatch(M), M.slot_glasses) - M.equip_if_possible(new /obj/item/weapon/sword/pirate(M), M.slot_r_hand) if ("space pirate") @@ -447,5 +448,22 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_if_possible(new /obj/item/clothing/head/ushanka(M), M.slot_head) */ + if("tunnel clown")//Tunnel clowns rule! + M.equip_if_possible(new /obj/item/clothing/under/rank/clown(M), M.slot_w_uniform) + M.equip_if_possible(new /obj/item/clothing/shoes/clown_shoes(M), M.slot_shoes) + M.equip_if_possible(new /obj/item/clothing/mask/gas/clown_hat(M), M.slot_wear_mask) + M.equip_if_possible(new /obj/item/clothing/head/chaplain_hood(M), M.slot_head) + M.equip_if_possible(new /obj/item/clothing/suit/chaplain_hoodie(M), M.slot_wear_suit) + M.equip_if_possible(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), M.slot_l_store) + M.equip_if_possible(new /obj/item/weapon/bikehorn(M), M.slot_r_store) + M.equip_if_possible(new /obj/item/device/pda/clown(M), M.slot_belt) + + var/obj/item/weapon/fireaxe/fire_axe = new(M) + fire_axe.name = "Fire Axe (Unwielded)" + M.equip_if_possible(fire_axe, M.slot_r_hand) + + if("death commando")//Was looking to add this for a while. + M.equip_death_commando() + M.update_clothing() return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 8490d86ca33..a5ec009a3f9 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -363,15 +363,19 @@ Traitors and the like can also be revived with the previous role mostly intact. var/mob/living/carbon/human/new_character = new(src)//The mob being spawned. //Second, we check if they are an alien or monkey. - var/adj_name = copytext(G_found.name,1,7)//What is their name? + var/adj_name = copytext(G_found.real_name,1,7)//What is their name? if(G_found.mind&&G_found.mind.special_role=="Alien")//If they have a mind, are they an alien? adj_name="alien " if( adj_name==("alien "||"monkey")) if(alert("This character appears to either be an an alien or monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")//If you do. switch(adj_name)//Let's check based on adjusted name. if("monkey")//A monkey. Monkeys don't have a mind, so we can safely spawn them here if needed. + //TO DO: Monkeys may have a mind now. May need retooling. var/mob/living/carbon/monkey/M = new(pick(latejoin))//Spawn a monkey at latejoin. - M.key = G_found.key//They are now a monkey. Nothing else needs doing. + M.mind = G_found.mind + if(M.mind)//If the mind is not null. + M.mind.current = M + M.key = G_found.key//They are now a monkey. Nothing else needs doing. if("alien ")//An alien. Aliens can have a mind which can be used to determine a few things. if(G_found.mind) var/turf/location = xeno_spawn.len ? pick(xeno_spawn) : pick(latejoin)//Location where they will be spawned. @@ -544,7 +548,7 @@ Traitors and the like can also be revived with the previous role mostly intact. call(/mob/new_player/proc/ManifestLateSpawn)(new_character) if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes") - call(/mob/new_player/proc/AnnounceArrival)(new_character) + call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role) message_admins("\blue [admin] has respawned [player_key] as [new_character.real_name].", 1) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 4a9f90127c0..2f20020e5e1 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -95,7 +95,7 @@ var/global/sent_strike_team = 0 //Spawns the rest of the commando gear. for (var/obj/landmark/L) if (L.name == "Commando_Manual") - new /obj/item/weapon/gun/energy/pulse_rifle(L.loc) + //new /obj/item/weapon/gun/energy/pulse_rifle(L.loc) var/obj/item/weapon/paper/P = new(L.loc) P.info = "

Good morning soldier!. This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow:
#1 Work as a team.
#2 Accomplish your objective at all costs.
#3 Leave no witnesses.
You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets.
If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.

In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations LEADER is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.

Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device.
First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible.
To make the device functional:
#1 Place bomb in designated detonation zone
#2 Extend and anchor bomb (attack with hand).
#3 Insert Nuclear Auth. Disk into slot.
#4 Type numeric code into keypad ([nuke_code]).
Note: If you make a mistake press R to reset the device.
#5 Press the E button to log onto the device.
You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option.
Note: Toggle off the SAFETY.
Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate.
Note: THE BOMB IS STILL SET AND WILL DETONATE
Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.

The nuclear authorization code is: [nuke_code ? nuke_code : "None provided"]

Good luck, soldier!

" P.name = "Spec. Ops. Manual" @@ -174,9 +174,7 @@ var/global/sent_strike_team = 0 equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store) equip_if_possible(new /obj/item/weapon/gun/projectile/mateba(src), slot_belt) - //equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_l_hand) - /*Commented out because Commandos now have their rifles spawn in front of them, along with operation manuals. - Useful for copy pasta since I'm lazy.*/ + equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle(src), slot_r_hand) var/obj/item/weapon/card/id/W = new(src) W.name = "[real_name]'s ID Card" diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 0de0ce0ec47..b6c29aab219 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -123,7 +123,7 @@ I kind of like the right click only--the window version can get a little confusi /mob/living/carbon/alien/humanoid/verb/ventcrawl() // -- TLE set name = "Crawl through Vent" - set desc = "Enter an air vent and appear at a random one" + set desc = "Enter an air vent and crawl through the pipes." set category = "Alien" // if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent)) // return diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index fc4943c7f47..f1b1453f293 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -1,6 +1,6 @@ /mob/living/carbon/alien/larva/verb/ventcrawl() // -- TLE set name = "Crawl through Vent" - set desc = "Enter an air vent and appear at a random one." + set desc = "Enter an air vent and crawl through the pipe system." set category = "Alien" // if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent)) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index dc7bbe122e1..d9fd40e4432 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -31,5 +31,6 @@ if (key) spawn(50) if(key && stat == 2) + src << "You are now dead. If you cannot ghost at this point, relog into the game." verbs += /mob/proc/ghost return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/powers.dm b/code/modules/mob/living/carbon/monkey/powers.dm new file mode 100644 index 00000000000..f9cf814dded --- /dev/null +++ b/code/modules/mob/living/carbon/monkey/powers.dm @@ -0,0 +1,46 @@ +/mob/living/carbon/monkey/verb/ventcrawl() + set name = "Crawl through Vent" + set desc = "Enter an air vent and crawl through the pipe system." + set category = "Monkey" + +// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent)) +// return + if(!stat) + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) + if(!v.welded) + vent_found = v + else + src << "\red That vent is welded." + if(vent_found) + if(vent_found.network&&vent_found.network.normal_members.len) + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) + if(temp_vent.loc == loc) + continue + vents.Add(temp_vent) + var/list/choices = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents) + if(vent.loc.z != loc.z) + continue + var/atom/a = get_turf_loc(vent) + choices.Add(a.loc) + var/turf/startloc = loc + var/obj/selection = input("Select a destination.", "Duct System") in choices + var/selection_position = choices.Find(selection) + if(loc==startloc) + var/obj/target_vent = vents[selection_position] + if(target_vent) + for(var/mob/O in oviewers()) + if ((O.client && !( O.blinded ))) + O.show_message(text("[src] scrambles into the ventillation ducts!"), 1) + loc = target_vent.loc + else + src << "You need to remain still while entering a vent." + else + src << "This vent is not connected to anything." + else + src << "You must be standing on or beside an air vent to enter it." + else + src << "You must be conscious to do this!" + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 419a21733e3..52a7de461bd 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -48,6 +48,7 @@ src << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." src << "To use something, simply double-click it." src << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI." + src << "Remember to adjust your camera network if you are having difficulty navigating the camera networks with the arrow keys or clicking on certain objects." if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai))) show_laws() src << "These laws may be changed by other players, or by you being the traitor." diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 4d0169701fc..fd95178eb81 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -200,22 +200,6 @@ src.machine = null src:cameraFollow = null - -/mob/living/silicon/pai/verb/seppuku() - set category = "pAI Commands" - set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)" - set name = "pAI Suicide" - var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No") - if(answer == "Yes") - var/obj/item/device/paicard/card = src.loc - card.pai = null - var/turf/T = get_turf_or_move(card.loc) - for (var/mob/M in viewers(T)) - M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2) - src.death(0) - else - src << "Aborting suicide attempt." - //Addition by Mord_Sith to define AI's network change ability /* /mob/living/silicon/pai/proc/pai_network_change() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 75e81afb76e..39f78a92b8d 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -70,7 +70,7 @@ /mob/proc/AIize() if(client) client.screen.len = null - var/mob/living/silicon/ai/O = new /mob/living/silicon/ai(loc, /datum/ai_laws/asimov,,1)//No MMI but safety is in effect. + var/mob/living/silicon/ai/O = new (loc, /datum/ai_laws/asimov,,1)//No MMI but safety is in effect. O.invisibility = 0 O.aiRestorePowerRoutine = 0 O.lastKnownIP = client.address diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index c33d6222a92..c4523acd79d 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 196c185bdeb..e1dd5c9f885 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 86ed88243d2..edbe9f24b80 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 4a4f015f449..61f3eb662ea 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 7bb51bd2fb7..3bebe02624d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -41,7 +41,6 @@ #define FILE_DIR "code/game/gamemodes/revolution" #define FILE_DIR "code/game/gamemodes/sandbox" #define FILE_DIR "code/game/gamemodes/traitor" -#define FILE_DIR "code/game/gamemodes/traitor_pair" #define FILE_DIR "code/game/gamemodes/wizard" #define FILE_DIR "code/game/jobs" #define FILE_DIR "code/game/machinery" @@ -130,6 +129,7 @@ #define FILE_DIR "icons/turf" #define FILE_DIR "interface" #define FILE_DIR "maps" +#define FILE_DIR "maps/backup" #define FILE_DIR "sound" #define FILE_DIR "sound/ambience" #define FILE_DIR "sound/announcer" @@ -708,6 +708,7 @@ #include "code\modules\mob\living\carbon\monkey\life.dm" #include "code\modules\mob\living\carbon\monkey\login.dm" #include "code\modules\mob\living\carbon\monkey\monkey.dm" +#include "code\modules\mob\living\carbon\monkey\powers.dm" #include "code\modules\mob\living\carbon\monkey\say.dm" #include "code\modules\mob\living\silicon\say.dm" #include "code\modules\mob\living\silicon\silicon.dm"