diff --git a/code/WorkInProgress/detective_work.dm b/code/WorkInProgress/detective_work.dm
index da6d6e92881..9c2e126c863 100644
--- a/code/WorkInProgress/detective_work.dm
+++ b/code/WorkInProgress/detective_work.dm
@@ -192,11 +192,11 @@ obj/machinery/computer/forensic_scanning
for(var/i = 1, i < (files.len + 1), i++) //Lets see if we can find the owner of the prints
var/list/perp_list = files[i]
var/list/perp_prints = params2list(perp_list[1])
- var/perp = perp_prints[1]
+ var/perp = perp_prints[num2text(1)]
var/found2 = 0
for(var/m = 1, m < (A.fingerprints.len + 1), m++) //Compare database prints with prints on object.
var/list/test_prints_list = params2list(A.fingerprints[m])
- var/checker = test_prints_list[1]
+ var/checker = test_prints_list[num2text(1)]
if(checker == perp) //Found 'em! Merge!
found_prints[m] = 1
for(var/n = 2, n < (perp_list.len + 1), n++) //Lets see if it is already in the database
@@ -209,13 +209,13 @@ obj/machinery/computer/forensic_scanning
if(A.fingerprints)
for(var/j = 1, j < (A.fingerprints.len + 1), j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
- var/test_print1 = print_test1[1]
+ var/test_print1 = print_test1[num2text(1)]
var/found = 0
for(var/k = 1, k <= (prints.len + 1), k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
- var/test_print2 = print_test2[1]
+ var/test_print2 = print_test2[num2text(1)]
if(test_print2 == test_print1) //It is! Merge!
- prints[k] = test_print2 + "&" + stringmerge(print_test2[2],print_test1[2])
+ prints[k] = "1=" + test_print2 + "&2=" + stringmerge(print_test2[num2text(2)],print_test1[num2text(2)])
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
@@ -278,20 +278,20 @@ obj/machinery/computer/forensic_scanning
for(var/k = 1, k < (files.len + 1), k++)
var/list/perp_list = files[k]
var/list/perp_prints = params2list(perp_list[1])
- var/perp = perp_prints[1]
+ var/perp = perp_prints[num2text(1)]
var/list/found_prints = list()
for(var/i = 2, i < (perp_list.len + 1), i++)
var/list/test_list = perp_list[i]
var/list/test_prints = test_list[2]
for(var/j = 1, j < (test_prints.len + 1), j++)
var/list/test_list_2 = params2list(test_prints[j])
- var/test_prints_2 = test_list_2[1]
+ var/test_prints_2 = test_list_2[num2text(1)]
if(test_prints_2 == perp)
- found_prints += test_list_2[2]
+ found_prints += test_list_2[num2text(2)]
break
for(var/prints in found_prints)
- perp_prints[2] = stringmerge(perp_prints[2],prints)
- perp_list[1] = perp + "&" + perp_prints[2]
+ perp_prints[num2text(2)] = stringmerge(perp_prints[num2text(2)],prints)
+ perp_list[1] = "1=" + perp + "&2=" + perp_prints[num2text(2)]
files[k] = perp_list
return
@@ -300,13 +300,13 @@ obj/machinery/computer/forensic_scanning
if(card.fingerprints)
for(var/k = 1, k < (card.fingerprints.len + 1), k++)
var/list/test_prints = params2list(card.fingerprints[k])
- var/print = test_prints[1]
+ var/print = test_prints[num2text(1)]
for(var/i = 1, i < (files.len + 1), i++)
var/list/test_list = files[i]
var/list/perp_prints = params2list(test_list[1])
- var/perp = perp_prints[1]
+ var/perp = perp_prints[num2text(1)]
if(perp == print)
- test_list[1] = print + "&" + print
+ test_list[1] = "1=" + print + "&2=" + print
files[i] = test_list
break
del(card)
@@ -396,8 +396,8 @@ obj/machinery/computer/forensic_scanning
var/list/dossier = files[identifier]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(prints[2]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: (80% or higher completion reached)
" + prints[2] + "
"
+ if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
+ print_string = "Fingerprints: (80% or higher completion reached)
" + prints[num2text(2)] + "
"
temp += print_string
for(var/i = 2, i < (dossier.len + 1), i++)
var/list/outputs = dossier[i]
@@ -436,8 +436,8 @@ obj/machinery/computer/forensic_scanning
var/list/dossier = files[text2num(href_list["identifier"])]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!
"
- if(stringpercent(prints[2]) <= FINGERPRINT_COMPLETE)
- print_string = "Fingerprints: " + prints[2] + "
"
+ if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE)
+ print_string = "Fingerprints: " + prints[num2text(2)] + "
"
P.info += print_string
for(var/i = 2, i < (dossier.len + 1), i++)
var/list/outputs = dossier[i]
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 8d573b32424..5466ab60ef9 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -309,13 +309,13 @@ datum/mind
if(!def_value)//If it's a custom objective, it will be an empty string.
def_value = "custom"
- var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "debrain", "protect", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom")
+ var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate","decapitate", "debrain", "protect", "hijack", "escape", "survive", "steal", "download", "nuclear", "capture", "absorb", "custom")
if (!new_obj_type) return
var/datum/objective/new_objective = null
switch (new_obj_type)
- if ("assassinate","protect","debrain")
+ if ("assassinate","protect","debrain","decapitate")
//To determine what to name the objective in explanation text.
var/objective_type_capital = uppertext(copytext(new_obj_type, 1,2))//Capitalize first letter.
var/objective_type_text = copytext(new_obj_type, 2)//Leave the rest of the text.
@@ -327,7 +327,7 @@ datum/mind
possible_targets += possible_target.current
var/mob/def_target = null
- var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain)
+ var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/decapitate)
if (objective&&(objective.type in objective_list) && objective:target)
def_target = objective:target.current
diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index cfd3dbfb00b..92e06cea72d 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -1254,7 +1254,7 @@ proc/listclearnulls(list/list)
return 0
/proc/do_after(mob/M as mob, time as num)
- var/turf/T = M.loc
+ var/turf/T = get_turf(M)
var/holding = M.equipped()
sleep(time)
if(M)
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 4535b2af207..311fa63548c 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -102,12 +102,12 @@
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
var/list/L = params2list(src.fingerprints[i])
if(L.len > 1)
- if(L[1] == md5(H.dna.uni_identity))
+ if(L[num2text(1)] == md5(H.dna.uni_identity))
new_prints = i
- prints = L[2]
+ prints = L[num2text(2)]
break
else
- src.fingerprints[i] = "1=" + L[1] + "&2=" + stars(L[2], rand(80,90))
+ src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + stars(L[num2text(2)], rand(80,90))
else
var/turf/T = get_turf(src)
for (var/mob/N in world)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 99d33b79226..cb2f4a46a8f 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -29,6 +29,39 @@ datum/objective
+datum/objective/decapitate
+ find_target()
+ ..()
+ if(target && target.current)
+ explanation_text = "[target.current.real_name], the [target.assigned_role], has defied us for the last time. Make an example of him, and bring us his severed head."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+
+ find_target_by_role(role, role_type=0)
+ ..(role, role_type)
+ if(target && target.current)
+ explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role], has defied us for the last time. Make an example of him, and bring us his severed head."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+
+ check_completion()
+ if(target && target.current)
+ if(!owner.current||owner.current.stat==2)//If you're otherwise dead.
+ return 0
+ var/list/all_items = owner.current.get_contents()
+ for(var/obj/item/weapon/organ/head/mmi in all_items)
+ if(mmi.brainmob&&mmi.brainmob.mind==target)
+ return 1
+ return 0
+ else
+ return 1
+
+
+
datum/objective/assassinate
find_target()
..()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 85a350d8571..18a0d6fcb89 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -171,20 +171,20 @@
if((!( istype(G, /obj/item/weapon/grab)) || !( ismob(G.affecting))))
return
if(src.occupant)
- user << "\blue The sleeper is already occupied!"
+ user << "\blue The [src.name] is already occupied!"
return
for(var/mob/living/carbon/metroid/M in range(1,G.affecting))
if(M.Victim == G.affecting)
- usr << "[G.affecting.name] will not fit into the sleeper because they have a Metroid latched onto their head."
+ usr << "[G.affecting.name] will not fit into the [src.name] because they have a Metroid latched onto their head."
return
for (var/mob/V in viewers(user))
- V.show_message("[user] starts putting [G.affecting.name] into the sleeper.", 3)
+ V.show_message("[user] starts putting [G.affecting.name] into the [src.name].", 3)
if(do_after(user, 20))
if(src.occupant)
- user << "\blue The sleeper is already occupied!"
+ user << "\blue The [src.name] is already occupied!"
return
if(!G || !G.affecting) return
var/mob/M = G.affecting
@@ -259,7 +259,7 @@
src.occupant.client.perspective = MOB_PERSPECTIVE
src.occupant.loc = src.loc
src.occupant = null
- if(orient == "RIGHT")
+ if(orient == "RIGHT" && !istype(src,/obj/machinery/sleeper/syndicate))
icon_state = "sleeper_0-r"
return
@@ -345,9 +345,12 @@
set src in oview(1)
if(usr.stat != 0)
return
- if(orient == "RIGHT")
- icon_state = "sleeper_0-r"
- src.icon_state = "sleeper_0"
+ if(!istype(src,/obj/machinery/sleeper/syndicate))
+ if(orient == "RIGHT")
+ icon_state = "sleeper_0-r"
+ src.icon_state = "sleeper_0"
+ else
+ src.icon_state = "syndi_0"
src.go_out()
add_fingerprint(usr)
return
@@ -361,7 +364,7 @@
if(usr.stat != 0)
return
if(src.occupant)
- usr << "\blue The sleeper is already occupied!"
+ usr << "\blue The [src.name] is already occupied!"
return
for(var/mob/living/carbon/metroid/M in range(1,usr))
@@ -369,22 +372,40 @@
usr << "You're too busy getting your life sucked out of you."
return
for(var/mob/V in viewers(usr))
- V.show_message("[usr] starts climbing into the sleeper.", 3)
+ V.show_message("[usr] starts climbing into the [src.name].", 3)
if(do_after(usr, 20))
if(src.occupant)
- usr << "\blue The sleeper is already occupied!"
+ usr << "\blue The [src.name] is already occupied!"
return
usr.pulling = null
usr.client.perspective = EYE_PERSPECTIVE
usr.client.eye = src
usr.loc = src
src.occupant = usr
- src.icon_state = "sleeper_1"
- if(orient == "RIGHT")
- icon_state = "sleeper_1-r"
+ if(!istype(src,/obj/machinery/sleeper/syndicate))
+ src.icon_state = "sleeper_1"
+ if(orient == "RIGHT")
+ icon_state = "sleeper_1-r"
+ else
+ src.icon_state = "syndi_1"
for(var/obj/O in src)
del(O)
src.add_fingerprint(usr)
return
return
+
+
+
+/obj/machinery/sleeper/syndicate
+ name = "Illegal Stasis Pod"
+ icon = 'Cryogenic2.dmi'
+ icon_state = "syndi_0"
+ density = 1
+ anchored = 1
+
+ process()
+ if(src.occupant)
+ src.occupant.sleeping = 5
+ return
+
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index ab5f245e499..c1576d41d34 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -207,13 +207,13 @@ MASS SPECTROMETER
if(A.fingerprints)
for(var/j = 1, j < (A.fingerprints.len + 1), j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
- var/test_print1 = print_test1[1]
+ var/test_print1 = print_test1[num2text(1)]
var/found = 0
for(var/k = 1, k < (prints.len + 1), k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
- var/test_print2 = print_test2[1]
+ var/test_print2 = print_test2[num2text(1)]
if(test_print2 == test_print1) //It is! Merge!
- prints[k] = test_print2 + "&" + stringmerge(print_test2[2],print_test1[2])
+ prints[k] = test_print2 + "&" + stringmerge(print_test2[num2text(2)],print_test1[num2text(2)])
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 779a3e75e0c..14838b1ef74 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -533,8 +533,9 @@ CIRCULAR SAW
else
// bone surgery doable?
- if(!try_bone_surgery(M, user))
- return ..()
+ try_bone_surgery(M, user)
+// if(!try_bone_surgery(M, user))
+// return ..()
/obj/item/weapon/cautery/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
if(!istype(H))
@@ -646,7 +647,7 @@ CIRCULAR SAW
M << "\red [user] begins to seperate your appendix with [src]!"
user << "\red You seperate [M]'s appendix with [src]!"
M:appendix_op_stage = 4.0
- return
+ return
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
@@ -929,7 +930,7 @@ CIRCULAR SAW
return
for(var/mob/O in viewers(H, null))
O.show_message(text("\red [H] gets \his [S.display_name] sawed at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1)
- if(!do_after(rand(50,70)))
+ if(!do_after(user,rand(50,70)))
for(var/mob/O in viewers(H, null))
O.show_message(text("\red [user] tried to cut [H]'s [S.display_name] off with [src], but failed."), 1)
return
@@ -1013,14 +1014,14 @@ CIRCULAR SAW
..()
return
- else if(user.zone_sel.selecting != "chest" && user.zone_sel.selecting != "groin" && istype(M, /mob/living/carbon/human))
+ else if(user.zone_sel.selecting != "chest" && istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
if(S.destroyed)
return
for(var/mob/O in viewers(H, null))
O.show_message(text("\red [H] gets \his [S.display_name] sawed at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1)
- if(!do_after(rand(20,80)))
+ if(!do_after(user, rand(20,80)))
for(var/mob/O in viewers(H, null))
O.show_message(text("\red [user] tried to cut [H]'s [S.display_name] off with [src], but failed."), 1)
return
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index b5a1c7896eb..e1a26252e98 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -280,6 +280,8 @@
if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]"
+ if (!src.hud_used)
+ src.hud_used = new/obj/hud(src)
client.screen -= hud_used.blurry
client.screen -= hud_used.druggy
client.screen -= hud_used.vimpaired
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 7f7d75a6cf2..498938ad50b 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -54,7 +54,11 @@
if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
show_laws()
src << "These laws may be changed by other players, or by you being the traitor."
-
+ src << "
IMPORTANT GAMEPLAY ASPECTS:"
+ src << "1.) Act like an AI. If someone is breaking into your upload, say something like \"Alert. Unauthorised Access Detected: AI Upload.\" not \"Help! Urist is trying to subvert me!\""
+ src << "2.) Do not watch the traitor like a hawk alerting the station to his/her every move. This relates to 1."
+ src << "3.) You are theoretically omniscient, but you should not be Beepsky 5000, laying down the law left and right. That is security's job. Instead, try to keep the station productive and effective. (Feel free to report the location of major violence and crimes and all that, just do not be the evil thing looking over peoples shoulders)"
+ src << "
We want everyone to have a good time, so we, the admins, will try to correct you if you stray from these rules. Just try to keep it sensible."
job = "AI"
spawn(0)
diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm
index 45adc6e7b78..29f89d6e251 100644
--- a/code/modules/mob/organ/organ_external.dm
+++ b/code/modules/mob/organ/organ_external.dm
@@ -92,8 +92,13 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
if(!istype(H))
return
if(H.dna)
- blood_DNA.len++
- blood_DNA[blood_DNA.len] = list(H.dna.unique_enzymes, H.dna.b_type)
+ if(blood_DNA)
+ blood_DNA.len++
+ blood_DNA[blood_DNA.len] = list(H.dna.unique_enzymes, H.dna.b_type)
+ else
+ var/templist[1]
+ templist[1] = list(H.dna.unique_enzymes, H.dna.b_type)
+ blood_DNA = templist
var/icon/I = new /icon(icon, icon_state)
diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi
index 7713edcfc58..5bddbadfca3 100644
Binary files a/icons/obj/Cryogenic2.dmi and b/icons/obj/Cryogenic2.dmi differ