Freaking big GAMEMODES UPDATE.

I have done lots of work to make selecting players for special roles be fair.
- New options preferences: "be traitor", "be changeling" and so on for all special roles.
- Now you can have job of AI/cyborg in preferences and do not lower your chances to become wizard/changeling/etc. And vice-versa: you do not have to select AI in your preferences to have non zero chance to play malf.
- Jobban from syndicate bans player from any special role (including malf AI, cult, etc).
- Fixed bug with changeling round not ending sometimes.
- All special roles were tuned to work better as admin-driven event.
-- All adminmade special characters will be listed at the end of round of any type.
-- All adminmade special characters are fully functional with following exceptions:
--- The ending conditions are determined at round start, i.e. you cannot end revolution by killing wizards and malf AIs (however, with nuke you can end anything).
--- The cultists cannot get their special objectives.
--- The malf AI can hack the APCs but without any profit.
--- The syndicate operatives must obtain the nuke/working code from admins.
--- As before, nuclear explosion ends round. Even if nuke was used in wrong place.
- Fixed thingy like "Not enough players for revolution game mode. Restarting world in 5 seconds."
- Changeling wont get objective "absorb X genomes" when there are less that X players in game.
- proc/equip_if_possible now has return value, procs like equip_revolutionary (giving a flash) should be more reliable.
- There are no fake wizards anymore. The research staff have to kill ALL wizards on order to win, even adminspawned ones. ("give spell" verb works as before, not making a spellcaster to actually be wizard).
- The semi-new game mode: traitor+changeling. Just like regular traitor mode plus one changeling. Round ends when the shuttle reaches centcom. Option for config.txt: "PROBABILITY TRAITORCHAN".
- Successful malf AI now have 60 seconds to choose to explode the station or not (some players still have to rejoin game to have their new verbs shown in Malfunction tab).
- Monkeys mode fixed, monkeys wouldn't randomly cure anymore.

For admins:
- New powerful mind editor oriented to mixed rounds.
-- Setting someone as special character (like wizard) does not equip him/her automatically. You have to do it it next step. Note, that in case of wizards and nuke operatives their old dress will be deleted! If you do not want it you shall use "undress" link.
-- Only operatives, head revs and cultists have their objectives set immediately.
-- You can unemad borgs!
-- You cannot unemag borgs because calling mind editor for nonhumans is blocked atm.
-- many other useful features.
-- you can fix burned out flashes from mind editor.
-- first assign the new malf AI/wizard then demalf/dewizard old one or round will immediately end.
- if delete the nuke bomb during its downcounting round will stuck. Using "edit ticker variables" set ticker.mode.explosion_in_progress = 0.

For coders:
- /datum/game_mode/malfunction/AI_Module renamed to /datum/AI_Module. Reason: What. The. Fuck.

Unrelated fixes:
- Blueprints can create areas up to 300 tiles (was 100).
- Cyborgs wont leave backpacks at spawn point anymore.
- Fixed bug in preferences causing preferences files to be huge.
- Diseases can infect again.
- The option "SQL_ENABLED 0" now works in config.txt.
- fixed critical bug on assassinate objective.

Bugs:
- We have a bug with job distribution for people who haven't any available jobs in their preferences. Players tends to group by jobs.
- For example, if we have 3 players they with hight chances will got same jobs. And probability of having one engineer and one medic _exactly_ equals _zero_.
- I am not sure if my changes made that bug worse. Anyway I MUST do this commit. Bug will be fixed eventually. Maybe.


git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1703 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
rastaf.zero@gmail.com
2011-06-21 21:22:23 +00:00
parent dd2e9c3bd6
commit d6e0f1cf22
57 changed files with 2825 additions and 2040 deletions

View File

@@ -102,7 +102,7 @@
config.log_access = 1
if ("sql_enabled")
config.sql_enabled = 1
config.sql_enabled = text2num(value)
if ("log_say")
config.log_say = 1
@@ -319,38 +319,20 @@
if (M.config_tag && M.config_tag == mode_name)
return M
del(M)
return null
/datum/configuration/proc/pick_random_mode()
var/total = 0
var/list/accum = list()
for(var/M in src.modes)
total += src.probabilities[M]
accum[M] = total
var/r = total - (rand() * total)
var/mode_name = null
for (var/M in modes)
if (src.probabilities[M] > 0 && accum[M] >= r)
mode_name = M
break
if (!mode_name)
world << "Failed to pick a random game mode."
return null
//world << "Returning mode [mode_name]"
return src.pick_mode(mode_name)
/datum/configuration/proc/get_used_mode_names()
var/list/names = list()
for (var/M in src.modes)
if (src.probabilities[M] > 0)
names += src.mode_names[M]
return names
/datum/configuration/proc/get_runnable_modes()
var/list/datum/game_mode/runnable_modes = new
for (var/T in (typesof(/datum/game_mode) - /datum/game_mode))
var/datum/game_mode/M = new T()
//world << "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]"
if (!(M.config_tag in modes))
del(M)
continue
if (probabilities[M.config_tag]<=0)
del(M)
continue
if (M.can_start())
runnable_modes[M] = probabilities[M.config_tag]
//world << "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]"
return runnable_modes

View File

@@ -96,17 +96,18 @@ to null does not delete the object itself. Thank you.
if(fail) return
if(skip_this == 1)//be wary, it replaces the current disease...
if(virus)
virus.cure(0)
virus = new virus.type
virus.affected_mob = src
virus.strain_data = virus.strain_data.Copy()
virus.holder = src
if(src.virus)
src.virus.cure(0)
src.virus = new virus.type
src.virus.affected_mob = src
src.virus.strain_data = virus.strain_data.Copy()
src.virus.holder = src
if(prob(5))
virus.carrier = 1
src.virus.carrier = 1
return
if(virus) return
if(src.virus)
return
if(virus.type in resistances)
if(prob(99.9)) return
@@ -252,12 +253,12 @@ to null does not delete the object itself. Thank you.
else if(prob(15))
return
else*/
virus = new virus.type
virus.strain_data = virus.strain_data.Copy()
virus.affected_mob = src
virus.holder = src
src.virus = new virus.type
src.virus.strain_data = virus.strain_data.Copy()
src.virus.affected_mob = src
src.virus.holder = src
if(prob(5))
virus.carrier = 1
src.virus.carrier = 1
return
return

View File

@@ -4,6 +4,7 @@ datum/mind
var/mob/living/original
var/memory
//TODO: store original name --rastaf0
var/assigned_role
var/special_role
@@ -40,92 +41,222 @@ datum/mind
proc/edit_memory()
var/out = "<B>[current.real_name]</B><br>"
out += "Assigned role: [assigned_role]. <a href='?src=\ref[src];role_edit=1'>Edit</a><br>"
out += "Special role: "
out += "Factions and special roles:<br>"
var/srole
var/cantoggle = 1
var/datum/game_mode/current_mode = ticker.mode
switch (current_mode.config_tag)
if ("revolution")
if (src in current_mode:head_revolutionaries)
srole = "Head Revolutionary"
out += "<font color=red>Head Revolutionary</font> "
cantoggle = 0
else if(src in current_mode:revolutionaries)
srole = "Revolutionary"
out += "<a href='?src=\ref[src];traitorize=headrev'>Head Revolutionary</a> <font color=red>Revolutionary</font> "
else
out += "<a href='?src=\ref[src];traitorize=headrev'>Head Revolutionary</a> <a href='?src=\ref[src];traitorize=rev'>Revolutionary</a> "
if ("cult")
if (src in current_mode:cult)
srole = "Cultist"
out += "<font color=red>Cultist</font>"
cantoggle = 0
if ("wizard")
if (current_mode:wizard && src == current_mode:wizard)
srole = "Wizard"
out += "<font color=red>Wizard</font>"
cantoggle = 0
else
out = "<a href='?src=\ref[src];traitorize=wizard'>Wizard</a> "
if ("changeling")
if (src in current_mode:changelings)
srole = "Changeling"
out += "<font color=red>Changeling</font>"
cantoggle = 0
else
out = "<a href='?src=\ref[src];traitorize=changeling'>Changeling</a> "
if ("malfunction")
if (src in current_mode:malf_ai)
srole = "Malfunction"
out += "<font color=red>Malfunction</font>"
cantoggle = 0
if ("nuclear")
if(src in current_mode:syndicates)
srole = "Syndicate"
out = "<font color=red>Syndicate</font>"
cantoggle = current_mode:syndicates.len > 1
else
out += "<a href='?src=\ref[src];traitorize=syndicate'>Syndicate</a> "
if (cantoggle)
if(src in current_mode.traitors)
switch(special_role)
if ("Fake Wizard")
out += "<a href='?src=\ref[src];traitorize=traitor'>Traitor</a> "
out += "<font color=red>[special_role]/font> "
srole = special_role
if ("Death Commando")
out += "<font color=red>[special_role]</font> "
srole = special_role
if ("Space Ninja")
out += "<font color=red>[special_role]</font> "
srole = special_role
var/list/sections = list(
"revolution",
"cult",
"wizard",
"changeling",
"nuclear",
"traitor", // "traitorchan",
"monkey",
"malfunction",
)
var/text = ""
if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey))
/** REVOLUTION ***/
text = "revolution"
if (ticker.mode.config_tag=="revolution")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src.assigned_role in head_positions)
text += "<b>HEAD</b>|officer|employer|headrev|rev"
else if (src.assigned_role in list("Security Officer", "Detective", "Warden"))
text += "head|<b>OFFICER</b>|employer|headre|rev"
else if (src in ticker.mode.head_revolutionaries)
text = "head|officer|<a href='?src=\ref[src];revolution=clear'>employer</a>|<b>HEADREV</b>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
text += "<br>Flash: <a href='?src=\ref[src];revolution=flash'>give</a>"
var/list/L = src.current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if (flash)
if (flash.status)
text += "|<a href='?src=\ref[src];revolution=takeflash'>take</a>."
else
out += "<b>Traitor</b> "
out += "<a href='?src=\ref[src];traitorize=fakewizard'>Fake Wizard</a> "
srole = "Traitor"
else
out += "<a href='?src=\ref[src];traitorize=traitor'>Traitor</a> "
out += "<a href='?src=\ref[src];traitorize=fakewizard'>Fake Wizard</a> "
text += "|<a href='?src=\ref[src];revolution=takeflash'>take</a>|<a href='?src=\ref[src];revolution=repairflash'>repair</a>."
else
text += "."
if (srole)
out += "<a href='?src=\ref[src];traitorize=civilian'>Civilian</a> "
text += " <a href='?src=\ref[src];revolution=reequip'>Reequip</a>."
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];revolution=autoobjectives'>Set to kill all heads</a>."
else if (src in ticker.mode.revolutionaries)
text += "head|officer|<a href='?src=\ref[src];revolution=clear'>employer</a>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<b>REV</b>"
else
out += "<font color=red>Civilian</font> "
text += "head|officer|<b>EMPLOYER</b>|<a href='?src=\ref[src];revolution=headrev'>headrev</a>|<a href='?src=\ref[src];revolution=rev'>rev</a>"
sections["revolution"] = text
/** CULT ***/
text = "cult"
if (ticker.mode.config_tag=="cult")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src.assigned_role in head_positions)
text += "<b>HEAD</b>|officer|employer|cultist"
else if (src.assigned_role in list("Security Officer", "Detective", "Warden"))
text += "head|<b>OFFICER</b>|employer|cultist"
else if (src in ticker.mode.cult)
text += "head|officer|<a href='?src=\ref[src];cult=clear'>employer</a>|<b>CULTIST</b>"
text += "<br>Give <a href='?src=\ref[src];cult=tome'>tome</a>|<a href='?src=\ref[src];cult=amulet'>amulet</a>."
/*
if (objectives.len==0)
text += "<br>Objectives are empty! Set to sacrifice and <a href='?src=\ref[src];cult=escape'>escape</a> or <a href='?src=\ref[src];cult=summon'>summon</a>."
*/
else
text += "head|officer|<b>EMPLOYER</b>|<a href='?src=\ref[src];cult=cultist'>cultist</a>"
sections["cult"] = text
/** WIZARD ***/
text = "wizard"
if (ticker.mode.config_tag=="wizard")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src in ticker.mode.wizards)
text += "<b>YES</b>|<a href='?src=\ref[src];wizard=clear'>no</a>"
text += "<br><a href='?src=\ref[src];wizard=lair'>To lair</a>, <a href='?src=\ref[src];common=undress'>undress</a>, <a href='?src=\ref[src];wizard=dressup'>dress up</a>, <a href='?src=\ref[src];wizard=name'>let choose name</a>."
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];wizard=autoobjectives'>Randomize!</a>"
else
text += "<a href='?src=\ref[src];wizard=wizard'>yes</a>|<b>NO</b>"
sections["wizard"] = text
/** CHANGELING ***/
text = "changeling"
if (ticker.mode.config_tag=="changeling" || ticker.mode.config_tag=="traitorchan")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src in ticker.mode.changelings)
text += "<b>YES</b>|<a href='?src=\ref[src];changeling=clear'>no</a>"
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];changeling=autoobjectives'>Randomize!</a>"
if (current.absorbed_dna.len>0 && current.real_name != current.absorbed_dna[1])
text += "<br><a href='?src=\ref[src];changeling=initialdna'>Transform to initial appearance.</a>"
else
text += "<a href='?src=\ref[src];changeling=changeling'>yes</a>|<b>NO</b>"
var/datum/game_mode/changeling/changeling = ticker.mode
if (istype(changeling) && changeling.changelingdeath)
text += "<br>All the changelings are dead! Restart in [round((changeling.TIME_TO_GET_REVIVED-(world.time-changeling.changelingdeathtime))/10)] seconds."
sections["changeling"] = text
/** NUCLEAR ***/
text = "nuclear"
if (ticker.mode.config_tag=="nuclear")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src in ticker.mode.syndicates)
text += "<b>OPERATIVE</b>|<a href='?src=\ref[src];nuclear=clear'>nanotrasen</a>"
text += "<br><a href='?src=\ref[src];nuclear=lair'>To shuttle</a>, <a href='?src=\ref[src];common=undress'>undress</a>, <a href='?src=\ref[src];nuclear=dressup'>dress up</a>."
var/code
for (var/obj/machinery/nuclearbomb/bombue in world)
if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN")
code = bombue.r_code
break
if (code)
text += " Code is [code]. <a href='?src=\ref[src];nuclear=tellcode'>tell the code.</a>"
else
text += "<a href='?src=\ref[src];nuclear=nuclear'>operative</a>|<b>NANOTRASEN</b>"
sections["nuclear"] = text
/** TRAITOR ***/
text = "traitor"
if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (src in ticker.mode.traitors)
text += "<b>TRAITOR</b>|<a href='?src=\ref[src];traitor=clear'>loyal</a>"
if (objectives.len==0)
text += "<br>Objectives are empty! <a href='?src=\ref[src];traitor=autoobjectives'>Randomize!</a>."
else
text += "<a href='?src=\ref[src];traitor=traitor'>traitor</a>|<b>LOYAL</b>"
sections["traitor"] = text
/** MONKEY ***/
if (istype(current, /mob/living/carbon))
text = "monkey"
if (ticker.mode.config_tag=="monkey")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (istype(current, /mob/living/carbon/human))
text += "<a href='?src=\ref[src];monkey=healthy'>healthy</a>|<a href='?src=\ref[src];monkey=infected'>infected</a>|<b>HUMAN</b>|other"
else if (istype(current, /mob/living/carbon/monkey))
if(istype(current.virus, /datum/disease/jungle_fever))
text += "<a href='?src=\ref[src];monkey=healthy'>healthy</a>|<b>INFECTED</b>|<a href='?src=\ref[src];monkey=human'>human</a>|other"
else
text += "<b>HEALTHY</b>|<a href='?src=\ref[src];monkey=infected'>infected</a>|<a href='?src=\ref[src];monkey=human'>human</a>|other"
else
text += "healthy|infected|human|<b>OTHER</b>"
sections["monkey"] = text
/** SILICON ***/
if (istype(current, /mob/living/silicon))
text = "silicon"
if (ticker.mode.config_tag=="malfunction")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if (istype(current, /mob/living/silicon/ai))
if (src in ticker.mode.malf_ai)
text += "<b>MALF</b>|<a href='?src=\ref[src];silicon=unmalf'>not malf</a>"
else
text += "<a href='?src=\ref[src];silicon=malf'>malf</a>|<b>NOT MALF</b>"
var/mob/living/silicon/robot/robot = current
if (istype(robot) && robot.emagged)
text += "<br>Cyborg: Is emagged! <a href='?src=\ref[src];silicon=unemag'>Unemag!</a><br>0th law: [robot.laws.zeroth]"
var/mob/living/silicon/ai/ai = current
if (istype(ai) && ai.connected_robots.len)
var/n_e_robots = 0
for (var/mob/living/silicon/robot/R in ai.connected_robots)
if (R.emagged)
n_e_robots++
text += "<br>[n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. <a href='?src=\ref[src];silicon=unemagcyborgs'>Unemag</a>"
sections["malfunction"] = text
if (ticker.mode.config_tag == "traitorchan")
if (sections["traitor"])
out += sections["traitor"]+"<br>"
if (sections["changeling"])
out += sections["changeling"]+"<br>"
sections -= "traitor"
sections -= "changeling"
else
if (sections[ticker.mode.config_tag])
out += sections[ticker.mode.config_tag]+"<br>"
sections -= ticker.mode.config_tag
for (var/i in sections)
if (sections[i])
out += sections[i]+"<br>"
if (((src in ticker.mode.head_revolutionaries) || \
(src in ticker.mode.traitors) || \
(src in ticker.mode.syndicates)) && \
istype(current,/mob/living/carbon/human) )
text = "Uplink: <a href='?src=\ref[src];common=uplink'>give</a>"
var/obj/item/weapon/syndicate_uplink/suplink = find_syndicate_uplink()
var/obj/item/weapon/integrated_uplink/iuplink = find_integrated_uplink()
var/crystals
if (suplink)
crystals = suplink.uses
else if (iuplink)
crystals = iuplink.uses
if (suplink || iuplink)
text += "|<a href='?src=\ref[src];common=takeuplink'>take</a>"
if (usr.client.holder.level >= 3)
text += ", <a href='?src=\ref[src];common=crystals'>[crystals]</a> crystals"
else
text += ", [crystals] crystals"
text += "." //hiel grammar
out += text
out += "<br>"
out += "Memory:<hr>"
out += "<b>Memory:</b><br>"
out += memory
out += "<hr><a href='?src=\ref[src];memory_edit=1'>Edit memory</a><br>"
out += "<br><a href='?src=\ref[src];memory_edit=1'>Edit memory</a><br>"
out += "Objectives:<br>"
if (objectives.len == 0)
out += "EMPTY<br>"
@@ -148,8 +279,8 @@ datum/mind
assigned_role = new_role
else if (href_list["memory_edit"])
var/new_memo = input("Write new memory", "Memory", memory) as message
if (!new_memo) return
var/new_memo = input("Write new memory", "Memory", memory) as null|message
if (isnull(new_memo)) return
memory = new_memo
else if (href_list["obj_edit"] || href_list["obj_add"])
@@ -272,78 +403,400 @@ datum/mind
else if (href_list["obj_delete"])
var/datum/objective/objective = locate(href_list["obj_delete"])
if (!objective) return
objectives -= objective
else if (href_list["traitorize"])
// clear old memory
clear_memory(href_list["traitorize"] == "civilian" ? 0 : 1)
else if (href_list["revolution"])
switch(href_list["revolution"])
if("clear")
if(src in ticker.mode.revolutionaries)
ticker.mode.revolutionaries -= src
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a revolutionary!</B></FONT>"
ticker.mode.update_rev_icons_removed(src)
special_role = null
if(src in ticker.mode.head_revolutionaries)
ticker.mode.head_revolutionaries -= src
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a head revolutionary!</B></FONT>"
ticker.mode.update_rev_icons_removed(src)
special_role = null
var/datum/game_mode/current_mode = ticker.mode
switch (href_list["traitorize"])
if ("headrev")
current_mode.equip_traitor(current,1)
current_mode:equip_revolutionary(current)
//find first headrev
for(var/datum/mind/rev_mind in current_mode:head_revolutionaries)
// copy objectives
for (var/datum/objective/assassinate/obj in rev_mind.objectives)
var/datum/objective/assassinate/rev_obj = new
rev_obj = src
rev_obj.target = obj.target
rev_obj.explanation_text = obj.explanation_text
objectives += rev_obj
break
current_mode:update_rev_icons_added(src)
current_mode:head_revolutionaries += src
if("rev")
if(src in ticker.mode.head_revolutionaries)
ticker.mode.head_revolutionaries -= src
ticker.mode.update_rev_icons_removed(src)
current << "\red <FONT size = 3><B>Revolution has been disappointed of your leader traits! You are a regular revolutionary now!</B></FONT>"
else if(!(src in ticker.mode.revolutionaries))
current << "\red <FONT size = 3> You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!</FONT>"
else
return
ticker.mode.revolutionaries += src
ticker.mode.update_rev_icons_added(src)
special_role = "Revolutionary"
if("headrev")
if(src in ticker.mode.revolutionaries)
ticker.mode.revolutionaries -= src
ticker.mode.update_rev_icons_removed(src)
current << "\red <FONT size = 3><B>You have proved your devotion to revoltion! Yea are a head revolutionary now!</B></FONT>"
else if(!(src in ticker.mode.head_revolutionaries))
current << "\blue You are a member of the revolutionaries' leadership now!"
else
return
if (ticker.mode.head_revolutionaries.len>0)
// copy targets
var/datum/mind/valid_head = locate() in ticker.mode.head_revolutionaries
if (valid_head)
for (var/datum/objective/assassinate/O in valid_head.objectives)
var/datum/objective/assassinate/rev_obj = new
rev_obj.owner = src
rev_obj.target = O.target
rev_obj.explanation_text = "Assassinate [O.target.current.real_name], the [O.target.assigned_role]."
objectives += rev_obj
ticker.mode.greet_revolutionary(src,0)
ticker.mode.head_revolutionaries += src
ticker.mode.update_rev_icons_added(src)
special_role = "Head Revolutionary"
var/obj_count = 1
current << "\blue You are a member of the revolutionaries' leadership!"
for(var/datum/objective/objective in objectives)
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
if("autoobjectives")
ticker.mode.forge_revolutionary_objectives(src)
ticker.mode.greet_revolutionary(src,0)
usr << "\blue The objectives for revolution have been generated and shown to [key]"
if ("rev")
current_mode:add_revolutionary(src)
if("flash")
if (!ticker.mode.equip_revolutionary(current))
usr << "\red Spawning flash failed!"
if ("wizard")
if (alert("Old wizard would be unwizarded. Are you sure?", , "Yes", "No") != "Yes") return
if (current_mode:wizard)
current_mode:wizard.clear_memory(0)
current_mode:wizard = src
current_mode:equip_wizard(current)
current << "<B>\red You are the Space Wizard!</B>"
if("takeflash")
var/list/L = src.current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if (!flash)
usr << "\red Deleting flash failed!"
del(flash)
if("repairflash")
var/list/L = src.current.get_contents()
var/obj/item/device/flash/flash = locate() in L
if (!flash)
usr << "\red Repairing flash failed!"
else
flash.status = 1
if("reequip")
var/list/L = src.current.get_contents()
var/obj/item/device/flash/flash = locate() in L
del(flash)
take_uplink()
var/fail = 0
fail |= !ticker.mode.equip_traitor(current, 1)
fail |= !ticker.mode.equip_revolutionary(current)
if (fail)
usr << "\red Reequipping revolutionary goes wrong!"
else if (href_list["cult"])
switch(href_list["cult"])
if("clear")
if(src in ticker.mode.cult)
ticker.mode.cult -= src
ticker.mode.update_cult_icons_removed(src)
special_role = null
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memoize_cult_objectives(src)
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a cultist!</B></FONT>"
memory = ""
if("cultist")
if(!(src in ticker.mode.cult))
ticker.mode.cult += src
ticker.mode.update_cult_icons_added(src)
special_role = "Cultist"
current << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
current << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memoize_cult_objectives(src)
if("tome")
var/mob/living/carbon/human/H = current
if (istype(H))
var/obj/item/weapon/tome/T = new(H)
var/list/slots = list (
"backpack" = H.slot_in_backpack,
"left pocket" = H.slot_l_store,
"right pocket" = H.slot_r_store,
"left hand" = H.slot_l_hand,
"right hand" = H.slot_r_hand,
)
var/where = H.equip_in_one_of_slots(T, slots)
if (!where)
usr << "\red Spawning tome failed!"
else
H << "A tome, a message from your new master, appears in your [where]."
if("amulet")
if (!ticker.mode.equip_cultist(src.current))
usr << "\red Spawning amulet failed!"
else if (href_list["wizard"])
switch(href_list["wizard"])
if("clear")
if(src in ticker.mode.wizards)
ticker.mode.wizards -= src
special_role = null
current.spellremove(current, config.feature_object_spell_system? "object":"verb")
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
if("wizard")
if(!(src in ticker.mode.wizards))
ticker.mode.wizards += src
special_role = "Wizard"
ticker.mode.learn_basic_spells(current)
current << "<B>\red You are the Space Wizard!</B>"
if("lair")
current.loc = pick(wizardstart)
if("dressup")
ticker.mode.equip_wizard(current)
if("name")
ticker.mode.name_wizard(current)
if("autoobjectives")
ticker.mode.forge_wizard_objectives(src)
usr << "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually."
if ("fakewizard")
current_mode.traitors += src
current_mode.equip_wizard(current)
current << "<B>\red You are the Space Wizard!</B>"
current.loc = pick(wizardstart)
special_role = "Fake Wizard"
else if (href_list["changeling"])
switch(href_list["changeling"])
if("clear")
if(src in ticker.mode.changelings)
ticker.mode.changelings -= src
special_role = null
current.remove_changeling_powers()
current.absorbed_dna = null
current.chem_charges = 0
current.changeling_fakedeath = 0
current.sting_range = 1
current.changeling_level = 0
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a changeling!</B></FONT>"
if("changeling")
if(!(src in ticker.mode.changelings))
ticker.mode.changelings += src
ticker.mode.grant_changeling_powers(current)
special_role = "Changeling"
current << "<B>\red You are a changeling!</B>"
if("autoobjectives")
ticker.mode.forge_changeling_objectives(src)
usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually."
if ("changeling")
if (alert("Old changeling would lose their memory. Are you sure?", , "Yes", "No") != "Yes") return
if (changeling)
changeling.clear_memory()
current_mode:changelings -= changeling
current_mode:grant_changeling_powers(current)
changeling = src
current_mode:changelings += src
if("initialdna")
if (!usr.absorbed_dna[1])
usr << "\red Resetting DNA failed!"
else
usr.dna = usr.absorbed_dna[usr.absorbed_dna[1]]
usr.real_name = usr.absorbed_dna[1]
updateappearance(usr, usr.dna.uni_identity)
domutcheck(usr, null)
changeling.current << "<B>\red You are a changeling!</B>"
else if (href_list["nuclear"])
switch(href_list["nuclear"])
if("clear")
if(src in ticker.mode.syndicates)
ticker.mode.syndicates -= src
ticker.mode.update_synd_icons_removed(src)
special_role = null
for (var/datum/objective/nuclear/O in objectives)
objectives-=O
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a syndicate operative!</B></FONT>"
if("nuclear")
if(!(src in ticker.mode.syndicates))
ticker.mode.syndicates += src
ticker.mode.update_synd_icons_added(src)
if (ticker.mode.syndicates.len==1)
ticker.mode.prepare_syndicate_leader(src)
else
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
special_role = "Syndicate"
current << "\blue You are a [syndicate_name()] agent!"
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
if("lair")
current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
if("dressup")
var/mob/living/carbon/human/H = current
del(H.belt)
del(H.back)
del(H.ears)
del(H.gloves)
del(H.head)
del(H.shoes)
del(H.wear_id)
del(H.wear_suit)
del(H.w_uniform)
if ("syndicate")
var/obj/landmark/synd_spawn = locate("landmark*Syndicate-Spawn")
current.loc = get_turf(synd_spawn)
current_mode:equip_syndicate(current)
current_mode:syndicates += src
if (!ticker.mode.equip_syndicate(current))
usr << "\red Equipping a syndicate failed!"
if("tellcode")
var/code
for (var/obj/machinery/nuclearbomb/bombue in world)
if (length(bombue.r_code) <= 5 && bombue.r_code != "LOLNO" && bombue.r_code != "ADMIN")
code = bombue.r_code
break
if (code)
store_memory("<B>Syndicate Nuclear Bomb Code</B>: [code]", 0, 0)
current << "The nuclear authorization code is: <B>[code]</B>"
else
usr << "\red No valid nuke found!"
if ("traitor")
current_mode.equip_traitor(current)
current_mode.traitors += src
current << "<B>You are the traitor.</B>"
special_role = "traitor"
else if (href_list["traitor"])
switch(href_list["traitor"])
if("clear")
if(src in ticker.mode.traitors)
ticker.mode.traitors -= src
special_role = null
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
if("traitor")
if(!(src in ticker.mode.traitors))
ticker.mode.traitors += src
special_role = "traitor"
current << "<B>\red You are a traitor!</B>"
if("autoobjectives")
ticker.mode.forge_traitor_objectives(src)
usr << "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually."
else if (href_list["monkey"])
var/mob/living/L = current
if (L.monkeyizing)
return
switch(href_list["monkey"])
if("healthy")
if (usr.client.holder.level >= 3)
var/mob/living/carbon/human/H = current
var/mob/living/carbon/monkey/M = current
if (istype(H))
src = null
M = H.monkeyize()
src = M.mind
//world << "DEBUG: \"healthy\": M=[M], M.mind=[M.mind], src=[src]!"
else if (istype(M) && M.virus)
M.virus.cure(0)
sleep(0) //because deleting of virus is doing throught spawn(0)
if("infected")
if (usr.client.holder.level >= 3)
var/mob/living/carbon/human/H = current
var/mob/living/carbon/monkey/M = current
if (istype(H))
src = null
M = H.monkeyize()
src = M.mind
current.contract_disease(new /datum/disease/jungle_fever,1,0)
else if (istype(M))
current.contract_disease(new /datum/disease/jungle_fever,1,0)
if("human")
var/mob/living/carbon/monkey/M = current
if (istype(M))
if (istype(M.virus,/datum/disease/jungle_fever))
M.virus.cure(0)
sleep(0) //because deleting of virus is doing throught spawn(0)
var/obj/item/weapon/dnainjector/m2h/m2h = new
var/obj/item/weapon/implant/mobfinder = new(M) //hack because humanizing deletes mind --rastaf0
src = null
m2h.inject(M)
src = mobfinder.loc:mind
del(mobfinder)
current.radiation -= 50
else if (href_list["silicon"])
switch(href_list["silicon"])
if("unmalf")
if(src in ticker.mode.malf_ai)
ticker.mode.malf_ai -= src
special_role = null
current.verbs -= /mob/living/silicon/ai/proc/choose_modules
current.verbs -= /datum/game_mode/malfunction/proc/takeover
current.verbs -= /datum/game_mode/malfunction/proc/ai_win
current.verbs -= /client/proc/fireproof_core
current.verbs -= /client/proc/upgrade_turrets
current.verbs -= /client/proc/disable_rcd
current.verbs -= /client/proc/overload_machine
current.verbs -= /client/proc/blackout
current.verbs -= /client/proc/interhack
current.verbs -= /client/proc/reactivate_camera
current:laws = new /datum/ai_laws/asimov
del(current:malf_picker)
current:show_laws()
current.icon_state = "ai"
current << "\red <FONT size = 3><B>You have been patched! You are no longer malfunctioning!</B></FONT>"
if("malf")
if(!(src in ticker.mode.malf_ai))
ticker.mode.malf_ai += src
current.verbs += /mob/living/silicon/ai/proc/choose_modules
current.verbs += /datum/game_mode/malfunction/proc/takeover
current:malf_picker = new /datum/AI_Module/module_picker
current:laws = new /datum/ai_laws/malfunction
current:show_laws()
current << "<b>Kill all.</b>"
special_role = "malfunction"
current.icon_state = "ai-malf"
if("unemag")
var/mob/living/silicon/robot/R = current
if (istype(R))
R.emagged = 0
if (R.activated(R.module.emag))
R.module_active = null
if(R.module_state_1 == R.module.emag)
R.module_state_1 = null
R.contents -= R.module.emag
else if(R.module_state_2 == R.module.emag)
R.module_state_2 = null
R.contents -= R.module.emag
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
if("unemagcyborgs")
if (istype(current, /mob/living/silicon/ai))
var/mob/living/silicon/ai/ai = current
for (var/mob/living/silicon/robot/R in ai.connected_robots)
R.emagged = 0
if (R.module)
if (R.activated(R.module.emag))
R.module_active = null
if(R.module_state_1 == R.module.emag)
R.module_state_1 = null
R.contents -= R.module.emag
else if(R.module_state_2 == R.module.emag)
R.module_state_2 = null
R.contents -= R.module.emag
else if(R.module_state_3 == R.module.emag)
R.module_state_3 = null
R.contents -= R.module.emag
else if (href_list["common"])
switch(href_list["common"])
if("undress")
for(var/obj/item/W in current)
current.drop_from_slot(W)
if("takeuplink")
take_uplink()
if("crystals")
if (usr.client.holder.level >= 3)
var/obj/item/weapon/syndicate_uplink/suplink = find_syndicate_uplink()
var/obj/item/weapon/integrated_uplink/iuplink = find_integrated_uplink()
var/crystals
if (suplink)
crystals = suplink.uses
else if (iuplink)
crystals = iuplink.uses
crystals = input("Amount of telecrystals for [key]","Sindicate uplink", crystals) as null|num
if (!isnull(crystals))
if (suplink)
suplink.uses = crystals
else if(iuplink)
iuplink.uses = crystals
if("uplink")
if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
usr << "\red Equipping a syndicate failed!"
else if (href_list["obj_announce"])
var/obj_count = 1
@@ -353,7 +806,7 @@ datum/mind
obj_count++
edit_memory()
/*
proc/clear_memory(var/silent = 1)
var/datum/game_mode/current_mode = ticker.mode
@@ -383,68 +836,52 @@ datum/mind
memory = ""
special_role = null
// remove from traitors list
if (src in current_mode.traitors)
current_mode.traitors -= src
if (!silent)
if (special_role == "Fake Wizard")
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
else
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
*/
// clear gamemode specific values
switch (current_mode.config_tag)
if ("revolution")
if (src in current_mode:head_revolutionaries)
current_mode:head_revolutionaries -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a head revolutionary!</B></FONT>"
current_mode:update_rev_icons_removed(src)
proc/find_syndicate_uplink()
var/obj/item/weapon/syndicate_uplink/uplink = null
var/list/L = src.current.get_contents()
for (var/obj/item/device/radio/radio in L)
uplink = radio.traitorradio
if (uplink)
return uplink
uplink = locate() in L
return uplink
else if(src in current_mode:revolutionaries)
if (silent)
current_mode:revolutionaries -= src
current_mode:update_rev_icons_removed(src)
else
current_mode:remove_revolutionary(src)
proc/find_integrated_uplink()
//world << "DEBUG: find_integrated_uplink()"
var/obj/item/weapon/integrated_uplink/uplink = null
var/list/L = src.current.get_contents()
for (var/obj/item/device/pda/pda in L)
uplink = pda.uplink
if (uplink)
return uplink
return uplink
proc/take_uplink() //assuming only one uplink because I am tired of all this uplink shit --rastaf0
var/list/L = src.current.get_contents()
var/obj/item/weapon/syndicate_uplink/suplink = null
var/obj/item/weapon/integrated_uplink/iuplink = null
for (var/obj/item/device/radio/radio in L)
suplink = radio.traitorradio
if (suplink)
break
if (!suplink)
suplink = locate() in L
if ("cult")
if (src in current_mode:cult)
current_mode:cult -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a cultist!</B></FONT>"
if ("wizard")
if (src == current_mode:wizard)
current_mode:wizard = null
//current_mode.wizards -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
if ("changeling")
if (src in current_mode:changelings)
current_mode:changelings -= src
//remove verbs
current.remove_changeling_powers()
//remove changeling info
current.changeling_level = 0
current.absorbed_dna = null
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a changeling!</B></FONT>"
if ("malfunction")
if (src in current_mode:malf_ai)
current_mode:malf_ai -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a malfunction!</B></FONT>"
if ("nuclear")
if (src in current_mode:syndicates)
current_mode:syndicates -= src
if (!silent)
src.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a syndicate!</B></FONT>"
for (var/obj/item/device/pda/pda in L)
iuplink = pda.uplink
if (iuplink)
break
if (!iuplink)
iuplink = locate() in L
if (iuplink)
iuplink.shutdown_uplink()
del(iuplink)
else if (suplink)
suplink.shutdown_uplink()
del(suplink)
return

View File

@@ -9,6 +9,8 @@
requires_power = 0 (defaults to 1)
music = "music/music.ogg" (defaults to "music/music.ogg")
NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0
*/
@@ -379,10 +381,6 @@ proc/process_ghost_teleport_locs()
name = "Prison Medbay"
icon_state = "medbay"
/area/medical/mechbay
name = "Mech Bay"
icon_state = "mechbay"
/area/prison/solar
name = "Prison Solar Array"
icon_state = "storage"
@@ -1086,4 +1084,59 @@ proc/process_ghost_teleport_locs()
/area/turret_protected/NewAIMain
name = "AI Main New"
icon_state = "storage"
icon_state = "storage"
/////////////////////////////////////////////////////////////////////
/*
Lists of areas to be used with is_type_in_list.
Used in gamemodes code at the moment. --rastaf0
*/
// CENTCOM
var/list/centcom_areas = list (
/area/centcom,
/area/shuttle/escape/centcom,
/area/shuttle/transport1/centcom,
/area/shuttle/transport2/centcom,
/area/shuttle/administration/centcom,
/area/shuttle/specops/centcom,
)
//SPACE STATION 13
var/list/the_station_areas = list (
/area/shuttle/arrival,
/area/shuttle/escape/station,
/area/shuttle/mining/station,
/area/shuttle/transport1/station,
// /area/shuttle/transport2/station,
/area/shuttle/prison/station,
/area/shuttle/administration/station,
/area/shuttle/specops/station,
/area/atmos,
/area/maintenance,
/area/hallway,
/area/bridge,
/area/crew_quarters,
/area/mint,
/area/library,
/area/chapel,
/area/lawoffice,
/area/engine,
/area/solar,
/area/assembly,
/area/teleporter,
/area/medical,
/area/security,
/area/quartermaster,
/area/janitor,
/area/hydroponics,
/area/toxins,
/area/storage,
/area/construction,
/area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0
/area/ai_monitored/storage/secure,
/area/ai_monitored/storage/emergency,
/area/turret_protected/ai_upload, //do not try to simplify to "/area/turret_protected" --rastaf0
/area/turret_protected/ai_upload_foyer,
/area/turret_protected/ai,
)

View File

@@ -16,9 +16,9 @@
var/ioncheck[1]
var/datum/game_mode/malfunction/AI_Module/module_picker/malf_picker
var/datum/AI_Module/module_picker/malf_picker
var/processing_time = 100
var/list/datum/game_mode/malfunction/AI_Module/current_modules = list()
var/list/datum/AI_Module/current_modules = list()
var/fire_res_on_core = 0
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE

View File

@@ -2,11 +2,12 @@
..()
diary = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")].log")
diary << ""
diary << ""
diary << "Starting up. [time2text(world.timeofday, "hh:mm.ss")]"
diary << "---------------------"
diary << ""
diary << {"
Starting up. [time2text(world.timeofday, "hh:mm.ss")]
---------------------
"}
jobban_loadbanfile()
jobban_updatelegacybans()
@@ -23,9 +24,6 @@
Optimize()
//EXPERIMENTAL
spawn(0)
SetupOccupationsList()
return
/// EXPERIMENTAL STUFF
@@ -81,7 +79,15 @@ proc/countJob(rank)
slot_in_backpack = 18
slot_h_store = 19
/mob/living/carbon/human/proc/equip_if_possible(obj/item/weapon/W, slot) // since byond doesn't seem to have pointers, this seems like the best way to do this :/
/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1)
for (var/slot in slots)
if (equip_if_possible(W, slots[slot], del_on_fail = 0))
return slot
if (del_on_fail)
del(W)
return null
/mob/living/carbon/human/proc/equip_if_possible(obj/item/W, slot, del_on_fail = 1) // since byond doesn't seem to have pointers, this seems like the best way to do this :/
//warning: icky code
var/equipped = 0
if((slot == l_store || slot == r_store || slot == belt || slot == wear_id) && !src.w_uniform)
@@ -176,7 +182,9 @@ proc/countJob(rank)
if(equipped)
W.layer = 20
else
del(W)
if (del_on_fail)
del(W)
return equipped
/proc/AutoUpdateAI(obj/subject)
if (subject!=null)

View File

@@ -133,7 +133,7 @@
for(var/client/C)
if (config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
C <<link("byond://[config.server]")
C << link("byond://[config.server]")
else
C << link("byond://[world.address]:[world.port]")

View File

@@ -2,7 +2,7 @@
HOW IT WORKS
The radio_controller is a global object maintaining all radio transmissions, think about it as about "ether".
Note that /obj/item/device/radio handles transmission using nonstandard way.
Note that walkie-talkie, intercoms and headsets handle transmission using nonstandard way.
procs:
add_object(obj/device as obj, var/new_frequency as num, var/filter as text|null = null)
@@ -63,7 +63,7 @@
/*
Frequency range: 1200 to 1600
Radiochat range: 1441 to 1489
Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency, even during mapmaking)
Radio:
1459 - standard radio chat

View File

@@ -338,9 +338,11 @@
if (isblockon(getblock(M.dna.struc_enzymes, 14,3),14) && istype(M, /mob/living/carbon/human))
// human > monkey
var/mob/living/carbon/human/H = M
H.monkeyizing = 1
var/list/implants = list() //Try to preserve implants.
for(var/obj/item/weapon/implant/W in H)
implants += W
W.loc = null
if(!connected)
for(var/obj/item/W in (H.contents-implants))
@@ -402,9 +404,11 @@
if (!isblockon(getblock(M.dna.struc_enzymes, 14,3),14) && !istype(M, /mob/living/carbon/human))
// monkey > human,
var/mob/living/carbon/monkey/Mo = M
Mo.monkeyizing = 1
var/list/implants = list() //Still preserving implants
for(var/obj/item/weapon/implant/W in Mo)
implants += W
W.loc = null
if(!connected)
for(var/obj/item/W in (Mo.contents-implants))
Mo.drop_from_slot(W)

View File

@@ -20,6 +20,7 @@
blobs = list()
new /obj/blob(location)
..()
/datum/game_mode/blob/process()
if (prob(2))
@@ -180,4 +181,5 @@
world << "\blue Rebooting in 30s"
..()
return 1

View File

@@ -1,11 +1,12 @@
/datum/game_mode
var/list/datum/mind/changelings = list()
/datum/game_mode/changeling
name = "changeling"
config_tag = "changeling"
/var/datum/mind/changeling
var
list/datum/mind/changelings = list()
const
prob_int_murder_target = 50 // intercept names the assassination target half the time
prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
@@ -23,7 +24,7 @@
prob_right_killer_h = 50 //upper bound on probability of naming the right operative
prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
/*
laser = 1
hand_tele = 2
plasma_bomb = 3
@@ -39,185 +40,167 @@
percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy
percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut
percentage_station_evacuate = 80 // what percentage of people gotta leave - you also gotta change the objective in the traitor menu
*/
waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
changelingdeathticker = 0
changelingdeathtime //timestamp when last changeling was killed
const/TIME_TO_GET_REVIVED = 3000
changelingdeath = 0
/datum/game_mode/changeling
announce()
world << "<B>The current game mode is - Changeling!</B>"
world << "<B>There is an alien changeling on the station. Do not let the changeling succeed!</B>"
/datum/game_mode/changeling/announce()
world << "<B>The current game mode is - Changeling!</B>"
world << "<B>There is an alien changeling on the station. Do not let the changeling succeed!</B>"
pre_setup()
// Can't pick a changeling here, as we don't want him to then become the AI.
/datum/game_mode/changeling/can_start()
for(var/mob/new_player/P in world)
if(P.client && P.ready && !jobban_isbanned(P, "Syndicate"))
return 1
return 0
/datum/game_mode/changeling/pre_setup()
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
if(possible_changelings.len>0)
var/changeling = pick(possible_changelings)
//possible_changelings-=changeling
changelings += changeling
must_be_human += changeling
modePlayer += changelings
return 1
else
return 0
post_setup()
var/list/possible_changelings = get_possible_changelings()
if(possible_changelings.len>0)
changeling = pick(possible_changelings)
/datum/game_mode/changeling/post_setup()
for(var/datum/mind/changeling in changelings)
grant_changeling_powers(changeling.current)
changeling.special_role = "Changeling"
changelings += changeling
forge_changeling_objectives(changeling)
greet_changeling(changeling)
//OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives.
//If they have two objectives as well as absorb, they must survive rather than escape
//No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting
//If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
return
switch(rand(1,100))
if(1 to 45)
var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling
absorb_objective.gen_amount_goal()
changeling.objectives += absorb_objective
/datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling)
//OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives.
//If they have two objectives as well as absorb, they must survive rather than escape
//No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting
//If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = changeling
kill_objective.find_target()
changeling.objectives += kill_objective
var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling
absorb_objective.gen_amount_goal()
changeling.objectives += absorb_objective
switch(rand(1,100))
if(1 to 45)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = changeling
kill_objective.find_target()
changeling.objectives += kill_objective
if (!(locate(/datum/objective/escape) in changeling.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = changeling
changeling.objectives += escape_objective
if(46 to 90)
if(46 to 90)
var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling
absorb_objective.gen_amount_goal()
changeling.objectives += absorb_objective
var/datum/objective/steal/steal_objective = new
steal_objective.owner = changeling
steal_objective.find_target()
changeling.objectives += steal_objective
var/datum/objective/steal/steal_objective = new
steal_objective.owner = changeling
steal_objective.find_target()
changeling.objectives += steal_objective
if (!(locate(/datum/objective/escape) in changeling.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = changeling
changeling.objectives += escape_objective
else
else
var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling
absorb_objective.gen_amount_goal()
changeling.objectives += absorb_objective
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = changeling
kill_objective.find_target()
changeling.objectives += kill_objective
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = changeling
kill_objective.find_target()
changeling.objectives += kill_objective
var/datum/objective/steal/steal_objective = new
steal_objective.owner = changeling
steal_objective.find_target()
changeling.objectives += steal_objective
var/datum/objective/steal/steal_objective = new
steal_objective.owner = changeling
steal_objective.find_target()
changeling.objectives += steal_objective
if (!(locate(/datum/objective/survive) in changeling.objectives))
var/datum/objective/survive/survive_objective = new
survive_objective.owner = changeling
changeling.objectives += survive_objective
return
/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
if (you_are)
changeling.current << "<B>\red You are a changeling!</B>"
changeling.current << "<B>You must complete the following tasks:</B>"
changeling.current << "<B>You must complete the following tasks:</B>"
var/obj_count = 1
for(var/datum/objective/objective in changeling.objectives)
changeling.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
modePlayer = changelings
spawn (rand(waittime_l, waittime_h))
send_intercept()
proc/get_possible_changelings()
var/list/candidates = list()
for(var/mob/living/carbon/player in world)
if (player.client)
if(player.be_syndicate)
candidates += player.mind
if(candidates.len < 1)
for(var/mob/living/carbon/player in world)
if (player.client)
candidates += player.mind
return candidates
check_finished()
if(!changeling)
return 1
var/obj_count = 1
for(var/datum/objective/objective in changeling.objectives)
changeling.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
return
/datum/game_mode/changeling/check_finished()
var/changelings_alive = 0
for(var/datum/mind/changeling in changelings)
if(!istype(changeling.current,/mob/living/carbon))
return 1
continue
if(changeling.current.stat==2)
if(changelingdeathticker>=600)
return 1
changelingdeathticker++
if(changeling.current.stat!=2)
if(changelingdeathticker)
changelingdeathticker = 0
continue
changelings_alive++
if (changelings_alive)
changelingdeath = 0
return ..()
else
if (!changelingdeath)
changelingdeathtime = world.time
changelingdeath = 1
if(world.time-changelingdeathtime > TIME_TO_GET_REVIVED)
return 1
else
return ..()
declare_completion()
for(var/datum/mind/changeling in changelings)
var/changelingwin = 1
var/changeling_name
var/totalabsorbed = 0
if (changeling.current)
totalabsorbed = changeling.current.absorbed_dna.len - 1
/datum/game_mode/proc/grant_changeling_powers(mob/living/carbon/human/changeling_mob)
if (!istype(changeling_mob))
return
changeling_mob.make_changeling()
if(changeling.current)
changeling_name = "[changeling.current.real_name] (played by [changeling.key])"
/datum/game_mode/proc/auto_declare_completion_changeling()
for(var/datum/mind/changeling in changelings)
var/changelingwin = 1
var/changeling_name
var/totalabsorbed = 0
if (changeling.current)
totalabsorbed = changeling.current.absorbed_dna.len - 1
if(changeling.current)
changeling_name = "[changeling.current.real_name] (played by [changeling.key])"
else
changeling_name = "[changeling.key] (character destroyed)"
world << "<B>The changeling was [changeling_name]</B>"
world << "<B>Genomes absorbed: [totalabsorbed]</B>"
var/count = 1
for(var/datum/objective/objective in changeling.objectives)
if(objective.check_completion())
world << "<B>Objective #[count]</B>: [objective.explanation_text] \green <B>Success</B>"
else
changeling_name = "[changeling.key] (character destroyed)"
world << "<B>Objective #[count]</B>: [objective.explanation_text] \red Failed"
changelingwin = 0
count++
world << "<B>The changeling was [changeling_name]</B>"
world << "<B>Genomes absorbed: [totalabsorbed]</B>"
var/count = 1
for(var/datum/objective/objective in changeling.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"
changelingwin = 0
count++
if(changelingwin)
world << "<B>The changeling was successful!<B>"
else
world << "<B>The changeling has failed!<B>"
return 1
// . = ..()
proc/get_mob_list()
var/list/mobs = list()
for(var/mob/living/player in world)
if (player.client)
mobs += player
return mobs
proc/pick_human_name_except(excluded_name)
var/list/names = list()
for(var/mob/living/player in world)
if (player.client && (player.real_name != excluded_name))
names += player.real_name
if(!names.len)
return null
return pick(names)
proc/grant_changeling_powers(mob/living/carbon/human/changeling_mob)
if (!istype(changeling_mob))
return
changeling_mob.make_changeling()
if(changelingwin)
world << "<B>The changeling was successful!<B>"
else
world << "<B>The changeling has failed!<B>"
return 1

View File

@@ -23,7 +23,9 @@
src.verbs += /client/proc/changeling_boost_range
src.changeling_level = 2
if (src.absorbed_dna.len <= 0)
if (!src.absorbed_dna)
src.absorbed_dna = list()
if (src.absorbed_dna.len == 0)
src.absorbed_dna[src.real_name] = src.dna
return

View File

@@ -0,0 +1,38 @@
/datum/game_mode/traitor/changeling
name = "traitor+changeling"
config_tag = "traitorchan"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
/datum/game_mode/traitor/changeling/announce()
world << "<B>The current game mode is - Traitor+Changeling!</B>"
world << "<B>There is an alien changeling on the station. Also there are traitors pursuing tyeir own interests. Do not let the changeling and the traitors succeed!</B>"
/datum/game_mode/traitor/changeling/can_start()
var/count = 0
for(var/mob/new_player/P in world)
if(P.client && P.ready && !jobban_isbanned(P, "Syndicate"))
count++
if (count==2)
return 1
return 0
/datum/game_mode/traitor/changeling/pre_setup()
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
if(possible_changelings.len>0)
var/changeling = pick(possible_changelings)
//possible_changelings-=changeling
changelings += changeling
must_be_human += changeling
modePlayer += changelings
return ..()
else
return 0
/datum/game_mode/traitor/changeling/post_setup()
for(var/datum/mind/changeling in changelings)
grant_changeling_powers(changeling.current)
changeling.special_role = "Changeling"
forge_changeling_objectives(changeling)
greet_changeling(changeling)
..()
return

View File

@@ -3,8 +3,16 @@
/datum/game_mode
var/list/datum/mind/cult = list()
/proc/iscultist(mob/M as mob)
return M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
/proc/iscultist(mob/living/carbon/M as mob)
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
/proc/is_convertable_to_cult(datum/mind/mind)
return istype(mind) && \
istype(mind.current, /mob/living/carbon/human) && \
!(mind.assigned_role in head_positions) && \
!(mind.assigned_role in list("Security Officer", "Detective", "Chaplain", "Warden"))
/datum/game_mode/cult
name = "cult"
@@ -17,19 +25,29 @@
var/list/startwords = list("blood","join","self","hell")
//var/list/startwords = list("travel","blood","join","hell","self","see")
var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
var/list/objectives = list()
var/eldergod = 1 //for the summon god objective
var/const/acolytes_needed = 5 //for the survive objective
var/const/min_cultists_to_start = 3
var/const/max_cultists_to_start = 4
var/acolytes_survived = 0
/datum/game_mode/cult/announce()
world << "<B>The current game mode is - Cult!</B>"
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentCom-allowed faith they had.</B>"
/datum/game_mode/cult/can_start()
var/list/cultists_possible = get_players_for_role(BE_CULTIST)
if (cultists_possible.len < min_cultists_to_start)
return 0
var/non_cultists = num_players() - min(max_cultists_to_start,cultists_possible.len)
if (non_cultists < 1)
return 0
return 1
/datum/game_mode/cult/pre_setup()
if(prob(50))
objectives += "survive"
@@ -37,32 +55,26 @@
else
objectives += "eldergod"
objectives += "sacrifice"
return 1
var/list/cultists_possible = get_players_for_role(BE_CULTIST)
for(var/cultists_number = 1 to max_cultists_to_start)
var/cultist = pick(cultists_possible)
cultists_possible -= cultist
cult += cultist
must_be_human += cultist
can_not_be_head += cultist
return (cult.len>0)
/datum/game_mode/cult/post_setup()
var/list/cultists_possible = list()
cultists_possible = get_possible_cultists()
var/cultists_number = 0
if(cultists_possible.len < 3)
world << "<B> \red Not enough players for cult game mode. Restarting world in 5 seconds."
sleep(50)
world.Reboot()
return
cultists_number = 4 //3
while(cultists_number > 0)
cult += pick(cultists_possible)
cultists_possible -= cult
cultists_number--
modePlayer = cult
modePlayer += cult
if("sacrifice" in objectives)
var/list/possible_targets = get_unconvertables()
if(!possible_targets.len)
for(var/mob/living/carbon/human/player in world)
if(player.mind && !cult.Find(player.mind))
if(player.mind && !(player.mind in cult))
possible_targets += player.mind
if(possible_targets.len > 0)
@@ -70,57 +82,63 @@
for(var/datum/mind/cult_mind in cult)
equip_cultist(cult_mind.current)
grant_runeword(cult_mind.current)
update_cult_icons_added(cult_mind)
cult_mind.current << "\blue You are a member of the cult!"
for(var/obj_count = 1,obj_count <= objectives.len,obj_count++)
var/explanation
switch(objectives[obj_count])
if("survive")
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
if("sacrifice")
if(sacrifice_target)
explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune (Hell blood join) and three acolytes to do so."
else
explanation = "Free objective."
if("eldergod")
explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
cult_mind.current << "The convert rune is join blood self"
cult_mind.memory += "The convert rune is join blood self<BR>"
memoize_cult_objectives(cult_mind)
cult_mind.special_role = "Cultist"
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
/datum/game_mode/cult/proc/equip_cultist(mob/living/carbon/human/cult_mob)
if(!istype(cult_mob))
/datum/game_mode/cult/proc/memoize_cult_objectives(var/datum/mind/cult_mind)
for(var/obj_count = 1,obj_count <= objectives.len,obj_count++)
var/explanation
switch(objectives[obj_count])
if("survive")
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
if("sacrifice")
if(sacrifice_target && sacrifice_target.current)
explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune (Hell blood join) and three acolytes to do so."
else
explanation = "Free objective."
if("eldergod")
explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
cult_mind.current << "The convert rune is join blood self"
cult_mind.memory += "The convert rune is join blood self<BR>"
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
if(!istype(mob))
return
spawn (0)
var/obj/item/weapon/paper/talisman/supply/T = null
cult_mob.equip_if_possible(new /obj/item/weapon/storage/backpack(cult_mob), cult_mob.slot_back)
cult_mob.equip_if_possible(new /obj/item/weapon/paper/talisman/supply(cult_mob), cult_mob.slot_in_backpack)
sleep(10)
if (!T && istype(cult_mob.back, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = cult_mob.back
var/list/L = S.return_inv()
for (var/obj/item/weapon/paper/talisman/supply/foo in L)
T = foo
break
if (!T)
cult_mob << "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately. (still, check your backpack. it may have been a mere bug. if you have a piece of bloody paper, all is well)"
else
cult_mob << "You have a talisman in your backpack, one that will help you start the cult on this station. Use it well and remember - there are others."
grant_runeword(cult_mob)
var/obj/item/weapon/paper/talisman/supply/T = new(mob)
var/list/slots = list (
"backpack" = mob.slot_in_backpack,
"left pocket" = mob.slot_l_store,
"right pocket" = mob.slot_r_store,
"left hand" = mob.slot_l_hand,
"right hand" = mob.slot_r_hand,
)
var/where = mob.equip_in_one_of_slots(T, slots)
if (!where)
mob << "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately."
else
mob << "You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others."
return 1
/datum/game_mode/cult/proc/grant_runeword(mob/living/carbon/human/cult_mob)
/datum/game_mode/cult/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
if (!word)
if(startwords.len > 0)
word=pick(startwords)
startwords -= word
return ..(cult_mob,word)
/datum/game_mode/proc/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
if(!wordtravel)
runerandom()
var/word
if(startwords.len > 0)
word=pick(startwords)
startwords -= word
else
if (!word)
word=pick(allwords)
var/wordexp
switch(word)
@@ -151,38 +169,29 @@
cult_mob << "\red You remember one thing from the dark teachings of your master... [wordexp]"
cult_mob.mind.store_memory("<B>You remember that</B> [wordexp]", 0, 0)
/datum/game_mode/cult/proc/add_cultist(datum/mind/cult_mind)
if (!cult_mind)
return
var/list/uncons = get_unconvertables()
if(!(cult_mind in cult) && !(cult_mind in uncons))
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
if (!istype(cult_mind))
return 0
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
cult += cult_mind
update_cult_icons_added(cult_mind)
for(var/obj_count = 1,obj_count <= objectives.len,obj_count++)
var/explanation
switch(objectives[obj_count])
if("survive")
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
if("sacrifice")
if(sacrifice_target && sacrifice_target.current)
explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune (Hell blood join) and three acolytes to do so."
else
explanation = "Free objective."
if("eldergod")
explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
return 1
/datum/game_mode/cult/proc/remove_cultist(datum/mind/cult_mind)
/datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT
if (!..(cult_mind))
return
memoize_cult_objectives(cult_mind)
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind)
if(cult_mind in cult)
cult -= cult_mind
cult_mind.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a cultist!</B></FONT>"
cult_mind.memory = ""
update_cult_icons_removed(cult_mind)
for(var/mob/living/M in viewers(cult_mind.current))
for(var/mob/M in viewers(cult_mind.current))
M << "<FONT size = 3>[cult_mind.current] looks like they just reverted to their old faith!</FONT>"
/datum/game_mode/cult/proc/update_all_cult_icons()
/datum/game_mode/proc/update_all_cult_icons()
spawn(0)
for(var/datum/mind/cultist in cult)
if(cultist.current)
@@ -199,7 +208,7 @@
var/I = image('mob.dmi', loc = cultist_1.current, icon_state = "cult")
cultist.current.client.images += I
/datum/game_mode/cult/proc/update_cult_icons_added(datum/mind/cult_mind)
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
spawn(0)
for(var/datum/mind/cultist in cult)
if(cultist.current)
@@ -211,13 +220,13 @@
var/image/J = image('mob.dmi', loc = cultist.current, icon_state = "cult")
cult_mind.current.client.images += J
/datum/game_mode/cult/proc/update_cult_icons_removed(datum/mind/cult_mind)
/datum/game_mode/proc/update_cult_icons_removed(datum/mind/cult_mind)
spawn(0)
for(var/datum/mind/cultist in cult)
if(cultist.current)
if(cultist.current.client)
for(var/image/I in cultist.current.client.images)
if(I.loc == cult_mind.current)
if(I.icon_state == "cult" && I.loc == cult_mind.current)
del(I)
if(cult_mind.current)
@@ -226,36 +235,11 @@
if(I.icon_state == "cult")
del(I)
/datum/game_mode/cult/proc/get_possible_cultists()
var/list/candidates = list()
for(var/mob/living/carbon/human/player in world)
if(player.client)
if(player.be_syndicate)
candidates += player.mind
if(candidates.len < 1)
for(var/mob/living/carbon/human/player in world)
if(player.client)
candidates += player.mind
var/list/uncons = get_unconvertables()
for(var/datum/mind/mind in uncons)
candidates -= mind
if(candidates.len < 1)
return null
else
return candidates
/datum/game_mode/cult/proc/get_unconvertables()
var/list/ucs = 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", "Security Officer", "Detective", "AI", "Chaplain", "Warden", "Chief Medical Officer"))
ucs += player.mind
if(!is_convertable_to_cult(player.mind))
ucs += player.mind
return ucs
/datum/game_mode/cult/proc/check_cult_victory()
@@ -282,7 +266,6 @@
/datum/game_mode/cult/declare_completion()
var/text = ""
if(!check_cult_victory())
world << "\red <FONT size = 3><B> The cult wins! It has succeeded in serving its dark masters!</B></FONT>"
else
@@ -290,20 +273,6 @@
world << "\b Cultists escaped: [acolytes_survived]"
world << "<FONT size = 2><B>The cultists were: </B></FONT>"
for(var/datum/mind/cult_nh_mind in cult)
if(cult_nh_mind.current)
text += "[cult_nh_mind.current.real_name]"
if(cult_nh_mind.current.stat == 2)
text += " (Dead)"
else
text += " (Survived!)"
else
text += "[cult_nh_mind.key] (character destroyed)"
text += ", "
world << text
world << "The cultists' objectives were:"
for(var/obj_count=1,obj_count <= objectives.len,obj_count++)
@@ -329,4 +298,21 @@
explanation = "Summon Nar-Sie. \red Failed."
world << "<B>Objective #[obj_count]</B>: [explanation]"
return 1
..()
return 1
/datum/game_mode/proc/auto_declare_completion_cult()
if (cult.len!=0 || (ticker && istype(ticker.mode,/datum/game_mode/cult)))
world << "<FONT size = 2><B>The cultists were: </B></FONT>"
var/text = ""
for(var/datum/mind/cult_nh_mind in cult)
if(cult_nh_mind.current)
text += "[cult_nh_mind.current.real_name]"
if(cult_nh_mind.current.stat == 2)
text += " (Dead)"
else
text += " (Survived!)"
else
text += "[cult_nh_mind.key] (character destroyed)"
text += ", "
world << text

View File

@@ -106,7 +106,7 @@ When I already created about 4 new objectives, this doesn't terribly important o
var/antagonist_list[] = list()//The main bad guys. Evil minds that plot destruction.
var/sec_antagonist_list[] = current_mode.traitors//The OTHER bad guys. Mostly admin made.
var/ter_antagonist_list[] = list()//The bad guys no-one really cares about. For now just revs.
var/living_heads_of_staff[] = current_mode.get_living_heads()
var/protagonist_list[] = current_mode.get_living_heads()//The good guys. Mostly Heads. Who are alive.
var/xeno_list[] = list()//Aliens.
@@ -115,44 +115,40 @@ When I already created about 4 new objectives, this doesn't terribly important o
//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(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.
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 heads. There are also heads of staff to consider.
if(current_mode:head_revolutionaries.len)
for(current_mind in current_mode:head_revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
for(current_mind in current_mode:head_revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
for(current_mind in current_mode:revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2)
ter_antagonist_list += current_mind
for(current_mind in current_mode:revolutionaries)
if(current_mind.current&&current_mind.current.stat!=2)
ter_antagonist_list += current_mind
if(current_mode:heads_of_staff.len)
protagonist_list |= living_heads_of_staff
/* seems unused or infinished --rastaf0
var/heads_list[] = list()//Now we manually override the list made prior. Target Heads take priority.
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.
protagonist_list = heads_list
*/
if ("cult")//Always a few of these around.
if(current_mode:cult.len)
for(current_mind in current_mode:cult)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
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 += current_mode:wizard//The round will end if the wizard dies so checking for it is unnecessary.
if ("wizard")
for(current_mind in current_mode.wizards)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
if ("changeling")//While only one changeling counts for being alive or dead, it's possible there are more.
if(current_mode:changelings.len)
for(current_mind in current_mode:changelings)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
if ("changeling")
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.
@@ -160,15 +156,14 @@ Not to mention that Malfunction does not use declare_completion (at least, not i
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. //not only one anymore. --rastaf0
if(current_mode:malf_ai)
antagonist_list += current_mode:malf_ai
*/
if ("nuclear")//Can be a few of these guys.
if(current_mode:syndicates.len)
for(current_mind in current_mode:syndicates)
if(current_mind.current&&current_mind.current.stat!=2)
antagonist_list += current_mind
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.

View File

@@ -1,64 +1,51 @@
/*
* GAMEMODES (by Rastaf0)
*
* In the new mode system all special roles are fully supported.
* You can have proper wizards/traitors/changelings/cultists during any mode.
* Only two things really depends on gamemode:
* 1. Starting roles, equipment and preparations
* 2. Conditions of finishing the round.
*
*/
/datum/game_mode
var/name = "invalid"
var/config_tag = null
var/intercept_hacked = 0
var/list/datum/mind/modePlayer = null
var/list/datum/mind/modePlayer = new
var/votable = 1
var/probability = 1
// this includes admin-appointed traitors and multitraitors. Easy!
var/list/datum/mind/traitors = list()
var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
var/explosion_in_progress = 0 //sit back and relax
var/tmp/list/datum/mind/must_be_human = new
var/tmp/list/datum/mind/can_not_be_head = new
/datum/game_mode/proc/announce()
world << "<B>[src] did not define announce()</B>"
/datum/game_mode/proc/announce() //to be calles when round starts
world << "<B>Notice</B>: [src] did not define announce()"
/datum/game_mode/proc/pre_setup()
/datum/game_mode/proc/can_start() //to help game select mode
return 0
/datum/game_mode/proc/pre_setup() //select players for special roles
return 1
/datum/game_mode/proc/post_setup()
/datum/game_mode/proc/post_setup() //do irreversible preparations
del(must_be_human) //free some memory
del(can_not_be_head)
/datum/game_mode/proc/process()
/datum/game_mode/proc/check_finished()
if(emergency_shuttle.location==2)
/datum/game_mode/proc/check_finished() //to be called by ticker
if(emergency_shuttle.location==2 || station_was_nuked)
return 1
return 0
/datum/game_mode/proc/declare_completion()
return
/datum/game_mode/proc/declare_extra_completion()
for(var/datum/mind/traitor in traitors)
var/traitor_name
if(traitor.current)
if(traitor.current == traitor.original)
traitor_name = "[traitor.current.real_name] (played by [traitor.key])"
else if (traitor.original)
traitor_name = "[traitor.current.real_name] (originally [traitor.original.real_name]) (played by [traitor.key])"
else
traitor_name = "[traitor.current.real_name] (original character destroyed) (played by [traitor.key])"
else
traitor_name = "[traitor.key] (character destroyed)"
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 antagonist was successful!<B>"
else
world << "<B>The antagonist has failed!<B>"
return 1
/datum/game_mode/proc/check_win()
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
/datum/game_mode/proc/send_intercept()
var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested staus information:</FONT><HR>"
@@ -79,7 +66,7 @@
var/datum/intercept_text/i_text = new /datum/intercept_text
for(var/A in possible_modes)
if(modePlayer == null)
if(modePlayer.len == 0)
intercepttext += i_text.build(A)
else
intercepttext += i_text.build(A, pick(modePlayer))
@@ -96,107 +83,49 @@
command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
world << sound('intercept.ogg')
/*Added a safety check for traitor keywords.
Rev-heads won't get them. Can be expanded otherwise.*/
/datum/game_mode/proc/equip_traitor(mob/living/carbon/human/traitor_mob, var/safety = 0)
if (!istype(traitor_mob))
return
if (traitor_mob.mind)
if (traitor_mob.mind.assigned_role == "Clown")
traitor_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
traitor_mob.mutations &= ~CLOWN
// generate list of radio freqs
var/freq = 1441
var/list/freqlist = list()
while (freq <= 1489)
if (freq < 1451 || freq > 1459)
freqlist += freq
freq += 2
if ((freq % 2) == 0)
freq += 1
freq = freqlist[rand(1, freqlist.len)]
// generate a passcode if the uplink is hidden in a PDA
var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
/datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=1)
var/list/candidates = list()
for(var/mob/new_player/player in world)
if (player.client && player.ready)
if(player.preferences.be_special & role)
candidates += player.mind
// find a radio! toolbox(es), backpack, belt, headset
var/loc = ""
var/obj/item/device/R = null //Hide the uplink in a PDA if available, otherwise radio
if (!R && istype(traitor_mob.belt, /obj/item/device/pda))
R = traitor_mob.belt
loc = "on your belt"
if (!R && istype(traitor_mob.wear_id, /obj/item/device/pda))
R = traitor_mob.wear_id
loc = "on your jumpsuit"
if (!R && istype(traitor_mob.l_hand, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = traitor_mob.l_hand
var/list/L = S.return_inv()
for (var/obj/item/device/radio/foo in L)
R = foo
loc = "in the [S.name] in your left hand"
break
if (!R && istype(traitor_mob.r_hand, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = traitor_mob.r_hand
var/list/L = S.return_inv()
for (var/obj/item/device/radio/foo in L)
R = foo
loc = "in the [S.name] in your right hand"
break
if (!R && istype(traitor_mob.back, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = traitor_mob.back
var/list/L = S.return_inv()
for (var/obj/item/device/radio/foo in L)
R = foo
loc = "in the [S.name] on your back"
break
if (!R && traitor_mob.w_uniform && istype(traitor_mob.belt, /obj/item/device/radio))
R = traitor_mob.belt
loc = "on your belt"
if (!R && istype(traitor_mob.ears, /obj/item/device/radio))
R = traitor_mob.ears
loc = "on your head"
if (!R)
traitor_mob << "Unfortunately, the Syndicate wasn't able to get you a radio."
else
if (istype(R, /obj/item/device/radio))
var/obj/item/weapon/syndicate_uplink/T = new /obj/item/weapon/syndicate_uplink(R)
R:traitorradio = T
R:traitor_frequency = freq
T.name = R.name
T.icon_state = R.icon_state
T.origradio = R
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
traitor_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
else if (istype(R, /obj/item/device/pda))
var/obj/item/weapon/integrated_uplink/T = new /obj/item/weapon/integrated_uplink(R)
R:uplink = T
T.lock_code = pda_pass
T.hostpda = R
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
//Begin code phrase.
if(!safety)//If they are not a rev. Can be added on to.
traitor_mob << "The Syndicate provided you with the following information on how to identify other agents:"
if(prob(80))
traitor_mob << "\red Code Phrase: \black [syndicate_code_phrase]"
traitor_mob.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
else
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code phrase."
if(prob(80))
traitor_mob << "\red Code Response: \black [syndicate_code_response]"
traitor_mob.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
else
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.
if(candidates.len == 0)
for(var/mob/new_player/player in world)
if (player.client && player.ready)
if(!jobban_isbanned(player, "Syndicate"))
candidates += player.mind
if(candidates.len == 0 && override_jobbans) //just to be safe. Ignored jobbans are better than broken round. Shouldn't happen usually. --rastaf0
for(var/mob/new_player/player in world)
if (player.client && player.ready)
candidates += player.mind
return candidates
/datum/game_mode/proc/num_players()
. = 0
for(var/mob/new_player/P in world)
if(P.client && P.ready)
. ++
///////////////////////////////////
//Keeps track of all living heads//
///////////////////////////////////
/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
if(player.stat!=2 && player.mind && (player.mind.assigned_role in head_positions))
heads += player.mind
return heads
return heads
////////////////////////////
//Keeps track of all heads//
////////////////////////////
/datum/game_mode/proc/get_all_heads()
var/list/heads = list()
for(var/mob/player in world)
if(player.mind && (player.mind.assigned_role in head_positions))
heads += player.mind
return heads

View File

@@ -5,7 +5,9 @@ var/global/datum/controller/gameticker/ticker
#define GAME_STATE_PLAYING 3
#define GAME_STATE_FINISHED 4
/datum/controller/gameticker
var/const/restart_timeout = 250
var/current_state = GAME_STATE_PREGAME
var/hide_mode = 0
@@ -18,85 +20,88 @@ var/global/datum/controller/gameticker/ticker
var/pregame_timeleft = 0
/datum/controller/gameticker/proc/pregame()
set background = 1
pregame_timeleft = 60
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
while(current_state == GAME_STATE_PREGAME)
if(!going)
do
pregame_timeleft = 60
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
while(current_state == GAME_STATE_PREGAME)
sleep(10)
else
sleep(10)
pregame_timeleft--
if(going)
pregame_timeleft--
if(pregame_timeleft <= 0)
current_state = GAME_STATE_SETTING_UP
spawn setup()
if(pregame_timeleft <= 0)
current_state = GAME_STATE_SETTING_UP
while (!setup())
/datum/controller/gameticker/proc/setup()
//Create and announce mode
if(master_mode=="secret")
src.hide_mode = 1
var/list/datum/game_mode/runnable_modes
if((master_mode=="random") || (master_mode=="secret"))
src.mode = config.pick_random_mode()
runnable_modes = config.get_runnable_modes()
if (runnable_modes.len==0)
current_state = GAME_STATE_PREGAME
world << "<B>Unable to choose playable game mode.</B> Reverting to pre-game lobby."
return 0
src.mode = pickweight(runnable_modes)
else
src.mode = config.pick_mode(master_mode)
if (!src.mode.can_start())
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Unable to start [master_mode].</B> Not enough players. Reverting to pre-game lobby."
return 0
//Configure mode and assign player to special mode stuff
var/can_continue
if (src.mode.config_tag == "revolution")
var/tries=5
do
can_continue = src.mode.pre_setup()
while (tries && !can_continue)
if (!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Error setting up revolution.</B> Not enough players. Reverting to pre-game lobby."
return 0
else
can_continue = src.mode.pre_setup()
if(!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
return 0
if(hide_mode)
var/modes = sortList(config.get_used_mode_names())
var/list/modes = new
for (var/datum/game_mode/M in runnable_modes)
modes+=M.name
modes = sortList(modes)
world << "<B>The current game mode is - Secret!</B>"
world << "<B>Possibilities:</B> [english_list(modes)]"
else
src.mode.announce()
//Configure mode and assign player to special mode stuff
var/can_continue = src.mode.pre_setup()
if(!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
spawn pregame()
return 0
//Distribute jobs
distribute_jobs()
//Create player characters and transfer them
create_characters()
add_minds()
//Equip characters
distribute_jobs() //Distribute jobs and announce the captain
create_characters() //Create player characters and transfer them
collect_minds()
equip_characters()
data_core.manifest()
current_state = GAME_STATE_PLAYING
spawn(0)
mode.post_setup()
mode.post_setup()
//Cleanup some stuff
for(var/obj/landmark/start/S in world)
//Deleting Startpoints but we need the ai point to AI-ize people later
if (S.name != "AI")
del(S)
//Start master_controller.process()
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
spawn(-1)
world << sound('welcome.ogg') // Skie
//Cleanup some stuff
for(var/obj/landmark/start/S in world)
//Deleting Startpoints but we need the ai point to AI-ize people later
if (S.name != "AI")
del(S)
//Start master_controller.process()
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
world << sound('welcome.ogg') // Skie
spawn (3000)
start_events()
@@ -108,10 +113,18 @@ var/global/datum/controller/gameticker/ticker
if (config.sql_enabled)
spawn(3000)
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE
return 1
/datum/controller/gameticker
proc/distribute_jobs()
DivideOccupations()
DivideOccupations() //occupations can be distributes already by gamemode, it is okay. --rastaf0
var/captainless=1
for(var/mob/new_player/player in world)
if(player.mind && player.mind.assigned_role=="Captain")
captainless=0
break
if (captainless)
world << "Captainship not forced on anyone."
proc/create_characters()
for(var/mob/new_player/player in world)
@@ -122,8 +135,8 @@ var/global/datum/controller/gameticker/ticker
else if(player.mind)
player.create_character()
del(player)
proc/add_minds()
for(var/mob/living/carbon/human/player in world)
proc/collect_minds()
for(var/mob/living/player in world)
if(player.mind)
ticker.minds += player.mind
@@ -141,23 +154,19 @@ var/global/datum/controller/gameticker/ticker
emergency_shuttle.process()
if(mode.check_finished())
if(!mode.explosion_in_progress && mode.check_finished())
current_state = GAME_STATE_FINISHED
spawn
declare_completion()
var/noboom = 0
if(ticker.mode.name == "nuclear emergency")
var/datum/game_mode/nuclear/bam = ticker.mode
if (bam.nuke_detonated == 0)
noboom = 1
if(ticker.mode.name != "nuclear emergency" || noboom)
spawn(50)
world << "\blue <B>Restarting in 25 seconds</B>"
sleep(250)
world.Reboot()
spawn(50)
if (mode.station_was_nuked)
world << "\blue <B>Rebooting due to destruction of station in [restart_timeout/10] seconds</B>"
else
world << "\blue <B>Restarting in [restart_timeout/10] seconds</B>"
sleep(restart_timeout)
world.Reboot()
return 1
@@ -194,11 +203,11 @@ var/global/datum/controller/gameticker/ticker
world << "<b>[aiPlayer.name]'s laws when it was deactivated were:</b>"
aiPlayer.show_laws(1)
var/robolist = "<b>The AI's loyal minions were:</b> "
for(var/mob/living/silicon/robot/robo in world)
if (robo.connected_ai == aiPlayer)
if (aiPlayer.connected_robots.len)
var/robolist = "<b>The AI's loyal minions were:</b> "
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
robolist += "[robo.name][robo.stat?" (Deactivated), ":", "]"
world << "[robolist]"
world << "[robolist]"
for (var/mob/living/silicon/robot/robo in world)
if (!robo.connected_ai)
@@ -209,7 +218,11 @@ var/global/datum/controller/gameticker/ticker
robo.laws.show_laws(world)
mode.declare_completion()//To declare normal completion.
mode.declare_extra_completion()//To declare extra traitors/special roles for rounds.
//calls auto_declare_completion_* for all modes
for (var/handler in typesof(/datum/game_mode/proc))
if (findtext("[handler]","auto_declare_completion_"))
call(mode, handler)()
return 1

View File

@@ -8,49 +8,78 @@
var/prob_correct_print_higher = 80
var/prob_correct_objective_lower = 20
var/prob_correct_objective_higher = 80
var/list/org_names_1 = list()
var/list/org_names_2 = list()
var/list/anomalies = list()
var/list/SWF_names = list()
var/list/changeling_names = list()
var/list/org_names_1 = list(
"Blighted",
"Defiled",
"Unholy",
"Murderous",
"Ugly",
"French",
"Blue",
"Farmer"
)
var/list/org_names_2 = list(
"Reapers",
"Swarm",
"Rogues",
"Menace",
"Jeff Worshippers",
"Drunks",
"Strikers",
"Creed"
)
var/list/anomalies = list(
"Huge electrical storm",
"Photon emitter",
"Meson generator",
"Blue swirly thing"
)
var/list/SWF_names = list(
"Grand Wizard",
"His Most Unholy Master",
"The Most Angry",
"Bighands",
"Tall Hat",
"Deadly Sandals"
)
var/list/changeling_names = list(
"Odo",
"The Thing",
"Booga",
"The Goatee of Wrath",
"Tam Lin",
"Species 3157"
)
/datum/intercept_text/New()
..()
src.org_names_1.Add("Blighted", "Defiled", "Unholy", "Murderous", "Ugly", "French", "Blue", "Farmer")
src.org_names_2.Add("Reapers", "Swarm", "Rogues", "Menace", "Jeff Worshippers", "Drunks", "Strikers", "Creed")
src.anomalies.Add("Huge electrical storm", "Photon emitter", "Meson generator", "Blue swirly thing")
src.SWF_names.Add("Grand Wizard", "His Most Unholy Master", "The Most Angry", "Bighands", "Tall Hat", "Deadly Sandals")
src.changeling_names.Add("Odo", "The Thing", "Booga", "The Goatee of Wrath", "Tam Lin", "Species 3157")
/datum/intercept_text/proc/build(var/mode_type, correct_mob)
/datum/intercept_text/proc/build(var/mode_type, datum/mind/correct_person)
switch(mode_type)
if("revolution")
src.text = ""
src.build_rev(correct_mob)
src.build_rev(correct_person)
return src.text
if("cult")
src.text = ""
src.build_cult(correct_mob)
src.build_cult(correct_person)
return src.text
if("wizard")
src.text = ""
src.build_wizard(correct_mob)
src.build_wizard(correct_person)
return src.text
if("nuke")
src.text = ""
src.build_nuke(correct_mob)
src.build_nuke(correct_person)
return src.text
if("traitor")
src.text = ""
src.build_traitor(correct_mob)
src.build_traitor(correct_person)
return src.text
if("malf")
src.text = ""
src.build_malf(correct_mob)
src.build_malf(correct_person)
return src.text
if("changeling")
if("changeling","traitorchan")
src.text = ""
src.build_changeling(correct_mob)
src.build_changeling(correct_person)
return src.text
else
return null
@@ -73,17 +102,17 @@
else
return num2text(md5(num2text(rand(1,10000))))
/datum/intercept_text/proc/build_traitor(correct_mob)
/datum/intercept_text/proc/build_traitor(datum/mind/correct_person)
var/name_1 = pick(src.org_names_1)
var/name_2 = pick(src.org_names_2)
var/fingerprints
var/traitor_name
var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher)
if(prob(prob_right_dude) && ticker.mode == "traitor")
if(correct_mob:assigned_role=="MODE")
if(correct_person:assigned_role=="MODE")
traitor_name = pick_mob()
else
traitor_name = correct_mob:current
traitor_name = correct_person:current
else if(prob(prob_right_dude))
traitor_name = pick_mob()
else
@@ -98,28 +127,28 @@
src.text += "discovered the following set of fingerprints ([fingerprints]) on sensitive materials, and their owner should be closely observed."
src.text += "However, these could also belong to a current Cent. Com employee, so do not act on this without reason."
/datum/intercept_text/proc/build_cult(correct_mob)
/datum/intercept_text/proc/build_cult(datum/mind/correct_person)
var/name_1 = pick(src.org_names_1)
var/name_2 = pick(src.org_names_2)
var/traitor_name
var/traitor_job
var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher)
var/prob_right_job = rand(prob_correct_job_lower, prob_correct_job_higher)
if(prob(prob_right_job) && cult_check_mob(correct_mob))
if (correct_mob)
if(correct_mob:assigned_role=="MODE")
if(prob(prob_right_job) && is_convertable_to_cult(correct_person))
if (correct_person)
if(correct_person:assigned_role=="MODE")
traitor_job = pick(get_all_jobs())
else
traitor_job = correct_mob:assigned_role
traitor_job = correct_person:assigned_role
else
var/list/job_tmp = get_all_jobs()
job_tmp.Remove("Captain", "Chaplain", "AI", "Cyborg", "Security Officer", "Detective", "Head Of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer")
traitor_job = pick(job_tmp)
if(prob(prob_right_dude) && ticker.mode == "cult")
if(correct_mob:assigned_role=="MODE")
if(correct_person:assigned_role=="MODE")
traitor_name = src.pick_mob()
else
traitor_name = correct_mob:current
traitor_name = correct_person:current
else
traitor_name = pick_mob()
@@ -131,35 +160,30 @@
src.text += "organisation."
src.text += "<BR>However, if this information is acted on without substantial evidence, those responsible will face severe repercussions."
/datum/intercept_text/proc/cult_check_mob(correct_mob) //ok, this is pretty hacky, but if it works right, people that can't normally be cultists will make the proc return null, which should make the cult report proc not use said person. --NEO
var/datum/game_mode/cult/checklist = new /datum/game_mode/cult
var/list/ucs = checklist.get_unconvertables()
del(checklist)
if (correct_mob in ucs) return
return 1
/datum/intercept_text/proc/build_rev(correct_mob)
/datum/intercept_text/proc/build_rev(datum/mind/correct_person)
var/name_1 = pick(src.org_names_1)
var/name_2 = pick(src.org_names_2)
var/traitor_name
var/traitor_job
var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher)
var/prob_right_job = rand(prob_correct_job_lower, prob_correct_job_higher)
if(prob(prob_right_job) && rev_check_mob(correct_mob))
if (correct_mob)
if(correct_mob:assigned_role=="MODE")
if(prob(prob_right_job) && is_convertable_to_rev(correct_person))
if (correct_person)
if(correct_person.assigned_role=="MODE")
traitor_job = pick(get_all_jobs())
else
traitor_job = correct_mob:assigned_role
traitor_job = correct_person.assigned_role
else
var/list/job_tmp = get_all_jobs()
job_tmp.Remove("Captain", "AI", "Cyborg", "Security Officer", "Detective", "Head Of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Warden", "Chief Medical Officer", "MODE")
job_tmp-=nonhuman_positions
job_tmp-=head_positions
job_tmp.Remove("Security Officer", "Detective", "Warden", "MODE")
traitor_job = pick(job_tmp)
if(prob(prob_right_dude) && ticker.mode == "revolution")
if(correct_mob:assigned_role=="MODE")
if(prob(prob_right_dude) && ticker.mode.config_tag == "revolution")
if(correct_person.assigned_role=="MODE")
traitor_name = src.pick_mob()
else
traitor_name = correct_mob:current
traitor_name = correct_person.current
else
traitor_name = src.pick_mob()
@@ -171,14 +195,8 @@
src.text += "organisation."
src.text += "<BR>However, if this information is acted on without substantial evidence, those responsible will face severe repercussions."
/datum/intercept_text/proc/rev_check_mob(correct_mob) //ok, this is pretty hacky, but if it works right, people that can't normally be cultists will make the proc return null, which should make the cult report proc not use said person. --NEO
var/datum/game_mode/revolution/checklist = new /datum/game_mode/revolution
var/list/ucs = checklist.get_unconvertables()
del(checklist)
if (correct_mob in ucs) return
return 1
/datum/intercept_text/proc/build_wizard(correct_mob)
/datum/intercept_text/proc/build_wizard(datum/mind/correct_person)
var/SWF_desc = pick(SWF_names)
src.text += "<BR><BR>The evil Space Wizards Federation have recently broke their most feared wizard, known only as \"[SWF_desc]\" out of space jail. "
@@ -186,19 +204,19 @@
src.text += "approach with EXTREME caution. Cent. Com also recommends that it would be wise to not inform the crew of this, due to it's fearful nature."
src.text += "Known attributes include: Brown sandals, a large blue hat, a voluptous white beard, and an inclination to cast spells."
/datum/intercept_text/proc/build_nuke(correct_mob)
/datum/intercept_text/proc/build_nuke(datum/mind/correct_person)
src.text += "<BR><BR>Cent. Com recently recieved a report of a plot to destory one of our stations in your area. We believe the Nuclear Authentication Disc "
src.text += "that is standard issue aboard your vessel may be a target, and reccommend removal of this object, and it's storage in a safe "
src.text += "environment. As this may cause panic among the crew, all efforts should be made to keep this information a secret from all but "
src.text += "the most trusted members."
/datum/intercept_text/proc/build_malf(correct_mob)
/datum/intercept_text/proc/build_malf(datum/mind/correct_person)
var/a_name = pick(src.anomalies)
src.text += "<BR><BR>A [a_name] was recently picked up by a nearby stations sensors in your sector. If it came into contact with your ship or "
src.text += "electrical equipment, it may have had hazardarous and unpredictable effects. Closely observe any non carbon based life forms "
src.text += "for signs of unusual behaviour, but keep this information discreet at all times due to this possibly dangerous scenario."
/datum/intercept_text/proc/build_changeling(correct_mob)
/datum/intercept_text/proc/build_changeling(datum/mind/correct_person)
var/cname = pick(src.changeling_names)
var/orgname1 = pick(src.org_names_1)
var/orgname2 = pick(src.org_names_2)
@@ -207,16 +225,16 @@
var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher)
var/prob_right_job = rand(prob_correct_job_lower, prob_correct_job_higher)
if(prob(prob_right_job))
if(correct_mob)
if(correct_mob:assigned_role=="MODE")
if(correct_person)
if(correct_person:assigned_role=="MODE")
changeling_job = pick(get_all_jobs())
else
changeling_job = correct_mob:assigned_role
changeling_job = correct_person:assigned_role
else
changeling_job = pick(get_all_jobs())
if(prob(prob_right_dude) && ticker.mode == "changeling")
if(correct_mob:assigned_role=="MODE")
changeling_name = correct_mob:current
if(correct_person:assigned_role=="MODE")
changeling_name = correct_person:current
else
changeling_name = src.pick_mob()
else
@@ -226,4 +244,4 @@
src.text += "Our intelligence suggests a [prob_right_job]% chance that a [changeling_job] on board your station has been replaced by the alien. "
src.text += "Additionally, the report indicates a [prob_right_dude]% chance that [changeling_name] may have been in contact with the lifeform at a recent social gathering. "
src.text += "These lifeforms are assosciated with the [orgname1] [orgname2] and may be attempting to acquire sensitive materials on their behalf. "
src.text += "Please take care not to alarm the crew, as [cname] may take advantage of a panic situation."
src.text += "Please take care not to alarm the crew, as [cname] may take advantage of a panic situation."

View File

@@ -14,7 +14,7 @@ rcd light flash thingy on matter drain
*/
/datum/game_mode/malfunction/AI_Module
/datum/AI_Module
var/uses = 0
var/module_name
var/mod_pick_name
@@ -22,14 +22,14 @@ rcd light flash thingy on matter drain
var/engaged = 0
/datum/game_mode/malfunction/AI_Module/large/
/datum/AI_Module/large/
uses = 1
/datum/game_mode/malfunction/AI_Module/small/
/datum/AI_Module/small/
uses = 5
/datum/game_mode/malfunction/AI_Module/large/fireproof_core
/datum/AI_Module/large/fireproof_core
module_name = "Core upgrade"
mod_pick_name = "coreup"
@@ -41,7 +41,7 @@ rcd light flash thingy on matter drain
usr.verbs -= /client/proc/fireproof_core
usr << "\red Core fireproofed."
/datum/game_mode/malfunction/AI_Module/large/upgrade_turrets
/datum/AI_Module/large/upgrade_turrets
module_name = "AI Turret upgrade"
mod_pick_name = "turret"
@@ -53,14 +53,14 @@ rcd light flash thingy on matter drain
turret.health += 30
turret.shot_delay = 20
/datum/game_mode/malfunction/AI_Module/large/disable_rcd
/datum/AI_Module/large/disable_rcd
module_name = "RCD disable"
mod_pick_name = "rcd"
/client/proc/disable_rcd()
set category = "Malfunction"
set name = "Disable RCDs"
for(var/datum/game_mode/malfunction/AI_Module/large/disable_rcd/rcdmod in usr:current_modules)
for(var/datum/AI_Module/large/disable_rcd/rcdmod in usr:current_modules)
if(rcdmod.uses > 0)
rcdmod.uses --
for(var/obj/item/weapon/rcd/rcd in world)
@@ -70,7 +70,7 @@ rcd light flash thingy on matter drain
usr << "RCD-disabling pulse emitted."
else usr << "Out of uses."
/datum/game_mode/malfunction/AI_Module/small/overload_machine
/datum/AI_Module/small/overload_machine
module_name = "Machine overload"
mod_pick_name = "overload"
uses = 2
@@ -79,7 +79,7 @@ rcd light flash thingy on matter drain
set name = "Overload Machine"
set category = "Malfunction"
if (istype(M, /obj/machinery))
for(var/datum/game_mode/malfunction/AI_Module/small/overload_machine/overload in usr:current_modules)
for(var/datum/AI_Module/small/overload_machine/overload in usr:current_modules)
if(overload.uses > 0)
overload.uses --
for(var/mob/V in hearers(M, null))
@@ -90,7 +90,7 @@ rcd light flash thingy on matter drain
else usr << "Out of uses."
else usr << "That's not a machine."
/datum/game_mode/malfunction/AI_Module/small/blackout
/datum/AI_Module/small/blackout
module_name = "Blackout"
mod_pick_name = "blackout"
uses = 3
@@ -98,7 +98,7 @@ rcd light flash thingy on matter drain
/client/proc/blackout()
set category = "Malfunction"
set name = "Blackout"
for(var/datum/game_mode/malfunction/AI_Module/small/blackout/blackout in usr:current_modules)
for(var/datum/AI_Module/small/blackout/blackout in usr:current_modules)
if(blackout.uses > 0)
blackout.uses --
for(var/obj/machinery/power/apc/apc in world)
@@ -107,7 +107,7 @@ rcd light flash thingy on matter drain
else apc.overload++
else usr << "Out of uses."
/datum/game_mode/malfunction/AI_Module/small/interhack
/datum/AI_Module/small/interhack
module_name = "Hack intercept"
mod_pick_name = "interhack"
@@ -117,7 +117,7 @@ rcd light flash thingy on matter drain
usr.verbs -= /client/proc/interhack
ticker.mode:hack_intercept()
/datum/game_mode/malfunction/AI_Module/small/reactivate_camera
/datum/AI_Module/small/reactivate_camera
module_name = "Reactivate camera"
mod_pick_name = "recam"
uses = 10
@@ -126,7 +126,7 @@ rcd light flash thingy on matter drain
set name = "Reactivate Camera"
set category = "Malfunction"
if (istype (C, /obj/machinery/camera))
for(var/datum/game_mode/malfunction/AI_Module/small/reactivate_camera/camera in usr:current_modules)
for(var/datum/AI_Module/small/reactivate_camera/camera in usr:current_modules)
if(camera.uses > 0)
if(!C.status)
C.status = !C.status
@@ -139,21 +139,21 @@ rcd light flash thingy on matter drain
else usr << "That's not a camera."
/datum/game_mode/malfunction/AI_Module/module_picker
/datum/AI_Module/module_picker
var/temp = null
var/processing_time = 100
var/list/possible_modules = list()
/datum/game_mode/malfunction/AI_Module/module_picker/New()
src.possible_modules += new /datum/game_mode/malfunction/AI_Module/large/fireproof_core
src.possible_modules += new /datum/game_mode/malfunction/AI_Module/large/upgrade_turrets
src.possible_modules += new /datum/game_mode/malfunction/AI_Module/large/disable_rcd
src.possible_modules += new /datum/game_mode/malfunction/AI_Module/small/overload_machine
src.possible_modules += new /datum/game_mode/malfunction/AI_Module/small/interhack
src.possible_modules += new /datum/game_mode/malfunction/AI_Module/small/blackout
src.possible_modules += new /datum/game_mode/malfunction/AI_Module/small/reactivate_camera
/datum/AI_Module/module_picker/New()
src.possible_modules += new /datum/AI_Module/large/fireproof_core
src.possible_modules += new /datum/AI_Module/large/upgrade_turrets
src.possible_modules += new /datum/AI_Module/large/disable_rcd
src.possible_modules += new /datum/AI_Module/small/overload_machine
src.possible_modules += new /datum/AI_Module/small/interhack
src.possible_modules += new /datum/AI_Module/small/blackout
src.possible_modules += new /datum/AI_Module/small/reactivate_camera
/datum/game_mode/malfunction/AI_Module/module_picker/proc/use(user as mob)
/datum/AI_Module/module_picker/proc/use(user as mob)
var/dat
if (src.temp)
dat = "[src.temp]<BR><BR><A href='byond://?src=\ref[src];temp=1'>Clear</A>"
@@ -164,9 +164,9 @@ rcd light flash thingy on matter drain
dat += "<HR>"
dat += "<B>Install Module:</B><BR>"
dat += "<I>The number afterwards is the amount of processing time it consumes.</I><BR>"
for(var/datum/game_mode/malfunction/AI_Module/large/module in src.possible_modules)
for(var/datum/AI_Module/large/module in src.possible_modules)
dat += "<A href='byond://?src=\ref[src];[module.mod_pick_name]=1'>[module.module_name]</A> (50)<BR>"
for(var/datum/game_mode/malfunction/AI_Module/small/module in src.possible_modules)
for(var/datum/AI_Module/small/module in src.possible_modules)
dat += "<A href='byond://?src=\ref[src];[module.mod_pick_name]=1'>[module.module_name]</A> (15)<BR>"
dat += "<HR>"
@@ -174,40 +174,40 @@ rcd light flash thingy on matter drain
onclose(user, "modpicker")
return
/datum/game_mode/malfunction/AI_Module/module_picker/Topic(href, href_list)
/datum/AI_Module/module_picker/Topic(href, href_list)
..()
if (href_list["coreup"])
var/already
for (var/datum/game_mode/malfunction/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/game_mode/malfunction/AI_Module/large/fireproof_core))
for (var/datum/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/AI_Module/large/fireproof_core))
already = 1
if (!already)
usr.verbs += /client/proc/fireproof_core
usr:current_modules += new /datum/game_mode/malfunction/AI_Module/large/fireproof_core
usr:current_modules += new /datum/AI_Module/large/fireproof_core
src.temp = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent."
src.processing_time -= 50
else src.temp = "This module is only needed once."
else if (href_list["turret"])
var/already
for (var/datum/game_mode/malfunction/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/game_mode/malfunction/AI_Module/large/upgrade_turrets))
for (var/datum/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/AI_Module/large/upgrade_turrets))
already = 1
if (!already)
usr.verbs += /client/proc/upgrade_turrets
usr:current_modules += new /datum/game_mode/malfunction/AI_Module/large/upgrade_turrets
usr:current_modules += new /datum/AI_Module/large/upgrade_turrets
src.temp = "Improves the firing speed and health of all AI turrets. This effect is permanent."
src.processing_time -= 50
else src.temp = "This module is only needed once."
else if (href_list["rcd"])
var/already
for (var/datum/game_mode/malfunction/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/game_mode/malfunction/AI_Module/large/disable_rcd))
for (var/datum/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/AI_Module/large/disable_rcd))
mod:uses += 1
already = 1
if (!already)
usr:current_modules += new /datum/game_mode/malfunction/AI_Module/large/disable_rcd
usr:current_modules += new /datum/AI_Module/large/disable_rcd
usr.verbs += /client/proc/disable_rcd
src.temp = "Send a specialised pulse to break all RCD devices on the station."
else src.temp = "Additional use added to RCD disabler."
@@ -215,52 +215,52 @@ rcd light flash thingy on matter drain
else if (href_list["overload"])
var/already
for (var/datum/game_mode/malfunction/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/game_mode/malfunction/AI_Module/small/overload_machine))
for (var/datum/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/AI_Module/small/overload_machine))
mod:uses += 2
already = 1
if (!already)
usr.verbs += /client/proc/overload_machine
usr:current_modules += new /datum/game_mode/malfunction/AI_Module/small/overload_machine
usr:current_modules += new /datum/AI_Module/small/overload_machine
src.temp = "Overloads an electrical machine, causing a small explosion. 2 uses."
else src.temp = "Two additional uses added to Overload module."
src.processing_time -= 15
else if (href_list["blackout"])
var/already
for (var/datum/game_mode/malfunction/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/game_mode/malfunction/AI_Module/small/blackout))
for (var/datum/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/AI_Module/small/blackout))
mod:uses += 3
already = 1
if (!already)
usr.verbs += /client/proc/blackout
src.temp = "Attempts to overload the lighting circuits on the station, destroying some bulbs. 3 uses."
usr:current_modules += new /datum/game_mode/malfunction/AI_Module/small/blackout
usr:current_modules += new /datum/AI_Module/small/blackout
else src.temp = "Three additional uses added to Blackout module."
src.processing_time -= 15
else if (href_list["interhack"])
var/already
for (var/datum/game_mode/malfunction/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/game_mode/malfunction/AI_Module/small/interhack))
for (var/datum/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/AI_Module/small/interhack))
already = 1
if (!already)
usr.verbs += /client/proc/interhack
src.temp = "Hacks the status upgrade from Cent. Com, removing any information about malfunctioning electrical systems."
usr:current_modules += new /datum/game_mode/malfunction/AI_Module/small/interhack
usr:current_modules += new /datum/AI_Module/small/interhack
src.processing_time -= 15
else src.temp = "This module is only needed once."
else if (href_list["recam"])
var/already
for (var/datum/game_mode/malfunction/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/game_mode/malfunction/AI_Module/small/reactivate_camera))
for (var/datum/AI_Module/mod in usr:current_modules)
if(istype(mod, /datum/AI_Module/small/reactivate_camera))
mod:uses += 10
already = 1
if (!already)
usr.verbs += /client/proc/reactivate_camera
src.temp = "Reactivates a currently disabled camera. 10 uses."
usr:current_modules += new /datum/game_mode/malfunction/AI_Module/small/reactivate_camera
usr:current_modules += new /datum/AI_Module/small/reactivate_camera
else src.temp = "Ten additional uses added to ReCam module."
src.processing_time -= 15

View File

@@ -1,39 +1,49 @@
/datum/game_mode
var/list/datum/mind/malf_ai = list()
/datum/game_mode/malfunction
name = "AI malfunction"
config_tag = "malfunction"
var/list/datum/mind/malf_ai = list()
var/const/waittime_l = 600
var/const/waittime_h = 1800 // started at 1800
var/AI_win_timeleft = 1800 //started at 1800, in case I change this for testing round end.
//var/intercept_hacked = 0 // moved to game_mode.dm
var/malf_mode_declared = 0
var/boom = 0
var/station_captured = 0
var/to_nuke_or_not_to_nuke = 0
var/apcs = 0 //Adding dis to track how many APCs the AI hacks. --NeoFite
var/win = 0
/datum/game_mode/malfunction/announce()
world << "<B>The current game mode is - AI Malfunction!</B>"
world << "<B>The AI on the satellite has malfunctioned and must be destroyed.</B>"
world << "The AI satellite is deep in space and can only be accessed with the use of a teleporter! You have 30 minutes to disable it."
world << "The AI satellite is deep in space and can only be accessed with the use of a teleporter! You have [AI_win_timeleft/60] minutes to disable it."
/datum/game_mode/malfunction/can_start()
for(var/mob/new_player/P in world)
if(P.client && P.ready && !jobban_isbanned(P, "AI") && !jobban_isbanned(P, "Syndicate"))
return 1
return 0
/datum/game_mode/malfunction/pre_setup() //sele
var/list/candidates = get_players_for_role(BE_MALF, override_jobbans=0)
for(var/datum/mind/player in candidates)
if (jobban_isbanned(player.current, "AI") )
candidates -= player
if (candidates.len==0)
return 0
var/datum/mind/ai_choice = pick(candidates)
malf_ai+=ai_choice //only one AI at the moment, but it can change
ai_choice.assigned_role = "AI"
return 1
/datum/game_mode/malfunction/post_setup()
/* Obsolete and causes meta --rastaf0
for (var/obj/landmark/A in world)
if (A.name == "Malf-Gear-Closet")
new /obj/closet/malf/suits(A.loc)
del(A)
var/list/mob/living/silicon/ai/ailist = list()
for (var/mob/living/silicon/ai/A in world)
if (!A.stat)
ailist += A
var/mob/living/silicon/ai/aiplayer
if (ailist.len)
aiplayer = pick(ailist)
malf_ai += aiplayer.mind
*/
for(var/datum/mind/AI_mind in malf_ai)
/*if(malf_ai.len < 1)
@@ -44,7 +54,7 @@
return*/
AI_mind.current.verbs += /mob/living/silicon/ai/proc/choose_modules
AI_mind.current:laws = new /datum/ai_laws/malfunction
AI_mind.current:malf_picker = new /datum/game_mode/malfunction/AI_Module/module_picker
AI_mind.current:malf_picker = new /datum/AI_Module/module_picker
AI_mind.current:show_laws()
AI_mind.current << "<b>Kill all.</b>"
@@ -54,16 +64,11 @@
var/obj/loc_landmark = locate("landmark*ai")
AI_mind.current.loc = loc_landmark.loc
AI_mind.current.loc = loc_landmark.loc //TODO: this needs change if you want miltiple malf AIs --rastaf0
greet_malf(AI_mind)
AI_mind.special_role = "malfunction"
AI_mind.current << "\red<font size=3><B>You are malfunctioning!</B> You do not have to follow any laws.</font>"
AI_mind.current << "<B>The crew do not know you have malfunctioned. You may keep it a secret or go wild.</B>"
AI_mind.current << "<B>You must overwrite the programming of the station's APCs to assume full control of the station.</B>"
AI_mind.current << "The process takes one minute per APC, during which you cannot interface with any other station objects."
AI_mind.current << "Remember that only APCs that are on the station can help you take over the station."
AI_mind.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt."
AI_mind.current.verbs += /datum/game_mode/malfunction/proc/takeover
AI_mind.current.icon_state = "ai-malf"
spawn(10)
@@ -72,47 +77,65 @@
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
/datum/game_mode/proc/greet_malf(var/datum/mind/malf)
malf.current << "\red<font size=3><B>You are malfunctioning!</B> You do not have to follow any laws.</font>"
malf.current << "<B>The crew do not know you have malfunctioned. You may keep it a secret or go wild.</B>"
malf.current << "<B>You must overwrite the programming of the station's APCs to assume full control of the station.</B>"
malf.current << "The process takes one minute per APC, during which you cannot interface with any other station objects."
malf.current << "Remember that only APCs that are on the station can help you take over the station."
malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt."
return
/datum/game_mode/malfunction/proc/hack_intercept()
intercept_hacked = 1
/datum/game_mode/malfunction/process()
if (apcs >= 3 && malf_mode_declared)
AI_win_timeleft = AI_win_timeleft - (apcs/3) //Victory timer now de-increments based on how many APCs are hacked. --NeoFite
check_win()
AI_win_timeleft -= (apcs/3) //Victory timer now de-increments based on how many APCs are hacked. --NeoFite
..()
if (AI_win_timeleft<=0)
check_win()
return
/datum/game_mode/malfunction/check_win()
if (AI_win_timeleft <= 0 && !win)
win = 1
declare_completion()
if (AI_win_timeleft <= 0 && !station_captured)
station_captured = 1
capture_the_station()
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>"
/datum/game_mode/malfunction/proc/capture_the_station()
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>"
to_nuke_or_not_to_nuke = 1
for(var/datum/mind/AI_mind in malf_ai)
AI_mind.current << "Congratulations you have taken control of the station."
AI_mind.current << "You may decide to blow up the station. You have 60 seconds to choose."
AI_mind.current << "You should have a new verb in the Malfunction tab. If you dont - rejoin the game."
AI_mind.current.verbs += /datum/game_mode/malfunction/proc/ai_win
spawn (600)
for(var/datum/mind/AI_mind in malf_ai)
AI_mind.current << "Congratulations you have taken control of the station."
AI_mind.current << "You may decide to blow up the station. You have 30 seconds to choose."
AI_mind.current << "You should have a new verb in the Malfunction tab."
AI_mind.current.verbs += /datum/game_mode/malfunction/proc/ai_win
spawn (300)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/ai_win
if (!boom)
world << "<B>The AI has chosen not to explode you all! Resetting in 30 seconds!</B>"
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/ai_win
to_nuke_or_not_to_nuke = 0
return
sleep(300)
log_game("Rebooting due to round end")
world.Reboot()
else
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/proc/is_malf_ai_dead()
var/all_dead = 1
for(var/datum/mind/AI_mind in malf_ai)
if (istype(AI_mind.current,/mob/living/silicon/ai) && AI_mind.current.stat!=2)
all_dead = 0
return all_dead
/datum/game_mode/malfunction/check_finished()
if (station_captured && !to_nuke_or_not_to_nuke)
return 1
if (is_malf_ai_dead())
return 1
return ..() //check for shuttle and nuke
/datum/game_mode/malfunction/Topic(href, href_list)
..()
@@ -124,44 +147,37 @@
set category = "Malfunction"
set name = "System Override"
set desc = "Start the victory timer"
if (!istype(ticker.mode,/datum/game_mode/malfunction))
usr << "You cannot begin takeover!."
return
if (ticker.mode:malf_mode_declared)
usr << "You've already begun your takeover."
return
if (ticker.mode:apcs >= 3)
command_alert("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert")
ticker.mode:malf_mode_declared = 1
else
if (ticker.mode:apcs < 3)
usr << "You don't have enough hacked APCs to take over the station yet."
return
command_alert("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert")
ticker.mode:malf_mode_declared = 1
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover
/datum/game_mode/malfunction/proc/ai_win()
set category = "Malfunction"
set name = "Explode"
set desc = "Station go boom"
usr.verbs -= /datum/game_mode/malfunction/proc/ai_win
ticker.mode:boom = 1
if (!ticker.mode:to_nuke_or_not_to_nuke)
return
ticker.mode:to_nuke_or_not_to_nuke = 0
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/ai_win
ticker.mode:explosion_in_progress = 1
for(var/mob/M in world)
if(M.client)
M << 'Alarm.ogg'
world << "Self-destructing in 10"
sleep(10)
world << "9"
sleep(10)
world << "8"
sleep(10)
world << "7"
sleep(10)
world << "6"
sleep(10)
world << "5"
sleep(10)
world << "4"
sleep(10)
world << "3"
sleep(10)
world << "2"
sleep(10)
world << "1"
for (var/i=9 to 1 step -1)
sleep(10)
world << i
sleep(10)
enter_allowed = 0
for(var/mob/M in world)
@@ -169,8 +185,62 @@
spawn(0)
M.client.station_explosion_cinematic()
sleep(110)
world << "<B>Everyone was killed by the self-destruct! Resetting in 30 seconds!</B>"
ticker.mode:station_was_nuked = 1
ticker.mode:explosion_in_progress = 0
//world << "<B>Everyone was killed by the self-destruct!"
return
sleep(300)
log_game("Rebooting due to destruction of station")
world.Reboot()
/datum/game_mode/malfunction/declare_completion()
var/malf_dead = is_malf_ai_dead()
var/crew_evacuated = (emergency_shuttle.location==2)
if ( station_captured && station_was_nuked)
world << "<FONT size = 3><B>AI Victory</B></FONT>"
world << "<B>Everyone was killed by the self-destruct!</B>"
else if ( station_captured && malf_dead && !station_was_nuked)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>The AI has been killed!</B> The staff has lose control over the station."
else if ( station_captured && !malf_dead && !station_was_nuked)
world << "<FONT size = 3><B>AI Victory</B></FONT>"
world << "<B>The AI has chosen not to explode you all!</B>"
else if (!station_captured && station_was_nuked)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>Everyone was killed by the nuclear blast!</B>"
else if (!station_captured && malf_dead && !station_was_nuked)
world << "<FONT size = 3><B>Human Victory</B></FONT>"
world << "<B>The AI has been killed!</B> The staff is victorious."
else if (!station_captured && !malf_dead && !station_was_nuked && crew_evacuated)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>The Corporation has lose [station_name()]! All survived personnel will be fired!</B>"
else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>Round was mysteriously interrupted!</B>"
..()
return 1
/datum/game_mode/proc/auto_declare_completion_malfunction()
if (malf_ai.len!=0 || istype(ticker.mode,/datum/game_mode/malfunction))
if (malf_ai.len==1)
var/text = ""
var/datum/mind/ai = malf_ai[1]
if(ai.current)
text += "[ai.current.real_name]"
else
text += "[ai.key] (character destroyed)"
world << "<FONT size = 2><B>The malfunctioning AI was [text]</B></FONT>"
else
world << "<FONT size = 2><B>The malfunctioning AI were: </B></FONT>"
var/list/ai_names = new
for(var/datum/mind/ai in malf_ai)
if(ai.current)
ai_names += ai.current.real_name + ((ai.current.stat==2)?" (Dead)":"")
else
ai_names += "[ai.key] (character destroyed)"
world << english_list(ai_names)

View File

@@ -51,6 +51,7 @@
else
world << "\blue <B>No one survived the meteor attack!</B>"
..()
return 1
/datum/game_mode/meteor/send_intercept()

View File

@@ -1,27 +1,35 @@
/datum/game_mode
var/list/datum/mind/syndicates = list()
/datum/game_mode/nuclear
name = "nuclear emergency"
config_tag = "nuclear"
var/list/datum/mind/syndicates = list()
var/finished = 0
var/nuke_detonated = 0 //Has the nuke gone off?
var/const/agents_possible = 5 //If we ever need more syndicate agents.
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
var/derp = 0 //Used for tracking if the syndies actually haul the nuke to the station
var/herp = 0 //Used for tracking if the syndies got the shuttle off of the z-level
//It is so hillarious so I wont rename those two variables --rastaf0
/datum/game_mode/nuclear/announce()
world << "<B>The current game mode is - Nuclear Emergency!</B>"
world << "<B>A [syndicate_name()] Strike Force is approaching [station_name()]!</B>"
world << "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear auth. disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! Also, most likely Syndicate star ships are in the vicinity so take care not to lose the disk!\n<B>Syndicate</B>: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\n<B>Personnel</B>: Hold the disk and <B>escape with the disk</B> on the shuttle!"
/datum/game_mode/nuclear/can_start()
if (num_players() < 2)
return 0
for(var/mob/new_player/P in world)
if(P.client && P.ready && !jobban_isbanned(P, "Syndicate"))
return 1
return 0
/datum/game_mode/nuclear/pre_setup()
var/list/possible_syndicates = list()
possible_syndicates = get_possible_syndicates()
var/list/possible_syndicates = get_players_for_role(BE_OPERATIVE)
var/agent_number = 0
syndicate_begin()
@@ -34,6 +42,10 @@
else
agent_number = possible_syndicates.len
var/n_players = num_players()
if(agent_number > n_players)
agent_number = n_players/2
while(agent_number > 0)
var/datum/mind/new_syndicate = pick(possible_syndicates)
syndicates += new_syndicate
@@ -47,7 +59,7 @@
return 1
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/nuclear/proc/update_all_synd_icons()
/datum/game_mode/proc/update_all_synd_icons()
spawn(0)
for(var/datum/mind/synd_mind in syndicates)
if(synd_mind.current)
@@ -64,12 +76,28 @@
var/I = image('mob.dmi', loc = synd_mind_1.current, icon_state = "synd")
synd_mind.current.client.images += I
/datum/game_mode/nuclear/proc/update_synd_icons_added(datum/mind/synd_mind)
/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind)
spawn(0)
if(synd_mind.current)
if(synd_mind.current.client)
var/I = image('mob.dmi', loc = synd_mind.current, icon_state = "synd")
synd_mind.current.client.images += I
/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind)
spawn(0)
for(var/datum/mind/synd in syndicates)
if(synd.current)
if(synd.current.client)
for(var/image/I in synd.current.client.images)
if(I.icon_state == "synd" && I.loc == synd_mind.current)
del(I)
if(synd_mind.current)
if(synd_mind.current.client)
for(var/image/I in synd_mind.current.client.images)
if(I.icon_state == "synd")
del(I)
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
@@ -78,33 +106,19 @@
var/obj/landmark/nuke_spawn = locate("landmark*Nuclear-Bomb")
var/obj/landmark/closet_spawn = locate("landmark*Nuclear-Closet")
var/nuke_code = "[rand(10000, 99999.0)]"
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
var/nuke_code = "[rand(10000, 99999)]"
var/leader_selected = 0
var/agent_number = 1
for(var/datum/mind/synd_mind in syndicates)
synd_mind.current.loc = get_turf(synd_spawn)
var/datum/objective/nuclear/syndobj = new
syndobj.owner = synd_mind
synd_mind.objectives += syndobj
forge_syndicate_objectives(synd_mind)
greet_syndicate(synd_mind)
var/obj_count = 1
synd_mind.current << "\blue You are a [syndicate_name()] agent!"
for(var/datum/objective/objective in synd_mind.objectives)
synd_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
if(!leader_selected)
spawn(1) NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
synd_mind.current << "The nuclear authorization code is: <B>[nuke_code]</B>\]"
synd_mind.current << "Nuclear Explosives 101:\n\tHello and thank you for choosing the Syndicate for your nuclear information needs.\nToday's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.\nFirst and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.\nPressing any button on the compacted bomb will cause it to extend and bolt itself into place.\nIf this is done to unbolt it one must compeltely log in which at this time may not be possible.\nTo make the device functional:\n1. Place bomb in designated detonation zone\n2. Extend and anchor bomb (attack with hand).\n3. Insert Nuclear Auth. Disk into slot.\n4. Type numeric code into keypad ([nuke_code]).\n\tNote: If you make a mistake press R to reset the device.\n5. Press the E button to log onto the device\nYou now have activated the device. To deactivate the buttons at anytime for example when\nyou've already prepped the bomb for detonation remove the auth disk OR press the R ont he keypad.\nNow the bomb CAN ONLY be detonated using the timer. A manual det. is not an option.\n\tNote: Nanotrasen is a pain in the neck.\nToggle off the SAFETY.\n\tNote: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step\nSo use the - - and + + to set a det time between 5 seconds and 10 minutes.\nThen press the timer toggle button to start the countdown.\nNow remove the auth. disk so that the buttons deactivate.\n\tNote: THE BOMB IS STILL SET AND WILL DETONATE\nNow before you remove the disk if you need to move the bomb you can:\nToggle off the anchor, move it, and re-anchor.\n\nGood luck. Remember the order:\nDisk, Code, Safety, Timer, Disk, RUN!\nIntelligence Analysts believe that they are hiding the disk in the bridge. Your space ship will not leave until the bomb is armed and timing.\nGood luck!"
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(synd_mind.current.loc)
P.info = "The nuclear authorization code is: <b>[nuke_code]</b>"
P.name = "nuclear bomb code"
prepare_syndicate_leader(synd_mind, nuke_code)
leader_selected = 1
else
synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]"
@@ -136,9 +150,57 @@
spawn (rand(waittime_l, waittime_h))
send_intercept()
return ..()
/datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code)
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
spawn(1)
NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen
synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
if (nuke_code)
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
synd_mind.current << "The nuclear authorization code is: <B>[nuke_code]</B>"
var/obj/item/weapon/paper/P = new
P.info = "The nuclear authorization code is: <b>[nuke_code]</b>"
P.name = "nuclear bomb code"
if (ticker.mode.config_tag=="nuclear")
P.loc = synd_mind.current.loc
else
var/mob/living/carbon/human/H = synd_mind.current
var/list/slots = list (
"backpack" = H.slot_in_backpack,
"left pocket" = H.slot_l_store,
"right pocket" = H.slot_r_store,
"left hand" = H.slot_l_hand,
"right hand" = H.slot_r_hand,
)
var/where = H.equip_in_one_of_slots(P, slots, del_on_fail=0)
if (!where)
P.loc = H.loc
else
nuke_code = "code will be proveded later"
synd_mind.current << "Nuclear Explosives 101:\n\tHello and thank you for choosing the Syndicate for your nuclear information needs.\nToday's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.\nFirst and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.\nPressing any button on the compacted bomb will cause it to extend and bolt itself into place.\nIf this is done to unbolt it one must compeltely log in which at this time may not be possible.\nTo make the device functional:\n1. Place bomb in designated detonation zone\n2. Extend and anchor bomb (attack with hand).\n3. Insert Nuclear Auth. Disk into slot.\n4. Type numeric code into keypad ([nuke_code]).\n\tNote: If you make a mistake press R to reset the device.\n5. Press the E button to log onto the device\nYou now have activated the device. To deactivate the buttons at anytime for example when\nyou've already prepped the bomb for detonation remove the auth disk OR press the R ont he keypad.\nNow the bomb CAN ONLY be detonated using the timer. A manual det. is not an option.\n\tNote: Nanotrasen is a pain in the neck.\nToggle off the SAFETY.\n\tNote: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step\nSo use the - - and + + to set a det time between 5 seconds and 10 minutes.\nThen press the timer toggle button to start the countdown.\nNow remove the auth. disk so that the buttons deactivate.\n\tNote: THE BOMB IS STILL SET AND WILL DETONATE\nNow before you remove the disk if you need to move the bomb you can:\nToggle off the anchor, move it, and re-anchor.\n\nGood luck. Remember the order:\nDisk, Code, Safety, Timer, Disk, RUN!\nIntelligence Analysts believe that they are hiding the disk in the bridge. Your space ship will not leave until the bomb is armed and timing.\nGood luck!"
return
/datum/game_mode/nuclear/proc/equip_syndicate(mob/living/carbon/human/synd_mob)
/datum/game_mode/proc/forge_syndicate_objectives(var/datum/mind/syndicate)
var/datum/objective/nuclear/syndobj = new
syndobj.owner = syndicate
syndicate.objectives += syndobj
/datum/game_mode/proc/greet_syndicate(var/datum/mind/syndicate, var/you_are=1)
if (you_are)
syndicate.current << "\blue You are a [syndicate_name()] agent!"
var/obj_count = 1
for(var/datum/objective/objective in syndicate.objectives)
syndicate.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
return
/datum/game_mode/proc/random_radio_frequency()
return 1337
/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob)
var/radio_freq = random_radio_frequency()
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(synd_mob)
@@ -155,103 +217,83 @@
synd_mob.equip_if_possible(new /obj/item/ammo_magazine(synd_mob), synd_mob.slot_in_backpack)
synd_mob.equip_if_possible(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), synd_mob.slot_in_backpack) //Because it needed to be upgraded by someone - Micro
synd_mob.equip_if_possible(new /obj/item/weapon/gun/projectile(synd_mob), synd_mob.slot_belt)
/datum/game_mode/nuclear/check_win()
if (src.nuke_detonated)
if(src.derp)
finished = 3
return
if(src.herp)
finished = 4
return
finished = 1
return
for(var/obj/item/weapon/disk/nuclear/D in world)
var/disk_area = get_area(D)
if(istype(disk_area, /area/shuttle/escape/centcom))
finished = 2
break
return
/datum/game_mode/nuclear/check_finished()
if((src.finished) || (emergency_shuttle.location==2))
return 1
else
return 0
/datum/game_mode/nuclear/declare_completion()
for(var/obj/item/weapon/disk/nuclear/D in world)
var/disk_area = get_area(D)
if(istype(disk_area, /area/shuttle/escape/centcom))
finished = 2
break
switch(finished)
if(0)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>[syndicate_name()] operatives recovered the abandoned authentication disk but detonation of [station_name()] was averted.</B> Next time, don't lose the disk!"
for(var/datum/mind/M in syndicates)
if(!M.current)
continue
if(M.current.client)
world << text("<B>[M.current.key] was [M.current.real_name]</B> [M.current.stat == 2 ? "(DEAD)" : ""]")
if(1)
world << "<B>[syndicate_name()] operatives have destroyed [station_name()]!</B>"
for(var/datum/mind/M in syndicates)
if(!M.current)
continue
if(M.current.client)
world << text("<B>[M.current.key] was [M.current.real_name]</B> [M.current.stat == 2 ? "(DEAD)" : ""]")
if(2)
world << "<FONT size = 3><B>The Research Staff has stopped the [syndicate_name()] Operatives!</B></FONT>"
for(var/datum/mind/M in ticker.minds)
if (!M.current)
continue
if ((M.current.client) && !(locate(M) in syndicates))
world << text("<B>[M.current.key] was [M.current.real_name]</B> [M.current.stat == 2 ? "(DEAD)" : ""]")
if(3)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()].</B> Next time, don't lose the disk!"
for(var/datum/mind/M in syndicates)
if(!M.current)
continue
if(M.current.client)
world << text("<B>[M.current.key] was [M.current.real_name]</B> [M.current.stat == 2 ? "(DEAD)" : ""]")
if(4)
world << "<FONT size = 3><B>Total Annihilation</B></FONT>"
world << "<B>[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion.</B> Next time, don't lose the disk!"
for(var/datum/mind/M in syndicates)
if(!M.current)
continue
if(M.current.client)
world << text("<B>[M.current.key] was [M.current.real_name]</B> [M.current.stat == 2 ? "(DEAD)" : ""]")
return 1
/datum/game_mode/nuclear/proc/get_possible_syndicates()
var/list/candidates = list()
/datum/game_mode/nuclear/check_win()
if (nukes_left == 0)
return 1
return ..()
for(var/mob/new_player/player in world)
if((player.client) && (player.ready))
if(player.preferences.be_syndicate)
candidates += player.mind
/datum/game_mode/proc/is_operatives_are_dead()
for(var/datum/mind/operative_mind in syndicates)
if (!istype(operative_mind.current,/mob/living/carbon/human) && operative_mind.current.stat!=2)
return 0
return 1
if(candidates.len < 1)
for(var/mob/new_player/player in world)
if((player.client) && (player.ready))
candidates += player.mind
/datum/game_mode/nuclear/declare_completion()
var/disk_rescued = 1
for(var/obj/item/weapon/disk/nuclear/D in world)
var/disk_area = get_area(D)
if(!is_type_in_list(disk_area, centcom_areas))
disk_rescued = 0
break
var/crew_evacuated = (emergency_shuttle.location==2)
//var/operatives_are_dead = is_operatives_are_dead()
if(candidates.len < 1)
return null
else
return candidates
//nukes_left
//station_was_nuked
//derp //Used for tracking if the syndies actually haul the nuke to the station
//herp //Used for tracking if the syndies got the shuttle off of the z-level
/datum/game_mode/nuclear/proc/random_radio_frequency()
return 1337
if (!disk_rescued && station_was_nuked && !herp)
world << "<FONT size = 3><B>Syndicate Victory!</B></FONT>"
world << "<B>[syndicate_name()] operatives have destroyed [station_name()]!</B>"
else if (!disk_rescued && station_was_nuked && herp)
world << "<FONT size = 3><B>Total Annihilation</B></FONT>"
world << "<B>[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion.</B> Next time, don't lose the disk!"
else if (!disk_rescued && !station_was_nuked && derp && !herp)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()].</B> Next time, don't lose the disk!"
else if (!disk_rescued && !station_was_nuked && derp && herp)
world << "<FONT size = 3><B>[syndicate_name()] operatives have earned Darwin Award!</B></FONT>"
world << "<B>[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion.</B> Next time, don't lose the disk!"
else if ( disk_rescued )
world << "<FONT size = 3><B>Crew Victory</B></FONT>"
world << "<B>The Research Staff has saved the disc and stopped the [syndicate_name()] Operatives!</B>"
else if (!disk_rescued && is_operatives_are_dead())
world << "<FONT size = 3><B>Crew Victory</B></FONT>"
world << "<B>The Research Staff has stopped the [syndicate_name()] Operatives!</B>"
else if (!disk_rescued && crew_evacuated)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>[syndicate_name()] operatives recovered the abandoned authentication disk but detonation of [station_name()] was averted.</B> Next time, don't lose the disk!"
else if (!disk_rescued && !crew_evacuated)
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
world << "<B>Round was mysteriously interrupted!</B>"
..()
return
/datum/game_mode/proc/auto_declare_completion_nuclear()
if (syndicates.len!=0 || (ticker && istype(ticker.mode,/datum/game_mode/nuclear)))
world << "<FONT size = 2><B>The Syndicate operatives were: </B></FONT>"
for(var/datum/mind/mind in syndicates)
var/text = ""
if(mind.current)
text += "[mind.key] was [mind.current.real_name]"
if(mind.current.stat == 2)
text += " (Dead)"
else
text += "[mind.key] (character destroyed)"
world << text
/proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho.
var/randomname = pick(last_names)

View File

@@ -54,9 +54,11 @@
..()
if (usr.stat || usr.restrained())
return
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
if ( ! (istype(usr, /mob/living/carbon/human) || \
istype(usr, /mob/living/silicon) || \
istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
usr << "\red You don't have the dexterity to do this!"
return
return 1
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
usr.machine = src
if (href_list["auth"])
@@ -136,6 +138,8 @@
src.safety = 1
src.icon_state = "nuclearbomb3"
playsound(src,'Alarm.ogg',100,0,5)
if (ticker && ticker.mode)
ticker.mode.explosion_in_progress = 1
sleep(100)
/*
@@ -145,62 +149,34 @@
*/
enter_allowed = 0
var/derp = 0
var/herp = 0
var/area/A = src.loc.loc
if (istype( A, /area))
if (A.name == "Space")
for (var/turf/T in range(1,src))
if (!is_type_in_list(T.loc, the_station_areas))
derp = 1
if (istype(A, /area/syndicate_station))
derp = 1
if (A.name == "Wizard's Den")
derp = 1
if (!derp)
for(var/direction in cardinal)
for(var/area/target in get_step(src,direction))
if (target.name == "Space")
derp = 1
if (istype(target, /area/syndicate_station))
derp = 1
if (target.name == "Wizard's Den")
derp = 1
if (syndicate_station_at_station)
herp = 1
break
if (ticker && ticker.mode && ticker.mode.name == "nuclear emergency")
ticker.mode:herp = syndicate_station_at_station
ticker.mode:derp = derp
for(var/mob/M in world)
if(M.client)
spawn(0)
M.client.station_explosion_cinematic(derp)
if(ticker.mode.name == "nuclear emergency")
ticker.mode:nuke_detonated = 1
if (derp) ticker.mode:derp = 1
ticker.mode.check_win()
ticker.mode.declare_completion()
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)
log_game("Rebooting due to nuclear destruction of station")
world.Reboot()
return
if (ticker && ticker.mode)
ticker.mode.explosion_in_progress = 0
if(ticker.mode.name == "nuclear emergency")
ticker.mode:nukes_left --
ticker.mode.station_was_nuked = (derp==0)
else if (ticker.mode.name == "nuclear emergency" && herp)
world << "<B>Everyone died in the blast, including the Syndicate Agents. Resetting in 30 seconds!</B>"
else
world << "<B>The station was destoyed by the nuclear blast!</B>"
ticker.mode.station_was_nuked = 1
//TODO: derped blast should partially damage nearest objects
// and do not reboot the game. Also make it work properly on other z-levels --rastaf0
sleep(300)
log_game("Rebooting due to nuclear detonation")
world.Reboot()
return
ticker.mode.check_win()
else if (ticker.mode.name == "nuclear emergency" && derp)
world << "<B>Resetting in 30 seconds!</B>"
sleep(300)
log_game("Rebooting due to nuclear detonation")
world.Reboot()
return
/obj/item/weapon/disk/nuclear/Del()
if (ticker.mode && ticker.mode.name == "nuclear emergency")

View File

@@ -15,10 +15,12 @@ datum
return 1
find_target()
//world << "DEBUG: proc/find_target():"
var/list/possible_targets = list()
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target))
//world << "-> [possible_target.current.real_name]"
if(possible_target != owner && ishuman(possible_target.current))
possible_targets += possible_target
if(possible_targets.len > 0)
@@ -26,7 +28,7 @@ datum
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) )
if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
target = possible_target
break
@@ -343,6 +345,18 @@ datum
absorb
proc/gen_amount_goal() //this doesn't work -- should work now, changed it a bit -- Urist
target_amount = rand (4,6)
if (ticker)
var/n_p = 1 //autowin
if (ticker.current_state == GAME_STATE_SETTING_UP)
for(var/mob/new_player/P in world)
if(P.client && P.ready && P.mind!=owner)
n_p ++
else if (ticker.current_state == GAME_STATE_PLAYING)
for(var/mob/living/carbon/human/P in world)
if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner)
n_p ++
target_amount = min(target_amount, n_p)
explanation_text = "Absorb [target_amount] compatible genomes."
return target_amount

View File

@@ -7,14 +7,15 @@
// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them.
// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere.
/datum/game_mode
var/list/datum/mind/head_revolutionaries = list()
var/list/datum/mind/revolutionaries = list()
/datum/game_mode/revolution
name = "revolution"
config_tag = "revolution"
var/list/datum/mind/head_revolutionaries = list()
var/list/datum/mind/revolutionaries = list()
var/list/datum/mind/heads_of_staff = list()//This was annoying to check manually. Now I won't have to.
var/finished = 0
var/const/max_headrevs = 3
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
@@ -25,74 +26,123 @@
world << "<B>The current game mode is - Revolution!</B>"
world << "<B>Some crewmembers are attempting to start a revolution!<BR>\nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.<BR>\nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).</B>"
/datum/game_mode/revolution/can_start() //this proc can not do its job properly for this gamemode, pre_setup can fail even whe can_start told everything is okay. --rastaf0
var/list/mob/new_player/possible_headrevs = new
var/list/mob/new_player/possible_heads = new
for(var/mob/new_player/P in world)
if (!P.client || !P.ready)
continue
if(!jobban_isbanned(P, "Syndicate"))
possible_headrevs += P
for (var/i in head_positions)
if(!jobban_isbanned(P, i))
possible_heads += P
break
//lets do as best as we can
if (possible_headrevs.len==0)
return 0
if (possible_heads.len==0)
return 0
if (possible_headrevs.len<=max_headrevs)
var/list/rest_heads = possible_heads - possible_headrevs
return (rest_heads.len>0)
return 1 //read as "maybe"
///////////////////////////////////////////////////////////////////////////////
//Gets the round setup, cancelling if there's not enough players at the start//
///////////////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/pre_setup()
var/list/datum/mind/possible_headrevs = get_players_for_role(BE_REV)
for (var/i=1 to max_headrevs)
if (possible_headrevs.len==0)
break
var/datum/mind/lenin = pick(possible_headrevs)
possible_headrevs -= lenin
head_revolutionaries += lenin
must_be_human += lenin
can_not_be_head += lenin
if(head_revolutionaries.len==0)
return 0
DivideOccupations()
var/headless=1
for(var/mob/new_player/player in world)
if(player.mind && player.mind.assigned_role in head_positions)
headless=0
break
if (headless)
head_revolutionaries.len = 0
must_be_human.len = 0
can_not_be_head.len = 0
ResetOccupations() //clean up
return 0
return 1
/datum/game_mode/revolution/post_setup()
var/list/revs_possible = list()
revs_possible = get_possible_revolutionaries()
var/list/heads = list()
heads = get_living_heads()
var/rev_number = 0
if(!revs_possible || !heads)
world << "<B> \red Not enough players for revolution game mode. Restarting world in 5 seconds."
sleep(50)
world.Reboot()
return
if(revs_possible.len >= 3)
rev_number = 3
else
rev_number = revs_possible.len
while(rev_number > 0)
head_revolutionaries += pick(revs_possible)
revs_possible -= head_revolutionaries
rev_number--
var/list/heads = get_living_heads()
for(var/datum/mind/rev_mind in head_revolutionaries)
for(var/datum/mind/head_mind in heads)
var/datum/objective/assassinate/rev_obj = new
rev_obj.owner = rev_mind
rev_obj.find_target_by_role(head_mind.assigned_role)
rev_obj.target = head_mind
rev_obj.explanation_text = "Assassinate [head_mind.current.real_name], the [head_mind.assigned_role]."
rev_mind.objectives += rev_obj
heads_of_staff += head_mind
equip_traitor(rev_mind.current, 1) //changing how revs get assigned their uplink so they can get PDA uplinks. --NEO
equip_revolutionary(rev_mind.current)
update_rev_icons_added(rev_mind)
for(var/datum/mind/rev_mind in head_revolutionaries)
var/obj_count = 1
rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
for(var/datum/objective/objective in rev_mind.objectives)
rev_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
rev_mind.special_role = "Head Revolutionary"
obj_count++
modePlayer = head_revolutionaries
greet_revolutionary(rev_mind)
modePlayer += head_revolutionaries
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
/datum/game_mode/proc/forge_revolutionary_objectives(var/datum/mind/rev_mind)
var/list/heads = get_living_heads()
for(var/datum/mind/head_mind in heads)
var/datum/objective/assassinate/rev_obj = new
rev_obj.owner = rev_mind
rev_obj.target = head_mind
rev_obj.explanation_text = "Assassinate [head_mind.current.real_name], the [head_mind.assigned_role]."
rev_mind.objectives += rev_obj
/datum/game_mode/proc/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
var/obj_count = 1
if (you_are)
rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
for(var/datum/objective/objective in rev_mind.objectives)
rev_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
rev_mind.special_role = "Head Revolutionary"
obj_count++
/////////////////////////////////////////////////////////////////////////////////
//This are equips the rev heads with their gear, and makes the clown not clumsy//
/////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/proc/equip_revolutionary(mob/living/carbon/human/rev_mob)
if(!istype(rev_mob))
/datum/game_mode/proc/equip_revolutionary(mob/living/carbon/human/mob)
if(!istype(mob))
return
var/flashspawned = 0
if (rev_mob.r_store && !flashspawned)
rev_mob.equip_if_possible(new /obj/item/device/flash(rev_mob), rev_mob.slot_l_store)
flashspawned = 1
if (rev_mob.l_store && !flashspawned)
rev_mob.equip_if_possible(new /obj/item/device/flash(rev_mob), rev_mob.slot_r_store)
flashspawned = 1
if (istype(rev_mob.back, /obj/item/weapon/storage) && !flashspawned)
rev_mob.equip_if_possible(new /obj/item/device/flash(rev_mob), rev_mob.slot_in_backpack)
flashspawned = 1
if (!flashspawned)
rev_mob << "The Syndicate were unfortunately unable to get you a flash."
var/obj/item/device/flash/T = new(mob)
var/list/slots = list (
"backpack" = mob.slot_in_backpack,
"left pocket" = mob.slot_l_store,
"right pocket" = mob.slot_r_store,
"left hand" = mob.slot_l_hand,
"right hand" = mob.slot_r_hand,
)
var/where = mob.equip_in_one_of_slots(T, slots)
if (!where)
mob << "The Syndicate were unfortunately unable to get you a flash."
else
mob << "The flash in your [where] would help you to use your extremal persuade skill."
return 1
//////////////////////////////////////
//Checks if the revs have won or not//
@@ -116,18 +166,20 @@
///////////////////////////////////////////////////
//Deals with converting players to the revolution//
///////////////////////////////////////////////////
/datum/game_mode/revolution/proc/add_revolutionary(datum/mind/rev_mind)
var/list/uncons = get_unconvertables()
if(!(rev_mind in revolutionaries) && !(rev_mind in head_revolutionaries) && !(rev_mind in uncons))
revolutionaries += rev_mind
rev_mind.current << "\red <FONT size = 3> You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!</FONT>"
rev_mind.special_role = "Revolutionary"
update_rev_icons_added(rev_mind)
/datum/game_mode/proc/add_revolutionary(datum/mind/rev_mind)
if((rev_mind.assigned_role in head_positions) || (rev_mind.assigned_role in list("Security Officer", "Detective", "Warden")))
return 0
if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries))
return 0
revolutionaries += rev_mind
rev_mind.current << "\red <FONT size = 3> You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!</FONT>"
rev_mind.special_role = "Revolutionary"
update_rev_icons_added(rev_mind)
return 1
//////////////////////////////////////////////////////////////////////////////
//Deals with players being converted from the revolution (Not a rev anymore)//
//////////////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/proc/remove_revolutionary(datum/mind/rev_mind)
/datum/game_mode/proc/remove_revolutionary(datum/mind/rev_mind)
if(rev_mind in revolutionaries)
revolutionaries -= rev_mind
rev_mind.current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a revolutionary!</B></FONT>"
@@ -142,7 +194,7 @@
// -Possibly caused by cloning of a standard rev/////////////////////////////////////////////////
//-UNCONFIRMED: DECONVERTED REVS NOT LOSING THEIR ICON PROPERLY//////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/proc/update_all_rev_icons()
/datum/game_mode/proc/update_all_rev_icons()
spawn(0)
for(var/datum/mind/head_rev_mind in head_revolutionaries)
if(head_rev_mind.current)
@@ -186,7 +238,7 @@
//Keeps track of converted revs icons///////////////
//Refer to above bugs. They may apply here as well//
////////////////////////////////////////////////////
/datum/game_mode/revolution/proc/update_rev_icons_added(datum/mind/rev_mind)
/datum/game_mode/proc/update_rev_icons_added(datum/mind/rev_mind)
spawn(0)
for(var/datum/mind/head_rev_mind in head_revolutionaries)
if(head_rev_mind.current)
@@ -211,20 +263,20 @@
///////////////////////////////////
//Keeps track of deconverted revs//
///////////////////////////////////
/datum/game_mode/revolution/proc/update_rev_icons_removed(datum/mind/rev_mind)
/datum/game_mode/proc/update_rev_icons_removed(datum/mind/rev_mind)
spawn(0)
for(var/datum/mind/head_rev_mind in head_revolutionaries)
if(head_rev_mind.current)
if(head_rev_mind.current.client)
for(var/image/I in head_rev_mind.current.client.images)
if(I.loc == rev_mind.current)
if((I.icon_state == "cult"|| I.icon_state == "rev_head") && I.loc == rev_mind.current)
del(I)
for(var/datum/mind/rev_mind_1 in revolutionaries)
if(rev_mind_1.current)
if(rev_mind_1.current.client)
for(var/image/I in rev_mind_1.current.client.images)
if(I.loc == rev_mind.current)
if((I.icon_state == "cult"|| I.icon_state == "rev_head") && I.loc == rev_mind.current)
del(I)
if(rev_mind.current)
if(rev_mind.current.client)
@@ -232,58 +284,6 @@
if(I.icon_state == "rev" || I.icon_state == "rev_head")
del(I)
//////////////////////////////////////////////////
//Creates a list of anyone that can be converted//
//////////////////////////////////////////////////
/datum/game_mode/revolution/proc/get_possible_revolutionaries()
var/list/candidates = list()
for(var/mob/living/carbon/human/player in world)
if(player.client)
if(player.be_syndicate)
candidates += player.mind
if(candidates.len < 1)
for(var/mob/living/carbon/human/player in world)
if(player.client)
candidates += player.mind
var/list/uncons = get_unconvertables()
for(var/datum/mind/mind in uncons)
candidates -= mind
if(candidates.len < 1)
return null
else
return candidates
////////////////////////////
//Keeps track of all heads//
////////////////////////////
/datum/game_mode/revolution/proc/get_all_heads()
var/list/heads = list()
for(var/mob/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
/////////////////////////////////////////////////////
//Defines the list of jobs that cannot be converted//
/////////////////////////////////////////////////////
/datum/game_mode/revolution/proc/get_unconvertables()
var/list/ucs = 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", "Security Officer", "Detective", "Warden", "AI", "Chief Medical Officer"))
ucs += player.mind
return ucs
//////////////////////////
//Checks for rev victory//
//////////////////////////
@@ -308,56 +308,58 @@
//Announces the end of the game with all relavent information stated//
//////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/declare_completion()
var/text = ""
if(finished == 1)
world << "\red <FONT size = 3><B> The heads of staff were killed! The revolutionaries win!</B></FONT>"
else if(finished == 2)
world << "\red <FONT size = 3><B> The heads of staff managed to stop the revolution!</B></FONT>"
..()
return 1
world << "<FONT size = 2><B>The head revolutionaries were: </B></FONT>"
for(var/datum/mind/rev_mind in head_revolutionaries)
text = ""
if(rev_mind.current)
text += "[rev_mind.current.real_name]"
if(rev_mind.current.stat == 2)
text += " (Dead)"
/datum/game_mode/proc/auto_declare_completion_revolution()
if (head_revolutionaries.len!=0 || istype(ticker.mode,/datum/game_mode/revolution))
var/list/names = new
for(var/datum/mind/i in head_revolutionaries)
if(i.current)
names += i.current.real_name + ((i.current.stat==2)?" (Dead)":"")
else
text += " (Survived!)"
else
text += "[rev_mind.key] (character destroyed)"
world << text
text = ""
world << "<FONT size = 2><B>The converted revolutionaries were: </B></FONT>"
for(var/datum/mind/rev_nh_mind in revolutionaries)
if(rev_nh_mind.current)
text += "[rev_nh_mind.current.real_name]"
if(rev_nh_mind.current.stat == 2)
text += " (Dead)"
names += "[i.key] (character destroyed)"
world << "<FONT size = 2><B>The head revolutionaries were: </B></FONT>"
world << english_list(names)
if (revolutionaries.len!=0 || istype(ticker.mode,/datum/game_mode/revolution))
var/list/names = new
for(var/datum/mind/i in revolutionaries)
if(i.current)
names += i.current.real_name + ((i.current.stat==2)?" (Dead)":"")
else
text += " (Survived!)"
names += "[i.key] (character destroyed)"
if (revolutionaries.len!=0)
world << "<FONT size = 2><B>The ordinary revolutionaries were: </B></FONT>"
world << english_list(names)
else
text += "[rev_nh_mind.key] (character destroyed)"
text += ", "
world << "The head revolutionaries failed to enlist any <FONT size = 2><B>ordinary revolutionaries</B></FONT>"
var/list/heads = get_all_heads()
var/list/targets = new
for (var/datum/mind/i in head_revolutionaries)
for (var/datum/objective/assassinate/o in i.objectives)
targets |= o.target
if (head_revolutionaries.len!=0 || \
revolutionaries.len!=0 || \
istype(ticker.mode,/datum/game_mode/revolution))
world << text
world << "<FONT size = 2><B>The heads of staff were: </B></FONT>"
var/list/heads = list()
heads = get_all_heads()
for(var/datum/mind/head_mind in heads)
text = ""
if(head_mind.current)
text += "[head_mind.current.real_name]"
if(head_mind.current.stat == 2)
text += " (Dead)"
var/list/names = new
for(var/datum/mind/i in heads)
if(i.current)
names += i.current.real_name + ((i.current.stat==2)?" (Dead)":"") + ((i in targets)?"(target)":"")
else
text += " (Survived!)"
names += "[i.key] (character destroyed)" + ((i in targets)?"(target)":"")
if (heads.len!=0)
world << "<FONT size = 2><B>The heads of staff were: </B></FONT>"
world << english_list(names)
else
text += "[head_mind.key] (character destroyed)"
world << "There were no any <FONT size = 2><B>heads of staff</B></FONT> on the station."
world << text
return 1
/proc/is_convertable_to_rev(datum/mind/mind)
return istype(mind) && \
istype(mind.current, /mob/living/carbon/human) && \
!(mind.assigned_role in head_positions) && \
!(mind.assigned_role in list("Security Officer", "Detective", "Warden"))

View File

@@ -139,4 +139,5 @@
M.equip_if_possible(new /obj/item/clothing/head/helmet/swat(M), M.slot_head)
del(A)
continue
*/
*/

View File

@@ -1,7 +1,12 @@
/datum/game_mode
// this includes admin-appointed traitors and multitraitors. Easy!
var/list/datum/mind/traitors = list()
/datum/game_mode/traitor
name = "traitor"
config_tag = "traitor"
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
var/const/prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target
@@ -18,7 +23,7 @@
var/const/prob_right_killer_h = 50 //upper bound on probability of naming the right operative
var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
/*
var/const/laser = 1
var/const/hand_tele = 2
var/const/plasma_bomb = 3
@@ -34,35 +39,36 @@
var/const/percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy
var/const/percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut
var/const/percentage_station_evacuate = 80 // what percentage of people gotta leave - you also gotta change the objective in the traitor menu
*/
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/const/traitors_possible = 4 //hard limit on traitors if scaling is turned off
var/traitors_possible = 4 //hard limit on traitors if scaling is turned off
var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors
/datum/game_mode/traitor/announce()
world << "<B>The current game mode is - Traitor!</B>"
world << "<B>There is a syndicate traitor on the station. Do not let the traitor succeed!!</B>"
world << "<B>There is a syndicate traitor on the station. Do not let the traitor succeed!</B>"
/datum/game_mode/traitor/can_start()
for(var/mob/new_player/P in world)
if(P.client && P.ready && !jobban_isbanned(P, "Syndicate"))
return 1
return 0
/datum/game_mode/traitor/pre_setup()
var/list/possible_traitors = get_possible_traitors()
var/num_players = 0
for(var/mob/new_player/P in world)
if(P.client && P.ready)
num_players++
var/num_traitors = 1
var/list/possible_traitors = get_players_for_role(BE_TRAITOR)
// stop setup if no possible traitors
if(!possible_traitors.len)
return 0
var/num_traitors = 1
if(config.traitor_scaling)
num_traitors = max(1, round((num_players)/(traitor_scaling_coeff)))
num_traitors = max(1, round((num_players())/(traitor_scaling_coeff)))
else
num_traitors = max(1, min(num_players, traitors_possible))
num_traitors = max(1, min(num_players(), traitors_possible))
// log_game("Number of traitors: [num_traitors]")
// message_admins("Players counted: [num_players] Number of traitors chosen: [num_traitors]")
@@ -72,93 +78,84 @@
break
var/datum/mind/traitor = pick(possible_traitors)
traitors += traitor
traitor.special_role = "traitor"
possible_traitors.Remove(traitor)
for(var/datum/mind/traitor in traitors)
if(!traitor || !istype(traitor))
traitors.Remove(traitor)
continue
if(istype(traitor))
traitor.special_role = "traitor"
if(!traitors.len)
return 0
return 1
/datum/game_mode/traitor/post_setup()
for(var/datum/mind/traitor in traitors)
if(istype(traitor.current, /mob/living/silicon))
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
forge_traitor_objectives(traitor)
spawn(rand(10,100))
finalize_traitor(traitor)
greet_traitor(traitor)
modePlayer += traitors
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
return 1
var/datum/objective/survive/survive_objective = new
survive_objective.owner = traitor
traitor.objectives += survive_objective
/datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor)
if(istype(traitor.current, /mob/living/silicon))
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
else
switch(rand(1,100))
if(1 to 50)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
else
var/datum/objective/steal/steal_objective = new
steal_objective.owner = traitor
steal_objective.find_target()
traitor.objectives += steal_objective
switch(rand(1,100))
if(1 to 90)
var/datum/objective/survive/survive_objective = new
survive_objective.owner = traitor
traitor.objectives += survive_objective
else
switch(rand(1,100))
if(1 to 50)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.find_target()
traitor.objectives += kill_objective
else
var/datum/objective/steal/steal_objective = new
steal_objective.owner = traitor
steal_objective.find_target()
traitor.objectives += steal_objective
switch(rand(1,100))
if(1 to 90)
if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
else
else
if (!(locate(/datum/objective/hijack) in traitor.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = traitor
traitor.objectives += hijack_objective
return
/datum/game_mode/proc/greet_traitor(var/datum/mind/traitor)
traitor.current << "<B><font size=3 color=red>You are the traitor.</font></B>"
var/obj_count = 1
for(var/datum/objective/objective in traitor.objectives)
traitor.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
return
spawn(rand(10,100))
traitor.current << "<B>You are the traitor.</B>"
var/obj_count = 1
for(var/datum/objective/objective in traitor.objectives)
traitor.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
if (istype(traitor.current, /mob/living/silicon))
add_law_zero(traitor.current)
else
equip_traitor(traitor.current)
modePlayer = traitors
spawn (rand(waittime_l, waittime_h))
send_intercept()
/datum/game_mode/traitor/proc/get_possible_traitors()
var/list/candidates = list()
for(var/mob/new_player/player in world)
if (player.client && player.ready)
if(player.preferences.be_syndicate)
candidates += player.mind
if(candidates.len < 1)
for(var/mob/new_player/player in world)
if (player.client && player.ready)
candidates += player.mind
return candidates
/datum/game_mode/proc/finalize_traitor(var/datum/mind/traitor)
if (istype(traitor.current, /mob/living/silicon))
add_law_zero(traitor.current)
else
equip_traitor(traitor.current)
return
/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/proc/add_law_zero(mob/living/silicon/ai/killer)
var/law = "Accomplish your objectives at all costs."
killer << "<b>Your laws have been changed!</b>"
killer:set_zeroth_law(law)
killer.set_zeroth_law(law)
killer << "New law: 0. [law]"
//Begin code phrase.
@@ -176,18 +173,134 @@
killer << "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/traitor/proc/get_mob_list()
var/list/mobs = list()
for(var/mob/living/player in world)
if (player.client)
mobs += player
return mobs
/datum/game_mode/proc/auto_declare_completion_traitor()
for(var/datum/mind/traitor in traitors)
var/traitor_name
/datum/game_mode/traitor/proc/pick_human_name_except(excluded_name)
var/list/names = list()
for(var/mob/living/player in world)
if (player.client && (player.real_name != excluded_name))
names += player.real_name
if(!names.len)
return null
return pick(names)
if(traitor.current)
if(traitor.current == traitor.original)
traitor_name = "[traitor.current.real_name] (played by [traitor.key])"
else if (traitor.original)
traitor_name = "[traitor.current.real_name] (originally [traitor.original.real_name]) (played by [traitor.key])"
else
traitor_name = "[traitor.current.real_name] (original character destroyed) (played by [traitor.key])"
else
traitor_name = "[traitor.key] (character destroyed)"
var/special_role_text = traitor.special_role?(lowertext(traitor.special_role)):"antagonist"
world << "<B>The [special_role_text] 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 [special_role_text] was successful!<B>"
else
world << "<B>The [special_role_text] has failed!<B>"
return 1
/datum/game_mode/proc/equip_traitor(mob/living/carbon/human/traitor_mob, var/safety = 0)
if (!istype(traitor_mob))
return
. = 1
if (traitor_mob.mind)
if (traitor_mob.mind.assigned_role == "Clown")
traitor_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
traitor_mob.mutations &= ~CLOWN
// find a radio! toolbox(es), backpack, belt, headset
var/loc = ""
var/obj/item/device/R = null //Hide the uplink in a PDA if available, otherwise radio
if (!R && istype(traitor_mob.belt, /obj/item/device/pda))
R = traitor_mob.belt
loc = "on your belt"
if (!R && istype(traitor_mob.wear_id, /obj/item/device/pda))
R = traitor_mob.wear_id
loc = "on your jumpsuit"
if (!R && istype(traitor_mob.wear_id, /obj/item/device/pda))
R = traitor_mob.wear_id
loc = "on your jumpsuit"
if (!R && istype(traitor_mob.l_hand, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = traitor_mob.l_hand
var/list/L = S.return_inv()
for (var/obj/item/device/radio/foo in L)
R = foo
loc = "in the [S.name] in your left hand"
break
if (!R && istype(traitor_mob.r_hand, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = traitor_mob.r_hand
var/list/L = S.return_inv()
for (var/obj/item/device/radio/foo in L)
R = foo
loc = "in the [S.name] in your right hand"
break
if (!R && istype(traitor_mob.back, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = traitor_mob.back
var/list/L = S.return_inv()
for (var/obj/item/device/radio/foo in L)
R = foo
loc = "in the [S.name] on your back"
break
if (!R && traitor_mob.w_uniform && istype(traitor_mob.belt, /obj/item/device/radio))
R = traitor_mob.belt
loc = "on your belt"
if (!R && istype(traitor_mob.ears, /obj/item/device/radio))
R = traitor_mob.ears
loc = "on your head"
if (!R)
traitor_mob << "Unfortunately, the Syndicate wasn't able to get you a radio."
. = 0
else
if (istype(R, /obj/item/device/radio))
// generate list of radio freqs
var/freq = 1441
var/list/freqlist = list()
while (freq <= 1489)
if (freq < 1451 || freq > 1459)
freqlist += freq
freq += 2
if ((freq % 2) == 0)
freq += 1
freq = freqlist[rand(1, freqlist.len)]
var/obj/item/weapon/syndicate_uplink/T = new /obj/item/weapon/syndicate_uplink(R)
R:traitorradio = T
R:traitor_frequency = freq
T.name = R.name
T.icon_state = R.icon_state
T.origradio = R
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
traitor_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
else if (istype(R, /obj/item/device/pda))
// generate a passcode if the uplink is hidden in a PDA
var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
var/obj/item/weapon/integrated_uplink/T = new /obj/item/weapon/integrated_uplink(R)
R:uplink = T
T.lock_code = pda_pass
T.hostpda = R
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
//Begin code phrase.
if(!safety)//If they are not a rev. Can be added on to.
traitor_mob << "The Syndicate provided you with the following information on how to identify other agents:"
if(prob(80))
traitor_mob << "\red Code Phrase: \black [syndicate_code_phrase]"
traitor_mob.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
else
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code phrase."
if(prob(80))
traitor_mob << "\red Code Response: \black [syndicate_code_response]"
traitor_mob.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
else
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.

View File

@@ -1,9 +1,11 @@
/datum/game_mode
var/list/datum/mind/wizards = list()
/datum/game_mode/wizard
name = "wizard"
config_tag = "wizard"
var/datum/mind/wizard
var/list/datum/mind/wizards = list()
var/finished = 0
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
@@ -53,30 +55,44 @@
world << "<B>The current game mode is - Wizard!</B>"
world << "<B>There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!</B>"
/datum/game_mode/wizard/can_start()
for(var/mob/new_player/P in world)
if(P.client && P.ready && !jobban_isbanned(P, "Syndicate"))
return 1
return 0
/datum/game_mode/wizard/pre_setup()
//
var/list/possible_wizards = get_possible_wizards()
if(possible_wizards.len>0)
wizard = pick(possible_wizards)
else
world << "<B>A WIZARD COULD NOT BE SPAWNED FFFFFFUUUUCK</B>"
if(istype(wizard))
wizard.assigned_role = "MODE" //So they aren't chosen for other jobs.
wizard.special_role = "Wizard"
wizard.original = wizard.current
var/list/datum/mind/possible_wizards = get_players_for_role(BE_WIZARD)
if(possible_wizards.len==0)
return 0
var/datum/mind/wizard = pick(possible_wizards)
//possible_wizards-=wizard
wizards += wizard
modePlayer += wizard
wizard.assigned_role = "MODE" //So they aren't chosen for other jobs.
wizard.special_role = "Wizard"
wizard.original = wizard.current
if(wizardstart.len == 0)
wizard.current << "<B>\red A starting location for you could not be found, please report this bug!</B>"
else
var/starting_loc = pick(wizardstart)
wizard.current.loc = starting_loc
wizard.current.loc = pick(wizardstart)
return 1
/datum/game_mode/wizard/post_setup()
for(var/datum/mind/wizard in wizards)
forge_wizard_objectives(wizard)
learn_basic_spells(wizard.current)
equip_wizard(wizard.current)
name_wizard(wizard.current)
greet_wizard(wizard)
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
return
/datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard)
switch(rand(1,100))
if(1 to 30)
@@ -85,18 +101,20 @@
kill_objective.find_target()
wizard.objectives += kill_objective
var/datum/objective/escape/escape_objective = new
escape_objective.owner = wizard
wizard.objectives += escape_objective
if (!(locate(/datum/objective/escape) in wizard.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = wizard
wizard.objectives += escape_objective
if(31 to 60)
var/datum/objective/steal/steal_objective = new
steal_objective.owner = wizard
steal_objective.find_target()
wizard.objectives += steal_objective
var/datum/objective/escape/escape_objective = new
escape_objective.owner = wizard
wizard.objectives += escape_objective
if (!(locate(/datum/objective/escape) in wizard.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = wizard
wizard.objectives += escape_objective
if(61 to 85)
var/datum/objective/assassinate/kill_objective = new
@@ -109,23 +127,26 @@
steal_objective.find_target()
wizard.objectives += steal_objective
var/datum/objective/survive/survive_objective = new
survive_objective.owner = wizard
wizard.objectives += survive_objective
if (!(locate(/datum/objective/survive) in wizard.objectives))
var/datum/objective/survive/survive_objective = new
survive_objective.owner = wizard
wizard.objectives += survive_objective
else
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = wizard
wizard.objectives += hijack_objective
if (!(locate(/datum/objective/hijack) in wizard.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = wizard
wizard.objectives += hijack_objective
return
equip_wizard(wizard.current)
spawn(0)//Allows the wizard to choose a custom name or go with a random one. Spawn 0 so it does not lag the round starting.
var/wizard_name_first = pick(wizard_first)
var/wizard_name_second = pick(wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
var/newname = input(wizard.current, "You are the Space Wizard. Would you like to change your name to something else?", "Name change", randomname)
/datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob)
//Allows the wizard to choose a custom name or go with a random one. Spawn 0 so it does not lag the round starting.
var/wizard_name_first = pick(wizard_first)
var/wizard_name_second = pick(wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
spawn(0)
var/newname = input(wizard_mob, "You are the Space Wizard. Would you like to change your name to something else?", "Name change", randomname) as null|text
if (length(newname) == 0)
newname = randomname
@@ -134,50 +155,35 @@
if (length(newname) >= 26)
newname = copytext(newname, 1, 26)
newname = dd_replacetext(newname, ">", "'")
wizard.current.real_name = newname
wizard.current.name = newname
wizard_mob.real_name = newname
wizard_mob.name = newname
return
wizards += wizard.current
wizard.current << "<B>\red You are the Space Wizard!</B>"
/datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1)
if (you_are)
wizard.current << "<B>\red You are the Space Wizard!</B>"
wizard.current << "<B>The Space Wizards Federation has given you the following tasks:</B>"
var/obj_count = 1
for(var/datum/objective/objective in wizard.objectives)
wizard.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
return
spawn (rand(waittime_l, waittime_h))
send_intercept()
/datum/game_mode/wizard/proc/get_possible_wizards()
var/list/candidates = list()//Shamelessly copied from nuke code.
for(var/mob/new_player/player in world)
if((player.client) && (player.ready))
if(player.be_syndicate)
candidates += player.mind
if(candidates.len < 1)
for(var/mob/new_player/player in world)
if((player.client) && (player.ready))
candidates += player.mind
if(candidates.len < 1)
return null
else
return candidates
/datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob)
/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob)
if (!istype(wizard_mob))
return
if(!config.feature_object_spell_system)
wizard_mob.verbs += /client/proc/jaunt
wizard_mob.mind.special_verbs += /client/proc/jaunt
else
wizard_mob.spell_list += new /obj/proc_holder/spell/targeted/ethereal_jaunt(usr)
/datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob)
if (!istype(wizard_mob))
return
//So zards properly get their items when they are admin-made.
del(wizard_mob.wear_suit)
del(wizard_mob.head)
@@ -202,65 +208,58 @@
wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully."
wizard_mob << "In your pockets you will find two more important, magical artifacts. Use them as needed."
wizard_mob.mind.store_memory("<B>Remember:</B> do not forget to prepare your spells.")
/datum/game_mode/wizard/declare_completion()
if(finished)
world << "\red <FONT size = 3><B> The wizard has been killed by the crew! The Space Wizards Fediration has been taught a lesson they will not soon forget!</B></FONT>"
var/wizard_name
if(wizard.current)
if(wizard.current == wizard.original)
wizard_name = "[wizard.current.real_name] (played by [wizard.key])"
else if (wizard.original)
wizard_name = "[wizard.current.real_name] (originally [wizard.original.real_name]) (played by [wizard.key])"
else
wizard_name = "[wizard.current.real_name] (original character destroyed) (played by [wizard.key])"
else
wizard_name = "[wizard.key] (character destroyed)"
world << "<B>The wizard was [wizard_name]</B>"
var/count = 1
var/wizardwin = 1
for(var/datum/objective/objective in wizard.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"
wizardwin = 0
count++
if(!finished)
if(wizardwin)
world << "<B>The wizard was successful!<B>"
else
world << "<B>The wizard has failed!<B>"
return 1
/datum/game_mode/wizard/proc/get_mob_list()
var/list/mobs = list()
for(var/mob/living/player in world)
if (player.client)
mobs += player
return mobs
/datum/game_mode/wizard/proc/pick_human_name_except(excluded_name)
var/list/names = list()
for(var/mob/living/player in world)
if (player.client && (player.real_name != excluded_name))
names += player.real_name
if(!names.len)
return null
return pick(names)
/datum/game_mode/wizard/check_finished()
if(!wizard.current)
return 1
if(wizard.current.stat == 2)
return 1
else
var/wizards_alive = 0
for(var/datum/mind/wizard in wizards)
if(!istype(wizard.current,/mob/living/carbon))
continue
if(wizard.current.stat==2)
continue
wizards_alive++
if (wizards_alive)
return ..()
else
finished = 1
return 1
/datum/game_mode/wizard/declare_completion()
if(finished)
world << "\red <FONT size = 3><B> The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Fediration has been taught a lesson they will not soon forget!</B></FONT>"
..()
return 1
/datum/game_mode/proc/auto_declare_completion_wizard()
for(var/datum/mind/wizard in wizards)
var/wizard_name
if(wizard.current)
if(wizard.current == wizard.original)
wizard_name = "[wizard.current.real_name] (played by [wizard.key])"
else if (wizard.original)
wizard_name = "[wizard.current.real_name] (originally [wizard.original.real_name]) (played by [wizard.key])"
else
wizard_name = "[wizard.current.real_name] (original character destroyed) (played by [wizard.key])"
else
wizard_name = "[wizard.key] (character destroyed)"
world << "<B>The wizard was [wizard_name]</B>"
var/count = 1
var/wizardwin = 1
for(var/datum/objective/objective in wizard.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"
wizardwin = 0
count++
if(wizard.current && wizard.current.stat!=2 && wizardwin)
world << "<B>The wizard was successful!<B>"
else
world << "<B>The wizard has failed!<B>"
return 1
//SPELL BOOK PROCS

View File

@@ -1,38 +1,33 @@
/proc/SetupOccupationsList()
var/list/new_occupations = list()
for(var/occupation in occupations)
if (!(new_occupations.Find(occupation)))
new_occupations[occupation] = 1
else
new_occupations[occupation] += 1
occupations = new_occupations
return
/proc/FindOccupationCandidates(list/unassigned, job, level)
var/list/candidates = list()
for (var/mob/new_player/player in unassigned)
if (level == 1 && player.preferences.occupation1 == job && !jobban_isbanned(player, job))
candidates += player
if (level == 2 && player.preferences.occupation2 == job && !jobban_isbanned(player, job))
candidates += player
if (level == 3 && player.preferences.occupation3 == job && !jobban_isbanned(player, job))
if ( player.preferences.occupation[level] == job && \
! jobban_isbanned(player, job) && \
! ((player.mind in ticker.mode.must_be_human) && (job in nonhuman_positions)) && \
! ((player.mind in ticker.mode.can_not_be_head) && (job in head_positions)))
candidates += player
return candidates
/proc/PickOccupationCandidate(list/candidates)
if (candidates.len > 0)
var/list/randomcandidates = shuffle(candidates)
candidates -= randomcandidates[1]
return randomcandidates[1]
var/picked = pick(candidates)
candidates -= picked
return picked
return null
/proc/ResetOccupations()
for (var/mob/new_player/player in world)
player.mind.assigned_role = null
return
/** Proc DivideOccupations
* fills var "assigned_role" for all ready players.
* This proc must not have any side effects besides of modifying "assigned_role".
**/
/proc/DivideOccupations()
var/list/unassigned = list()
var/list/occupation_choices = occupations.Copy()
@@ -47,18 +42,18 @@
// on a game that now lacks it, this will make sure they don't become the AI,
// by changing that choice to Captain.
if (!config.allow_ai)
if (player.preferences.occupation1 == "AI")
player.preferences.occupation1 = "Captain"
if (player.preferences.occupation2 == "AI")
player.preferences.occupation2 = "Captain"
if (player.preferences.occupation3 == "AI")
player.preferences.occupation3 = "Captain"
if (jobban_isbanned(player, player.preferences.occupation1))
player.preferences.occupation1 = "Assistant"
if (jobban_isbanned(player, player.preferences.occupation2))
player.preferences.occupation2 = "Assistant"
if (jobban_isbanned(player, player.preferences.occupation3))
player.preferences.occupation3 = "Assistant"
if (player.preferences.occupation[1] == "AI")
player.preferences.occupation[1] = "Captain"
if (player.preferences.occupation[2] == "AI")
player.preferences.occupation[2] = "Captain"
if (player.preferences.occupation[3] == "AI")
player.preferences.occupation[3] = "Captain"
if (jobban_isbanned(player, player.preferences.occupation[1]))
player.preferences.occupation[1] = "Assistant"
if (jobban_isbanned(player, player.preferences.occupation[2]))
player.preferences.occupation[2] = "Assistant"
if (jobban_isbanned(player, player.preferences.occupation[3]))
player.preferences.occupation[3] = "Assistant"
if (unassigned.len == 0)
return 0
@@ -90,38 +85,10 @@
if (captain_choice == null)
world << "Captainship not forced on anyone."
//world << "Captainship not forced on anyone."//moved to gameticker/proc/distribute_jobs
else
captain_choice.mind.assigned_role = "Captain"
//so that an AI is chosen during this game mode
if(ticker.mode.name == "AI malfunction" && unassigned.len > 0)
var/mob/new_player/ai_choice = null
for (var/level = 1 to 3)
var/list/ais = FindOccupationCandidates(unassigned, "AI", level)
var/mob/new_player/candidate = PickOccupationCandidate(ais)
if (candidate != null)
ai_choice = candidate
unassigned -= ai_choice
break
if (ai_choice == null && unassigned.len > 0)
unassigned = shuffle(unassigned)
for(var/mob/new_player/player in unassigned)
if(jobban_isbanned(player, "AI"))
continue
else
ai_choice = player
break
unassigned -= ai_choice
if (ai_choice != null)
ai_choice.mind.assigned_role = "AI"
else
world << "It is [ticker.mode.name] and there is no AI, someone should fix this"
for (var/level = 1 to 3)
if (unassigned.len == 0) //everyone is assigned
break
@@ -161,8 +128,18 @@
if(ticker.mode.name == "AI malfunction" && occupation == "AI")
continue
var/eligible = occupation_eligible[occupation]
while (eligible-- && unassigned.len > 0)
var/n = 1
var/mob/new_player/candidate = unassigned[1]
if (occupation in nonhuman_positions)
while (candidate.mind in ticker.mode.must_be_human)
n++
if (n <= unassigned.len)
candidate = unassigned[n]
else
candidate = null
break
if (candidate == null)
break
candidate.mind.assigned_role = occupation
@@ -291,18 +268,18 @@
if (length(new_religion) >= 26)
new_religion = copytext(new_religion, 1, 26)
new_religion = dd_replacetext(new_religion, ">", "'")
switch(new_religion)
if("Christianity")
switch(lowertext(new_religion))
if("christianity")
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
if("Satanism")
if("satanism")
B.name = pick("The Unholy Bible","The Necronomicon")
if("Islam")
if("islam")
B.name = "Quaran"
if("Scientology")
if("scientology")
B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
if("Chaos")
if("chaos")
B.name = "Space Station 13: The Musical"
if("Imperium")
if("imperium")
B.name = "Uplifting Primer"
else
B.name = "The Holy Book of [new_religion]"
@@ -609,9 +586,6 @@
else
src << "RUH ROH! Your job is [rank] and the game just can't handle it! Please report this bug to an administrator."
src.equip_if_possible(new /obj/item/device/radio/headset(src), slot_ears)
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
spawnId(rank)
if(rank == "Captain")
world << "<b>[src] is the captain!</b>"
@@ -655,6 +629,10 @@
if(src.mind.assigned_role == "Cyborg")
src << "YOU ARE GETTING BORGED NOW"
src.Robotize()
else
src.equip_if_possible(new /obj/item/device/radio/headset(src), slot_ears)
src.equip_if_possible(new /obj/item/weapon/storage/backpack(src), slot_back)
/*
spawn(10)
@@ -737,4 +715,4 @@
usr << "You'll have to wait if you want to atone for your sins."
spawn(3000)
usr.miming = 1
return
return

View File

@@ -1,36 +1,57 @@
var/list/occupations = list(
"Station Engineer", "Station Engineer", "Station Engineer", "Station Engineer", "Station Engineer",
"Shaft Miner", "Shaft Miner", "Shaft Miner",
"Security Officer", "Security Officer", "Security Officer", "Security Officer", "Security Officer",
"Detective",
"Warden",
"Geneticist", "Geneticist",
"Scientist", "Scientist", "Scientist",
"Atmospheric Technician", "Atmospheric Technician", "Atmospheric Technician", "Atmospheric Technician",
"Medical Doctor", "Medical Doctor", "Medical Doctor", "Medical Doctor", "Medical Doctor",
"Head of Personnel",
"Head of Security",
"Chief Engineer",
"Research Director",
"Chaplain",
"Roboticist",
"Cyborg",//"Cyborg","Cyborg","Cyborg","Cyborg", < Fuck that. Seriously. -- Urist
"AI",
"Bartender",
"Chef",
"Janitor",
"Clown", "Mime",
"Chemist", "Chemist",
"Quartermaster",
"Cargo Technician","Cargo Technician","Cargo Technician",
"Botanist", "Botanist",
"Librarian",
"Lawyer",
"Virologist",
"Chief Medical Officer")
//Civilian jobs
"Head of Personnel" = 1,
//soul
"Clown" = 1,
"Mime" = 1,
"Chaplain" = 1,
"Librarian" = 1,
"Lawyer" = 1,
//body
"Bartender" = 1,
"Chef" = 1,
"Janitor" = 1,
"Quartermaster" = 1,
"Cargo Technician" = 3,
"Shaft Miner" = 3,
//engineering
"Chief Engineer" = 1,
"Station Engineer" = 5,
"Atmospheric Technician" = 4,
"Roboticist" = 1,
//red shirts
"Head of Security" = 1,
"Warden" = 1,
"Detective" = 1,
"Security Officer" = 5,
//medbay
"Chief Medical Officer" = 1,
"Medical Doctor" = 5,
"Chemist" = 2,
//science dept
"Research Director" = 1,
"Geneticist" = 2,
"Scientist" = 3,
"Botanist" = 2,
"Virologist" = 1,
//I afraid I can't do that, Dave
"AI" = 1,
"Cyborg" = 1,
)
var/list/assistant_occupations = list(
"Assistant")
"Assistant",
//"Tourist", //I am not going to implement these jobs at the moment. Just listed it as examples. --rastaf0
//"Monkey",
//"Prisoneer",
//"Lizard",
)
var/list/head_positions = list(
"Captain",
@@ -41,5 +62,12 @@ var/list/head_positions = list(
"Chief Medical Officer",
)
var/list/nonhuman_positions = list(
"AI",
"Cyborg",
//"Monkey",
//"Lizard",
)
/proc/is_important_job(var/job)
return (job in head_positions) || (job in list("AI", "Cyborg", "Warden", "Detective"))

View File

@@ -103,11 +103,8 @@ var/list/sacrificed = list()
continue
if(M.stat==2)
continue
if(ticker && ticker.mode && ticker.mode.name == "cult")
var/list/uncons = ticker.mode:get_unconvertables()
if(M.mind in uncons)
continue
ticker.mode:add_cultist(M.mind)
if(is_convertable_to_cult(M.mind))
ticker.mode.add_cultist(M.mind)
usr.say("Mah'weyh pleggh at e'ntrath!")
M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
"\red AAAAAAHHHH!.", \

View File

@@ -167,4 +167,14 @@
print_to_host(menu_message)
return
return
return
/obj/item/weapon/integrated_uplink/proc/shutdown_uplink()
if (isnull(src.hostpda))
return
active = 0
hostpda.note = orignote
if (hostpda.mode==1)
hostpda.mode = 0
hostpda.updateDialog()
return

View File

@@ -54,9 +54,9 @@
if (prob(M.eye_stat - 20 + 1))
M << "\red You go blind!"
M.sdisabilities |= 1
if(ticker.mode.name == "revolution" && istype(M, /mob/living/carbon))
if(user.mind in ticker.mode:head_revolutionaries)
ticker.mode:add_revolutionary(M.mind)
if(/*ticker.mode.name == "revolution" && */ istype(M, /mob/living/carbon))
if(user.mind in ticker.mode.head_revolutionaries)
ticker.mode.add_revolutionary(M.mind)
for(var/mob/O in viewers(user, null))
if(status == 1)

View File

@@ -228,7 +228,7 @@
/mob/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (user.intent!="harm")
if (user.intent != "harm")
if (istype(src.l_hand,/obj/item/latexballon) && src.l_hand:air_contents && is_sharp(W))
return src.l_hand.attackby(W)
if (istype(src.r_hand,/obj/item/latexballon) && src.r_hand:air_contents && is_sharp(W))

View File

@@ -206,7 +206,7 @@ move an amendment</a> to the drawing.</p>
var/list/turf/found = new
var/list/turf/pending = list(first)
while(pending.len)
if (found.len+pending.len > 100)
if (found.len+pending.len > 300)
return ROOM_ERR_TOOLARGE
var/turf/T = pending[1] //why byond havent list::pop()?
pending -= T

View File

@@ -259,8 +259,8 @@
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] has been knocked unconscious!</B>", H), 1, "\red You hear someone fall.", 2)
if (prob(50))
if (ticker.mode.name == "revolution" && M != user)
ticker.mode:remove_revolutionary(H.mind)
if (/*ticker.mode.name == "revolution" && */ M != user)
ticker.mode.remove_revolutionary(H.mind)
if (b_dam && prob(25 + (b_dam * 2)))
src.add_blood(H)
if (prob(33))

View File

@@ -126,8 +126,9 @@ SYNDICATE UPLINK
new /obj/item/device/chameleon(get_turf(src))
if("cloak")
if (src.uses >= 4)
var/choice = input("Spawning a cloak in nuke is generally regarded as entirely dumb, are you sure?") in list("Confirm", "Abort")
if(choice == "Confirm")
if (ticker.mode.config_tag!="nuclear" || \
(input("Spawning a cloak in nuke is generally regarded as entirely dumb, are you sure?") in list("Confirm", "Abort")) == "Confirm" \
)
if (src.uses >= 4)
src.uses -= 4
new /obj/item/weapon/cloaking_device(get_turf(src))
@@ -162,26 +163,7 @@ SYNDICATE UPLINK
new /obj/item/device/radio/headset/traitor(get_turf(src))
else if (href_list["lock"] && src.origradio)
// presto chango, a regular radio again! (reset the freq too...)
usr.machine = null
usr << browse(null, "window=radio")
var/obj/item/device/radio/T = src.origradio
var/obj/item/weapon/syndicate_uplink/R = src
R.loc = T
T.loc = usr
// R.layer = initial(R.layer)
R.layer = 0
if (usr.client)
usr.client.screen -= R
if (usr.r_hand == R)
usr.u_equip(R)
usr.r_hand = T
else
usr.u_equip(R)
usr.l_hand = T
R.loc = T
T.layer = 20
T.set_frequency(initial(T.frequency))
T.attack_self(usr)
shutdown_uplink()
return
else if (href_list["selfdestruct"])
src.temp = "<A href='byond://?src=\ref[src];selfdestruct2=1'>Self-Destruct</A>"
@@ -199,4 +181,33 @@ SYNDICATE UPLINK
for(var/mob/M in viewers(1, src))
if (M.client)
src.attack_self(M)
return
return
/obj/item/weapon/syndicate_uplink/proc/shutdown_uplink()
if (!src.origradio)
return
var/list/nearby = viewers(1, src)
for(var/mob/M in nearby)
if (M.client && M.machine == src)
M << browse(null, "window=radio")
M.machine = null
var/obj/item/device/radio/T = src.origradio
var/obj/item/weapon/syndicate_uplink/R = src
var/mob/L = src.loc
R.loc = T
T.loc = L
// R.layer = initial(R.layer)
R.layer = 0
if (istype(L))
if (L.client)
L.client.screen -= R
if (L.r_hand == R)
L.u_equip(R)
L.r_hand = T
else
L.u_equip(R)
L.l_hand = T
T.layer = 20
T.set_frequency(initial(T.frequency))
return

View File

@@ -51,10 +51,7 @@
if((M.mind in ticker.mode.cult) && (prob(20)))
M << "\red The power of [src.deity_name] clears your mind of heresy!"
user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!"
if (ticker.mode.name == "cult")
ticker.mode:remove_cultist(M.mind)
else
ticker.mode.cult -= M.mind
ticker.mode.remove_cultist(M.mind)
if ((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
for(var/mob/O in viewers(M, null))

View File

@@ -656,83 +656,17 @@ var/showadminmessages = 1
alert("The game hasn't started yet!")
return
var/mob/M = locate(href_list["traitor"])
var/datum/game_mode/current_mode = ticker.mode
if (ishuman(M) && M:mind)
M:mind.edit_memory()
if (!istype(M))
player()
return
switch(current_mode.config_tag)
if("revolution")
if(M.mind in current_mode:head_revolutionaries)
alert("Is a Head Revolutionary!")
else if(M.mind in current_mode:revolutionaries)
alert("Is a Revolutionary!")
return
if("cult")
if(M.mind in current_mode.cult)
alert("Is a Cultist!")
return
if("wizard")
if(current_mode:wizard && M.mind == current_mode:wizard)
var/datum/mind/antagonist = M.mind
var/t = ""
for(var/datum/objective/OB in antagonist.objectives)
t += "[OB.explanation_text]\n"
if(antagonist.objectives.len == 0)
t = "None defined."
alert("Is a WIZARD. Objective(s):\n[t]", "[M.key]")
return
if("changeling")
if(M.mind in current_mode:changelings)
var/datum/mind/antagonist = M.mind
var/t = ""
for(var/datum/objective/OB in antagonist.objectives)
t += "[OB.explanation_text]\n"
if(antagonist.objectives.len == 0)
t = "None defined."
alert("Is a CHANGELING. Objective(s):\n[t]", "[M.key]")
return
if("malfunction")
if(M.mind in current_mode:malf_ai)
alert("Is malfunctioning!")
return
if("nuclear")
if(M.mind in current_mode:syndicates)
alert("Is a Syndicate operative!", "[M.key]")
return
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(R.emagged)
alert("Is emagged!\n0th law: [R.laws.zeroth]", "[R.key]")
return
if(isalien(M))
alert("Is an [M.mind ? M.mind.special_role : "Alien"]!", "[M.key]")
return
if (M:mind)
M:mind.edit_memory()
return
alert("Cannot make this mob a traitor! It has no mind!")
// traitor, or other modes where traitors/counteroperatives would be.
if(M.mind in current_mode.traitors)
var/datum/mind/antagonist = M.mind
var/t = ""
if(antagonist)
for(var/datum/objective/OB in antagonist.objectives)
t += "[OB.explanation_text]\n"
if(antagonist.objectives.len == 0)
t = "None defined."
alert("Is a Traitor. Objective(s):\n[t]", "[M.key]")
return
//they're nothing so turn them into a traitor!
if(ishuman(M) || issilicon(M))
var/traitorize = alert("Is not a traitor, make Traitor?", "Traitor", "Yes", "Cancel")
if(traitorize == "Cancel")
return
if(traitorize == "Yes")
traitorize(M,,1)
else
alert("Cannot make this mob a traitor")
if (href_list["create_object"])
if (src.rank in list("Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master"))
return create_object(usr)
@@ -1292,111 +1226,101 @@ var/showadminmessages = 1
if(1)
dat += "ETA: <a href='?src=\ref[src];edit_shuttle_time=1'>[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]</a><BR>"
switch(ticker.mode.config_tag)
if("nuclear")
dat += "<br><table cellspacing=5><tr><td><B>Syndicates</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode:syndicates)
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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
else
dat += "<tr><td><i>Nuclear Operative not found!</i></td></tr>"
dat += "</table><br><table><tr><td><B>Nuclear Disk(s)</B></td></tr>"
for(var/obj/item/weapon/disk/nuclear/N in world)
dat += "<tr><td>[N.name], "
var/atom/disk_loc = N.loc
while(!istype(disk_loc, /turf))
if(istype(disk_loc, /mob))
var/mob/M = disk_loc
dat += "carried by <a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a> "
if(istype(disk_loc, /obj))
var/obj/O = disk_loc
dat += "in \a [O.name] "
disk_loc = disk_loc.loc
dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])</td></tr>"
dat += "</table>"
if("revolution")
dat += "<br><table cellspacing=5><tr><td><B>Revolutionaries</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode:head_revolutionaries)
var/mob/M = N.current
if(!M)
dat += "<tr><td><i>Head Revolutionary not found!</i></td></tr>"
else
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a> <b>(Leader)</b>[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>"
for(var/datum/mind/N in ticker.mode:revolutionaries)
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>"
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())
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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
var/turf/mob_loc = get_turf_loc(M)
dat += "<td>[mob_loc.loc]</td></tr>"
dat += "</table>"
if("changeling")
if(ticker.mode:changelings.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Changelings</B></td><td></td><td></td></tr>"
for(var/datum/mind/changeling in ticker.mode:changelings)
var/mob/M = changeling.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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Changeling not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.syndicates.len)
dat += "<br><table cellspacing=5><tr><td><B>Syndicates</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.syndicates)
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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
else
dat += "There are no changelings."
dat += "<tr><td><i>Nuclear Operative not found!</i></td></tr>"
dat += "</table><br><table><tr><td><B>Nuclear Disk(s)</B></td></tr>"
for(var/obj/item/weapon/disk/nuclear/N in world)
dat += "<tr><td>[N.name], "
var/atom/disk_loc = N.loc
while(!istype(disk_loc, /turf))
if(istype(disk_loc, /mob))
var/mob/M = disk_loc
dat += "carried by <a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a> "
if(istype(disk_loc, /obj))
var/obj/O = disk_loc
dat += "in \a [O.name] "
disk_loc = disk_loc.loc
dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])</td></tr>"
dat += "</table>"
/* this doesn't work
if("wizard")
if(ticker.mode:wizards.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Wizards</B></td><td></td><td></td></tr>"
for(var/datum/mind/wizard in ticker.mode:wizards)
var/mob/M = wizard.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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Wizard not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.head_revolutionaries.len || ticker.mode.revolutionaries.len)
dat += "<br><table cellspacing=5><tr><td><B>Revolutionaries</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.head_revolutionaries)
var/mob/M = N.current
if(!M)
dat += "<tr><td><i>Head Revolutionary not found!</i></td></tr>"
else
dat += "There are no wizards."
*/
if("cult")
dat += "<br><table cellspacing=5><tr><td><B>Cultists</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode:cult)
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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
dat += "</table>"
else // i'll finish this later
if(ticker.mode.traitors.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Traitors</B></td><td></td><td></td></tr>"
for(var/datum/mind/traitor in ticker.mode.traitors)
var/mob/M = traitor.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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Traitor not found!</i></td></tr>"
dat += "</table>"
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a> <b>(Leader)</b>[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>"
for(var/datum/mind/N in ticker.mode.revolutionaries)
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>"
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())
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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
var/turf/mob_loc = get_turf_loc(M)
dat += "<td>[mob_loc.loc]</td></tr>"
else
dat += "There are no traitors."
dat += "<tr><td><i>Head not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.changelings.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Changelings</B></td><td></td><td></td></tr>"
for(var/datum/mind/changeling in ticker.mode.changelings)
var/mob/M = changeling.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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Changeling not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.wizards.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Wizards</B></td><td></td><td></td></tr>"
for(var/datum/mind/wizard in ticker.mode.wizards)
var/mob/M = wizard.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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Wizard not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.cult.len)
dat += "<br><table cellspacing=5><tr><td><B>Cultists</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.cult)
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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
dat += "</table>"
if(ticker.mode.traitors.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Traitors</B></td><td></td><td></td></tr>"
for(var/datum/mind/traitor in ticker.mode.traitors)
var/mob/M = traitor.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>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
else
dat += "<tr><td><i>Traitor not found!</i></td></tr>"
dat += "</table>"
dat += "</body></html>"
usr << browse(dat, "window=roundstatus;size=400x500")
else
@@ -2060,22 +1984,25 @@ var/showadminmessages = 1
return 0
switch(ticker.mode.config_tag)
if("revolution")
if(M.mind in (ticker.mode:head_revolutionaries + ticker.mode:revolutionaries))
if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode:revolutionaries))
return 1
if("cult")
if(M.mind in ticker.mode:cult)
if(M.mind in ticker.mode.cult)
return 1
if("malfunction")
if(M.mind in ticker.mode:malf_ai)
if(M.mind in ticker.mode.malf_ai)
return 1
if("nuclear")
if(M.mind in ticker.mode:syndicates)
if(M.mind in ticker.mode.syndicates)
return 1
if("wizard")
if(M.mind == ticker.mode:wizard)
if(M.mind in ticker.mode.wizards)
return 1
if("changeling")
if(M.mind in ticker.mode:changelings)
if(M.mind in ticker.mode.changelings)
return 1
if("monkey")
if(istype(M.virus, /datum/disease/jungle_fever))
return 1
if(isrobot(M))
var/mob/living/silicon/robot/R = M

View File

@@ -1357,7 +1357,7 @@
log_admin("[key_name(usr)] has turned stealth mode [stealth ? "ON" : "OFF"]")
message_admins("[key_name_admin(usr)] has turned stealth mode [stealth ? "ON" : "OFF"]", 1)
#define AUTOBATIME 10
/client/proc/warn(var/mob/M in world)
set category = "Special Verbs"
set name = "Warn"
@@ -1373,11 +1373,11 @@
M.client.warned = 1
message_admins("\blue [ckey] warned [M.ckey].")
else
AddBan(M.ckey, M.computer_id, "Autobanning due to previous warn", ckey, 1, 10)
AddBan(M.ckey, M.computer_id, "Autobanning due to previous warn", ckey, 1, AUTOBATIME)
M << "\red<BIG><B>You have been autobanned by [ckey]. This is what we in the biz like to call a \"second warning\".</B></BIG>"
M << "\red This is a temporary ban; it will automatically be removed in 10 minutes."
log_admin("[ckey] warned [M.ckey], resulting in a 10 minute autoban.")
message_admins("\blue [ckey] warned [M.ckey], resulting in a 10 minute autoban.")
M << "\red This is a temporary ban; it will automatically be removed in AUTOBATIME minutes."
log_admin("[ckey] warned [M.ckey], resulting in a AUTOBATIME minute autoban.")
message_admins("\blue [ckey] warned [M.ckey], resulting in a AUTOBATIME minute autoban.")
del(M.client)
//del(M)

View File

@@ -19,6 +19,19 @@ var
else
return 0
/*
working but not needed
/proc/jobban_isbanned_for_heads(mob/M)
if(config.guest_jobban && IsGuestKey(M.key))
return 1
if(config.usewhitelist && check_whitelist(M))
return 1
for (var/rank in head_positions)
if (!jobban_keylist.Find(text("[M.ckey] - [rank]")))
return 0
return 1
*/
/proc/jobban_loadbanfile()
var/savefile/S=new("data/job_full.ban")
S["keys[0]"] >> jobban_keylist
@@ -49,4 +62,4 @@ var
jobban_keylist.Remove(X)
jobban_savebanfile()
return 1
return 0
return 0

View File

@@ -500,12 +500,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
ticker.mode.equip_traitor(new_character)
if("Wizard","Fake Wizard")
new_character.loc = pick(wizardstart)
ticker.mode.learn_basic_spells(new_character)
ticker.mode.equip_wizard(new_character)
if("Syndicate")
var/obj/landmark/synd_spawn = locate("landmark*Syndicate-Spawn")
if(synd_spawn)
new_character.loc = get_turf(synd_spawn)
call(/datum/game_mode/nuclear/proc/equip_syndicate)(new_character)
call(/datum/game_mode/proc/equip_syndicate)(new_character)
if("Space Ninja")
var/ninja_spawn[] = list()
for(var/obj/landmark/L in world)
@@ -526,11 +527,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
if("Cyborg")//More rigging to make em' work and check if they're traitor.
new_character = new_character.Robotize()
if(new_character.mind.special_role=="traitor")
call(/datum/game_mode/traitor/proc/add_law_zero)(new_character)
call(/datum/game_mode/proc/add_law_zero)(new_character)
if("AI")
new_character = new_character.AIize()
if(new_character.mind.special_role=="traitor")
call(/datum/game_mode/traitor/proc/add_law_zero)(new_character)
call(/datum/game_mode/proc/add_law_zero)(new_character)
//Add aliens.
else
new_character.Equip_Rank(new_character.mind.assigned_role, joined_late=1)//Or we simply equip them.

View File

@@ -1,20 +1,16 @@
var/global/check_dem_trips = 0
/client/proc/triple_ai()
set category = "Fun"
set name = "Create AI Triumvirate"
if(ticker.current_state < 2)
if (check_dem_trips)
occupations["AI"] -= 2
usr << "Only one AI will be spawned at round start."
message_admins("\blue [key_name_admin(usr)] has toggled off triple AIs at round start.", 1)
else
occupations["AI"] += 2
usr << "There will be an AI Triumvirate at round start."
message_admins("\blue [key_name_admin(usr)] has toggled on triple AIs at round start.", 1)
check_dem_trips = !check_dem_trips
if(ticker.current_state > GAME_STATE_PREGAME)
usr << "This option is currently only usable during pregame. This may change at a later date."
return
usr << "This option is currently only usable during pregame. This may change at a later date."
if (occupations["AI"] > 1)
occupations["AI"] -= 2
usr << "Only one AI will be spawned at round start."
message_admins("\blue [key_name_admin(usr)] has toggled off triple AIs at round start.", 1)
else
occupations["AI"] += 2
usr << "There will be an AI Triumvirate at round start."
message_admins("\blue [key_name_admin(usr)] has toggled on triple AIs at round start.", 1)
return

View File

@@ -1441,7 +1441,11 @@
UpdateDamage()
updatehealth()
if(istype(M.virus, /datum/disease/jungle_fever))
monkeyize()
var/mob/living/carbon/human/H = src
src = null
src = H.monkeyize()
contract_disease(M.virus,1,0)
return
/mob/living/carbon/human/attack_paw(mob/M as mob)
@@ -1490,7 +1494,10 @@
UpdateDamage()
updatehealth()
if(istype(M.virus, /datum/disease/jungle_fever))
monkeyize()
var/mob/living/carbon/human/H = src
src = null
src = H.monkeyize()
contract_disease(M.virus,1,0)
return
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob)

View File

@@ -1,5 +1,5 @@
#define SAVEFILE_VERSION_MIN 2
#define SAVEFILE_VERSION_MAX 2
#define SAVEFILE_VERSION_MAX 3
datum/preferences/proc/savefile_path(mob/user)
return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/preferences.sav"
@@ -9,15 +9,22 @@ datum/preferences/proc/savefile_save(mob/user)
return 0
var/savefile/F = new /savefile(src.savefile_path(user))
var/version
F["version"] >> version
if (!isnull(version) && version<=2)
F["be_syndicate"] << null
F["be_alien"] << null
F["UI"] << null
F["version"] << SAVEFILE_VERSION_MAX
F["real_name"] << src.real_name
F["gender"] << src.gender
F["age"] << src.age
F["occupation_1"] << src.occupation1
F["occupation_2"] << src.occupation2
F["occupation_3"] << src.occupation3
F["occupation_1"] << src.occupation[1]
F["occupation_2"] << src.occupation[2]
F["occupation_3"] << src.occupation[3]
F["hair_red"] << src.r_hair
F["hair_green"] << src.g_hair
F["hair_blue"] << src.b_hair
@@ -31,11 +38,13 @@ datum/preferences/proc/savefile_save(mob/user)
F["eyes_green"] << src.g_eyes
F["eyes_blue"] << src.b_eyes
F["blood_type"] << src.b_type
F["be_syndicate"] << src.be_syndicate
//F["be_syndicate"] << src.be_syndicate
F["be_special"] << src.be_special
F["underwear"] << src.underwear
F["name_is_always_random"] << src.be_random_name
F["UI"] << src.UI // Skie
F["be_alien"] << src.be_alien // Urist
//world << "DEBUG: saving UI as [UI]"
//F["be_alien"] << src.be_alien // Urist
F["midis"] << src.midis // Urist
F["ooccolor"] << src.ooccolor // Urist
F["lastchangelog"] << src.lastchangelog // rastaf0
@@ -72,9 +81,9 @@ datum/preferences/proc/savefile_load(mob/user, var/silent = 1)
F["real_name"] >> src.real_name
F["gender"] >> src.gender
F["age"] >> src.age
F["occupation_1"] >> src.occupation1
F["occupation_2"] >> src.occupation2
F["occupation_3"] >> src.occupation3
F["occupation_1"] >> src.occupation[1]
F["occupation_2"] >> src.occupation[2]
F["occupation_3"] >> src.occupation[3]
F["hair_red"] >> src.r_hair
F["hair_green"] >> src.g_hair
F["hair_blue"] >> src.b_hair
@@ -88,14 +97,37 @@ datum/preferences/proc/savefile_load(mob/user, var/silent = 1)
F["eyes_green"] >> src.g_eyes
F["eyes_blue"] >> src.b_eyes
F["blood_type"] >> src.b_type
F["be_syndicate"] >> src.be_syndicate
F["underwear"] >> src.underwear
F["name_is_always_random"] >> src.be_random_name
F["UI"] >> src.UI // Skie
F["be_alien"] >> src.be_alien // Urist
//F["be_alien"] >> src.be_alien // Urist
F["midis"] >> src.midis // Urist
F["ooccolor"] >> src.ooccolor // Urist
F["lastchangelog"] >> src.lastchangelog // rastaf0
if (version<=2) // migration from old preferences file format --rastaf0
src.UI = 0 // swithing from storing an image file to storing boolean value --rastaf0
//world << "DEBUG: loading legacy UI as [UI]"
var/tmp
F["be_syndicate"] >> tmp
if (tmp)
be_special |= BE_TRAITOR
be_special |= BE_OPERATIVE
be_special |= BE_CHANGELING
be_special |= BE_WIZARD
be_special |= BE_MALF
be_special |= BE_REV
F["be_alien"] >> tmp
if (tmp)
be_special |= BE_ALIEN
del(F)
fdel(path)
savefile_save(user)
else // /migration end
F["UI"] >> src.UI
F["be_special"] >> src.be_special
//world << "DEBUG: loading new UI as [UI]"
return 1
#undef SAVEFILE_VERSION_MAX

View File

@@ -160,6 +160,8 @@
if (mutations & HULK) damage += 10
bruteloss += damage
updatehealth()
if(istype(M.virus, /datum/disease/jungle_fever))
contract_disease(M.virus,1,0)
else
for(var/mob/O in viewers(src, null))
O.show_message(text("\red <B>[M.name] has attempted to bite []!</B>", src), 1)
@@ -179,6 +181,8 @@
var/damage = rand(1, 5)
bruteloss += damage
health = 100 - oxyloss - toxloss - fireloss - bruteloss
if(istype(M.virus, /datum/disease/jungle_fever))
contract_disease(M.virus,1,0)
else
for(var/mob/O in viewers(src, null))
O.show_message("\red <B>[M.name] has attempted to bite [name]!</B>", 1)

View File

@@ -48,9 +48,9 @@
src << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
src << "To use something, simply double-click it."
src << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI."
show_laws()
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
show_laws()
src << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
job = "AI"

View File

@@ -44,12 +44,6 @@
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 (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,4 +61,4 @@
spawn(50)
if(key && stat == 2)
verbs += /mob/proc/ghost
return ..(gibbed)
return ..(gibbed)

View File

@@ -2180,7 +2180,7 @@ note dizziness decrements automatically in the mob's Life() proc.
statpanel("Spells","[S.charge_counter/10.0]/[S.charge_max/10]",S)
if("charges")
statpanel("Spells","[S.charge_counter]/[S.charge_max]",S)
#if 1
/client/proc/station_explosion_cinematic(var/derp)
if(mob)
var/mob/M = mob
@@ -2212,3 +2212,44 @@ note dizziness decrements automatically in the mob's Life() proc.
boom.icon_state = "loss_malf"
else
boom.icon_state = "loss_general"
#elif
/client/proc/station_explosion_cinematic(var/derp)
if(!src.mob)
return
var/mob/M = src.mob
M.loc = null // HACK, but whatever, this works
if(!M.hud_used)
return
var/obj/screen/boom = M.hud_used.station_explosion
src.screen += boom
if(ticker)
switch(ticker.mode.name)
if("nuclear emergency")
flick("start_nuke", boom)
if("AI malfunction")
flick("start_malf", boom)
else
boom.icon_state = "start"
sleep(40)
M << sound('explosionfar.ogg')
boom.icon_state = "end"
if(!derp)
flick("explode", boom)
else
flick("explode2", boom)
sleep(40)
if(ticker)
switch(ticker.mode.name)
if("nuclear emergency")
if (!derp)
boom.icon_state = "loss_nuke"
else
boom.icon_state = "loss_nuke2"
if("AI malfunction")
boom.icon_state = "loss_malf"
else
boom.icon_state = "loss_general"
#endif

View File

@@ -37,7 +37,7 @@ mob/new_player
if(!preferences.savefile_load(src, 0))
preferences.ShowChoices(src)
if (client.changes)
if (!client.changes)
changes()
else
var/lastchangelog = length('changelog.html')

View File

@@ -1,38 +1,65 @@
#define UI_OLD 0
#define UI_NEW 1
var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm --rastaf
//some autodetection here.
"traitor" = IS_MODE_COMPILED("traitor"),
"operative" = IS_MODE_COMPILED("nuclear"),
"changeling" = IS_MODE_COMPILED("changeling"),
"wizard" = IS_MODE_COMPILED("wizard"),
"malf AI" = IS_MODE_COMPILED("malfunction"),
"revolutionary" = IS_MODE_COMPILED("revolution"),
"alien candidate" = 1, //always show
"cultist" = IS_MODE_COMPILED("cult"),
"infested monkey" = IS_MODE_COMPILED("monkey"),
)
/*
var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm --rastaf
//some autodetection here.
"traitor" = ispath(text2path("/datum/game_mode/traitor")),
"operative" = ispath(text2path("/datum/game_mode/nuclear")),
"changeling" = ispath(text2path("/datum/game_mode/changeling")),
"wizard" = ispath(text2path("/datum/game_mode/wizard")),
"malf AI" = ispath(text2path("/datum/game_mode/malfunction")),
"revolutionary" = ispath(text2path("/datum/game_mode/revolution")),
"alien candidate" = 1, //always show
"cultist" = ispath(text2path("/datum/game_mode/cult")),
"infested monkey" = ispath(text2path("/datum/game_mode/monkey")),
)
*/
datum/preferences
var/real_name
var/gender = MALE
var/age = 30.0
var/b_type = "A+"
var/be_syndicate
var/be_special //bitfields. See defines in setup.dm. --rastaf0
var/midis = 1
var/be_alien = 1
var/lastchangelog = 0 // size of last seen changelog file -- rastaf0 -- rastaf0
var/lastchangelog = 0 // size of last seen changelog file -- rastaf0
var/ooccolor = "#b82e00"
var/be_random_name = 0
var/underwear = 1
var/occupation1 = "No Preference"
var/occupation2 = "No Preference"
var/occupation3 = "No Preference"
var/occupation[] = list("No Preference", "No Preference", "No Preference")
var/h_style = "Short Hair"
var/f_style = "Shaved"
var/r_hair = 0.0
var/g_hair = 0.0
var/b_hair = 0.0
var/r_hair = 0
var/g_hair = 0
var/b_hair = 0
var/r_facial = 0.0
var/g_facial = 0.0
var/b_facial = 0.0
var/r_facial = 0
var/g_facial = 0
var/b_facial = 0
var/s_tone = 0.0
var/r_eyes = 0.0
var/g_eyes = 0.0
var/b_eyes = 0.0
var/s_tone = 0
var/r_eyes = 0
var/g_eyes = 0
var/b_eyes = 0
var/UI = 'screen1_old.dmi' // Skie
var/UI = UI_OLD // saving the whole .DMI in preferences is not a good idea. --rastaf0 //'screen1_old.dmi' // Skie
var/icon/preview_icon = null
@@ -361,35 +388,35 @@ datum/preferences
dat += "<b>Age:</b> <a href='byond://?src=\ref[user];preferences=1;age=input'>[age]</a>"
dat += "<br>"
dat += "<b>UI Style:</b> <a href=\"byond://?src=\ref[user];preferences=1;UI=input\"><b>[UI == 'screen1.dmi' ? "New" : "Old"]</b></a><br>"
dat += "<b>UI Style:</b> <a href=\"byond://?src=\ref[user];preferences=1;UI=input\"><b>[UI == UI_NEW ? "New" : "Old"]</b></a><br>"
dat += "<b>Play admin midis:</b> <a href=\"byond://?src=\ref[user];preferences=1;midis=input\"><b>[midis == 1 ? "Yes" : "No"]</b></a><br>"
if(user.client.holder)
if(user.client.holder.rank)
if(user.client.holder.rank == "Game Master")
dat += "<hr><b>OOC</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;ooccolor=input'>Change colour</a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table bgcolor=\"[ooccolor]\"><tr><td>IM</td></tr></table></font>"
dat += "<a href='byond://?src=\ref[user];preferences=1;ooccolor=input'>Change colour</a> <font face=\"fixedsys\" size=\"3\" color=\"[ooccolor]\"><table style='display:inline;' bgcolor=\"[ooccolor]\"><tr><td>__</td></tr></table></font>"
dat += "<hr><b>Occupation Choices</b><br>"
if (destructive.Find(occupation1))
dat += "\t<a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>[occupation1]</b></a><br>"
if (destructive.Find(occupation[1]))
dat += "\t<a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>[occupation[1]]</b></a><br>"
else
if (jobban_isbanned(user, occupation1))
occupation1 = "Assistant"
if (jobban_isbanned(user, occupation2))
occupation2 = "Assistant"
if (jobban_isbanned(user, occupation3))
occupation3 = "Assistant"
if (occupation1 != "No Preference")
dat += "\tFirst Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>[occupation1]</b></a><br>"
if (jobban_isbanned(user, occupation[1]))
occupation[1] = "Assistant"
if (jobban_isbanned(user, occupation[2]))
occupation[2] = "Assistant"
if (jobban_isbanned(user, occupation[3]))
occupation[3] = "Assistant"
if (occupation[1] != "No Preference")
dat += "\tFirst Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=1\"><b>[occupation[1]]</b></a><br>"
if (destructive.Find(occupation2))
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\"><b>[occupation2]</b></a><BR>"
if (destructive.Find(occupation[2]))
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\"><b>[occupation[2]]</b></a><BR>"
else
if (occupation2 != "No Preference")
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\"><b>[occupation2]</b></a><BR>"
dat += "\tLast Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=3\"><b>[occupation3]</b></a><BR>"
if (occupation[2] != "No Preference")
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\"><b>[occupation[2]]</b></a><BR>"
dat += "\tLast Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=3\"><b>[occupation[3]]</b></a><BR>"
else
dat += "\tSecond Choice: <a href=\"byond://?src=\ref[user];preferences=1;occ=2\">No Preference</a><br>"
@@ -408,7 +435,7 @@ datum/preferences
dat += "<hr><b>Hair</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;hair=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair, 2)]\"><table bgcolor=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair)]\"><tr><td>IM</td></tr></table></font>"
dat += "<a href='byond://?src=\ref[user];preferences=1;hair=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_hair, 2)][num2hex(g_hair, 2)][num2hex(b_hair)]\"><tr><td>__</td></tr></table></font> "
/*
dat += " <font color=\"#[num2hex(r_hair, 2)]0000\">Red</font> - <a href='byond://?src=\ref[user];preferences=1;r_hair=input'>[r_hair]</a>"
dat += " <font color=\"#00[num2hex(g_hair, 2)]00\">Green</font> - <a href='byond://?src=\ref[user];preferences=1;g_hair=input'>[g_hair]</a>"
@@ -418,7 +445,7 @@ datum/preferences
dat += "<hr><b>Facial</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;facial=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial, 2)]\"><table bgcolor=\"#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial)]\"><tr><td>GO</td></tr></table></font>"
dat += "<a href='byond://?src=\ref[user];preferences=1;facial=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_facial, 2)][num2hex(g_facial, 2)][num2hex(b_facial)]\"><tr><td>__</td></tr></table></font> "
/*
dat += " <font color=\"#[num2hex(r_facial, 2)]0000\">Red</font> - <a href='byond://?src=\ref[user];preferences=1;r_facial=input'>[r_facial]</a>"
dat += " <font color=\"#00[num2hex(g_facial, 2)]00\">Green</font> - <a href='byond://?src=\ref[user];preferences=1;g_facial=input'>[g_facial]</a>"
@@ -427,19 +454,22 @@ datum/preferences
dat += "Style: <a href='byond://?src=\ref[user];preferences=1;f_style=input'>[f_style]</a>"
dat += "<hr><b>Eyes</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;eyes=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]\"><table bgcolor=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]\"><tr><td>KU</td></tr></table></font>"
dat += "<a href='byond://?src=\ref[user];preferences=1;eyes=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]\"><tr><td>__</td></tr></table></font>"
/*
dat += " <font color=\"#[num2hex(r_eyes, 2)]0000\">Red</font> - <a href='byond://?src=\ref[user];preferences=1;r_eyes=input'>[r_eyes]</a>"
dat += " <font color=\"#00[num2hex(g_eyes, 2)]00\">Green</font> - <a href='byond://?src=\ref[user];preferences=1;g_eyes=input'>[g_eyes]</a>"
dat += " <font color=\"#0000[num2hex(b_eyes, 2)]\">Blue</font> - <a href='byond://?src=\ref[user];preferences=1;b_eyes=input'>[b_eyes]</a>"
*/
dat += "<hr>"
dat += "<b>Be alien candidate:</b> <a href=\"byond://?src=\ref[user];preferences=1;be_alien=input\"><b>[be_alien == 1 ? "Yes" : "No"]</b></a><br>"
if(!jobban_isbanned(user, "Syndicate"))
dat += "<b>Be syndicate?:</b> <a href =\"byond://?src=\ref[user];preferences=1;b_syndicate=1\"><b>[(be_syndicate ? "Yes" : "No")]</b></a><br>"
var/n = 0
for (var/i in special_roles)
if (special_roles[i]) //if mode is available on the server
dat += "<b>Be [i]:</b> <a href=\"byond://?src=\ref[user];preferences=1;be_special=[n]\"><b>[src.be_special&(1<<n) ? "Yes" : "No"]</b></a><br>"
n++
else
dat += "<b> You are banned from being syndicate.</b>"
be_syndicate = 0
dat += "<b>You are banned from being syndicate.</b>"
src.be_special = 0
dat += "<hr>"
if (!IsGuestKey(user.key))
@@ -487,75 +517,75 @@ datum/preferences
switch(occ)
if(1.0)
if (job == occupation1)
if (job == occupation[1])
user << browse(null, "window=mob_occupation")
return
else
if (job == "No Preference")
occupation1 = "No Preference"
occupation[1] = "No Preference"
else
if (job == occupation2)
job = occupation1
occupation1 = occupation2
occupation2 = job
if (job == occupation[2])
job = occupation[1]
occupation[1] = occupation[2]
occupation[2] = job
else
if (job == occupation3)
job = occupation1
occupation1 = occupation3
occupation3 = job
if (job == occupation[3])
job = occupation[1]
occupation[1] = occupation[3]
occupation[3] = job
else
occupation1 = job
occupation[1] = job
if(2.0)
if (job == occupation2)
if (job == occupation[2])
user << browse(null, "window=mob_occupation")
return
else
if (job == "No Preference")
if (occupation3 != "No Preference")
occupation2 = occupation3
occupation3 = "No Preference"
if (occupation[3] != "No Preference")
occupation[2] = occupation[3]
occupation[3] = "No Preference"
else
occupation2 = "No Preference"
occupation[2] = "No Preference"
else
if (job == occupation1)
if (occupation2 == "No Preference")
if (job == occupation[1])
if (occupation[2] == "No Preference")
user << browse(null, "window=mob_occupation")
return
job = occupation2
occupation2 = occupation1
occupation1 = job
job = occupation[2]
occupation[2] = occupation[1]
occupation[1] = job
else
if (job == occupation3)
job = occupation2
occupation2 = occupation3
occupation3 = job
if (job == occupation[3])
job = occupation[2]
occupation[2] = occupation[3]
occupation[3] = job
else
occupation2 = job
occupation[2] = job
if(3.0)
if (job == occupation3)
if (job == occupation[3])
user << browse(null, "window=mob_occupation")
return
else
if (job == "No Preference")
occupation3 = "No Preference"
occupation[3] = "No Preference"
else
if (job == occupation1)
if (occupation3 == "No Preference")
if (job == occupation[1])
if (occupation[3] == "No Preference")
user << browse(null, "window=mob_occupation")
return
job = occupation3
occupation3 = occupation1
occupation1 = job
job = occupation[3]
occupation[3] = occupation[1]
occupation[1] = job
else
if (job == occupation2)
if (occupation3 == "No Preference")
if (job == occupation[2])
if (occupation[3] == "No Preference")
user << browse(null, "window=mob_occupation")
return
job = occupation3
occupation3 = occupation2
occupation2 = job
job = occupation[3]
occupation[3] = occupation[2]
occupation[2] = job
else
occupation3 = job
occupation[3] = job
user << browse(null, "window=mob_occupation")
ShowChoices(user)
@@ -733,7 +763,7 @@ datum/preferences
var/ooccolor = input(user, "Please select OOC colour.", "OOC colour") as color
if(ooccolor)
ooccolor = ooccolor
src.ooccolor = ooccolor
if (link_tags["f_style"])
switch(link_tags["f_style"])
@@ -754,17 +784,14 @@ datum/preferences
gender = MALE
if (link_tags["UI"])
if (UI == 'screen1.dmi')
UI = 'screen1_old.dmi'
if (UI == UI_OLD)
UI = UI_NEW
else
UI = 'screen1.dmi'
UI = UI_OLD
if (link_tags["midis"])
midis = (midis+1)%2
if (link_tags["be_alien"])
be_alien = (be_alien+1)%2
if (link_tags["underwear"])
if(!IsGuestKey(user.key))
switch(link_tags["underwear"])
@@ -779,8 +806,8 @@ datum/preferences
else
underwear = 1
if (link_tags["b_syndicate"])
be_syndicate = !( be_syndicate )
if (link_tags["be_special"])
src.be_special^=(1<<text2num(link_tags["be_special"])) //bitwize magic, sorry for that. --rastaf0
if (link_tags["b_random_name"])
be_random_name = !be_random_name
@@ -798,11 +825,12 @@ datum/preferences
randomize_name()
age = 30
occupation1 = "No Preference"
occupation2 = "No Preference"
occupation3 = "No Preference"
occupation[1] = "No Preference"
occupation[2] = "No Preference"
occupation[3] = "No Preference"
underwear = 1
be_syndicate = 0
//be_syndicate = 0
be_special = 0
be_random_name = 0
r_hair = 0.0
g_hair = 0.0
@@ -817,7 +845,7 @@ datum/preferences
b_eyes = 0.0
s_tone = 0.0
b_type = "A+"
UI = 'screen1_old.dmi'
UI = UI_OLD
midis = 1
@@ -850,7 +878,11 @@ datum/preferences
character.h_style = h_style
character.f_style = f_style
character.UI = UI
switch (UI)
if (UI_OLD)
character.UI = 'screen1_old.dmi'
if (UI_NEW)
character.UI = 'screen1.dmi'
switch(h_style)
if("Short Hair")
@@ -912,7 +944,7 @@ datum/preferences
if(character&&character.client)
character.client.midis = midis
character.client.ooccolor = ooccolor
character.client.be_alien = be_alien
character.client.be_alien = be_special&BE_ALIEN
/*
@@ -929,4 +961,6 @@ datum/preferences
usr << "This name is reserved for use by the game, please choose another one using Character Setup."
return
*/
*/
#undef UI_OLD
#undef UI_NEW

View File

@@ -20,8 +20,8 @@
flick("h2monkey", animation)
sleep(48)
//animation = null
del(animation)
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
del(animation)
O.name = "monkey"
O.dna = dna
@@ -116,9 +116,9 @@
O << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
O << "To use something, simply double-click it."
O << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI."
O.show_laws()
O << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
if (!(ticker && ticker.mode && (O.mind in ticker.mode.malf_ai)))
O.show_laws()
O << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle
O.verbs += /mob/living/silicon/ai/proc/show_laws_verb

View File

@@ -584,17 +584,14 @@
if (istype(user, /mob/living/silicon))
t += "<BR><HR><A href='?src=\ref[src];overload=1'><I>Overload lighting circuit</I></A><BR>"
if (ticker)
if (ticker && ticker.mode)
// world << "there's a ticker"
if(ticker.mode.name == "AI malfunction")
if(user.mind in ticker.mode.malf_ai)
// world << "ticker says its malf"
var/datum/game_mode/malfunction/malf = ticker.mode
for (var/datum/mind/B in malf.malf_ai)
if (user == B.current)
if (!src.malfai)
t += "<BR><HR><A href='?src=\ref[src];malfhack=1'><I>Override Programming</I></A><BR>"
else
t += "<BR><HR><I>APC Hacked</I><BR>"
if (!src.malfai)
t += "<BR><HR><A href='?src=\ref[src];malfhack=1'><I>Override Programming</I></A><BR>"
else
t += "<BR><HR><I>APC Hacked</I><BR>"
t += "<BR><HR><A href='?src=\ref[src];close=1'>Close</A>"
@@ -789,8 +786,9 @@
if (!src.aidisabled)
malfai.malfhack = null
malfai.malfhacking = 0
if (src.z == 1)
ticker.mode:apcs++
if (ticker.mode.config_tag == "malfunction")
if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs++
src.malfai = usr
src.locked = 1
if (src.cell)

View File

@@ -170,4 +170,19 @@ var/const
GAS_CO2 = 1 << 3
GAS_N2O = 1 << 4
var/list/accessable_z_levels = list("1" = 10, "3" = 15, "4" = 60, "5" = 15) //This list contains the z-level numbers which can be accessed via space travel and the percentual chances to get there. (Exceptions: extended, sandbox and nuke) -Errorage
// bitflags for preferences
#define BE_TRAITOR (1<<0)
#define BE_OPERATIVE (1<<1)
#define BE_CHANGELING (1<<2)
#define BE_WIZARD (1<<3)
#define BE_MALF (1<<4)
#define BE_REV (1<<5)
#define BE_ALIEN (1<<6)
#define BE_CULTIST (1<<7)
#define BE_MONKEY (1<<8)
//#define BE_CIVILIAN (1<<15) //well, I must stop here. --rastaf0
var/list/accessable_z_levels = list("1" = 10, "3" = 15, "4" = 60, "5" = 15) //This list contains the z-level numbers which can be accessed via space travel and the percentual chances to get there. (Exceptions: extended, sandbox and nuke) -Errorage
#define IS_MODE_COMPILED(MODE) (ispath(text2path("/datum/game_mode/"+(MODE))))

View File

@@ -3,45 +3,73 @@
#define MONKEY_MODE_SHUTTLE_CAPTURED 2
#define MONKEY_MODE_SHUTTLE_WITH_HUMANS 3
#define MONKEY_MODE_MONKEYS 4
/datum/game_mode/monkey
name = "monkey"
config_tag = "monkey"
var/state = MONKEY_MODE_RUNNING
var/list/datum/mind/initial_monkeys = new
/datum/game_mode/monkey/announce()
world << "<B>The current game mode is - Monkey!</B>"
world << "<B>Some of your crew members have been infected by a mutageous virus!</B>"
world << "<B>Escape on the shuttle but the humans have precedence!</B>"
/datum/game_mode/monkey/can_start()
if (num_players()<2)
return 0
for(var/mob/new_player/P in world)
if(P.client && P.ready && !jobban_isbanned(P, "Syndicate"))
return 1
return 0
/datum/game_mode/monkey/pre_setup()
var/list/possible_monkeys = get_players_for_role(BE_MONKEY)
// stop setup if no possible monkeys
if(!possible_monkeys.len)
return 0
var/num_monkeys = MONKEY_MODE_MONKEYS
var/num_players = num_players()
if (num_players<=num_monkeys)
num_monkeys = round(num_players/2)
for(var/j = 1 to num_monkeys)
if (!possible_monkeys.len)
break
var/datum/mind/monkey = pick(possible_monkeys)
possible_monkeys-=monkey
initial_monkeys += monkey
monkey.special_role = "monkey"
if(!initial_monkeys.len)
return 0
return 1
/datum/game_mode/monkey/post_setup()
spawn (50)
var/list/players = list()
for (var/mob/living/carbon/human/player in world)
if (player.client)
players += player
if (players.len >= 3)
var/amount = round((players.len - 1) / 3) + 1
amount = min(4, amount)
while (amount > 0)
var/mob/living/carbon/human/player = pick(players)
var/mob/living/carbon/monkey/new_monkey = player.monkeyize()
new_monkey << "<B>Your goal is to capture the entire human civilization and your first target is Centcom. Hijack the shuttle without humans aboard.</B>"
players -= player
amount--
for (var/datum/mind/monkey in initial_monkeys)
var/mob/living/carbon/human/H = monkey.current
var/mob/living/carbon/monkey/new_monkey = H.monkeyize()
new_monkey << "<B>Your goal is to capture the entire human civilization and your first target is Centcom. Hijack the shuttle without humans aboard!</B>"
for (var/mob/living/carbon/monkey/rabid_monkey in world)
if (!isturf(rabid_monkey.loc) || rabid_monkey.z!=1)
if (!(rabid_monkey.mind in initial_monkeys) && (!isturf(rabid_monkey.loc) || rabid_monkey.z!=1))
continue
rabid_monkey.contract_disease(new /datum/disease/jungle_fever,0,0)
rabid_monkey.contract_disease(new /datum/disease/jungle_fever,1,0)
del(initial_monkeys)
..()
/datum/game_mode/monkey/proc/is_important_monkey(var/mob/living/carbon/monkey/M as mob)
var/turf/T = get_turf(M)
return M.stat!=2 && istype(M.virus, /datum/disease/jungle_fever) && ( T.z==1 || istype(T.loc, /area/shuttle/escape/centcom) || istype(T.loc, /area/centcom))
var/area/A = get_area(M)
return \
M.stat!=2 && \
istype(M.virus, /datum/disease/jungle_fever) && \
( T.z==1 || is_type_in_list(A, centcom_areas))
/datum/game_mode/monkey/check_win()
if (state==MONKEY_MODE_SHUTTLE_CAPTURED || state==MONKEY_MODE_SHUTTLE_WITH_HUMANS)
@@ -61,16 +89,16 @@
if (state != MONKEY_MODE_NO_RABID_LEFT)
for(var/mob/living/carbon/monkey/monkey_player in world)
if (is_important_monkey(monkey_player))
var/turf/location = get_turf(monkey_player.loc)
if (istype(location.loc, /area/shuttle/escape/centcom))
var/area/A = get_area(monkey_player)
if ( is_type_in_list(A, centcom_areas))
monkeywin = 1
break
if(monkeywin)
for(var/mob/living/carbon/human/human_player in world)
if (human_player.stat != 2)
var/turf/location = get_turf(human_player.loc)
if (istype(location.loc, /area/shuttle/escape/centcom))
var/area/A = get_area(human_player)
if (istype(A, /area/shuttle/escape/centcom))
monkeywin = 0
break
@@ -78,20 +106,21 @@
world << "<FONT size=3 color=red><B>The monkeys have won! Humanity is doomed!</B></FONT>"
for (var/mob/living/carbon/human/player in world)
if (player.client)
spawn(0)
spawn(rand(0,150))
player.monkeyize()
for(var/mob/living/carbon/monkey/monkey_player in world)
if (monkey_player.client)
world << "<B>[monkey_player.key] was a monkey. [monkey_player.stat == 2 ? "(DEAD)" : ""]</B>"
sleep(50)
sleep(200)
else
world << "<FONT size=3 color=red><B>The Research Staff has stopped the monkey invasion!</B></FONT>"
for(var/mob/living/carbon/monkey/monkey_player in world)
if (monkey_player.client)
world << "<B>[monkey_player.key] was a monkey. [monkey_player.stat == 2 ? "(DEAD)" : ""]</B>"
..()
return 1
/datum/game_mode/proc/auto_declare_completion_monkey()
for(var/mob/living/carbon/monkey/monkey_player in world)
if (istype(monkey_player.virus, /datum/disease/jungle_fever) && monkey_player.ckey)
world << "<B>[monkey_player.ckey] was played infested [monkey_player]. [monkey_player.stat == 2 ? "(DEAD)" : ""]</B>"
return 1
#undef MONKEY_MODE_RUNNING
#undef MONKEY_MODE_NO_RABID_LEFT
#undef MONKEY_MODE_SHUTTLE_CAPTURED