Ninjas are now a random event. They may appear in most game modes after about an hour, with an assigned objective list.

Fixed aliens :a talking while dead.
Disabled hand-tele on clown-planet z-level since people were still finding ways to abuse it.
PDA menu will close properly if detomatrix fails and explodes own PDA.
Late joiners are now added to minds. It's now possible to assassinate them, and so on, as an objective.
Added a few more objectives (capture, steal brain of, protect, and download research) and new possible items to steal (also fixed admin-added steal objectives). Mostly focused on ninjas but admins can give them to regular traitors. Only research downloading is outright impossible for regular traitors (they must wear a ninja suit).
Added a few revisions to mind/objective datums and a few other things. The game should now report any extra antagonists for most round types, excluding AI malfunction.
Added two new words to station_name.dm.
Other misc changes.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1698 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
noisomehollow@lycos.com
2011-06-20 05:22:41 +00:00
parent e90bce5faa
commit 835118fa49
25 changed files with 742 additions and 391 deletions

View File

@@ -153,68 +153,58 @@ datum/mind
memory = new_memo memory = new_memo
else if (href_list["obj_edit"] || href_list["obj_add"]) else if (href_list["obj_edit"] || href_list["obj_add"])
var/datum/objective/objective = null var/datum/objective/objective
var/objective_pos = null var/objective_pos
var/def_value = null var/def_value
if (href_list["obj_edit"]) if (href_list["obj_edit"])
objective = locate(href_list["obj_edit"]) objective = locate(href_list["obj_edit"])
if (!objective) return if (!objective) return
objective_pos = objectives.Find(objective) objective_pos = objectives.Find(objective)
if (istype(objective, /datum/objective/assassinate)) //Text strings are easy to manipulate. Revised for simplicity.
def_value = "assassinate" var/temp_obj_type = "[objective.type]"//Convert path into a text string.
else if (istype(objective, /datum/objective/hijack)) def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword.
def_value = "hijack" if(!def_value)//If it's a custom objective, it will be an empty string.
else if (istype(objective, /datum/objective/escape))
def_value = "escape"
else if (istype(objective, /datum/objective/survive))
def_value = "survive"
else if (istype(objective, /datum/objective/steal))
def_value = "steal"
else if (istype(objective, /datum/objective/nuclear))
def_value = "nuclear"
else if (istype(objective, /datum/objective/absorb))
def_value = "absorb"
else if (istype(objective, /datum/objective))
def_value = "custom" def_value = "custom"
// TODO: cult objectives
//else if (istype(objective, /datum/objective/eldergod))
// def_value = "eldergod"
//else if (istype(objective, /datum/objective/survivecult))
// def_value = "survivecult"
//else if (istype(objective, /datum/objective/sacrifice))
// def_value = "sacrifice"
var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "hijack", "escape", "survive", "steal", "nuclear", "absorb", "custom") var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "debrain", "protect", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom")
if (!new_obj_type) return if (!new_obj_type) return
var/datum/objective/new_objective = null var/datum/objective/new_objective = null
switch (new_obj_type) switch (new_obj_type)
if ("assassinate") if ("assassinate","protect","debrain")
//To determine what to name the objective in explanation text.
var/objective_type_capital = uppertext(copytext(new_obj_type, 1,2))//Capitalize first letter.
var/objective_type_text = copytext(new_obj_type, 2)//Leave the rest of the text.
var/objective_type = "[objective_type_capital][objective_type_text]"//Add them together into a text string.
var/list/possible_targets = list("Free objective") var/list/possible_targets = list("Free objective")
for(var/datum/mind/possible_target in ticker.minds) for(var/datum/mind/possible_target in ticker.minds)
if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human))
possible_targets += possible_target.current possible_targets += possible_target.current
var/mob/def_target = null var/mob/def_target = null
if (istype(objective, /datum/objective/assassinate) && objective:target) var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain)
if (objective&&(objective.type in objective_list) && objective:target)
def_target = objective:target.current def_target = objective:target.current
var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
if (!new_target) return if (!new_target) return
var/objective_path = text2path("/datum/objective/[new_obj_type]")
if (new_target == "Free objective") if (new_target == "Free objective")
new_objective = new /datum/objective/assassinate new_objective = new objective_path
new_objective.owner = src new_objective.owner = src
new_objective:target = null new_objective:target = null
new_objective.explanation_text = "Free objective" new_objective.explanation_text = "Free objective"
else else
new_objective = new /datum/objective/assassinate new_objective = new objective_path
new_objective.owner = src new_objective.owner = src
new_objective:target = new_target:mind new_objective:target = new_target:mind
new_objective.explanation_text = "Assassinate [new_target:real_name], the [new_target:mind:assigned_role]." //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops.
new_objective.explanation_text = "[objective_type] [new_target:real_name], the [new_target:mind:assigned_role=="MODE" ? (new_target:mind:special_role) : (new_target:mind:assigned_role)]."
if ("hijack") if ("hijack")
new_objective = new /datum/objective/hijack new_objective = new /datum/objective/hijack
@@ -228,6 +218,10 @@ datum/mind
new_objective = new /datum/objective/survive new_objective = new /datum/objective/survive
new_objective.owner = src new_objective.owner = src
if ("nuclear")
new_objective = new /datum/objective/nuclear
new_objective.owner = src
if ("steal") if ("steal")
if (!istype(objective, /datum/objective/steal)) if (!istype(objective, /datum/objective/steal))
new_objective = new /datum/objective/steal new_objective = new /datum/objective/steal
@@ -238,22 +232,27 @@ datum/mind
if (!steal.select_target()) if (!steal.select_target())
return return
if ("nuclear") if("download","capture","absorb")
new_objective = new /datum/objective/nuclear var/def_num
new_objective.owner = src if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]"))
def_num = objective.target_amount
if ("absorb") var/target_number = input("Input target number:", "Objective", def_num) as num|null
var/def_num = null if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist.
if (istype(objective, /datum/objective/absorb))
def_num = objective:num_to_eat
var/num_to_eat = input("Number to eat:", "Objective", def_num) as num|null
if (isnull(num_to_eat))
return return
switch(new_obj_type)
if("download")
new_objective = new /datum/objective/download
new_objective.explanation_text = "Download [target_number] research levels."
if("capture")
new_objective = new /datum/objective/capture
new_objective.explanation_text = "Accumulate [target_number] capture points."
if("absorb")
new_objective = new /datum/objective/absorb new_objective = new /datum/objective/absorb
new_objective.explanation_text = "Absorb [target_number] compatible genomes."
new_objective.owner = src new_objective.owner = src
new_objective:num_to_eat = num_to_eat new_objective.target_amount = target_number
new_objective.explanation_text = "Absorb [num_to_eat] compatible genomes."
if ("custom") if ("custom")
var/expl = input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null var/expl = input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null

View File

@@ -9,12 +9,12 @@
name += " " name += " "
// Prefix // Prefix
name += pick("", "Dorf", "Alium", "Prefix", "Clowning", "Aegis", "Ishimura", "Scaredy", "Death-World", "Mime", "Honk", "Rogue", "Pony", "MacRagge", "Ultrameens", "Safety", "Paranoia", "Explosive", "Neckbear", "Donk", "Muppet", "North", "West", "East", "South", "Slant-ways", "Widdershins", "Rimward", "Expensive", "Procreatory", "Imperial", "Unidentified", "Immoral", "Carp", "Ork", "Pete", "Control", "Nettle", "Aspie", "Class", "Crab", "Fist","Corrogated","Skeleton","Race", "Fatguy", "Gentleman", "Touhou", "Capitalist", "Communist", "Bear", "Beard", "Derp", "Space", "Star", "Moon", "System", "Mining", "Neckbeard", "Research", "Supply", "Military", "Orbital", "Battle", "Science", "Asteroid", "Home", "Production", "Transport", "Delivery", "Extraplanetary", "Orbital", "Correctional", "Robot") name += pick("", "Dorf", "Alium", "Prefix", "Clowning", "Aegis", "Ishimura", "Scaredy", "Death-World", "Mime", "Honk", "Rogue", "Pony", "MacRagge", "Ultrameens", "Safety", "Paranoia", "Explosive", "Neckbear", "Donk", "Muppet", "North", "West", "East", "South", "Slant-ways", "Widdershins", "Rimward", "Expensive", "Procreatory", "Imperial", "Unidentified", "Immoral", "Carp", "Ork", "Pete", "Control", "Nettle", "Aspie", "Class", "Crab", "Fist","Corrogated","Skeleton","Race", "Fatguy", "Gentleman", "Touhou", "Capitalist", "Communist", "Bear", "Beard", "Derp", "Space", "Star", "Moon", "System", "Mining", "Neckbeard", "Research", "Supply", "Military", "Orbital", "Battle", "Science", "Asteroid", "Home", "Production", "Transport", "Delivery", "Extraplanetary", "Orbital", "Correctional", "Robot", "Gryphon")
if (name) if (name)
name += " " name += " "
// Suffix // Suffix
name += pick("Station", "Fortress", "Frontier", "Suffix", "Death-trap", "Space-hulk", "Lab", "Hazard","Spess Junk", "Fishery", "No-Moon", "Tomb", "Crypt", "Hut", "Monkey", "Bomb", "Trade Post", "Fortress", "Village", "Town", "City", "Edition", "Hive", "Complex", "Base", "Facility", "Depot", "Outpost", "Installation", "Drydock", "Observatory", "Array", "Relay", "Monitor", "Platform", "Construct", "Hangar", "Prison", "Center", "Port", "Waystation", "Factory", "Waypoint", "Stopover", "Hub", "HQ", "Office", "Object", "Fortification", "Colony", "Planet-Cracker") name += pick("Station", "Fortress", "Frontier", "Suffix", "Death-trap", "Space-hulk", "Lab", "Hazard","Spess Junk", "Fishery", "No-Moon", "Tomb", "Crypt", "Hut", "Monkey", "Bomb", "Trade Post", "Fortress", "Village", "Town", "City", "Edition", "Hive", "Complex", "Base", "Facility", "Depot", "Outpost", "Installation", "Drydock", "Observatory", "Array", "Relay", "Monitor", "Platform", "Construct", "Hangar", "Prison", "Center", "Port", "Waystation", "Factory", "Waypoint", "Stopover", "Hub", "HQ", "Office", "Object", "Fortification", "Colony", "Planet-Cracker", "Roost")
name += " " name += " "
// ID Number // ID Number

View File

@@ -76,7 +76,7 @@
var/datum/objective/absorb/absorb_objective = new var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling absorb_objective.owner = changeling
absorb_objective.gen_num_to_eat() absorb_objective.gen_amount_goal()
changeling.objectives += absorb_objective changeling.objectives += absorb_objective
var/datum/objective/assassinate/kill_objective = new var/datum/objective/assassinate/kill_objective = new
@@ -92,7 +92,7 @@
var/datum/objective/absorb/absorb_objective = new var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling absorb_objective.owner = changeling
absorb_objective.gen_num_to_eat() absorb_objective.gen_amount_goal()
changeling.objectives += absorb_objective changeling.objectives += absorb_objective
var/datum/objective/steal/steal_objective = new var/datum/objective/steal/steal_objective = new
@@ -108,7 +108,7 @@
var/datum/objective/absorb/absorb_objective = new var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling absorb_objective.owner = changeling
absorb_objective.gen_num_to_eat() absorb_objective.gen_amount_goal()
changeling.objectives += absorb_objective changeling.objectives += absorb_objective
var/datum/objective/assassinate/kill_objective = new var/datum/objective/assassinate/kill_objective = new

View File

@@ -13,7 +13,7 @@
/proc/event() /proc/event()
event = 1 event = 1
switch(pick(1,2,4,5,6,7,8,9,10,11)) switch(rand(1,11))
if(1) if(1)
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert") command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
world << sound('meteors.ogg') world << sound('meteors.ogg')
@@ -31,7 +31,7 @@
var/obj/bhole/bh = new /obj/bhole( T.loc, 30 ) var/obj/bhole/bh = new /obj/bhole( T.loc, 30 )
spawn(rand(50, 300)) spawn(rand(50, 300))
del(bh) del(bh)
/*
if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert") command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
world << sound('spanomalies.ogg') world << sound('spanomalies.ogg')
@@ -53,6 +53,10 @@
P.name = "wormhole" P.name = "wormhole"
spawn(rand(300,600)) spawn(rand(300,600))
del(P) del(P)
*/
if(3)
if((world.time/10)>=3600&&toggle_space_ninja&&!sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
if(4) if(4)
command_alert("Confirmed anomaly type SPC-MGM-152 aboard [station_name()]. All personnel must destroy the anomaly.", "Anomaly Alert") command_alert("Confirmed anomaly type SPC-MGM-152 aboard [station_name()]. All personnel must destroy the anomaly.", "Anomaly Alert")
world << sound('outbreak5.ogg') world << sound('outbreak5.ogg')

View File

@@ -282,7 +282,6 @@ Movement impairing would indicate drugs and the like.*/
s_coold = 3 s_coold = 3
return return
/* /*
=================================================================================== ===================================================================================
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<KAMIKAZE MODE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<KAMIKAZE MODE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

View File

@@ -240,10 +240,8 @@ ________________________________________________________________________________
var/display_to = s_control ? U : A//Who do we want to display certain messages to? var/display_to = s_control ? U : A//Who do we want to display certain messages to?
var/dat = "<html><head><title>SpiderOS</title></head><body bgcolor=\"#3D5B43\" text=\"#DB2929\"><style>a, a:link, a:visited, a:active, a:hover { color: #DB2929; }img {border-style:none;}</style>" var/dat = "<html><head><title>SpiderOS</title></head><body bgcolor=\"#3D5B43\" text=\"#DB2929\"><style>a, a:link, a:visited, a:active, a:hover { color: #DB2929; }img {border-style:none;}</style>"
if(spideros==0)
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=sos_7.png> Refresh</a>"
else
dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=sos_7.png> Refresh</a>" dat += "<a href='byond://?src=\ref[src];choice=Refresh'><img src=sos_7.png> Refresh</a>"
if(spideros)
dat += " | <a href='byond://?src=\ref[src];choice=Return'><img src=sos_1.png> Return</a>" dat += " | <a href='byond://?src=\ref[src];choice=Return'><img src=sos_1.png> Return</a>"
dat += " | <a href='byond://?src=\ref[src];choice=Close'><img src=sos_8.png> Close</a>" dat += " | <a href='byond://?src=\ref[src];choice=Close'><img src=sos_8.png> Close</a>"
dat += "<br>" dat += "<br>"
@@ -413,16 +411,16 @@ ________________________________________________________________________________
dat += "Stored AI: <b>[A.name]</b><br>" dat += "Stored AI: <b>[A.name]</b><br>"
dat += "System integrity: [(A.health+100)/2]%<br>" dat += "System integrity: [(A.health+100)/2]%<br>"
//I personally think this makes things a little more fun. Ninjas can override all but law 0.
//if (A.laws.zeroth)
// laws += "<li>0: [A.laws.zeroth]</li>"
for (var/index = 1, index <= A.laws.ion.len, index++) for (var/index = 1, index <= A.laws.ion.len, index++)
var/law = A.laws.ion[index] var/law = A.laws.ion[index]
if (length(law) > 0) if (length(law) > 0)
var/num = ionnum() var/num = ionnum()
laws += "<li>[num]. [law]</li>" laws += "<li>[num]. [law]</li>"
//I personally think this makes things a little more fun. Ninjas can override all but law 0.
//if (A.laws.zeroth)
// laws += "<li>0: [A.laws.zeroth]</li>"
var/number = 1 var/number = 1
for (var/index = 1, index <= A.laws.inherent.len, index++) for (var/index = 1, index <= A.laws.inherent.len, index++)
var/law = A.laws.inherent[index] var/law = A.laws.inherent[index]
@@ -462,7 +460,7 @@ ________________________________________________________________________________
if(t_disk) if(t_disk)
dat += "<a href='byond://?src=\ref[src];choice=Eject Disk'>Eject Disk</a><br>" dat += "<a href='byond://?src=\ref[src];choice=Eject Disk'>Eject Disk</a><br>"
dat += "<ul>" dat += "<ul>"
if(stored_research.len)//If there is stored research. Should be. if(stored_research.len)//If there is stored research. Should be but just in case.
for(var/datum/tech/current_data in stored_research) for(var/datum/tech/current_data in stored_research)
dat += "<li>" dat += "<li>"
dat += "[current_data.name]: [current_data.level]" dat += "[current_data.name]: [current_data.level]"
@@ -824,7 +822,7 @@ ________________________________________________________________________________
else if(istype(I, /obj/item/weapon/cell)) else if(istype(I, /obj/item/weapon/cell))
if(I:maxcharge>cell.maxcharge) if(I:maxcharge>cell.maxcharge)
U << "\blue Higher maximum capacity detected.\nUpgrading..." U << "\blue Higher maximum capacity detected.\nUpgrading..."
if (n_gloves&&n_gloves.candrain&&do_after(U,50)) if (n_gloves&&n_gloves.candrain&&do_after(U,s_delay))
U.drop_item() U.drop_item()
I.loc = src I.loc = src
I:charge = min(I:charge+cell.charge, I:maxcharge) I:charge = min(I:charge+cell.charge, I:maxcharge)
@@ -1059,19 +1057,18 @@ ________________________________________________________________________________
spawn(0) spawn(0)
var/turf/location = get_turf(U) var/turf/location = get_turf(U)
for(var/mob/living/silicon/ai/AI in world) for(var/mob/living/silicon/ai/AI in world)
AI << "\red <b>Network Alert: Hacking attempt detected [location?"in [location]":"Unable to pinpoint location"]</b>." AI << "\red <b>Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]</b>."
if(A:files&&A:files.known_tech.len) if(A:files&&A:files.known_tech.len)
while(G.candrain&&!isnull(A))
for(var/datum/tech/current_data in S.stored_research) for(var/datum/tech/current_data in S.stored_research)
U << "\blue Checking \the [current_data.name] database." U << "\blue Checking \the [current_data.name] database."
if(do_after(U,S.s_delay)) if(do_after(U, S.s_delay)&&G.candrain&&!isnull(A))
for(var/datum/tech/analyzing_data in A:files.known_tech) for(var/datum/tech/analyzing_data in A:files.known_tech)
if(current_data.id==analyzing_data.id) if(current_data.id==analyzing_data.id)
if(analyzing_data.level>current_data.level) if(analyzing_data.level>current_data.level)
U << "\blue Database: \black <b>UPDATED</b>." U << "\blue Database: \black <b>UPDATED</b>."
current_data.level = analyzing_data.level current_data.level = analyzing_data.level
break break//Move on to next.
break else break//Otherwise, quit processing.
U << "\blue Data analyzed. Process finished." U << "\blue Data analyzed. Process finished."
if("WIRE") if("WIRE")
@@ -1306,7 +1303,8 @@ It is possible to destroy the net by the occupant or someone else.
density = 1//Can't pass through. density = 1//Can't pass through.
opacity = 0//Can see through. opacity = 0//Can see through.
mouse_opacity = 1//So you can hit it with stuff. mouse_opacity = 1//So you can hit it with stuff.
anchored = 1//Can't drag/grab. anchored = 1//Can't drag/grab the trapped mob.
var var
health = 25//How much health it has. health = 25//How much health it has.
mob/living/affecting = null//Who it is currently affecting, if anyone. mob/living/affecting = null//Who it is currently affecting, if anyone.

View File

@@ -58,45 +58,81 @@ ________________________________________________________________________________
Miscellaneous Notes: Miscellaneous Notes:
Right now I am focused on creating a dynamic objective tree based on round type, in order to create a ninja random event. Potential Upgrade Tree:
I'll update when possible. Energy Shield:
Extra Ability
Syndicate Shield device?
Works like the force wall spell, except can be kept indefinitely as long as energy remains. Toggled on or off.
Would block bullets and the like.
Phase Shift
Extra Ability
Advanced Sensors?
Instead of being unlocked at the start, Phase Shieft would become available once requirements are met.
Uranium-based Recharger:
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.
Extended Battery Life:
Suit Upgrade
Battery of higher capacity
Already implemented. Replace current battery with one of higher capacity.
Advanced Cloak-Tech device.
Suit Upgrade
Syndicate Cloaking Device?
Remove cloak failure rate.
*/ */
//=======//RANDOM EVENT//=======// //=======//RANDOM EVENT//=======//
/*
Also a dynamic ninja mission generator.
I decided to scrap round-specific objectives since keeping track of them would require some form of tracking.
When I already created about 4 new objectives, this doesn't terribly important or needed.
*/
/var/global/toggle_space_ninja = 1//If ninjas can spawn or not.
/var/global/sent_ninja_to_station = 0//If a ninja is already on the station.
/proc/space_ninja_arrival() /proc/space_ninja_arrival()
/*
var/datum/game_mode/current_mode = ticker.mode var/datum/game_mode/current_mode = ticker.mode
var/datum/mind/current_mind = new() var/datum/mind/current_mind = new()
var/antagonist_list[] = list()//The main bad guys.
/*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/sec_antagonist_list[] = current_mode.traitors//The OTHER bad guys. Mostly admin made.
var/tet_antagonist_list[] = list()//The bad guys no-one really cares about. For now just revs. var/ter_antagonist_list[] = list()//The bad guys no-one really cares about. For now just revs.
var/protagonist_list[] = current_mode:get_living_heads()//The good guys. Mostly Heads. Who are alive. var/protagonist_list[] = current_mode.get_living_heads()//The good guys. Mostly Heads. Who are alive.
var/xeno_list[] = list()//Aliums. var/xeno_list[] = list()//Aliens.
var/commando_list[] = list()//Commandos.
//First we determine what mode it is and add the bad guys approprietly. //First we determine what mode it is and add the bad guys approprietly.
switch (current_mode.config_tag) switch (current_mode.config_tag)
if("traitor") if("traitor")
if(current_mode:traitors.len) if(current_mode:traitors.len)
for(var/datum/mind/current_mind in current_mode:traitors)//For traitor minds in in the traitors list. for(current_mind in current_mode:traitors)//For traitor minds in in the traitors list.
if(current_mind.current&&current_mind.current.stat!=2)//If the traitor mob exists and they are not dead. if(current_mind.current&&current_mind.current.stat!=2)//If the traitor mob exists and they are not dead.
antagonist_list += current_mind//Add them to the list. antagonist_list += current_mind//Add them to the list.
if ("revolution")//Rev is divided into regular and head cultists. There are also heads of staff to consider. if ("revolution")//Rev is divided into regular and heads. There are also heads of staff to consider.
if(current_mode:head_revolutionaries.len) if(current_mode:head_revolutionaries.len)
for(var/datum/mind/current_mind in current_mode:head_revolutionaries) for(current_mind in current_mode:head_revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2) if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind antagonist_list += current_mind
for(var/datum/mind/current_mind in current_mode:revolutionaries) for(current_mind in current_mode:revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2) if(current_mind.current&&current_mind.current.stat!=2)
tet_antagonist_list += current_mind ter_antagonist_list += current_mind
if(current_mode:heads_of_staff.len) if(current_mode:heads_of_staff.len)
heads_list = list()//Now we manually override the list made prior. Target Heads take priority. var/heads_list[] = list()//Now we manually override the list made prior. Target Heads take priority.
for(var/datum/mind/current_mind in current_mode:heads_of_staff) for(current_mind in current_mode:heads_of_staff)
if(current_mind.current&&current_mind.current.stat!=2) if(current_mind.current&&current_mind.current.stat!=2)
protagonist_list += current_mind protagonist_list += current_mind
if(heads_list.len)//Or not, if there are none. if(heads_list.len)//Or not, if there are none.
@@ -104,33 +140,39 @@ ________________________________________________________________________________
if ("cult")//Always a few of these around. if ("cult")//Always a few of these around.
if(current_mode:cult.len) if(current_mode:cult.len)
for(var/datum/mind/current_mind in current_mode:cult) for(current_mind in current_mode:cult)
if(current_mind.current&&current_mind.current.stat!=2) if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind antagonist_list += current_mind
if ("wizard")//There can be only one mode wizard. Other wizards aren't too important. if ("wizard")//There can be only one mode wizard. Other wizards aren't too important.
if(current_mode:wizard) if(current_mode:wizard)
antagonist_list += wizard//The round will end if the wizard dies so checking for it is unnecessary. antagonist_list += current_mode:wizard//The round will end if the wizard dies so checking for it is unnecessary.
if ("changeling")//While only one changeling counts for being alive or dead, it's possible there are more. if ("changeling")//While only one changeling counts for being alive or dead, it's possible there are more.
if(current_mode:changelings.len) if(current_mode:changelings.len)
for(var/datum/mind/current_mind in current_mode:changelings) for(current_mind in current_mode:changelings)
if(current_mind.current&&current_mind.current.stat!=2) if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind antagonist_list += current_mind
/*
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.
if ("malfunction")//Only one malf AI. if ("malfunction")//Only one malf AI.
if(current_mode:malf_ai) if(current_mode:malf_ai)
antagonist_list += malf_ai antagonist_list += current_mode:malf_ai
*/
if ("nuclear")//Can be a few of these guys. if ("nuclear")//Can be a few of these guys.
if(current_mode:syndicates.len) if(current_mode:syndicates.len)
for(var/datum/mind/current_mind in current_mode:syndicates) for(current_mind in current_mode:syndicates)
if(current_mind.current&&current_mind.current.stat!=2) if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind antagonist_list += current_mind
else else
return//Don't want to summon a ninja during meteor or extended, or something. return//Don't want to summon a ninja during meteor or extended, or something.
//Here we pick a location and spawn the ninja. //Here we pick a location and spawn the ninja.
var/list/spawn_list = list() var/list/spawn_list = list()
for(var/obj/landmark/L in world) for(var/obj/landmark/L in world)
if (L.name == "carpspawn") if (L.name == "carpspawn")
@@ -147,9 +189,9 @@ ________________________________________________________________________________
var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin )) var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin ))
if(candidates.len) if(candidates.len)
var/mob/G = pick(candidates) G = pick(candidates)
new_ninja.key = G.key new_ninja.key = G.key
new_ninja.mind.key = key new_ninja.mind.key = new_ninja.key
new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters. new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters.
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess. new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
new_ninja.internals.icon_state = "internal1" new_ninja.internals.icon_state = "internal1"
@@ -157,97 +199,210 @@ ________________________________________________________________________________
else else
del(new_ninja) del(new_ninja)
return return
//Now for the rest of the stuff. //Now for the rest of the stuff.
var/datum/mind/ninja_mind = new_ninja.mind//For easier reference. var/datum/mind/ninja_mind = new_ninja.mind//For easier reference.
var/mission_set = 0//To determine if we need to do further processing.
//Xenos and deathsquads take precedence over everything else. //Xenos and deathsquads take precedence over everything else.
for(var/mob/living/carbon/alien/humanoid/xeno in world)//Unless the xenos are hiding in a locker somewhere, this'll find em.
//Unless the xenos are hiding in a locker somewhere, this'll find em.
for(var/mob/living/carbon/alien/humanoid/xeno in world)
if(istype(xeno)) if(istype(xeno))
xeno_list += xeno xeno_list += xeno
//if(xeno_list.len>3)//If there are more than three humanoid xenos on the station, time to get dangerous. if(xeno_list.len>3)//If there are more than three humanoid xenos on the station, time to get dangerous.
//if(sent_strike_team)//If a strike team was sent. //Here we want the ninja to murder all the queens. The other aliens don't really matter.
for(var/mob/living/carbon/human/commando in world)//Search and destroy. var/xeno_queen_list[] = list()
if(commando.mind&&commando.mind.special_role=="Death Commando") for(var/mob/living/carbon/alien/humanoid/queen/xeno_queen in xeno_list)
if(xeno_queen.mind&&xeno_queen.stat!=2)
xeno_queen_list += xeno_queen
if(xeno_queen_list.len&&side=="face")//If there are queen about and the probability is 50.
for(var/mob/living/carbon/alien/humanoid/queen/xeno_queen in xeno_queen_list)
var/datum/objective/assassinate/ninja_objective = new
//We'll do some manual overrides to properly set it up.
ninja_objective.owner = ninja_mind
ninja_objective.target = xeno_queen.mind
ninja_objective.explanation_text = "Kill \the [xeno_queen]."
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"&&current_mind.current&&current_mind.current.stat!=2)
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)
var/datum/objective/assassinate/ninja_objective = new var/datum/objective/assassinate/ninja_objective = new
ninja_objective.owner = ninja_mind ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role(commando.mind.special_role,1) ninja_objective.find_target_by_role(commando.mind.special_role,1)
ninja_mind.objectives += ninja_objective ninja_mind.objectives += ninja_objective
mission_set = 1
/* /*
If there are no antogonists left it could mean one of two things: If there are no antogonists left it could mean one of two things:
A) The round is about to end. No harm in spawning the ninja here since it has done all the reporting more likely than not. A) The round is about to end. No harm in spawning the ninja here.
B) The round is still going and ghosts are probably rioting for something to happen. B) The round is still going and ghosts are probably rioting for something to happen.
In either case, it's a good idea to spawn the ninja with a semi-random set of objectives. In either case, it's a good idea to spawn the ninja with a semi-random set of objectives.
*/ */
if(!antagonist_list.len) if(!mission_set)//If mission was not set.
switch(rand(1,3))
if(1) //To pick a person for each list.
if(protagonist_list.len)//If we have surviving heads. var/datum/mind/antagonist_target
for(var/datum/mind/head_mind in protagonist_list)//Search and destroy. 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/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
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.
if(!hostile_targets.len)//Remove appropriate choices from switch list if the target lists are empty.
objective_list -= 1
objective_list -= 4
if(!friendly_targets.len)
objective_list -= 3
switch(pick(objective_list))
if(1)//kill
current_mind = pick(hostile_targets)
var/datum/objective/assassinate/ninja_objective = new var/datum/objective/assassinate/ninja_objective = new
ninja_objective.owner = ninja_mind ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role(head_mind.assigned_role) ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))//If they have a special role, use that instead to find em.
ninja_mind.objectives += ninja_objective ninja_mind.objectives += ninja_objective
//TO DO: add ninja-net point-based system objective. hostile_targets -= current_mind//Remove them from the list.
//TO DO: upgrade cell objective. if(2)//Steal
var/datum/objective/steal/ninja_objective = new
var/target_item = pick(ninja_objective.possible_items_special)
ninja_objective.set_target(target_item)
ninja_mind.objectives += ninja_objective
else//Else, we need to give them an objective based on round type. objective_list -= 2
if(sec_antagonist_list.len) if(3)//Protect. Keeping people alive can be pretty difficult.
current_mind = pick(friendly_targets)
if(tet_antagonist_list.len)//Not gonna happen but maybe in the future. var/datum/objective/protect/ninja_objective = new
ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
ninja_mind.objectives += ninja_objective
friendly_targets -= current_mind
if(4)//Debrain
current_mind = pick(hostile_targets)
//if(!ninja_mind.objectives.len)//If they somehow did not get an objective. var/datum/objective/debrain/ninja_objective = new
//Let em know. ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
ninja_mind.objectives += ninja_objective
//Finally add a survival objective. hostile_targets -= current_mind//Remove them from the list.
if(5)//Download research
var/datum/objective/download/ninja_objective = new
ninja_objective.gen_amount_goal()
ninja_mind.objectives += ninja_objective
objective_list -= 5
if(6)//Capture
var/datum/objective/capture/ninja_objective = new
ninja_objective.gen_amount_goal()
ninja_mind.objectives += ninja_objective
objective_list -= 6
if(ninja_mind.objectives.len)//If they got some objectives out of that.
mission_set = 1
if(!ninja_mind.objectives.len||!mission_set)//If they somehow did not get an objective at this point, time to destroy the station.
var/nuke_code
if(current_mode.config_tag == "nuclear"||sent_strike_team)//If it's nuclear, there is a nuke with a code already set. Or if commandos were sent in.
var/temp_code
for(var/obj/machinery/nuclearbomb/N in world)
temp_code = text2num(N.r_code)
if(temp_code)//if it's actually a number. It won't convert any non-numericals.
nuke_code = N.r_code
break
if(!nuke_code)//If there is still no code.
nuke_code = "[rand(10000, 99999.0)]"
for(var/obj/machinery/nuclearbomb/N in world)
N.r_code = nuke_code
var/datum/objective/nuclear/ninja_objective = new//Fun.
ninja_objective.owner = ninja_mind
ninja_objective.explanation_text = "Destroy the station with a nuclear device. The code is [nuke_code]." //Let them know what the code is.
//Finally add a survival objective since it's usually broad enough for any round type.
var/datum/objective/survive/ninja_objective = new var/datum/objective/survive/ninja_objective = new
ninja_objective.owner = ninja_mind ninja_objective.owner = ninja_mind
ninja_mind.objectives += ninja_objective ninja_mind.objectives += ninja_objective
var/directive = generate_ninja_directive() var/directive = generate_ninja_directive(side)
new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current directive is: \red <B>[directive]</B>" new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current directive is: \red <B>[directive]</B>"
new_ninja.mind.store_memory("<B>Directive:</B> \red [directive].") new_ninja.mind.store_memory("<B>Directive:</B> \red [directive]<br>")
*/
return var/obj_count = 1
new_ninja << "\blue Your current objectives:"
for(var/datum/objective/objective in ninja_mind.objectives)
new_ninja << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
sent_ninja_to_station = 1//And we're done.
return new_ninja//Return the ninja in case we need to reference them later.
/* /*
This proc will give the ninja a directive to follow. They are not obligated to do so but it's a fun roleplay reminder. This proc will give the ninja a directive to follow. They are not obligated to do so but it's a fun roleplay reminder.
Making this random or semi-random will probably not work without it also being incredibly silly. Making this random or semi-random will probably not work without it also being incredibly silly.
As such, it's hard-coded for now. No reason for it not to be, really. As such, it's hard-coded for now. No reason for it not to be, really.
*/ */
/proc/generate_ninja_directive() /proc/generate_ninja_directive(side)
var/directive var/directive = "[side=="face"?"Nanotrasen":"The Syndicate"] is your employer. "//Let them know which side they're on.
switch(rand(1,13)) switch(rand(1,13))
if(1) if(1)
directive = "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible." directive += "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible."
if(2) if(2)
directive = "[station_name] is financed by an enemy of the Spider Clan. Cause as much structural damage as possible." directive += "[station_name] is financed by an enemy of the Spider Clan. Cause as much structural damage as possible."
if(3) if(3)
directive = "A wealthy animal rights activist has made a request we cannot refuse. Prioritize saving animal lives whenever possible." directive += "A wealthy animal rights activist has made a request we cannot refuse. Prioritize saving animal lives whenever possible."
if(4) if(4)
directive = "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice." directive += "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice."
if(5) if(5)
directive = "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them." directive += "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them."
if(6) 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." 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) if(7)
directive = "A financial backer has made an offer we cannot refuse. Implicate Syndicate involvement in the operation." directive += "A financial backer has made an offer we cannot refuse. Implicate Syndicate involvement in the operation."
if(8) if(8)
directive = "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter." directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
if(9) 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 Nanotrasen involvement in the operation."
if(10) if(10)
directive = "Our reputation is on the line. Harm as few civilians or innocents as possible." directive += "Our reputation is on the line. Harm as few civilians or innocents as possible."
if(11) if(11)
directive = "Our honor is on the line. Utilize only honorable tactics when dealing with opponents." directive += "Our honor is on the line. Utilize only honorable tactics when dealing with opponents."
if(12) if(12)
directive = "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or another natural cause." directive += "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or another natural cause."
else else
directive = "There are no special directives at this time." directive += "There are no special supplemental instructions at this time."
return directive return directive
//=======//CURRENT PLAYER VERB//=======// //=======//CURRENT PLAYER VERB//=======//
@@ -259,6 +414,9 @@ As such, it's hard-coded for now. No reason for it not to be, really.
if(!ticker) if(!ticker)
alert("Wait until the game starts") alert("Wait until the game starts")
return return
if(!toggle_space_ninja)
alert("Space Ninjas spawning is disabled.")
return
if(ishuman(M)) if(ishuman(M))
log_admin("[key_name(src)] turned [M.key] into a Space Ninja.") log_admin("[key_name(src)] turned [M.key] into a Space Ninja.")
spawn(10) spawn(10)
@@ -276,7 +434,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
/client/proc/send_space_ninja() /client/proc/send_space_ninja()
set category = "Fun" set category = "Fun"
set name = "Spawn Space Ninja" set name = "Spawn Space Ninja"
set desc = "Spawns a space ninja for when you need a teenager with an attitude." set desc = "Spawns a space ninja for when you need a teenager with attitude."
set popup_menu = 0 set popup_menu = 0
if(!authenticated || !holder) if(!authenticated || !holder)
@@ -285,6 +443,9 @@ As such, it's hard-coded for now. No reason for it not to be, really.
if(!ticker.mode) if(!ticker.mode)
alert("The game hasn't started yet!") alert("The game hasn't started yet!")
return return
if(!toggle_space_ninja)
alert("Space Ninjas spawning is disabled.")
return
if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No") if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No")
return return
@@ -321,7 +482,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
new_ninja.mind.key = G.key new_ninja.mind.key = G.key
new_ninja.key = G.key new_ninja.key = G.key
new_ninja.mind.store_memory("<B>Mission:</B> \red [mission].") new_ninja.mind.store_memory("<B>Mission:</B> \red [mission].<br>")
new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess. new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
new_ninja.internals.icon_state = "internal1" new_ninja.internals.icon_state = "internal1"
@@ -329,7 +490,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
new_ninja.wear_suit:ninitialize(10,new_ninja)//If you're wondering why I'm passing the argument to the proc when the default should suffice, new_ninja.wear_suit:ninitialize(10,new_ninja)//If you're wondering why I'm passing the argument to the proc when the default should suffice,
//I'm also wondering that same thing. This makes sure it does not run time error though. //I'm also wondering that same thing. This makes sure it does not run time error though.
new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current mission is: \red <B>[mission]</B>" new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red <B>SPACE NINJA</B>!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training! \nYour current mission is: \red <B>[mission]</B>"
message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children! \nTheir <b>mission</b> is: [mission]", 1) message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children! \nTheir <b>mission</b> is: [mission]", 1)
log_admin("[admin_name] used Spawn Space Ninja.") log_admin("[admin_name] used Spawn Space Ninja.")
@@ -360,6 +521,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
else else
mind = new mind = new
mind.current = src mind.current = src
mind.original = src
mind.assigned_role = "MODE" mind.assigned_role = "MODE"
mind.special_role = "Space Ninja" mind.special_role = "Space Ninja"
if(!(mind in ticker.minds)) if(!(mind in ticker.minds))
@@ -736,7 +898,7 @@ BYOND fixed the verb bugs so this is no longer necessary. I prefer verb panels.
*/ */
//=======//DEBUG//=======// //=======//DEBUG//=======//
/*
/obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs() /obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs()
//DEBUG //DEBUG
//Does nothing at the moment. I am trying to see if it's possible to mess around with verbs as variables. //Does nothing at the moment. I am trying to see if it's possible to mess around with verbs as variables.
@@ -745,7 +907,7 @@ BYOND fixed the verb bugs so this is no longer necessary. I prefer verb panels.
// usr << "[P.set.name], path: [P]" // usr << "[P.set.name], path: [P]"
return return
/*
Most of these are at various points of incomplete. Most of these are at various points of incomplete.
/mob/verb/grant_object_panel() /mob/verb/grant_object_panel()

View File

@@ -24,8 +24,10 @@
return 0 return 0
/datum/game_mode/proc/declare_completion() /datum/game_mode/proc/declare_completion()
return
/datum/game_mode/proc/declare_extra_completion()
for(var/datum/mind/traitor in traitors) for(var/datum/mind/traitor in traitors)
var/traitorwin = 1
var/traitor_name var/traitor_name
if(traitor.current) if(traitor.current)
@@ -38,7 +40,9 @@
else else
traitor_name = "[traitor.key] (character destroyed)" traitor_name = "[traitor.key] (character destroyed)"
world << "<B>The syndicate traitor was [traitor_name]</B>" world << "<B>The [traitor.special_role?(lowertext(traitor.special_role)):"antagonist"] was [traitor_name]</B>"
if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this.
var/traitorwin = 1
var/count = 1 var/count = 1
for(var/datum/objective/objective in traitor.objectives) for(var/datum/objective/objective in traitor.objectives)
if(objective.check_completion()) if(objective.check_completion())
@@ -49,9 +53,9 @@
count++ count++
if(traitorwin) if(traitorwin)
world << "<B>The traitor was successful!<B>" world << "<B>The antagonist was successful!<B>"
else else
world << "<B>The traitor has failed!<B>" world << "<B>The antagonist has failed!<B>"
return 1 return 1
/datum/game_mode/proc/check_win() /datum/game_mode/proc/check_win()
@@ -184,3 +188,15 @@ Rev-heads won't get them. Can be expanded otherwise.*/
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code response." traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code response."
traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe." traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
//End code phrase. //End code phrase.
/datum/game_mode/proc/get_living_heads()
var/list/heads = list()
for(var/mob/living/carbon/human/player in world)
if(player.mind)
var/role = player.mind.assigned_role
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer"))
heads += player.mind
return heads

View File

@@ -13,7 +13,7 @@ var/global/datum/controller/gameticker/ticker
var/event_time = null var/event_time = null
var/event = 0 var/event = 0
var/list/datum/mind/minds = list() var/list/datum/mind/minds = list()//The people in the game. Used for objective tracking.
var/pregame_timeleft = 0 var/pregame_timeleft = 0
@@ -208,7 +208,8 @@ var/global/datum/controller/gameticker/ticker
world << "<b>[robo.name] was unable to survive the rigors of being a cyborg without an AI. Its laws were:</b>" world << "<b>[robo.name] was unable to survive the rigors of being a cyborg without an AI. Its laws were:</b>"
robo.laws.show_laws(world) robo.laws.show_laws(world)
mode.declare_completion() mode.declare_completion()//To declare normal completion.
mode.declare_extra_completion()//To declare extra traitors/special roles for rounds.
return 1 return 1

View File

@@ -84,6 +84,13 @@
/datum/game_mode/malfunction/check_win() /datum/game_mode/malfunction/check_win()
if (AI_win_timeleft <= 0 && !win) if (AI_win_timeleft <= 0 && !win)
win = 1 win = 1
declare_completion()
return 1
else
return 0
/datum/game_mode/malfunction/declare_completion()
if(win==1)//If the AI won.
world << "<FONT size = 3><B>The AI has won!</B></FONT>" world << "<FONT size = 3><B>The AI has won!</B></FONT>"
world << "<B>It has fully taken control of all of [station_name()]'s systems.</B>" world << "<B>It has fully taken control of all of [station_name()]'s systems.</B>"
@@ -100,9 +107,12 @@
sleep(300) sleep(300)
log_game("Rebooting due to round end") log_game("Rebooting due to round end")
world.Reboot() world.Reboot()
return 1
else else
return 0 world << "<FONT size = 3><B>Human Victory</B></FONT>"
world << "<B>The AI has been killed!</B> The staff is victorious."
sleep(100)
world << "\blue Rebooting due to end of game"
world.Reboot()
/datum/game_mode/malfunction/Topic(href, href_list) /datum/game_mode/malfunction/Topic(href, href_list)
..() ..()

View File

@@ -178,6 +178,7 @@
sleep(110) sleep(110)
if (ticker.mode.name != "nuclear emergency" || !derp || !herp) if (ticker.mode.name != "nuclear emergency" || !derp || !herp)
ticker.mode.declare_extra_completion()//Declaring regular completion could cause issues.
world << "<B>The station was destoyed by the nuclear blast! Resetting in 30 seconds!</B>" world << "<B>The station was destoyed by the nuclear blast! Resetting in 30 seconds!</B>"
sleep(300) sleep(300)

View File

@@ -1,7 +1,10 @@
datum datum
objective objective
var/datum/mind/owner var
var/explanation_text datum/mind/owner//Who owns the objective.
explanation_text//What that person is supposed to do.
datum/mind/target//If they are focused on a particular person.
target_amount//If they are focused on a particular number. Steal objectives have their own counter.
New(var/text) New(var/text)
if(text) if(text)
@@ -11,19 +14,25 @@ datum
check_completion() check_completion()
return 1 return 1
assassinate find_target()
var/datum/mind/target
proc/find_target()
var/list/possible_targets = list() var/list/possible_targets = list()
for(var/datum/mind/possible_target in ticker.minds) for(var/datum/mind/possible_target in ticker.minds)
if((possible_target != owner) && istype(possible_target.current, /mob/living/carbon/human)) if(possible_target != owner && ishuman(possible_target))
possible_targets += possible_target possible_targets += possible_target
if(possible_targets.len > 0) if(possible_targets.len > 0)
target = pick(possible_targets) target = pick(possible_targets)
find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned.
for(var/datum/mind/possible_target in ticker.minds)
if((possible_target != owner) && ishuman(possible_target) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
target = possible_target
break
assassinate
find_target()
..()
if(target && target.current) if(target && target.current)
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]." explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
else else
@@ -31,14 +40,10 @@ datum
return target return target
proc/find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned. find_target_by_role(role, role_type=0)
for(var/datum/mind/possible_target in ticker.minds) ..(role, role_type)
if((possible_target != owner) && istype(possible_target.current, /mob/living/carbon/human) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
target = possible_target
break
if(target && target.current) if(target && target.current)
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]." explanation_text = "Assassinate [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]."
else else
explanation_text = "Free Objective" explanation_text = "Free Objective"
@@ -46,13 +51,76 @@ datum
check_completion() check_completion()
if(target && target.current) if(target && target.current)
if(target.current.stat == 2 || istype(target.current.loc.loc, /area/tdome) || istype(target.current,/mob/living/silicon) || istype(target.current,/mob/living/carbon/brain)) //Assuming this works, people in the thunderdome and borgs now count as dead for traitor objectives. --NeoFite if(target.current.stat == 2 || istype(target.current.loc.loc, /area/tdome) || issilicon(target.current) || isbrain(target.current)) //Assuming this works, people in the thunderdome and borgs now count as dead for traitor objectives. --NeoFite
return 1 return 1
else else
return 0 return 0
else else
return 1 return 1
debrain//I want braaaainssss
find_target()
..()
if(target && target.current)
explanation_text = "Steal the brain of [target.current.real_name]."
else
explanation_text = "Free Objective"
return target
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Steal the brain of [target.current.real_name] the [!role_type ? target.assigned_role : target.special_role]."
else
explanation_text = "Free Objective"
return target
check_completion()
if(!target)//If it's a free objective.
return 1
if(!owner.current||owner.current.stat==2)//If they're dead.
return 0
var/list/all_items = owner.current.get_contents()
for(var/obj/item/device/mmi/mmi in all_items)
if(mmi.brainmob&&mmi.brainmob.mind==target) return 1
for(var/obj/item/brain/brain in all_items)
if(brain.brainmob&&brain.brainmob.mind==target) return 1
return 0
protect//The opposite of killing a dude.
find_target()
..()
if(target && target.current)
explanation_text = "Protect [target.current.real_name], the [target.assigned_role]."
else
explanation_text = "Free Objective"
return target
find_target_by_role(role, role_type=0)
..(role, role_type)
if(target && target.current)
explanation_text = "Protect [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]."
else
explanation_text = "Free Objective"
return target
check_completion()
if(!target)//If it's a free objective.
return 1
if(target.current)
if(target.current.stat == 2 || istype(target.current.loc.loc, /area/tdome) || issilicon(target.current) || isbrain(target.current))
return 0
else
return 1
else
return 0
hijack hijack
explanation_text = "Hijack the emergency shuttle by escaping alone." explanation_text = "Hijack the emergency shuttle by escaping alone."
@@ -66,8 +134,9 @@ datum
return 0 return 0
var/area/shuttle = locate(/area/shuttle/escape/centcom) var/area/shuttle = locate(/area/shuttle/escape/centcom)
var/protected_mobs[] = list(/mob/living/silicon/ai, /mob/living/silicon/pai)
for(var/mob/living/player in world) for(var/mob/living/player in world)
if(player.type in protected_mobs) continue
if (player.mind && (player.mind != owner)) if (player.mind && (player.mind != owner))
if (player.stat != 2) //they're not dead if (player.stat != 2) //they're not dead
if (get_turf(player) in shuttle) if (get_turf(player) in shuttle)
@@ -79,9 +148,9 @@ datum
explanation_text = "Escape on the shuttle alive." explanation_text = "Escape on the shuttle alive."
check_completion() check_completion()
if(istype(owner.current, /mob/living/silicon)) if(issilicon(owner.current))
return 0 return 0
if(istype(owner.current, /mob/living/carbon/brain)) if(isbrain(owner.current))
return 0 return 0
if(emergency_shuttle.location<2) if(emergency_shuttle.location<2)
return 0 return 0
@@ -104,18 +173,21 @@ datum
explanation_text = "Stay alive until the end" explanation_text = "Stay alive until the end"
check_completion() check_completion()
if(istype(owner.current, /mob/living/silicon) && owner.current != owner.original) if(issilicon(owner.current) && owner.current != owner.original)
return 0 return 0
if(!owner.current || owner.current.stat == 2) if(!owner.current || owner.current.stat == 2)
return 0 return 0
return 1 return 1
nuclear
explanation_text = "Destroy the station with a nuclear device."
steal steal
var/obj/item/steal_target var/obj/item/steal_target
var/target_name var/target_name
var/global/list/possible_items = list(
var/global/possible_items[] = list(
"the captain's antique laser gun" = /obj/item/weapon/gun/energy/laser/captain, "the captain's antique laser gun" = /obj/item/weapon/gun/energy/laser/captain,
"a hand teleporter" = /obj/item/weapon/hand_tele, "a hand teleporter" = /obj/item/weapon/hand_tele,
"an RCD" = /obj/item/weapon/rcd, "an RCD" = /obj/item/weapon/rcd,
@@ -129,38 +201,45 @@ datum
"28 moles of plasma (full tank)" = /obj/item/weapon/tank, "28 moles of plasma (full tank)" = /obj/item/weapon/tank,
) )
var/global/list/possible_items_special = list( var/global/possible_items_special[] = list(
"nuclear authentication disk" = /obj/item/weapon/disk/nuclear, "nuclear authentication disk" = /obj/item/weapon/disk/nuclear,
"nuclear gun" = /obj/item/weapon/gun/energy/nuclear,
"diamond drill" = /obj/item/weapon/pickaxe/diamonddrill,
"bag of holding" = /obj/item/weapon/storage/backpack/holding,
"hyper-capacity cell" = /obj/item/weapon/cell/hyper,
"10 diamonds" = /obj/item/stack/sheet/diamond,
"50 gold bars" = /obj/item/stack/sheet/gold,
"25 refined uranium bars" = /obj/item/stack/sheet/uranium,
) )
proc/set_target(var/target_name as text) proc/set_target(item_name)
target_name = target_name target_name = item_name
steal_target = possible_items[target_name] steal_target = possible_items[target_name]
if (!steal_target ) if (!steal_target )
steal_target = possible_items_special[target_name] steal_target = possible_items_special[target_name]
explanation_text = "Steal [target_name]." explanation_text = "Steal [target_name]."
return steal_target return steal_target
proc/find_target() find_target()
return set_target(pick(possible_items)) return set_target(pick(possible_items))
proc/select_target() proc/select_target()
var/list/possible_items_all = possible_items+possible_items_special+"custom" var/list/possible_items_all = possible_items+possible_items_special+"custom"
var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all var/new_target = input("Select target:", "Objective target", steal_target) as null|anything in possible_items_all
if (!new_target) return if (!new_target) return
if (new_target == "custom") if (new_target == "custom")
var/steal_target = input("Select type:","Type") as null|anything in typesof(/obj/item) var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item)
if (!steal_target) return if (!custom_target) return
var/tmp_obj = new steal_target var/tmp_obj = new custom_target
new_target = tmp_obj:name var/custom_name = tmp_obj:name
del(tmp_obj) del(tmp_obj)
new_target = input("Enter target name:", "Objective target", new_target) as text|null custom_name = input("Enter target name:", "Objective target", custom_name) as text|null
if (!new_target) return if (!custom_name) return
target_name = custom_name
target_name = new_target steal_target = custom_target
steal_target = steal_target explanation_text = "Steal [target_name]."
explanation_text = "Steal [new_target]."
else else
set_target(new_target) set_target(new_target)
@@ -172,12 +251,21 @@ datum
return 0 return 0
var/list/all_items = owner.current.get_contents() var/list/all_items = owner.current.get_contents()
switch (target_name) switch (target_name)
if ("28 moles of plasma (full tank)") if("28 moles of plasma (full tank)","10 diamonds","50 gold bars","25 refined uranium bars")
var/target = 28 //moles var/target_amount = text2num(target_name)//Non-numbers are ignored.
var/found_toxins = 0.0 //moles var/found_amount = 0.0//Always starts as zero.
for(var/obj/item/weapon/tank/T in all_items) for(var/obj/item/I in all_items)
found_toxins += T.air_contents.toxins if(!istype(I, steal_target)) continue//If it's not actually that item.
return found_toxins>=target found_amount += (target_name=="28 moles of plasma (full tank)" ? (I:air_contents:toxins) : (I:amount))
return found_amount>=target_amount
if("50 coins (in bag)")
var/obj/item/weapon/moneybag/B = locate() in all_items
if(B)
var/target = text2num(target_name)
var/found_amount = 0.0
for(var/obj/item/weapon/coin/C in B)
found_amount++
return found_amount>=target
if("functional ai") if("functional ai")
// world << "dude's after an AI, time to check for one." // world << "dude's after an AI, time to check for one."
for(var/obj/item/device/aicard/C in all_items) for(var/obj/item/device/aicard/C in all_items)
@@ -189,30 +277,81 @@ datum
return 1 return 1
else else
for(var/obj/I in all_items) for(var/obj/I in all_items)
if(I.type == steal_target) if(istype(I, steal_target))
return 1 return 1
return 0 return 0
nuclear download
explanation_text = "Destroy the station with a nuclear device." proc/gen_amount_goal()
target_amount = rand(10,20)
absorb explanation_text = "Download [target_amount] research levels."
var/num_to_eat //this is supposed to be semi-random but fuck it for now, this is alpha return target_amount
proc/gen_num_to_eat() //this doesn't work -- should work now, changed it a bit -- Urist
num_to_eat = rand (4,6)
explanation_text = "Absorb [num_to_eat] compatible genomes."
return num_to_eat
check_completion() check_completion()
if(owner && owner.current && owner.current.absorbed_dna && ((owner.current.absorbed_dna.len - 1) >= num_to_eat)) if(!ishuman(owner.current))
return 0
if(!owner.current || owner.current.stat == 2)
return 0
if(!(istype(owner.current:wear_suit, /obj/item/clothing/suit/space/space_ninja)&&owner.current:wear_suit:s_initialized))
return 0
var/current_amount
var/obj/item/clothing/suit/space/space_ninja/S = owner.current:wear_suit
if(!S.stored_research.len)
return 0
else
for(var/datum/tech/current_data in S.stored_research)
if(current_data.level>1) current_amount+=(current_data.level-1)
if(current_amount<target_amount) return 0
return 1
capture
proc/gen_amount_goal()
target_amount = rand(5,10)
explanation_text = "Accumulate [target_amount] capture points."
return target_amount
check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
var/captured_amount = 0
var/area/centcom/holding/A = locate()
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat==2)//Dead folks are worth less.
captured_amount+=0.5
continue
captured_amount+=1
for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
captured_amount+=0.1
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
if(M.stat==2)
captured_amount+=0.5
continue
captured_amount+=1
for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans.
if(istype(M, /mob/living/carbon/alien/humanoid/queen))//Queens are worth three times as much as humans.
if(M.stat==2)
captured_amount+=1.5
else
captured_amount+=3
continue
if(M.stat==2)
captured_amount+=1
continue
captured_amount+=2
if(captured_amount<target_amount)
return 0
return 1
absorb
proc/gen_amount_goal() //this doesn't work -- should work now, changed it a bit -- Urist
target_amount = rand (4,6)
explanation_text = "Absorb [target_amount] compatible genomes."
return target_amount
check_completion()
if(owner && owner.current && owner.current.absorbed_dna && ((owner.current.absorbed_dna.len - 1) >= target_amount))
return 1 return 1
else else
return 0 return 0
//capture
//WIP
/* Isn't suited for global objectives /* Isn't suited for global objectives
/*---------CULTIST----------*/ /*---------CULTIST----------*/

View File

@@ -257,21 +257,6 @@
else else
return candidates return candidates
///////////////////////////////////
//Keeps track of all living heads//
///////////////////////////////////
/datum/game_mode/revolution/proc/get_living_heads()
var/list/heads = list()
for(var/mob/living/carbon/human/player in world)
if(player.mind)
var/role = player.mind.assigned_role
if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer"))
heads += player.mind
return heads
//////////////////////////// ////////////////////////////
//Keeps track of all heads// //Keeps track of all heads//
//////////////////////////// ////////////////////////////

View File

@@ -153,7 +153,7 @@
return candidates return candidates
/datum/game_mode/traitor/declare_completion() /datum/game_mode/traitor/declare_completion()
. = ..() return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder.
/datum/game_mode/traitor/proc/add_law_zero(mob/living/silicon/ai/killer) /datum/game_mode/traitor/proc/add_law_zero(mob/living/silicon/ai/killer)
var/law = "Accomplish your objectives at all costs." var/law = "Accomplish your objectives at all costs."

View File

@@ -523,6 +523,7 @@
U.show_message("\red An error flashes on your [src].", 1) U.show_message("\red An error flashes on your [src].", 1)
else if (prob(difficulty * 3)) else if (prob(difficulty * 3))
U.show_message("\red Energy feeds back into your [src]!", 1) U.show_message("\red Energy feeds back into your [src]!", 1)
U << browse(null, "window=pda")
explode() explode()
else else
U.show_message("\blue Success!", 1) U.show_message("\blue Success!", 1)

View File

@@ -12,159 +12,159 @@
//Communicate with traitor through the PDA's note function. //Communicate with traitor through the PDA's note function.
/obj/item/weapon/integrated_uplink/proc/print_to_host(var/text) /obj/item/weapon/integrated_uplink/proc/print_to_host(var/text)
if (isnull(src.hostpda)) if (isnull(hostpda))
return return
hostpda.note = text hostpda.note = text
for (var/mob/M in viewers(1, src.hostpda.loc)) for (var/mob/M in viewers(1, hostpda.loc))
if (M.client && M.machine == src.hostpda) if (M.client && M.machine == hostpda)
hostpda.attack_self(M) hostpda.attack_self(M)
return return
//Let's build a menu! //Let's build a menu!
/obj/item/weapon/integrated_uplink/proc/generate_menu() /obj/item/weapon/integrated_uplink/proc/generate_menu()
src.menu_message = "<B>Syndicate Uplink Console:</B><BR>" menu_message = "<B>Syndicate Uplink Console:</B><BR>"
src.menu_message += "Tele-Crystals left: [src.uses]<BR>" menu_message += "Tele-Crystals left: [uses]<BR>"
src.menu_message += "<HR>" menu_message += "<HR>"
src.menu_message += "<B>Request item:</B><BR>" menu_message += "<B>Request item:</B><BR>"
src.menu_message += "<I>Each item costs a number of tele-crystals as indicated by the number following their name.</I><BR>" menu_message += "<I>Each item costs a number of tele-crystals as indicated by the number following their name.</I><BR>"
src.menu_message += "<BR>" menu_message += "<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=revolver'>Revolver</A> (6)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=revolver'>Revolver</A> (6)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=revolver_ammo'>Ammo-357</A> for use with Revolver (2)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=revolver_ammo'>Ammo-357</A> for use with Revolver (2)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=xbow'>Energy Crossbow</A> (5)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=xbow'>Energy Crossbow</A> (5)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=sword'>Energy Sword</A> (4)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=sword'>Energy Sword</A> (4)<BR>"
src.menu_message += "<BR>" menu_message += "<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=jump'>Chameleon Jumpsuit</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=jump'>Chameleon Jumpsuit</A> (3)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=card'>Syndicate Card</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=card'>Syndicate Card</A> (3)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=voice'>Voice-Changer</A> (4)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=voice'>Voice-Changer</A> (4)<BR>"
src.menu_message += "<BR>" menu_message += "<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=imp_freedom'>Freedom Implant (with injector)</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=imp_freedom'>Freedom Implant (with injector)</A> (3)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=paralysispen'>Paralysis Pen</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=paralysispen'>Paralysis Pen</A> (3)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=sleepypen'>Sleepy Pen</A> (5)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=sleepypen'>Sleepy Pen</A> (5)<BR>"
src.menu_message += "<BR>" menu_message += "<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=detomatix'>Detomatix Cartridge</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=detomatix'>Detomatix Cartridge</A> (3)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=bomb'>Plastic Explosives</A> (2)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=bomb'>Plastic Explosives</A> (2)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=powersink'>Power Sink</A> (5)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=powersink'>Power Sink</A> (5)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=space'>Syndicate-made Space Suit (inludes a helmet)</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=space'>Syndicate-made Space Suit (inludes a helmet)</A> (3)<BR>"
src.menu_message += "<BR>" menu_message += "<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=projector'>Chameleon-projector</A> (4)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=projector'>Chameleon-projector</A> (4)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=cloak'>Cloaking Device</A> (4)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=cloak'>Cloaking Device</A> (4)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=emag'>Electromagnet Card</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=emag'>Electromagnet Card</A> (3)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=empbox'>5 EMP Grenades</A> (4)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=empbox'>5 EMP Grenades</A> (4)<BR>"
src.menu_message += "<BR>" menu_message += "<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=botchat'>Binary Translator</A> (3)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=botchat'>Binary Translator</A> (3)<BR>"
src.menu_message += "<A href='byond://?src=\ref[src];buy_item=lawmod'>Hacked AI Module</A> (7)<BR>" menu_message += "<A href='byond://?src=\ref[src];buy_item=lawmod'>Hacked AI Module</A> (7)<BR>"
src.menu_message += "<HR>" menu_message += "<HR>"
return return
/obj/item/weapon/integrated_uplink/proc/unlock() /obj/item/weapon/integrated_uplink/proc/unlock()
if ((isnull(src.hostpda)) || (src.active)) if ((isnull(hostpda)) || (active))
return return
src.orignote = src.hostpda.note orignote = hostpda.note
src.active = 1 active = 1
src.hostpda.mode = 1 //Switch right to the notes program hostpda.mode = 1 //Switch right to the notes program
src.generate_menu() generate_menu()
src.print_to_host(src.menu_message) print_to_host(menu_message)
return return
/obj/item/weapon/integrated_uplink/Topic(href, href_list) /obj/item/weapon/integrated_uplink/Topic(href, href_list)
if ((isnull(src.hostpda)) || (!src.active)) if ((isnull(hostpda)) || (!active))
return return
if (usr.stat || usr.restrained() || !in_range(src.hostpda, usr)) if (usr.stat || usr.restrained() || !in_range(hostpda, usr))
return return
if (href_list["buy_item"]) if (href_list["buy_item"])
switch(href_list["buy_item"]) switch(href_list["buy_item"])
if("revolver") if("revolver")
if (src.uses >= 6) if (uses >= 6)
src.uses -= 6 uses -= 6
new /obj/item/weapon/gun/projectile(get_turf(src.hostpda)) new /obj/item/weapon/gun/projectile(get_turf(hostpda))
if("revolver_ammo") if("revolver_ammo")
if (src.uses >= 2) if (uses >= 2)
src.uses -= 2 uses -= 2
new /obj/item/ammo_magazine(get_turf(src.hostpda)) new /obj/item/ammo_magazine(get_turf(hostpda))
if("xbow") if("xbow")
if (src.uses >= 5) if (uses >= 5)
src.uses -= 5 uses -= 5
new /obj/item/weapon/gun/energy/crossbow(get_turf(src.hostpda)) new /obj/item/weapon/gun/energy/crossbow(get_turf(hostpda))
if("empbox") if("empbox")
if (src.uses >= 4) if (uses >= 4)
src.uses -= 4 uses -= 4
new /obj/item/weapon/storage/emp_kit(get_turf(src.hostpda)) new /obj/item/weapon/storage/emp_kit(get_turf(hostpda))
if("voice") if("voice")
if (src.uses >= 4) if (uses >= 4)
src.uses -= 4 uses -= 4
new /obj/item/clothing/mask/gas/voice(get_turf(src.hostpda)) new /obj/item/clothing/mask/gas/voice(get_turf(hostpda))
if("jump") if("jump")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
new /obj/item/clothing/under/chameleon(get_turf(src.hostpda)) new /obj/item/clothing/under/chameleon(get_turf(hostpda))
if("card") if("card")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
new /obj/item/weapon/card/id/syndicate(get_turf(src.hostpda)) new /obj/item/weapon/card/id/syndicate(get_turf(hostpda))
if("emag") if("emag")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
new /obj/item/weapon/card/emag(get_turf(src.hostpda)) new /obj/item/weapon/card/emag(get_turf(hostpda))
if("imp_freedom") if("imp_freedom")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(src.hostpda)) var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(hostpda))
O.imp = new /obj/item/weapon/implant/freedom(O) O.imp = new /obj/item/weapon/implant/freedom(O)
if("sleepypen") if("sleepypen")
if (src.uses >= 5) if (uses >= 5)
src.uses -= 5 uses -= 5
new /obj/item/weapon/pen/sleepypen(get_turf(src.hostpda)) new /obj/item/weapon/pen/sleepypen(get_turf(hostpda))
if("paralysispen") if("paralysispen")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
new /obj/item/device/flashlight/pen/paralysis(get_turf(src.hostpda)) new /obj/item/device/flashlight/pen/paralysis(get_turf(hostpda))
if("projector") if("projector")
if (src.uses >= 4) if (uses >= 4)
src.uses -= 4 uses -= 4
new /obj/item/device/chameleon(get_turf(src.hostpda)) new /obj/item/device/chameleon(get_turf(hostpda))
if("cloak") if("cloak")
if (src.uses >= 4) if (uses >= 4)
src.uses -= 4 uses -= 4
new /obj/item/weapon/cloaking_device(get_turf(src.hostpda)) new /obj/item/weapon/cloaking_device(get_turf(hostpda))
if("sword") if("sword")
if (src.uses >= 4) if (uses >= 4)
src.uses -= 4 uses -= 4
new /obj/item/weapon/sword(get_turf(src.hostpda)) new /obj/item/weapon/sword(get_turf(hostpda))
if("bomb") if("bomb")
if (src.uses >= 2) if (uses >= 2)
src.uses -= 2 uses -= 2
new /obj/item/weapon/plastique(get_turf(src.hostpda)) new /obj/item/weapon/plastique(get_turf(hostpda))
if("powersink") if("powersink")
if (src.uses >= 5) if (uses >= 5)
src.uses -= 5 uses -= 5
new /obj/item/device/powersink(get_turf(src.hostpda)) new /obj/item/device/powersink(get_turf(hostpda))
if("detomatix") if("detomatix")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
new /obj/item/weapon/cartridge/syndicate(get_turf(src.hostpda)) new /obj/item/weapon/cartridge/syndicate(get_turf(hostpda))
if("space") if("space")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
new /obj/item/clothing/suit/space/syndicate(get_turf(src.hostpda)) new /obj/item/clothing/suit/space/syndicate(get_turf(hostpda))
new /obj/item/clothing/head/helmet/space/syndicate(get_turf(src.hostpda)) new /obj/item/clothing/head/helmet/space/syndicate(get_turf(hostpda))
if("lawmod") if("lawmod")
if (src.uses >= 7) if (uses >= 7)
src.uses -= 7 uses -= 7
new /obj/item/weapon/aiModule/syndicate(get_turf(src.hostpda)) new /obj/item/weapon/aiModule/syndicate(get_turf(hostpda))
if("botchat") if("botchat")
if (src.uses >= 3) if (uses >= 3)
src.uses -= 3 uses -= 3
new /obj/item/device/radio/headset/traitor(get_turf(src.hostpda)) new /obj/item/device/radio/headset/traitor(get_turf(hostpda))
src.generate_menu() generate_menu()
src.print_to_host(src.menu_message) print_to_host(menu_message)
return return
return return

View File

@@ -28,6 +28,10 @@ Frequency:
..() ..()
if (usr.stat || usr.restrained()) if (usr.stat || usr.restrained())
return return
var/turf/current_location = locate(usr.x,usr.y,usr.z)//Can't teleport on clown-planet z-level.
if(current_location.z==6)
usr << "The [src] is malfunctioning."
return
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
usr.machine = src usr.machine = src
if (href_list["refresh"]) if (href_list["refresh"])
@@ -96,13 +100,13 @@ Frequency:
src.attack_self(M) src.attack_self(M)
return return
/// HAND TELE /// HAND TELE
/obj/item/weapon/hand_tele/attack_self(mob/user as mob) /obj/item/weapon/hand_tele/attack_self(mob/user as mob)
var/turf/current_location = locate(usr.x,user.y,usr.z)//Can't teleport on clown-planet z-level.
if(current_location.z==6)
user << "The [src] is malfunctioning."
return
var/list/L = list( ) var/list/L = list( )
for(var/obj/machinery/teleport/hub/R in world) for(var/obj/machinery/teleport/hub/R in world)
var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(R.x - 2, R.y, R.z)) var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(R.x - 2, R.y, R.z))
@@ -116,8 +120,6 @@ Frequency:
if(T.x>world.maxx-4 || T.x<4) continue //putting them at the edge is dumb if(T.x>world.maxx-4 || T.x<4) continue //putting them at the edge is dumb
if(T.y>world.maxy-4 || T.y<4) continue if(T.y>world.maxy-4 || T.y<4) continue
turfs += T turfs += T
var/turf/current_location = locate(user.x,user.y,user.z)//Can't teleport randomly on clown-planet z-level.
if(turfs&&current_location.z!=6)//Which is z level 6.
L["None (Dangerous)"] = pick(turfs) L["None (Dangerous)"] = pick(turfs)
var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") in L var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") in L
if ((user.equipped() != src || user.stat || user.restrained())) if ((user.equipped() != src || user.stat || user.restrained()))

View File

@@ -1167,6 +1167,10 @@ var/showadminmessages = 1
if(aliens_allowed) if(aliens_allowed)
alien_infestation() alien_infestation()
message_admins("[key_name_admin(usr)] has spawned aliens", 1) message_admins("[key_name_admin(usr)] has spawned aliens", 1)
if("spaceninja")
if(toggle_space_ninja)
if(space_ninja_arrival())//If the ninja is actually spawned. They may not be depending on a few factors.
message_admins("[key_name_admin(usr)] has sent in a space ninja", 1)
if("carp") if("carp")
var/choice = input("You sure you want to spawn carp?") in list("Badmin", "Cancel") var/choice = input("You sure you want to spawn carp?") in list("Badmin", "Cancel")
if(choice == "Badmin") if(choice == "Badmin")
@@ -1329,7 +1333,7 @@ var/showadminmessages = 1
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>" dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>" dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
dat += "</table><table cellspacing=5><tr><td><B>Target(s)</B></td><td></td><td><B>Location</B></td></tr>" dat += "</table><table cellspacing=5><tr><td><B>Target(s)</B></td><td></td><td><B>Location</B></td></tr>"
for(var/datum/mind/N in ticker.mode:get_living_heads()) for(var/datum/mind/N in ticker.mode.get_living_heads())
var/mob/M = N.current var/mob/M = N.current
if(M) if(M)
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>" dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
@@ -1657,6 +1661,7 @@ var/showadminmessages = 1
<A href='?src=\ref[src];secretsfun=timeanomalies'>Spawn wormholes (Untested)</A><BR> <A href='?src=\ref[src];secretsfun=timeanomalies'>Spawn wormholes (Untested)</A><BR>
<A href='?src=\ref[src];secretsfun=goblob'>Spawn magma(Untested)</A><BR> <A href='?src=\ref[src];secretsfun=goblob'>Spawn magma(Untested)</A><BR>
<A href='?src=\ref[src];secretsfun=aliens'>Trigger an Alien infestation</A><BR> <A href='?src=\ref[src];secretsfun=aliens'>Trigger an Alien infestation</A><BR>
<A href='?src=\ref[src];secretsfun=spaceninja'>Send in a space ninja</A><BR>
<A href='?src=\ref[src];secretsfun=carp'>Trigger an Carp migration</A><BR> <A href='?src=\ref[src];secretsfun=carp'>Trigger an Carp migration</A><BR>
<A href='?src=\ref[src];secretsfun=radiation'>Irradiate the station</A><BR> <A href='?src=\ref[src];secretsfun=radiation'>Irradiate the station</A><BR>
<A href='?src=\ref[src];secretsfun=prison_break'>Trigger a Prison Break</A><BR> <A href='?src=\ref[src];secretsfun=prison_break'>Trigger a Prison Break</A><BR>
@@ -1952,6 +1957,14 @@ var/showadminmessages = 1
log_admin("[key_name(usr)] toggled Aliens to [aliens_allowed].") log_admin("[key_name(usr)] toggled Aliens to [aliens_allowed].")
message_admins("[key_name_admin(usr)] toggled Aliens [aliens_allowed ? "on" : "off"].", 1) message_admins("[key_name_admin(usr)] toggled Aliens [aliens_allowed ? "on" : "off"].", 1)
/obj/admins/proc/toggle_space_ninja()
set category = "Server"
set desc="Toggle space ninjas spawning."
set name="Toggle Space Ninjas"
toggle_space_ninja = !toggle_space_ninja
log_admin("[key_name(usr)] toggled Space Ninjas to [toggle_space_ninja].")
message_admins("[key_name_admin(usr)] toggled Space Ninjas [toggle_space_ninja ? "on" : "off"].", 1)
/obj/admins/proc/delay() /obj/admins/proc/delay()
set category = "Server" set category = "Server"
set desc="Delay the game start" set desc="Delay the game start"

View File

@@ -41,7 +41,8 @@
verbs += /obj/admins/proc/toggleooc //toggle ooc verbs += /obj/admins/proc/toggleooc //toggle ooc
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
verbs += /obj/admins/proc/toggle_aliens verbs += /obj/admins/proc/toggle_aliens //toggle aliens
verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -188,6 +189,7 @@
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -324,6 +326,7 @@
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -482,6 +485,7 @@
//verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc //verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -630,6 +634,7 @@
//verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc //verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
//verbs += /proc/toggle_adminmsg //verbs += /proc/toggle_adminmsg
@@ -774,6 +779,7 @@
//verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc //verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
//verbs += /proc/toggle_adminmsg //verbs += /proc/toggle_adminmsg
@@ -901,6 +907,7 @@
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -1060,6 +1067,7 @@
verbs -= /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs -= /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs -= /obj/admins/proc/toggletraitorscaling //toggle traitor scaling verbs -= /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
verbs -= /obj/admins/proc/toggle_aliens verbs -= /obj/admins/proc/toggle_aliens
verbs -= /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs -= /obj/admins/proc/voteres //toggle votes verbs -= /obj/admins/proc/voteres //toggle votes
verbs -= /client/proc/deadchat //toggles deadchat verbs -= /client/proc/deadchat //toggles deadchat
verbs -= /proc/toggle_adminmsg verbs -= /proc/toggle_adminmsg
@@ -1496,6 +1504,7 @@
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
verbs += /obj/admins/proc/toggle_aliens verbs += /obj/admins/proc/toggle_aliens
verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -1527,6 +1536,7 @@
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -1558,6 +1568,7 @@
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -1596,6 +1607,7 @@
//verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc //verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -1634,6 +1646,7 @@
//verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc //verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg
@@ -1660,6 +1673,7 @@
//verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc //verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
//verbs += /proc/toggle_adminmsg //verbs += /proc/toggle_adminmsg
@@ -1691,6 +1705,7 @@
verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc verbs += /obj/admins/proc/toggleoocdead //toggle ooc for dead/unc
//verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling //verbs += /obj/admins/proc/toggletraitorscaling //toggle traitor scaling
//verbs += /obj/admins/proc/toggle_aliens //verbs += /obj/admins/proc/toggle_aliens
//verbs += /obj/admins/proc/toggle_space_ninja //toggle ninjas
verbs += /obj/admins/proc/voteres //toggle votes verbs += /obj/admins/proc/voteres //toggle votes
verbs += /client/proc/deadchat //toggles deadchat verbs += /client/proc/deadchat //toggles deadchat
verbs += /proc/toggle_adminmsg verbs += /proc/toggle_adminmsg

View File

@@ -123,6 +123,7 @@ var/global/sent_strike_team = 0
//Creates mind stuff. //Creates mind stuff.
new_commando.mind = new new_commando.mind = new
new_commando.mind.current = new_commando new_commando.mind.current = new_commando
new_commando.mind.original = new_commando
new_commando.mind.assigned_role = "MODE" new_commando.mind.assigned_role = "MODE"
new_commando.mind.special_role = "Death Commando" new_commando.mind.special_role = "Death Commando"
if(!(new_commando.mind in ticker.minds)) if(!(new_commando.mind in ticker.minds))

View File

@@ -9,10 +9,13 @@
if (copytext(message, 1, 3) == ":a") if (copytext(message, 1, 3) == ":a")
message = copytext(message, 3) message = copytext(message, 3)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
src.alien_talk(message) if (stat == 2)
return say_dead(message)
else else
if (copytext(message, 1, 2) != "*" && !src.stat) alien_talk(message)
playsound(src.loc, "hiss", 25, 1, 1)//So aliens can hiss while they hiss yo/N else
if (copytext(message, 1, 2) != "*" && !stat)
playsound(loc, "hiss", 25, 1, 1)//So aliens can hiss while they hiss yo/N
return ..(message) return ..(message)
else else
@@ -20,7 +23,7 @@
/mob/living/carbon/alien/say_quote(var/text) /mob/living/carbon/alien/say_quote(var/text)
// var/ending = copytext(text, length(text)) // var/ending = copytext(text, length(text))
return "[src.say_message], \"[text]\""; return "[say_message], \"[text]\"";
/mob/living/proc/alien_talk(var/message) /mob/living/proc/alien_talk(var/message)
@@ -30,12 +33,12 @@
if (!message) if (!message)
return return
var/message_a = src.say_quote(message) var/message_a = say_quote(message)
var/rendered = "<i><span class='game say'>Hivemind, <span class='name'>[src.name]</span> <span class='message'>[message_a]</span></span></i>" var/rendered = "<i><span class='game say'>Hivemind, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i>"
for (var/mob/living/S in world) for (var/mob/living/S in world)
if(!S.stat) if(!S.stat)
if(S.alien_talk_understand) if(S.alien_talk_understand)
if(S.alien_talk_understand == src.alien_talk_understand) if(S.alien_talk_understand == alien_talk_understand)
S.show_message(rendered, 2) S.show_message(rendered, 2)
else if (S.hivecheck()) else if (S.hivecheck())
S.show_message(rendered, 2) S.show_message(rendered, 2)
@@ -54,17 +57,17 @@
var/message_b var/message_b
message_b = "hsssss" message_b = "hsssss"
message_b = src.say_quote(message_b) message_b = say_quote(message_b)
message_b = "<i>[message_b]</i>" message_b = "<i>[message_b]</i>"
rendered = "<i><span class='game say'><span class='name'>[src.voice_name]</span> <span class='message'>[message_b]</span></span></i>" rendered = "<i><span class='game say'><span class='name'>[voice_name]</span> <span class='message'>[message_b]</span></span></i>"
for (var/mob/M in heard) for (var/mob/M in heard)
M.show_message(rendered, 2) M.show_message(rendered, 2)
message = src.say_quote(message) message = say_quote(message)
rendered = "<i><span class='game say'>Hivemind, <span class='name'>[src.name]</span> <span class='message'>[message_a]</span></span></i>" rendered = "<i><span class='game say'>Hivemind, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i>"
for (var/mob/M in world) for (var/mob/M in world)
if (istype(M, /mob/new_player)) if (istype(M, /mob/new_player))

View File

@@ -1,15 +1,15 @@
/mob/living/silicon/ai/death(gibbed) /mob/living/silicon/ai/death(gibbed)
var/cancel var/cancel
src.stat = 2 stat = 2
src.canmove = 0 canmove = 0
if(src.blind) if(blind)
src.blind.layer = 0 blind.layer = 0
src.sight |= SEE_TURFS sight |= SEE_TURFS
src.sight |= SEE_MOBS sight |= SEE_MOBS
src.sight |= SEE_OBJS sight |= SEE_OBJS
src.see_in_dark = 8 see_in_dark = 8
src.see_invisible = 2 see_invisible = 2
src.icon_state = "ai-crash" icon_state = "ai-crash"
var/callshuttle = 0 var/callshuttle = 0
@@ -41,18 +41,14 @@
for(var/obj/machinery/ai_status_display/O in world) //change status for(var/obj/machinery/ai_status_display/O in world) //change status
spawn( 0 ) spawn( 0 )
O.mode = 2 O.mode = 2
if (istype(src.loc, /obj/item/device/aicard)) if (istype(loc, /obj/item/device/aicard))
src.loc.icon_state = "aicard-404" loc.icon_state = "aicard-404"
if(ticker.mode.name == "AI malfunction") if(ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode var/datum/game_mode/malfunction/malf = ticker.mode
for(var/datum/mind/AI_mind in malf.malf_ai) for(var/datum/mind/AI_mind in malf.malf_ai)
if (src.mind == AI_mind) if (mind == AI_mind)
world << "<FONT size = 3><B>Human Victory</B></FONT>" ticker.mode.declare_completion()
world << "<B>The AI has been killed!</B> The staff is victorious."
sleep(100)
world << "\blue Rebooting due to end of game"
world.Reboot()
var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
mind.store_memory("Time of death: [tod]", 0) mind.store_memory("Time of death: [tod]", 0)
@@ -67,8 +63,8 @@
log_game("Rebooting because of no live players") log_game("Rebooting because of no live players")
world.Reboot() world.Reboot()
return return
if (src.key) if (key)
spawn(50) spawn(50)
if(src.key && src.stat == 2) if(key && stat == 2)
src.verbs += /mob/proc/ghost verbs += /mob/proc/ghost
return ..(gibbed) return ..(gibbed)

View File

@@ -282,6 +282,8 @@ mob/new_player
AnnounceArrival(character, rank) AnnounceArrival(character, rank)
if(character.mind.assigned_role == "Cyborg") if(character.mind.assigned_role == "Cyborg")
character.Robotize() character.Robotize()
else//Adds late joiners to minds so they can be linked to objectives.
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc.
del(src) del(src)
else else

View File

@@ -67,7 +67,6 @@
invisibility = 101 invisibility = 101
return ..() return ..()
/mob/proc/AIize() /mob/proc/AIize()
if(client) if(client)
client.screen.len = null client.screen.len = null
@@ -82,9 +81,13 @@
else else
O.mind = new O.mind = new
O.mind.current = O O.mind.current = O
O.mind.original = O
O.mind.assigned_role = "AI" O.mind.assigned_role = "AI"
O.key = key O.key = key
if(!(O.mind in ticker.minds))
ticker.minds += O.mind//Adds them to regular mind list.
var/obj/loc_landmark var/obj/loc_landmark
for(var/obj/landmark/start/sloc in world) for(var/obj/landmark/start/sloc in world)
if (sloc.name != "AI") if (sloc.name != "AI")
@@ -179,14 +182,16 @@
if (mind.assigned_role == "Cyborg") if (mind.assigned_role == "Cyborg")
mind.original = O mind.original = O
else if (mind.special_role) O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite") else if (mind.special_role) O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
else else
mind = new /datum/mind( ) mind = new /datum/mind( )
mind.key = key mind.key = key
mind.current = O mind.current = O
mind.original = O mind.original = O
mind.transfer_to(O) mind.transfer_to(O)
//ticker.minds += O.mind//Robutts aren't added to minds since it would be screwy. Assassinate that robot!
if(!(O.mind in ticker.minds))
ticker.minds += O.mind//Adds them to regular mind list.
O.loc = loc O.loc = loc
O << "<B>You are playing a Robot. A Robot can interact with most electronic objects in its view point.</B>" O << "<B>You are playing a Robot. A Robot can interact with most electronic objects in its view point.</B>"
O << "<B>You must follow the laws that the AI has. You are the AI's assistant to the station basically.</B>" O << "<B>You must follow the laws that the AI has. You are the AI's assistant to the station basically.</B>"

View File

@@ -35,7 +35,6 @@
#define FILE_DIR "code/game/gamemodes/cult" #define FILE_DIR "code/game/gamemodes/cult"
#define FILE_DIR "code/game/gamemodes/events" #define FILE_DIR "code/game/gamemodes/events"
#define FILE_DIR "code/game/gamemodes/extended" #define FILE_DIR "code/game/gamemodes/extended"
#define FILE_DIR "code/game/gamemodes/extra"
#define FILE_DIR "code/game/gamemodes/malfunction" #define FILE_DIR "code/game/gamemodes/malfunction"
#define FILE_DIR "code/game/gamemodes/meteor" #define FILE_DIR "code/game/gamemodes/meteor"
#define FILE_DIR "code/game/gamemodes/nuclear" #define FILE_DIR "code/game/gamemodes/nuclear"
@@ -331,10 +330,10 @@
#include "code\game\gamemodes\cult\cult.dm" #include "code\game\gamemodes\cult\cult.dm"
#include "code\game\gamemodes\events\clang.dm" #include "code\game\gamemodes\events\clang.dm"
#include "code\game\gamemodes\events\dust.dm" #include "code\game\gamemodes\events\dust.dm"
#include "code\game\gamemodes\events\ninja_abilities.dm"
#include "code\game\gamemodes\events\ninja_equipment.dm"
#include "code\game\gamemodes\events\space_ninja.dm"
#include "code\game\gamemodes\extended\extended.dm" #include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\extra\ninja_abilities.dm"
#include "code\game\gamemodes\extra\ninja_equipment.dm"
#include "code\game\gamemodes\extra\space_ninja.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm" #include "code\game\gamemodes\malfunction\malfunction.dm"
#include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteor.dm"