Few changes to how round start works.

Station Roles are picked before Syndie Roles unless it is nuke or wizard
People should no longer spawn in space because they did not get a job.
Heads and such should no longer get a role they should not have.
Rounds now have a minimum number of players required for it to start up.
Also the atmos pipes should stop exploding all over the place.


git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1974 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
mport2004@gmail.com
2011-08-03 05:59:10 +00:00
parent 7c7252fab3
commit 0f15fd1567
18 changed files with 240 additions and 350 deletions

View File

@@ -21,9 +21,9 @@ datum/pipe_network
update = 0
reconcile_air() //equalize_gases(gases)
//Give pipelines their process call for pressure checking and what not
for(var/datum/pipeline/line_member in line_members)
line_member.process()
//Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport
//for(var/datum/pipeline/line_member in line_members)
// line_member.process()
proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference)
//Purpose: Generate membership roster

View File

@@ -18,7 +18,7 @@ datum/pipeline
..()
proc/process()
proc/process()//This use to be called called from the pipe networks
//Check to see if pressure is within acceptable limits
var/pressure = air.return_pressure()

View File

@@ -1,10 +1,12 @@
/datum/game_mode/blob
name = "blob"
config_tag = "blob"
required_players = 0
var/stage = 0
var/next_stage = 0
/datum/game_mode/blob/announce()
world << "<B>The current game mode is - <font color='green'>Blob</font>!</B>"
world << "<B>A dangerous alien organism is rapidly spreading throughout the station!</B>"

View File

@@ -5,6 +5,8 @@
/datum/game_mode/changeling
name = "changeling"
config_tag = "changeling"
restricted_jobs = list("AI", "Cyborg")
required_players = 15
var
const
@@ -52,20 +54,24 @@
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/can_start()
/*/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
return 0*/
/datum/game_mode/changeling/pre_setup()
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
for(var/datum/mind/player in possible_changelings)
for(var/job in restricted_jobs)//Removing robots from the list
if(player.assigned_role == job)
possible_changelings -= player
if(possible_changelings.len>0)
var/datum/mind/changeling = pick(possible_changelings)
//possible_changelings-=changeling
changelings += changeling
var/mob/new_player/player = changeling.current
player.jobs_restricted_by_gamemode = nonhuman_positions
modePlayer += changelings
return 1
else

View File

@@ -2,28 +2,34 @@
name = "traitor+changeling"
config_tag = "traitorchan"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
restricted_jobs = list("AI", "Cyborg")
required_players = 20
/datum/game_mode/traitor/changeling/announce()
world << "<B>The current game mode is - Traitor+Changeling!</B>"
world << "<B>There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!</B>"
/datum/game_mode/traitor/changeling/can_start()
/*/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
return 0*/
/datum/game_mode/traitor/changeling/pre_setup()
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
for(var/datum/mind/player in possible_changelings)
for(var/job in restricted_jobs)//Removing robots from the list
if(player.assigned_role == job)
possible_changelings -= player
if(possible_changelings.len>0)
var/datum/mind/changeling = pick(possible_changelings)
//possible_changelings-=changeling
changelings += changeling
var/mob/new_player/player = changeling.current
player.jobs_restricted_by_gamemode = nonhuman_positions
modePlayer += changelings
return ..()
else

View File

@@ -1,9 +1,10 @@
/datum/game_mode
var/list/datum/mind/cult = list()
var
list/datum/mind/cult = list()
list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
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)
@@ -14,9 +15,12 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
!(mind.assigned_role in head_positions) && \
!(mind.assigned_role in list("Security Officer", "Detective", "Chaplain", "Warden"))
/datum/game_mode/cult
name = "cult"
config_tag = "cult"
restricted_jobs = list("Chaplain", "Security Officer", "Warden", "Detective", "AI", "Cyborg", "Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
required_players = 15
var/datum/mind/sacrifice_target = null
var/finished = 0
@@ -24,7 +28,6 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/list/startwords = list("blood","join","self","hell")
//var/list/startwords = list("travel","blood","join","hell","self","see")
var/list/objectives = list()
@@ -35,18 +38,22 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
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()
/*/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
return 1*/
/datum/game_mode/cult/pre_setup()
if(prob(50))
@@ -55,19 +62,23 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
else
objectives += "eldergod"
objectives += "sacrifice"
var/list/cultists_possible = get_players_for_role(BE_CULTIST)
for(var/datum/mind/player in cultists_possible)
for(var/job in restricted_jobs)//Removing heads and such from the list
if(player.assigned_role == job)
cultists_possible -= player
for(var/cultists_number = 1 to max_cultists_to_start)
if(!cultists_possible.len)
break
var/datum/mind/cultist = pick(cultists_possible)
cultists_possible -= cultist
cult += cultist
var/mob/new_player/player = cultist.current
player.jobs_restricted_by_gamemode = list("Chaplain", "Security Officer", "Warden", "Detective")+nonhuman_positions+head_positions
return (cult.len>0)
/datum/game_mode/cult/post_setup()
/datum/game_mode/cult/post_setup()
modePlayer += cult
if("sacrifice" in objectives)
var/list/possible_targets = get_unconvertables()
@@ -92,6 +103,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
send_intercept()
..()
/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
@@ -110,6 +122,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
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
@@ -128,6 +141,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
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/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
if (!word)
if(startwords.len > 0)
@@ -135,6 +149,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
startwords -= word
return ..(cult_mob,word)
/datum/game_mode/proc/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
if(!wordtravel)
runerandom()
@@ -169,6 +184,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
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/proc/add_cultist(datum/mind/cult_mind) //BASE
if (!istype(cult_mind))
return 0
@@ -177,11 +193,13 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
update_cult_icons_added(cult_mind)
return 1
/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
@@ -191,6 +209,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
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/proc/update_all_cult_icons()
spawn(0)
for(var/datum/mind/cultist in cult)
@@ -208,6 +227,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
var/I = image('mob.dmi', loc = cultist_1.current, icon_state = "cult")
cultist.current.client.images += I
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
spawn(0)
for(var/datum/mind/cultist in cult)
@@ -220,6 +240,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
var/image/J = image('mob.dmi', loc = cultist.current, icon_state = "cult")
cult_mind.current.client.images += J
/datum/game_mode/proc/update_cult_icons_removed(datum/mind/cult_mind)
spawn(0)
for(var/datum/mind/cultist in cult)
@@ -235,6 +256,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
if(I.icon_state == "cult")
del(I)
/datum/game_mode/cult/proc/get_unconvertables()
var/list/ucs = list()
for(var/mob/living/carbon/human/player in world)
@@ -242,6 +264,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
ucs += player.mind
return ucs
/datum/game_mode/cult/proc/check_cult_victory()
var/cult_fail = 0
if(objectives.Find("survive"))
@@ -254,6 +277,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
return cult_fail //if any objectives aren't met, failure
/datum/game_mode/cult/proc/check_survive()
acolytes_survived = 0
for(var/datum/mind/cult_mind in cult)
@@ -266,6 +290,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
else
return 1
/datum/game_mode/cult/declare_completion()
if(!check_cult_victory())
@@ -303,6 +328,7 @@ var/list/allwords = list("travel","self","see","hell","blood","join","tech","des
..()
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>"

View File

@@ -1,6 +1,7 @@
/datum/game_mode/extended
name = "extended"
config_tag = "extended"
required_players = 0
/datum/game_mode/announce()
world << "<B>The current game mode is - Extended Role-Playing!</B>"
@@ -11,5 +12,5 @@
spawn_exporation_packs()
return 1
/datum/game_mode/extended/can_start()
return (num_players() > 0)
//datum/game_mode/extended/can_start()
// return (num_players() > 0)

View File

@@ -1,48 +1,75 @@
/*
* 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 = new
var/votable = 1
var/probability = 1
var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
var/explosion_in_progress = 0 //sit back and relax
var
name = "invalid"
config_tag = null
intercept_hacked = 0
votable = 1
probability = 1
station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
explosion_in_progress = 0 //sit back and relax
list/datum/mind/modePlayer = new
list/restricted_jobs = list()
required_players = 0
/datum/game_mode/proc/announce() //to be calles when round starts
world << "<B>Notice</B>: [src] did not define announce()"
/datum/game_mode/proc/can_start() //to help game select mode
///can_start()
///Checks to see if the game can be setup and ran with the current number of players or whatnot.
/datum/game_mode/proc/can_start()
var/playerC = 0
for(var/mob/new_player/player in world)
if((player.client)&&(player.ready))
playerC++
if(playerC >= required_players)
return 1
return 0
/datum/game_mode/proc/pre_setup() //select players for special roles
///pre_setup()
///Attempts to select players for special roles the mode might have.
/datum/game_mode/proc/pre_setup()
return 1
/datum/game_mode/proc/post_setup() //do irreversible preparations
///post_setup()
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
/datum/game_mode/proc/post_setup()
return 1
///process()
///Called by the gameticker
/datum/game_mode/proc/process()
return 0
/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
return 0
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
return 0
/datum/game_mode/proc/send_intercept()
var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested staus information:</FONT><HR>"
@@ -80,6 +107,7 @@
command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.")
world << sound('intercept.ogg')
/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)
@@ -98,16 +126,22 @@
for(var/mob/new_player/player in world)
if (player.client && player.ready)
candidates += player.mind
return candidates
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
if(player.preferences.be_special & role)
return 1
return 0
/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//
///////////////////////////////////
@@ -118,6 +152,7 @@
heads += player.mind
return heads
////////////////////////////
//Keeps track of all heads//
////////////////////////////

View File

@@ -52,12 +52,12 @@ var/global/datum/controller/gameticker/ticker
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Unable to start [master_mode].</B> Not enough players. Reverting to pre-game lobby."
ResetOccupations()
return 0
//Configure mode and assign player to special mode stuff
var/can_continue
if (src.mode.config_tag == "revolution")
/* if (src.mode.config_tag == "revolution")
var/tries=5
do
can_continue = src.mode.pre_setup()
@@ -67,13 +67,16 @@ var/global/datum/controller/gameticker/ticker
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
else*/
DivideOccupations() //Distribute jobs
var/can_continue = src.mode.pre_setup()//Setup special modes
if(!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
ResetOccupations()
return 0
if(hide_mode)
var/list/modes = new
@@ -85,22 +88,22 @@ var/global/datum/controller/gameticker/ticker
else
src.mode.announce()
distribute_jobs() //Distribute jobs and announce the captain
create_characters() //Create player characters and transfer them
collect_minds()
data_core.manifest()
equip_characters()
data_core.manifest()
current_state = GAME_STATE_PLAYING
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)
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
world << sound('welcome.ogg') // Skie
spawn(0)//Forking here so we dont have to wait for this to finish
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)
spawn(-1)
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
world << sound('welcome.ogg') // Skie
spawn (3000)
start_events()
@@ -116,15 +119,6 @@ var/global/datum/controller/gameticker/ticker
return 1
/datum/controller/gameticker
proc/distribute_jobs()
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)
@@ -135,16 +129,25 @@ var/global/datum/controller/gameticker/ticker
else if(player.mind)
player.create_character()
del(player)
proc/collect_minds()
for(var/mob/living/player in world)
if(player.mind)
ticker.minds += player.mind
proc/equip_characters()
var/captainless=1
for(var/mob/living/carbon/human/player in world)
if(player.mind && player.mind.assigned_role)
if(player.mind.assigned_role != "MODE")
player.Equip_Rank(player.mind.assigned_role)
if(player.mind.assigned_role == "Captain")
captainless=0
if (captainless)
world << "Captainship not forced on anyone."
proc/process()
if(current_state != GAME_STATE_PLAYING)
@@ -170,29 +173,6 @@ var/global/datum/controller/gameticker/ticker
return 1
/*
/datum/controller/gameticker/proc/timeup()
if (shuttle_left) //Shuttle left but its leaving or arriving again
check_win() //Either way, its not possible
return
if (src.shuttle_location == shuttle_z)
move_shuttle(locate(/area/shuttle), locate(/area/arrival/shuttle))
src.timeleft = shuttle_time_in_station
src.shuttle_location = 1
world << "<B>The Emergency Shuttle has docked with the station! You have [ticker.timeleft/600] minutes to board the Emergency Shuttle.</B>"
else //marker2
world << "<B>The Emergency Shuttle is leaving!</B>"
shuttle_left = 1
shuttlecoming = 0
check_win()
return
*/
/datum/controller/gameticker/proc/declare_completion()
@@ -225,70 +205,3 @@ var/global/datum/controller/gameticker/ticker
call(mode, handler)()
return 1
/////
/////SETTING UP THE GAME
/////
/////
/////MAIN PROCESS PART
/////
/*
/datum/controller/gameticker/proc/game_process()
switch(mode.name)
if("deathmatch","monkey","nuclear emergency","Corporate Restructuring","revolution","traitor",
"wizard","extended")
do
if (!( shuttle_frozen ))
if (src.timing == 1)
src.timeleft -= 10
else
if (src.timing == -1.0)
src.timeleft += 10
if (src.timeleft >= shuttle_time_to_arrive)
src.timeleft = null
src.timing = 0
if (prob(0.5))
spawn_meteors()
if (src.timeleft <= 0 && src.timing)
src.timeup()
sleep(10)
while(src.processing)
return
//Standard extended process (incorporates most game modes).
//Put yours in here if you don't know where else to put it.
if("AI malfunction")
do
check_win()
ticker.AItime += 10
sleep(10)
if (ticker.AItime == 6000)
world << "<FONT size = 3><B>Cent. Com. Update</B> AI Malfunction Detected</FONT>"
world << "\red It seems we have provided you with a malfunctioning AI. We're very sorry."
while(src.processing)
return
//malfunction process
if("meteor")
do
if (!( shuttle_frozen ))
if (src.timing == 1)
src.timeleft -= 10
else
if (src.timing == -1.0)
src.timeleft += 10
if (src.timeleft >= shuttle_time_to_arrive)
src.timeleft = null
src.timing = 0
for(var/i = 0; i < 10; i++)
spawn_meteors()
if (src.timeleft <= 0 && src.timing)
src.timeup()
sleep(10)
while(src.processing)
return
//meteor mode!!! MORE METEORS!!!
else
return
//Anything else, like sandbox, return.
*/

View File

@@ -4,6 +4,7 @@
/datum/game_mode/malfunction
name = "AI malfunction"
config_tag = "malfunction"
required_players = 20
var/const/waittime_l = 600
var/const/waittime_h = 1800 // started at 1800
@@ -19,39 +20,29 @@
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 [AI_win_timeleft/60] minutes to disable it."
/datum/game_mode/malfunction/can_start()
/*/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()
for(var/mob/new_player/player in world)
if(player.mind && player.mind.assigned_role == "AI")
malf_ai+=player.mind
if(malf_ai.len)
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)
*/
for(var/datum/mind/AI_mind in malf_ai)
/*if(malf_ai.len < 1)
world << "Uh oh, its malfunction and there is no AI! Please report this."
world << "Rebooting world in 5 seconds."
sleep(50)
world.Reboot()
return*/
if(malf_ai.len < 1)
world << "Uh oh, its malfunction and there is no AI! Please report this."
world << "Rebooting world in 5 seconds."
sleep(50)
world.Reboot()
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/AI_Module/module_picker
@@ -129,7 +120,7 @@
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
@@ -210,7 +201,7 @@
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."

View File

@@ -5,6 +5,7 @@
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
var/const/meteordelay = 2000
var/nometeors = 1
required_players = 0
/datum/game_mode/meteor/announce()
world << "<B>The current game mode is - Meteor!</B>"
@@ -16,7 +17,7 @@
spawn(meteordelay)
nometeors = 0
/datum/game_mode/meteor/can_start()
/*/datum/game_mode/meteor/can_start()
var/num_players = 0
for(var/mob/new_player/P in world)
if(P.client && P.ready)
@@ -25,7 +26,7 @@
if(num_players >= 10)
return 1 // needs at least 10 players in order to play this mode
return 0
return 0*/
/datum/game_mode/meteor/process()
if (nometeors) return

View File

@@ -5,6 +5,7 @@
/datum/game_mode/nuclear
name = "nuclear emergency"
config_tag = "nuclear"
required_players = 15
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)
@@ -20,15 +21,9 @@
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)
/datum/game_mode/nuclear/can_start()//This could be better, will likely have to recode it later
if(!..())
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 = get_players_for_role(BE_OPERATIVE)
var/agent_number = 0
@@ -55,8 +50,13 @@
for(var/datum/mind/synd_mind in syndicates)
synd_mind.assigned_role = "MODE" //So they aren't chosen for other jobs.
synd_mind.special_role = "Syndicate"//So they actually have a special role/N
return 1
/datum/game_mode/nuclear/pre_setup()
return 1
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
/datum/game_mode/proc/update_all_synd_icons()

View File

@@ -14,11 +14,13 @@
/datum/game_mode/revolution
name = "revolution"
config_tag = "revolution"
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
required_players = 20
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)
///////////////////////////
//Announces the game type//
///////////////////////////
@@ -26,13 +28,15 @@
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
var/players = 0
for(var/mob/new_player/P in world)
if (!P.client || !P.ready)
continue
players++
if(!jobban_isbanned(P, "Syndicate"))
possible_headrevs += P
for (var/i in head_positions)
@@ -40,6 +44,8 @@
possible_heads += P
break
//lets do as best as we can
if (players < min_players)
return 0
if (possible_headrevs.len==0)
return 0
if (possible_heads.len==0)
@@ -48,7 +54,7 @@
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//
@@ -56,30 +62,30 @@
/datum/game_mode/revolution/pre_setup()
var/list/datum/mind/possible_headrevs = get_players_for_role(BE_REV)
var/head_check = 0
for(var/mob/new_player/player in world)
if(player.mind.assigned_role in head_positions)
head_check = 1
break
for(var/datum/mind/player in possible_headrevs)
for(var/job in restricted_jobs)//Removing heads and such from the list
if(player.assigned_role == job)
possible_headrevs -= player
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
var/mob/new_player/player = lenin.current
player.jobs_restricted_by_gamemode = list("Security Officer", "Warden", "Detective")+nonhuman_positions+head_positions
if(head_revolutionaries.len==0)
if((head_revolutionaries.len==0)||(!head_check))
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
ResetOccupations() //clean up
return 0
return 1
/datum/game_mode/revolution/post_setup()
var/list/heads = get_living_heads()

View File

@@ -1,6 +1,7 @@
/datum/game_mode/sandbox
name = "sandbox"
config_tag = "sandbox"
required_players = 0
/datum/game_mode/sandbox/announce()
world << "<B>The current game mode is - Sandbox!</B>"

View File

@@ -5,7 +5,7 @@
/datum/game_mode/traitor
name = "traitor"
config_tag = "traitor"
required_players = 0
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
@@ -50,11 +50,11 @@
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>"
/datum/game_mode/traitor/can_start()
/*/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
return 0*/
/datum/game_mode/traitor/pre_setup()
var/list/possible_traitors = get_players_for_role(BE_TRAITOR)

View File

@@ -5,6 +5,7 @@
/datum/game_mode/wizard
name = "wizard"
config_tag = "wizard"
required_players = 0
var/finished = 0
@@ -55,18 +56,13 @@
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()
/datum/game_mode/wizard/can_start()//This could be better, will likely have to recode it later
if(!..())
return 0
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.
@@ -78,6 +74,9 @@
wizard.current.loc = pick(wizardstart)
return 1
/datum/game_mode/wizard/pre_setup()
return 1
/datum/game_mode/wizard/post_setup()
for(var/datum/mind/wizard in wizards)
forge_wizard_objectives(wizard)

View File

@@ -6,8 +6,8 @@
if (player.preferences.occupation[level] == job)
if (jobban_isbanned(player, job))
continue
if (player.jobs_restricted_by_gamemode && (job in player.jobs_restricted_by_gamemode))
continue
// if (player.jobs_restricted_by_gamemode && (job in player.jobs_restricted_by_gamemode))
// continue
candidates += player
return candidates
@@ -15,7 +15,8 @@
/proc/ResetOccupations()
for (var/mob/new_player/player in world)
player.mind.assigned_role = null
player.jobs_restricted_by_gamemode = null
player.mind.special_role = null
// player.jobs_restricted_by_gamemode = null
return
/** Proc DivideOccupations
@@ -26,9 +27,6 @@
var/list/unassigned = list()
var/list/occupation_eligible = occupations.Copy()
if(ticker.mode.name == "AI malfunction")
occupation_eligible["AI"] = 0
for (var/mob/new_player/player in world)
if (player.client && player.ready && !player.mind.assigned_role)
unassigned += player
@@ -47,27 +45,40 @@
if (unassigned.len == 0)
return 0
//Check for a Captain first
for (var/level = 1 to 3)
var/list/candidates = FindOccupationCandidates(unassigned, "Captain", level)
if (candidates.len)
var/mob/new_player/candidate = pick(candidates)
unassigned -= candidate
candidate.mind.assigned_role = "Captain"
break
/*
// Not forcing a Captain -- TLE
if (captain_choice == null && unassigned.len > 0)
//Then check for an AI
for (var/level = 1 to 3)//Malf is a bit special as it replaces a normal job
var/list/candidates = FindOccupationCandidates(unassigned, "AI", level)
if(ticker.mode.name == "AI malfunction")
for(var/mob/new_player/player in candidates)
if(!player.preferences.be_special & BE_MALF)
candidates -= player
if (candidates.len)
var/mob/new_player/candidate = pick(candidates)
unassigned -= candidate
candidate.mind.assigned_role = "AI"
break
//Malf NEEDS an AI so force one
if((ticker.mode.name == "AI malfunction")&&(occupation_eligible["AI"] > 0))
unassigned = shuffle(unassigned)
for(var/mob/new_player/player in unassigned)
if(jobban_isbanned(player, "Captain"))
if(jobban_isbanned(player, "AI"))
continue
else
captain_choice = player
player.mind.assigned_role = "AI"
unassigned -= player
break
unassigned -= captain_choice
*/
for (var/level = 1 to 3) //players with preferences set
//Now we can go though the rest of the jobs and players who set prefs
for (var/level = 1 to 3)
//Assistants are checked first
for (var/occupation in assistant_occupations)
if (unassigned.len == 0)
break
@@ -75,7 +86,7 @@
for (var/mob/new_player/candidate in candidates)
candidate.mind.assigned_role = occupation
unassigned -= candidate
//Now everyone else
for (var/occupation in occupation_eligible)
if (unassigned.len == 0)
break
@@ -87,10 +98,9 @@
var/mob/new_player/candidate = pick_n_take(candidates)
candidate.mind.assigned_role = occupation
unassigned -= candidate
if (unassigned.len) //unlucky players with preferences and players without preferences
//Last try to fill in any leftover jobs with leftover players
if (unassigned.len)
var/list/vacancies = list()
var/list/failsafe = list()
for (var/occ in occupation_eligible)
for (var/i = 1 to occupation_eligible[occ])
vacancies += occ
@@ -98,13 +108,6 @@
while (unassigned.len && vacancies.len)
var/mob/new_player/candidate = pick_n_take(unassigned)
var/occupation = pick_n_take(vacancies)
if(candidate.jobs_restricted_by_gamemode)
if(occupation in candidate.jobs_restricted_by_gamemode)
vacancies += occupation
failsafe += candidate
continue
candidate.mind.assigned_role = occupation
for (var/mob/new_player/player in unassigned)
@@ -112,110 +115,10 @@
break
player.mind.assigned_role = pick(assistant_occupations)
for (var/mob/new_player/player in failsafe)
if (unassigned.len == 0)
break
player.mind.assigned_role = pick(assistant_occupations)
return 1
/mob/living/carbon/human/proc/Equip_Rank(rank, joined_late)
/*
if(rank=="Clown")
if(alert("Do you want to be a clown or a mime?",,"Clown","Mime")=="Mime")
rank="Mime" //Why no work -- Urist
*/
/*if(joined_late && ticker.mode.name == "ctf")
var/red_team
var/green_team
for(var/mob/living/carbon/human/M in world)
if(M.client)
if(M.client.team == "Red")
red_team++
if(M.client.team == "Green")
green_team++
if(!src.client.team)
if(red_team > green_team)
src.client.team = "Green"
else
src.client.team = "Red"
src << "You are in the [src.client.team] Team!"
var/obj/item/device/radio/headset/H = new /obj/item/device/radio/headset(src)
src.equip_if_possible(H, slot_w_radio)
if(src.client.team == "Red")
H.set_frequency(1465)
src.equip_if_possible(new /obj/item/clothing/under/color/red(src), src.slot_w_uniform)
src.equip_if_possible(new /obj/item/clothing/suit/armor/tdome/red(src), slot_wear_suit)
else if(src.client.team == "Green")
H.set_frequency(1449)
src.equip_if_possible(new /obj/item/clothing/under/color/green(src), src.slot_w_uniform)
src.equip_if_possible(new /obj/item/clothing/suit/armor/tdome/green(src), slot_wear_suit)
src.equip_if_possible(new /obj/item/clothing/shoes/black(src), src.slot_shoes)
src.equip_if_possible(new /obj/item/clothing/mask/gas/emergency(src), src.slot_wear_mask)
src.equip_if_possible(new /obj/item/clothing/gloves/swat(src), src.slot_gloves)
src.equip_if_possible(new /obj/item/clothing/glasses/thermal(src), src.slot_glasses)
var/obj/item/weapon/tank/air/O = new /obj/item/weapon/tank/air(src)
src.equip_if_possible(O, src.slot_back)
src.internal = O
var/obj/item/weapon/card/id/W = new(src)
W.name = "[src.real_name]'s ID card ([src.client.team] Team)"
if(src.client.team == "Red")
W.access = access_red
else if(src.client.team == "Green")
W.access = access_green
else
world << "Unspecified team, [src.client.team]"
W.assignment = "[src.client.team] Team"
W.registered = src.real_name
src.equip_if_possible(W, src.slot_wear_id)
return
if(joined_late && ticker.mode.name == "deathmatch")
src.equip_if_possible(new /obj/item/clothing/under/color/black(src), src.slot_w_uniform)
src.equip_if_possible(new /obj/item/clothing/shoes/black(src), src.slot_shoes)
src.equip_if_possible(new /obj/item/clothing/suit/swat_suit/death_commando(src), src.slot_wear_suit)
src.equip_if_possible(new /obj/item/clothing/mask/gas/death_commando(src), src.slot_wear_mask)
src.equip_if_possible(new /obj/item/clothing/gloves/swat(src), src.slot_gloves)
src.equip_if_possible(new /obj/item/clothing/glasses/thermal(src), src.slot_glasses)
src.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle(src), src.slot_l_hand)
src.equip_if_possible(new /obj/item/weapon/flashbang(src), src.slot_r_store)
var/obj/item/weapon/tank/air/O = new /obj/item/weapon/tank/air(src)
src.equip_if_possible(O, src.slot_back)
src.internal = O
var/randomname = "Killiam Shakespeare"
if(commando_names.len)
randomname = pick(commando_names)
commando_names -= randomname
var/newname = input(src,"You are a death commando. Would you like to change your name?", "Character Creation", randomname)
if(!length(newname))
newname = randomname
newname = strip_html(newname,40)
src.real_name = newname
src.name = newname // there are WAY more things than this to change, I'm almost certain
var/obj/item/weapon/card/id/W = new(src)
W.name = "[newname]'s ID card (Death Commando)"
W.access = get_all_accesses()
W.assignment = "Death Commando"
W.registered = newname
src.equip_if_possible(W, src.slot_wear_id)
return
*/
switch(rank)
if ("Chaplain")
var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible/booze(src)

View File

@@ -10,7 +10,7 @@ mob/new_player
canmove = 0
anchored = 1 // don't get pushed around
var/list/jobs_restricted_by_gamemode
// var/list/jobs_restricted_by_gamemode
Login()
//Next line is commented out because seem it does nothing helpful and on the other hand it calls mob/new_player/Move() to EACH turf in the world. --rastaf0