-Added a config option, which defaults to off, which will let the gamemodes Wizard, Malf and Rev carry on playing without round interruption. Meaning...

The wizard round will carry on even if the wizard dies
The malf round will carry on even if the AI dies. When the AI dies the shuttle will become callable. If the AI takesover the station or causes the station to explode, the round will end like normal.
Rev will carry on playing even when all heads or all rev heads die. The shuttle will become callable when this is true.

-Properly fixed the PDA runtime without adding special snowflakes.


git-svn-id: http://tgstation13.googlecode.com/svn/trunk@5489 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
giacomand@gmail.com
2013-01-07 20:53:03 +00:00
parent 2f90aa3959
commit 1434a0154c
10 changed files with 141 additions and 118 deletions

View File

@@ -31,6 +31,7 @@
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
var/allow_Metadata = 0 // Metadata is supported.
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
var/Ticklag = 0.9
@@ -349,6 +350,9 @@
if("gateway_delay")
config.gateway_delay = text2num(value)
if("continuous_rounds")
config.continous_rounds = 1
else
diary << "Unknown setting in configuration: '[name]'"

View File

@@ -20,18 +20,22 @@ datum/shuttle_controller
var/timelimit //important when the shuttle gets called for more than shuttlearrivetime
//timeleft = 360 //600
var/fake_recall = 0 //Used in rounds to prevent "ON NOES, IT MUST [INSERT ROUND] BECAUSE SHUTTLE CAN'T BE CALLED"
var/always_fake_recall = 0
// call the shuttle
// if not called before, set the endtime to T+600 seconds
// otherwise if outgoing, switch to incoming
proc/incall(coeff = 1)
if(endtime)
if(direction == -1)
setdirection(1)
else
settimeleft(SHUTTLEARRIVETIME*coeff)
online = 1
if(always_fake_recall)
fake_recall = rand(300,500)
proc/recall()
if(direction == 1)
@@ -216,7 +220,7 @@ datum/shuttle_controller
else if((fake_recall != 0) && (timeleft <= fake_recall))
recall()
fake_recall = 0
return 0
/* --- Shuttle has docked with the station - begin countdown to transit --- */

View File

@@ -65,6 +65,8 @@
if(alert(AI_mind.current,"Do you want to use an alternative sprite for your real core?",,"Yes","No")=="Yes")
AI_mind.current.icon_state = "ai-malf2"
*/
if(emergency_shuttle)
emergency_shuttle.always_fake_recall = 1
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
@@ -131,7 +133,11 @@
if (station_captured && !to_nuke_or_not_to_nuke)
return 1
if (is_malf_ai_dead())
return 1
if(config.continous_rounds)
if(emergency_shuttle)
emergency_shuttle.always_fake_recall = 0
else
return 1
return ..() //check for shuttle and nuke

View File

@@ -89,6 +89,8 @@
for(var/datum/mind/rev_mind in head_revolutionaries)
greet_revolutionary(rev_mind)
modePlayer += head_revolutionaries
if(emergency_shuttle)
emergency_shuttle.always_fake_recall = 1
spawn (rand(waittime_l, waittime_h))
send_intercept()
..()
@@ -165,6 +167,11 @@
//Checks if the round is over//
///////////////////////////////
/datum/game_mode/revolution/check_finished()
if(config.continous_rounds)
if(finished != 0)
if(emergency_shuttle)
emergency_shuttle.always_fake_recall = 0
return ..()
if(finished != 0)
return 1
else

View File

@@ -15,5 +15,7 @@
M.CanBuild()
return 1
/datum/game_mode/sandbox/check_finished()
return 0
/datum/game_mode/sandbox/post_setup()
..()
if(emergency_shuttle)
emergency_shuttle.always_fake_recall = 1

View File

@@ -182,6 +182,10 @@
/datum/game_mode/wizard/check_finished()
if(config.continous_rounds)
return ..()
var/wizards_alive = 0
for(var/datum/mind/wizard in wizards)
if(!istype(wizard.current,/mob/living/carbon))
@@ -197,6 +201,7 @@
return 1
/datum/game_mode/wizard/declare_completion()
if(finished)
feedback_set_details("round_end_result","loss - wizard killed")

View File

@@ -442,10 +442,6 @@
user << "The emergency shuttle is already on its way."
return
if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "sandbox")
//New version pretends to call the shuttle but cause the shuttle to return after a random duration.
emergency_shuttle.fake_recall = rand(300,500)
if(ticker.mode.name == "blob")
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
return

View File

@@ -3,7 +3,7 @@
// TODO: Split everything into easy to manage procs.
/obj/item/device/detective_scanner
name = "Scanner"
name = "scanner"
desc = "Used to scan objects for DNA and fingerprints. Can print a report of the findings."
icon_state = "forensic1"
w_class = 3.0
@@ -17,7 +17,10 @@
if(log.len && !scanning)
scanning = 1
user << "<span class='notice'>Printing report, please wait...</span>"
spawn(100)
// Create our paper
var/obj/item/weapon/paper/P = new(get_turf(src))
P.name = "paper- 'Scanner Report'"
P.info = "<center><font size='6'><B>Scanner Report</B></font></center><HR><BR>"
@@ -25,143 +28,139 @@
P.info += "<HR><B>Notes:</B><BR>"
P.info_links = P.info
user.put_in_hands(P)
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(P)
M << "<span class='notice'>Report printed. Log cleared.<span>"
// Clear the logs
log = list()
scanning = 0
if(user)
user << "<span class='notice'>Report printed. Log cleared.<span>"
else
user << "<span class='notice'>The scanner has no logs or is in use.</span>"
/obj/item/device/detective_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
if(!scanning)
scanning = 1
spawn(0)
/obj/item/device/detective_scanner/attack(mob/living/M as mob, mob/user as mob)
scan(M, user)
var/found_something = 0
user << "<span class='notice'>You scan [M]. The scanner is analysing the results...</span>"
add_log(null, "<B>[time2text(world.time + 432000, "hh:mm:ss")] - [M]</B>")
// Fingerprints
if(ishuman(M))
if (istype(M.dna, /datum/dna) && !M.gloves)
sleep(30)
add_log(user, "<span class='info'><B>Prints:</B></span>")
add_log(user, "[md5(M.dna.uni_identity)]")
found_something = 1
// Blood
if ( !M.blood_DNA || !M.blood_DNA.len )
if(M.blood_DNA)
del(M.blood_DNA)
else
sleep(30)
add_log(user, "<span class='info'><B>Blood:</B></span>")
found_something = 1
for(var/blood in M.blood_DNA)
add_log(user, "Type: <font color='red'>[M.blood_DNA[blood]]</font> DNA: <font color='red'>[blood]</font>")
//Reagents
if(M.reagents && M.reagents.reagent_list.len)
sleep(30)
add_log(user, "<span class='info'><B>Reagents:</B></span>")
for(var/datum/reagent/R in M.reagents.reagent_list)
add_log(user, "Reagent: <font color='red'>[R.name]</font> Volume: <font color='red'>[R.volume]</font>")
found_something = 1
if(!found_something)
add_log(null, "<I># No forensic traces found #</I>")
user.visible_message("\The [user] scans \the [M] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"<span class='notice'>Unable to locate any fingerprints, materials, fibers, or blood on [M]!</span>",\
"You hear a faint hum of electrical equipment.")
else
user.visible_message("\The [user] scans \the [M] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"<span class='notice'>You finish scanning \the [M].</span>",\
"You hear a faint hum of electrical equipment.")
add_log(null, "---------------------------------------------------------")
scanning = 0
return
/obj/item/device/detective_scanner/afterattack(atom/A as obj|turf|area, mob/user as mob)
// Note, don't add formating, such as <span class>, as it won't show up in the logs.
if(!in_range(A,user))
return
if(!isturf(A) && !isobj(A))
return
if(loc != user)
return
scan(A, user)
/obj/item/device/detective_scanner/proc/scan(var/atom/A, var/mob/user)
if(!scanning)
scanning = 1
add_fingerprint(user)
user.visible_message("\The [user] scans \the [A] with \the [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]")
user << "<span class='notice'>You scan [A]. The scanner is analysing the results...</span>"
// GATHER INFORMATION
//Make our lists
var/list/fingerprints = list()
var/list/blood = list()
var/list/fibers = list()
var/list/reagents = list()
var/target_name = A.name
// Start gathering
if(ishuman(A))
var/mob/living/carbon/human/H = A
if (istype(H.dna, /datum/dna) && !H.gloves)
fingerprints += md5(H.dna.uni_identity)
if(H.blood_DNA && H.blood_DNA.len)
blood = H.blood_DNA.Copy()
else
if(A.fingerprints && A.fingerprints.len)
fingerprints = A.fingerprints.Copy()
if(A.blood_DNA && A.blood_DNA.len)
blood = A.blood_DNA.Copy()
if(A.reagents && A.reagents.reagent_list.len)
for(var/datum/reagent/R in A.reagents.reagent_list)
reagents[R.name] = R.volume
if(A.suit_fibers && A.suit_fibers.len)
fibers = A.suit_fibers.Copy()
// We gathered everything. Create a fork and slowly display the results to the holder of the scanner.
spawn(0)
var/found_something = 0
user << "<span class='notice'>You scan [A]. The scanner is analysing the results...</span>"
add_log(null, "<B>[time2text(world.time + 432000, "hh:mm:ss")] - [capitalize(A.name)]</B>")
//PRINTS
if(!A.fingerprints || !A.fingerprints.len)
if(A.fingerprints)
del(A.fingerprints)
else
var/list/completed_prints = list()
// Bah this looks awful but basically it loop throught the last 15 entries.
for(var/i in A.fingerprints)
var/print = A.fingerprints[i]
completed_prints += print
add_log("<B>[get_timestamp()] - [target_name]</B>", 0)
if(completed_prints.len)
sleep(30)
add_log(user, "<span class='info'><B>Prints:</B></span>")
for(var/i in completed_prints)
add_log(user, "[i]")
found_something = 1
//FIBERS
if(A.suit_fibers && A.suit_fibers.len)
// Fingerprints
if(fingerprints && fingerprints.len)
sleep(30)
add_log(user, "<span class='info'><B>Fibers:</B></span>")
for(var/fiber in A.suit_fibers)
add_log(user, "[fiber]")
add_log("<span class='info'><B>Prints:</B></span>")
for(var/finger in fingerprints)
add_log("[finger]")
found_something = 1
//Blood
if (A.blood_DNA && A.blood_DNA.len)
// Blood
if (blood && blood.len)
sleep(30)
add_log(user, "<span class='info'><B>Blood:</B></span>")
for(var/blood in A.blood_DNA)
add_log(user, "Type: <font color='red'>[A.blood_DNA[blood]]</font> DNA: <font color='red'>[blood]</font>")
add_log("<span class='info'><B>Blood:</B></span>")
found_something = 1
for(var/B in blood)
add_log("Type: <font color='red'>[blood[B]]</font> DNA: <font color='red'>[B]</font>")
//Fibers
if(fibers && fibers.len)
sleep(30)
add_log("<span class='info'><B>Fibers:</B></span>")
for(var/fiber in fibers)
add_log("[fiber]")
found_something = 1
//Reagents
if(A.reagents && A.reagents.reagent_list.len)
if(reagents && reagents.len)
sleep(30)
add_log(user, "<span class='info'><B>Reagents:</B></span>")
for(var/datum/reagent/R in A.reagents.reagent_list)
add_log(user, "Reagent: <font color='red'>[R.name]</font> Volume: <font color='red'>[R.volume]</font>")
add_log("<span class='info'><B>Reagents:</B></span>")
for(var/R in reagents)
add_log("Reagent: <font color='red'>[R]</font> Volume: <font color='red'>[reagents[R]]</font>")
found_something = 1
//General
if (!found_something)
add_log(null, "<I># No forensic traces found #</I>")
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"<span class='notice'>Unable to locate any fingerprints, materials, fibers, or blood on [A]!</span>",\
"You hear a faint hum of electrical equipment.")
// Get a new user
var/mob/holder = null
if(ismob(src.loc))
holder = src.loc
if(!found_something)
add_log("<I># No forensic traces found #</I>", 0) // Don't display this to the holder user
if(holder)
holder << "<span class='notice'>Unable to locate any fingerprints, materials, fibers, or blood on [target_name]!</span>"
else
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"<span class='notice'>You finish analysing \the [A].</span>",\
"You hear a faint hum of electrical equipment.")
if(holder)
holder << "<span class='notice'>You finish scanning \the [target_name].</span>"
add_log(null, "---------------------------------------------------------")
add_log("---------------------------------------------------------", 0)
scanning = 0
return 0
return
/obj/item/device/detective_scanner/proc/add_log(var/mob/user, var/msg)
/obj/item/device/detective_scanner/proc/add_log(var/msg, var/broadcast = 1)
if(scanning)
if(user)
user << msg
if(broadcast && ismob(loc))
var/mob/M = loc
M << msg
log += "&nbsp;&nbsp;[msg]"
else
CRASH("[src] \ref[src] is adding a log when it was never put in scanning mode!")
/obj/item/device/detective_scanner/proc/get_timestamp()
return time2text(world.time + 432000, "hh:mm:ss")

View File

@@ -270,15 +270,11 @@
var/criminal = "None"
if(wear_id)
if (istype(wear_id, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = wear_id
var/obj/item/weapon/card/id/I = wear_id.GetID()
if(I)
perpname = I.registered_name
else if (istype(wear_id, /obj/item/device/pda))
var/obj/item/device/pda/P = wear_id
perpname = P.owner
else if (istype(wear_id, /obj/item/weapon/storage/wallet))
var/obj/item/weapon/storage/wallet/W = wear_id
perpname = W.front_id
else
perpname = name
else
perpname = name

View File

@@ -186,3 +186,7 @@ GATEWAY_DELAY 18000
## Remove the # to give assistants maint access.
#ASSISTANT_MAINT
## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked.
## Malf and Rev will let the shuttle be called when the antags/protags are dead.
#CONTINUOUS_ROUNDS