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