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
else if (href_list["obj_edit"] || href_list["obj_add"])
var/datum/objective/objective = null
var/objective_pos = null
var/def_value = null
var/datum/objective/objective
var/objective_pos
var/def_value
if (href_list["obj_edit"])
objective = locate(href_list["obj_edit"])
if (!objective) return
objective_pos = objectives.Find(objective)
if (istype(objective, /datum/objective/assassinate))
def_value = "assassinate"
else if (istype(objective, /datum/objective/hijack))
def_value = "hijack"
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))
//Text strings are easy to manipulate. Revised for simplicity.
var/temp_obj_type = "[objective.type]"//Convert path into a text string.
def_value = copytext(temp_obj_type, 19)//Convert last part of path into an objective keyword.
if(!def_value)//If it's a custom objective, it will be an empty string.
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
var/datum/objective/new_objective = null
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")
for(var/datum/mind/possible_target in ticker.minds)
if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human))
possible_targets += possible_target.current
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
var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
if (!new_target) return
var/objective_path = text2path("/datum/objective/[new_obj_type]")
if (new_target == "Free objective")
new_objective = new /datum/objective/assassinate
new_objective = new objective_path
new_objective.owner = src
new_objective:target = null
new_objective.explanation_text = "Free objective"
else
new_objective = new /datum/objective/assassinate
new_objective = new objective_path
new_objective.owner = src
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")
new_objective = new /datum/objective/hijack
@@ -228,6 +218,10 @@ datum/mind
new_objective = new /datum/objective/survive
new_objective.owner = src
if ("nuclear")
new_objective = new /datum/objective/nuclear
new_objective.owner = src
if ("steal")
if (!istype(objective, /datum/objective/steal))
new_objective = new /datum/objective/steal
@@ -238,22 +232,27 @@ datum/mind
if (!steal.select_target())
return
if ("nuclear")
new_objective = new /datum/objective/nuclear
new_objective.owner = src
if("download","capture","absorb")
var/def_num
if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]"))
def_num = objective.target_amount
if ("absorb")
var/def_num = null
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))
var/target_number = input("Input target number:", "Objective", def_num) as num|null
if (isnull(target_number))//Ordinarily, you wouldn't need isnull. In this case, the value may already exist.
return
new_objective = new /datum/objective/absorb
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.explanation_text = "Absorb [target_number] compatible genomes."
new_objective.owner = src
new_objective:num_to_eat = num_to_eat
new_objective.explanation_text = "Absorb [num_to_eat] compatible genomes."
new_objective.target_amount = target_number
if ("custom")
var/expl = input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null

View File

@@ -9,12 +9,12 @@
name += " "
// 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)
name += " "
// 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 += " "
// ID Number

View File

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

View File

@@ -13,7 +13,7 @@
/proc/event()
event = 1
switch(pick(1,2,4,5,6,7,8,9,10,11))
switch(rand(1,11))
if(1)
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
world << sound('meteors.ogg')
@@ -31,7 +31,7 @@
var/obj/bhole/bh = new /obj/bhole( T.loc, 30 )
spawn(rand(50, 300))
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
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
world << sound('spanomalies.ogg')
@@ -53,6 +53,10 @@
P.name = "wormhole"
spawn(rand(300,600))
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)
command_alert("Confirmed anomaly type SPC-MGM-152 aboard [station_name()]. All personnel must destroy the anomaly.", "Anomaly Alert")
world << sound('outbreak5.ogg')

View File

@@ -282,7 +282,6 @@ Movement impairing would indicate drugs and the like.*/
s_coold = 3
return
/*
===================================================================================
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<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/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=Close'><img src=sos_8.png> Close</a>"
dat += "<br>"
@@ -413,16 +411,16 @@ ________________________________________________________________________________
dat += "Stored AI: <b>[A.name]</b><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++)
var/law = A.laws.ion[index]
if (length(law) > 0)
var/num = ionnum()
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
for (var/index = 1, index <= A.laws.inherent.len, index++)
var/law = A.laws.inherent[index]
@@ -462,7 +460,7 @@ ________________________________________________________________________________
if(t_disk)
dat += "<a href='byond://?src=\ref[src];choice=Eject Disk'>Eject Disk</a><br>"
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)
dat += "<li>"
dat += "[current_data.name]: [current_data.level]"
@@ -824,7 +822,7 @@ ________________________________________________________________________________
else if(istype(I, /obj/item/weapon/cell))
if(I:maxcharge>cell.maxcharge)
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()
I.loc = src
I:charge = min(I:charge+cell.charge, I:maxcharge)
@@ -1059,19 +1057,18 @@ ________________________________________________________________________________
spawn(0)
var/turf/location = get_turf(U)
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)
while(G.candrain&&!isnull(A))
for(var/datum/tech/current_data in S.stored_research)
U << "\blue Checking \the [current_data.name] database."
if(do_after(U,S.s_delay))
for(var/datum/tech/analyzing_data in A:files.known_tech)
if(current_data.id==analyzing_data.id)
if(analyzing_data.level>current_data.level)
U << "\blue Database: \black <b>UPDATED</b>."
current_data.level = analyzing_data.level
break
break
for(var/datum/tech/current_data in S.stored_research)
U << "\blue Checking \the [current_data.name] database."
if(do_after(U, S.s_delay)&&G.candrain&&!isnull(A))
for(var/datum/tech/analyzing_data in A:files.known_tech)
if(current_data.id==analyzing_data.id)
if(analyzing_data.level>current_data.level)
U << "\blue Database: \black <b>UPDATED</b>."
current_data.level = analyzing_data.level
break//Move on to next.
else break//Otherwise, quit processing.
U << "\blue Data analyzed. Process finished."
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.
opacity = 0//Can see through.
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
health = 25//How much health it has.
mob/living/affecting = null//Who it is currently affecting, if anyone.

View File

@@ -58,45 +58,81 @@ ________________________________________________________________________________
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.
I'll update when possible.
Potential Upgrade Tree:
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//=======//
/*
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()
/*
var/datum/game_mode/current_mode = ticker.mode
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/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.
switch (current_mode.config_tag)
if("traitor")
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.
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)
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)
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)
tet_antagonist_list += current_mind
ter_antagonist_list += current_mind
if(current_mode:heads_of_staff.len)
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)
var/heads_list[] = list()//Now we manually override the list made prior. Target Heads take priority.
for(current_mind in current_mode:heads_of_staff)
if(current_mind.current&&current_mind.current.stat!=2)
protagonist_list += current_mind
if(heads_list.len)//Or not, if there are none.
@@ -104,33 +140,39 @@ ________________________________________________________________________________
if ("cult")//Always a few of these around.
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)
antagonist_list += current_mind
if ("wizard")//There can be only one mode wizard. Other wizards aren't too important.
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(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)
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(current_mode:malf_ai)
antagonist_list += malf_ai
antagonist_list += current_mode:malf_ai
*/
if ("nuclear")//Can be a few of these guys.
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)
antagonist_list += current_mind
else
return//Don't want to summon a ninja during meteor or extended, or something.
//Here we pick a location and spawn the ninja.
//Here we pick a location and spawn the ninja.
var/list/spawn_list = list()
for(var/obj/landmark/L in world)
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 ))
if(candidates.len)
var/mob/G = pick(candidates)
G = pick(candidates)
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.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess.
new_ninja.internals.icon_state = "internal1"
@@ -157,97 +199,210 @@ ________________________________________________________________________________
else
del(new_ninja)
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/mission_set = 0//To determine if we need to do further processing.
//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))
xeno_list += xeno
//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.
for(var/mob/living/carbon/human/commando in world)//Search and destroy.
if(commando.mind&&commando.mind.special_role=="Death Commando")
if(xeno_list.len>3)//If there are more than three humanoid xenos on the station, time to get dangerous.
//Here we want the ninja to murder all the queens. The other aliens don't really matter.
var/xeno_queen_list[] = list()
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
ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role(commando.mind.special_role,1)
ninja_mind.objectives += ninja_objective
mission_set = 1
/*
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.
In either case, it's a good idea to spawn the ninja with a semi-random set of objectives.
*/
if(!antagonist_list.len)
switch(rand(1,3))
if(1)
if(protagonist_list.len)//If we have surviving heads.
for(var/datum/mind/head_mind in protagonist_list)//Search and destroy.
var/datum/objective/assassinate/ninja_objective = new
ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role(head_mind.assigned_role)
ninja_mind.objectives += ninja_objective
if(!mission_set)//If mission was not set.
//TO DO: add ninja-net point-based system objective.
//TO DO: upgrade cell objective.
//To pick a person for each list.
var/datum/mind/antagonist_target
if(antagonist_list.len)
antagonist_target = pick(antagonist_list)
else//Else, we need to give them an objective based on round type.
var/datum/mind/secondary_target
if(sec_antagonist_list.len)
secondary_target = pick(sec_antagonist_list)
if(tet_antagonist_list.len)//Not gonna happen but maybe in the future.
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)
//if(!ninja_mind.objectives.len)//If they somehow did not get an objective.
//Let em know.
var/hostile_targets[] = list()//The guys actually picked for the assassination or whatever.
var/friendly_targets[] = list()//The guys the ninja must protect.
//Finally add a survival objective.
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
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))//If they have a special role, use that instead to find em.
ninja_mind.objectives += ninja_objective
hostile_targets -= current_mind//Remove them from the list.
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
objective_list -= 2
if(3)//Protect. Keeping people alive can be pretty difficult.
current_mind = pick(friendly_targets)
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)
var/datum/objective/debrain/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
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
ninja_objective.owner = ninja_mind
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.mind.store_memory("<B>Directive:</B> \red [directive].")
*/
return
new_ninja.mind.store_memory("<B>Directive:</B> \red [directive]<br>")
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.
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.
*/
/proc/generate_ninja_directive()
var/directive
/proc/generate_ninja_directive(side)
var/directive = "[side=="face"?"Nanotrasen":"The Syndicate"] is your employer. "//Let them know which side they're on.
switch(rand(1,13))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
directive = "There are no special directives at this time."
directive += "There are no special supplemental instructions at this time."
return directive
//=======//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)
alert("Wait until the game starts")
return
if(!toggle_space_ninja)
alert("Space Ninjas spawning is disabled.")
return
if(ishuman(M))
log_admin("[key_name(src)] turned [M.key] into a Space Ninja.")
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()
set category = "Fun"
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
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)
alert("The game hasn't started yet!")
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")
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.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.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,
//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)
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
mind = new
mind.current = src
mind.original = src
mind.assigned_role = "MODE"
mind.special_role = "Space Ninja"
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//=======//
/*
/obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs()
//DEBUG
//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]"
return
/*
Most of these are at various points of incomplete.
/mob/verb/grant_object_panel()

View File

@@ -24,8 +24,10 @@
return 0
/datum/game_mode/proc/declare_completion()
return
/datum/game_mode/proc/declare_extra_completion()
for(var/datum/mind/traitor in traitors)
var/traitorwin = 1
var/traitor_name
if(traitor.current)
@@ -38,20 +40,22 @@
else
traitor_name = "[traitor.key] (character destroyed)"
world << "<B>The syndicate traitor was [traitor_name]</B>"
var/count = 1
for(var/datum/objective/objective in traitor.objectives)
if(objective.check_completion())
world << "<B>Objective #[count]</B>: [objective.explanation_text] \green <B>Success</B>"
else
world << "<B>Objective #[count]</B>: [objective.explanation_text] \red Failed"
traitorwin = 0
count++
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
for(var/datum/objective/objective in traitor.objectives)
if(objective.check_completion())
world << "<B>Objective #[count]</B>: [objective.explanation_text] \green <B>Success</B>"
else
world << "<B>Objective #[count]</B>: [objective.explanation_text] \red Failed"
traitorwin = 0
count++
if(traitorwin)
world << "<B>The traitor was successful!<B>"
else
world << "<B>The traitor has failed!<B>"
if(traitorwin)
world << "<B>The antagonist was successful!<B>"
else
world << "<B>The antagonist has failed!<B>"
return 1
/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 << "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.
/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 = 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
@@ -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>"
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

View File

@@ -84,6 +84,13 @@
/datum/game_mode/malfunction/check_win()
if (AI_win_timeleft <= 0 && !win)
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 << "<B>It has fully taken control of all of [station_name()]'s systems.</B>"
@@ -100,9 +107,12 @@
sleep(300)
log_game("Rebooting due to round end")
world.Reboot()
return 1
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)
..()

View File

@@ -178,6 +178,7 @@
sleep(110)
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>"
sleep(300)

View File

@@ -1,7 +1,10 @@
datum
objective
var/datum/mind/owner
var/explanation_text
var
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)
if(text)
@@ -11,19 +14,25 @@ datum
check_completion()
return 1
assassinate
var/datum/mind/target
proc/find_target()
find_target()
var/list/possible_targets = list()
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
if(possible_targets.len > 0)
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)
explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]."
else
@@ -31,14 +40,10 @@ datum
return target
proc/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) && istype(possible_target.current, /mob/living/carbon/human) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
target = possible_target
break
find_target_by_role(role, role_type=0)
..(role, role_type)
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
explanation_text = "Free Objective"
@@ -46,13 +51,76 @@ datum
check_completion()
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
else
return 0
else
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
explanation_text = "Hijack the emergency shuttle by escaping alone."
@@ -66,8 +134,9 @@ datum
return 0
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)
if(player.type in protected_mobs) continue
if (player.mind && (player.mind != owner))
if (player.stat != 2) //they're not dead
if (get_turf(player) in shuttle)
@@ -79,9 +148,9 @@ datum
explanation_text = "Escape on the shuttle alive."
check_completion()
if(istype(owner.current, /mob/living/silicon))
if(issilicon(owner.current))
return 0
if(istype(owner.current, /mob/living/carbon/brain))
if(isbrain(owner.current))
return 0
if(emergency_shuttle.location<2)
return 0
@@ -104,18 +173,21 @@ datum
explanation_text = "Stay alive until the end"
check_completion()
if(istype(owner.current, /mob/living/silicon) && owner.current != owner.original)
if(issilicon(owner.current) && owner.current != owner.original)
return 0
if(!owner.current || owner.current.stat == 2)
return 0
return 1
nuclear
explanation_text = "Destroy the station with a nuclear device."
steal
var/obj/item/steal_target
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,
"a hand teleporter" = /obj/item/weapon/hand_tele,
"an RCD" = /obj/item/weapon/rcd,
@@ -129,38 +201,45 @@ datum
"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 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)
target_name = target_name
proc/set_target(item_name)
target_name = item_name
steal_target = possible_items[target_name]
if (!steal_target )
steal_target = possible_items_special[target_name]
explanation_text = "Steal [target_name]."
return steal_target
proc/find_target()
find_target()
return set_target(pick(possible_items))
proc/select_target()
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
if (!new_target) return
if (new_target == "custom")
var/steal_target = input("Select type:","Type") as null|anything in typesof(/obj/item)
if (!steal_target) return
var/tmp_obj = new steal_target
new_target = tmp_obj:name
var/obj/item/custom_target = input("Select type:","Type") as null|anything in typesof(/obj/item)
if (!custom_target) return
var/tmp_obj = new custom_target
var/custom_name = tmp_obj:name
del(tmp_obj)
new_target = input("Enter target name:", "Objective target", new_target) as text|null
if (!new_target) return
target_name = new_target
steal_target = steal_target
explanation_text = "Steal [new_target]."
custom_name = input("Enter target name:", "Objective target", custom_name) as text|null
if (!custom_name) return
target_name = custom_name
steal_target = custom_target
explanation_text = "Steal [target_name]."
else
set_target(new_target)
@@ -172,12 +251,21 @@ datum
return 0
var/list/all_items = owner.current.get_contents()
switch (target_name)
if ("28 moles of plasma (full tank)")
var/target = 28 //moles
var/found_toxins = 0.0 //moles
for(var/obj/item/weapon/tank/T in all_items)
found_toxins += T.air_contents.toxins
return found_toxins>=target
if("28 moles of plasma (full tank)","10 diamonds","50 gold bars","25 refined uranium bars")
var/target_amount = text2num(target_name)//Non-numbers are ignored.
var/found_amount = 0.0//Always starts as zero.
for(var/obj/item/I in all_items)
if(!istype(I, steal_target)) continue//If it's not actually that item.
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")
// world << "dude's after an AI, time to check for one."
for(var/obj/item/device/aicard/C in all_items)
@@ -189,30 +277,81 @@ datum
return 1
else
for(var/obj/I in all_items)
if(I.type == steal_target)
if(istype(I, steal_target))
return 1
return 0
nuclear
explanation_text = "Destroy the station with a nuclear device."
absorb
var/num_to_eat //this is supposed to be semi-random but fuck it for now, this is alpha
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
download
proc/gen_amount_goal()
target_amount = rand(10,20)
explanation_text = "Download [target_amount] research levels."
return target_amount
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
else
return 0
//capture
//WIP
/* Isn't suited for global objectives
/*---------CULTIST----------*/

View File

@@ -257,21 +257,6 @@
else
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//
////////////////////////////

View File

@@ -153,7 +153,7 @@
return candidates
/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)
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)
else if (prob(difficulty * 3))
U.show_message("\red Energy feeds back into your [src]!", 1)
U << browse(null, "window=pda")
explode()
else
U.show_message("\blue Success!", 1)

View File

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

View File

@@ -28,6 +28,10 @@ Frequency:
..()
if (usr.stat || usr.restrained())
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))))
usr.machine = src
if (href_list["refresh"])
@@ -96,13 +100,13 @@ Frequency:
src.attack_self(M)
return
/// HAND TELE
/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( )
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))
@@ -116,9 +120,7 @@ Frequency:
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
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
if ((user.equipped() != src || user.stat || user.restrained()))
return

View File

@@ -1167,6 +1167,10 @@ var/showadminmessages = 1
if(aliens_allowed)
alien_infestation()
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")
var/choice = input("You sure you want to spawn carp?") in list("Badmin", "Cancel")
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 += "<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>"
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
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>"
@@ -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=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=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=radiation'>Irradiate the station</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].")
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()
set category = "Server"
set desc="Delay the game start"

View File

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

View File

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

View File

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

View File

@@ -1,15 +1,15 @@
/mob/living/silicon/ai/death(gibbed)
var/cancel
src.stat = 2
src.canmove = 0
if(src.blind)
src.blind.layer = 0
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = 2
src.icon_state = "ai-crash"
stat = 2
canmove = 0
if(blind)
blind.layer = 0
sight |= SEE_TURFS
sight |= SEE_MOBS
sight |= SEE_OBJS
see_in_dark = 8
see_invisible = 2
icon_state = "ai-crash"
var/callshuttle = 0
@@ -41,18 +41,14 @@
for(var/obj/machinery/ai_status_display/O in world) //change status
spawn( 0 )
O.mode = 2
if (istype(src.loc, /obj/item/device/aicard))
src.loc.icon_state = "aicard-404"
if (istype(loc, /obj/item/device/aicard))
loc.icon_state = "aicard-404"
if(ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
for(var/datum/mind/AI_mind in malf.malf_ai)
if (src.mind == AI_mind)
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()
if (mind == AI_mind)
ticker.mode.declare_completion()
var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
mind.store_memory("Time of death: [tod]", 0)
@@ -67,8 +63,8 @@
log_game("Rebooting because of no live players")
world.Reboot()
return
if (src.key)
if (key)
spawn(50)
if(src.key && src.stat == 2)
src.verbs += /mob/proc/ghost
if(key && stat == 2)
verbs += /mob/proc/ghost
return ..(gibbed)

View File

@@ -282,6 +282,8 @@ mob/new_player
AnnounceArrival(character, rank)
if(character.mind.assigned_role == "Cyborg")
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)
else

View File

@@ -67,7 +67,6 @@
invisibility = 101
return ..()
/mob/proc/AIize()
if(client)
client.screen.len = null
@@ -82,9 +81,13 @@
else
O.mind = new
O.mind.current = O
O.mind.original = O
O.mind.assigned_role = "AI"
O.key = key
if(!(O.mind in ticker.minds))
ticker.minds += O.mind//Adds them to regular mind list.
var/obj/loc_landmark
for(var/obj/landmark/start/sloc in world)
if (sloc.name != "AI")
@@ -179,14 +182,16 @@
if (mind.assigned_role == "Cyborg")
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
mind = new /datum/mind( )
mind.key = key
mind.current = O
mind.original = 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 << "<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>"

View File

@@ -35,7 +35,6 @@
#define FILE_DIR "code/game/gamemodes/cult"
#define FILE_DIR "code/game/gamemodes/events"
#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/meteor"
#define FILE_DIR "code/game/gamemodes/nuclear"
@@ -331,10 +330,10 @@
#include "code\game\gamemodes\cult\cult.dm"
#include "code\game\gamemodes\events\clang.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\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\malfunction.dm"
#include "code\game\gamemodes\meteor\meteor.dm"