WIP on detective work overhaul

Give command ported, with more sanity checks (It works, now!)
Added BS12 c4 in addition to TG c4
Fixed server air alarm
Book length increased 3 fold.
Blood and gibs now maintains DNA
Fixed evidence bags
Ported the awesome BS12 handcuff stuff, with flavor text.
This commit is contained in:
SkyMarshal
2012-01-29 22:53:47 -07:00
parent d2eff85c17
commit 5dba3ccf88
20 changed files with 411 additions and 53 deletions
+16 -7
View File
@@ -88,27 +88,36 @@
var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna))
return 0
world << md5(H.dna.uni_identity)
if (H.gloves)
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
return 0
if (!( src.fingerprints ))
src.fingerprints = text("[]", md5(H.dna.uni_identity))
src.fingerprints = list(text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(40,60))))
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
return 1
else
var/list/L = params2list(src.fingerprints)
L -= md5(H.dna.uni_identity)
while(L.len >= 3)
L -= L[1]
L += md5(H.dna.uni_identity)
src.fingerprints = list2params(L)
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
var/new_prints = 0
var/prints
for(var/i = 1, i < src.fingerprints.len, i++)
var/list/L = params2list(src.fingerprints[i])
if(L[1] == md5(H.dna.uni_identity))
new_prints = i
prints = L[2]
break
if(new_prints)
src.fingerprints[new_prints] = list(text("[]&[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(40,60)))))
return 1
else
src.fingerprints += text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(40,60)))
return 1
else
if(src.fingerprintslast != M.key)
src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
+2 -1
View File
@@ -64,7 +64,8 @@ Implants;
/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals);
Whitespace:Seperator;
Badassery;
/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"}
/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);
Whitespace:Seperator;"}
/datum/game_mode/proc/announce() //to be calles when round starts
world << "<B>Notice</B>: [src] did not define announce()"
+1 -1
View File
@@ -90,7 +90,7 @@
"plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
"other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa
"pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.20,ONE_ATMOSPHERE*0.35,ONE_ATMOSPHERE*0.8,ONE_ATMOSPHERE*0.9), /* kpa */
"temperature" = new/datum/tlv(40, 60, 140, 160), // K
"temperature" = new/datum/tlv(40, 60, 150, 160), // K
)
//all air alarms in area are connected via magic
+2 -2
View File
@@ -232,11 +232,11 @@
if ((!in_range(src, usr) && src.loc != user && src.loc.loc != user && user.equipped() != W))
return
if(lentext(t) >= MAX_PAPER_MESSAGE_LEN)
if(lentext(t) >= MAX_BOOK_MESSAGE_LEN)
var/cont = input(user, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no")
if(cont == "no")
break
while(lentext(t) > MAX_PAPER_MESSAGE_LEN)
while(lentext(t) > MAX_BOOK_MESSAGE_LEN)
if ((!in_range(src, usr) && src.loc != user && src.loc.loc != user && user.equipped() != W))
return
+3
View File
@@ -20,6 +20,9 @@
sleep(3)
if (i > 0)
var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc)
b.blood_DNA = blood_DNA
b.blood_type = blood_type
b.OriginalMob = OriginalMob
for(var/datum/disease/D in src.viruses)
b.viruses += D
if (step_to(src, get_step(src, direction), 0))
+10 -8
View File
@@ -66,11 +66,11 @@ MASS SPECTROMETER
var/amount = 20.0
var/printing = 0.0
var/fibers_index = 0
var/list/stored_fibers = null
var/list/stored_name = null
var/list/stored_fibers = list()
var/list/stored_name = list()
var/prints_index = 0
var/list/stored_prints = null
var/list/prints_name = null
var/list/stored_prints = list()
var/list/prints_name = list()
w_class = 3.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
@@ -138,20 +138,22 @@ MASS SPECTROMETER
return
/obj/item/device/detective_scanner/afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
if(src.loc != user)
return 0
src.add_fingerprint(user)
if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
if(A.blood_DNA)
user << "\blue Blood type: [A.blood_type]\nDNA: [A.blood_DNA]"
return
if (!( A.fingerprints ) && !(A.suit_fibers) && !(A.blood_DNA))
user << "\blue Unable to locate any fingerprints, materials, fibers, or fingerprints on [A]!"
return 0
else if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..."
sleep(15)
user << "\blue Blood type: [A.blood_type]\nDNA: [A.blood_DNA]"
else
user << "\blue No blood found on [A]."
if (!( A.fingerprints ) && !(A.suit_fibers))
user << "\blue Unable to locate any fingerprints or fibers on [A]!"
return 0
if(!( A.fingerprints ))
user << "\blue Unable to locate any fingerprints on [A]!"
else
+14 -10
View File
@@ -162,7 +162,7 @@
if(isalien(user)) // -- TLE
var/mob/living/carbon/alien/A = user
if(!A.has_fine_manipulation || w_class >= 4)
if(!A.has_fine_manipulation || w_class <= 4)
user << "Your claws aren't capable of such fine manipulation."
return
@@ -196,20 +196,23 @@
/obj/item/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/packageWrap))
var/location = get_turf(src.loc)
if(istype(src,/obj/item/weapon/storage) && istype(src.loc, /mob)) //Put it into the bag
return
if(istype(src.loc,/obj/item/weapon/storage) || istype(src.loc,/obj/item/clothing/suit/storage/)) //Taking stuff out of storage duplicates it.
user << "\blue Do not do this, it is broken as all hell. Take it out of the container first."
return
for(var/obj/item/T in user) //Lets remove it from their inventory
if(T == src)
user.remove_from_mob(T)
break
if(istype(src.loc,/obj/item/weapon/storage)) //Taking stuff out of storage duplicates it.
var/obj/item/weapon/storage/U = src.loc
user.client.screen -= src
U.contents.Remove(src)
if(istype(src.loc,/obj/item/clothing/suit/storage/))
var/obj/item/clothing/suit/storage/X = src.loc
user.client.screen -= src
X.contents.Remove(src)
if(src in user)
user.remove_from_mob(src)
var/obj/item/weapon/packageWrap/O = W
if (O.amount > 1)
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(src.loc))
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(location)
P.wrapped = src
src.loc = P
O.amount -= 1
else if(istype(W,/obj/item/wardrobe))
@@ -225,6 +228,7 @@
user << "\blue The wardrobe is full."
return
user << "\blue You pick up all the items."
user.visible_message("\blue [user] gathers up the pile of stuff, and puts it into \the [src]")
I.update_icon()
/obj/item/attack_self(mob/user as mob)
+84
View File
@@ -0,0 +1,84 @@
/obj/item/weapon/syndie
icon = 'syndieweapons.dmi'
/*C-4 explosive charge and etc, replaces the old syndie transfer valve bomb.*/
/*The explosive charge itself. Flashes for five seconds before exploding.*/
/obj/item/weapon/syndie/c4explosive
icon_state = "c-4small_0"
item_state = "c-4small"
name = "mysterious package"
desc = "A mysterious package."
w_class = 3
var/power = 1 /*Size of the explosion.*/
var/size = "small" /*Used for the icon, this one will make c-4small_0 for the off state.*/
/obj/item/weapon/syndie/c4explosive/heavy
icon_state = "c-4large_0"
item_state = "c-4large"
desc = "A mysterious package, it's quite heavy."
power = 2
size = "large"
/obj/item/weapon/syndie/c4explosive/New()
var/K = rand(1,2000)
K = md5(num2text(K)+name)
K = copytext(K,1,7)
src.desc += "\n You see [K] engraved on \the [src]"
var/obj/item/weapon/syndie/c4detonator/detonator = new(src.loc)
detonator.desc += "\n You see [K] engraved on \the [src]"
detonator.bomb = src
/obj/item/weapon/syndie/c4explosive/proc/detonate()
icon_state = "c-4[size]_1"
spawn(50)
explosion(get_turf(src), power, power*2, power*3, power*4, power*4)
for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors.
var/turf/simulated/wall/T = get_step(src,dirn)
if(locate(/obj/machinery/door/airlock) in T)
var/obj/machinery/door/airlock/D = locate() in T
if(D.density)
D.open()
if(istype(T,/turf/simulated/wall))
T.dismantle_wall(1)
del(src)
/*Detonator, disguised as a lighter*/
/*Click it when closed to open, when open to bring up a prompt asking you if you want to close it or press the button.*/
/obj/item/weapon/syndie/c4detonator
icon_state = "c-4detonator_0"
item_state = "c-4detonator"
name = "lighter" /*Sneaky, thanks Dreyfus.*/
desc = "A disposable lighter, it's quite heavy."
w_class = 1
var/obj/item/weapon/syndie/c4explosive/bomb
var/pr_open = 0 /*Is the "What do you want to do?" prompt open?*/
/obj/item/weapon/syndie/c4detonator/attack_self(mob/user as mob)
switch(src.icon_state)
if("c-4detonator_0")
src.icon_state = "c-4detonator_1"
user << "You flick open the lighter."
if("c-4detonator_1")
if(!pr_open)
pr_open = 1
switch(alert(user, "What would you like to do?", "Lighter", "Press the button.", "Close the lighter."))
if("Press the button.")
user << "\red You press the button."
flick("c-4detonator_click", src)
if(src.bomb)
src.bomb.detonate()
log_admin("[user.real_name]([user.ckey]) has triggered [src.bomb] with [src].")
message_admins("\red [user.real_name]([user.ckey]) has triggered [src.bomb] with [src].")
if("Close the lighter.")
src.icon_state = "c-4detonator_0"
user << "You close the lighter."
pr_open = 0
+7 -1
View File
@@ -11,8 +11,14 @@
src << "You can't commit suicide before the game starts!"
return
var/permitted = 0
var/list/allowed = list("Syndicate","traitor","Wizard","Head Revolutionary","Cultist","Changeling")
if (mind.special_role in allowed)
for(var/T in allowed)
if(mind.special_role == T)
permitted = 1
break
if(!permitted)
message_admins("[ckey] has tried to suicide, but they were not permitted due to not being antagonist as human.", 1)
src << "No. Adminhelp if there is a legitimate reason."
return