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