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