From 1434a0154c6b4c18bd4102750179c38d7a511e64 Mon Sep 17 00:00:00 2001 From: "giacomand@gmail.com" Date: Mon, 7 Jan 2013 20:53:03 +0000 Subject: [PATCH] -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 --- code/controllers/configuration.dm | 4 + code/controllers/shuttle_controller.dm | 6 +- .../game/gamemodes/malfunction/malfunction.dm | 8 +- code/game/gamemodes/revolution/revolution.dm | 7 + code/game/gamemodes/sandbox/sandbox.dm | 6 +- code/game/gamemodes/wizard/wizard.dm | 5 + .../game/machinery/computer/communications.dm | 4 - code/modules/detectivework/scanner.dm | 201 +++++++++--------- .../mob/living/carbon/human/examine.dm | 12 +- config/config.txt | 6 +- 10 files changed, 141 insertions(+), 118 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 32080af6aeb..61fd4bb9b18 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -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]'" diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 2af57a876db..32784007196 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -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 --- */ diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 34545842ccf..b0b12a9c4a4 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -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 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index fe03323c86b..bedd230ebcc 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -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 diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 3bace4756ed..475c3d22aa5 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -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 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index d007cc1adec..e2c23db92d8 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -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") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index ae3d8f9f970..2fb98134ccb 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -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 diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index e3bd6221b8e..4475278000c 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -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 << "Printing report, please wait..." + spawn(100) + + // Create our paper var/obj/item/weapon/paper/P = new(get_turf(src)) P.name = "paper- 'Scanner Report'" P.info = "
Scanner Report


" @@ -25,143 +28,139 @@ P.info += "
Notes:
" P.info_links = P.info - user.put_in_hands(P) + if(ismob(loc)) + var/mob/M = loc + M.put_in_hands(P) + M << "Report printed. Log cleared." + // Clear the logs log = list() scanning = 0 - if(user) - user << "Report printed. Log cleared." else user << "The scanner has no logs or is in use." -/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 << "You scan [M]. The scanner is analysing the results..." - add_log(null, "[time2text(world.time + 432000, "hh:mm:ss")] - [M]") - // Fingerprints - if(ishuman(M)) - if (istype(M.dna, /datum/dna) && !M.gloves) - sleep(30) - add_log(user, "Prints:") - 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, "Blood:") - found_something = 1 - for(var/blood in M.blood_DNA) - add_log(user, "Type: [M.blood_DNA[blood]] DNA: [blood]") - - //Reagents - if(M.reagents && M.reagents.reagent_list.len) - sleep(30) - add_log(user, "Reagents:") - for(var/datum/reagent/R in M.reagents.reagent_list) - add_log(user, "Reagent: [R.name] Volume: [R.volume]") - found_something = 1 - - if(!found_something) - add_log(null, "# No forensic traces found #") - user.visible_message("\The [user] scans \the [M] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\ - "Unable to locate any fingerprints, materials, fibers, or blood on [M]!",\ - "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." : "."]" ,\ - "You finish scanning \the [M].",\ - "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 , 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 << "You scan [A]. The scanner is analysing the results..." + + + // 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 << "You scan [A]. The scanner is analysing the results..." - add_log(null, "[time2text(world.time + 432000, "hh:mm:ss")] - [capitalize(A.name)]") - //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("[get_timestamp()] - [target_name]", 0) - if(completed_prints.len) - - sleep(30) - add_log(user, "Prints:") - 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, "Fibers:") - for(var/fiber in A.suit_fibers) - add_log(user, "[fiber]") + add_log("Prints:") + 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, "Blood:") - for(var/blood in A.blood_DNA) - add_log(user, "Type: [A.blood_DNA[blood]] DNA: [blood]") + add_log("Blood:") + found_something = 1 + for(var/B in blood) + add_log("Type: [blood[B]] DNA: [B]") + + //Fibers + if(fibers && fibers.len) + sleep(30) + add_log("Fibers:") + 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, "Reagents:") - for(var/datum/reagent/R in A.reagents.reagent_list) - add_log(user, "Reagent: [R.name] Volume: [R.volume]") + add_log("Reagents:") + for(var/R in reagents) + add_log("Reagent: [R] Volume: [reagents[R]]") found_something = 1 - //General - if (!found_something) - add_log(null, "# No forensic traces found #") - user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\ - "Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\ - "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("# No forensic traces found #", 0) // Don't display this to the holder user + if(holder) + holder << "Unable to locate any fingerprints, materials, fibers, or blood on [target_name]!" else - user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\ - "You finish analysing \the [A].",\ - "You hear a faint hum of electrical equipment.") + if(holder) + holder << "You finish scanning \the [target_name]." - 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 += "  [msg]" else - CRASH("[src] \ref[src] is adding a log when it was never put in scanning mode!") \ No newline at end of file + 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") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f0ca3e9dfe9..943c93a7cd9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -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 diff --git a/config/config.txt b/config/config.txt index b05806f4024..de368b284a5 100644 --- a/config/config.txt +++ b/config/config.txt @@ -185,4 +185,8 @@ HUMANS_NEED_SURNAMES GATEWAY_DELAY 18000 ## Remove the # to give assistants maint access. -#ASSISTANT_MAINT \ No newline at end of file +#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 \ No newline at end of file