Merge branch 'master' of git://github.com/Baystation12/Baystation12 into TGUpdates
Conflicts: code/modules/mob/mob_defines.dm icons/mob/items_lefthand.dmi icons/mob/items_righthand.dmi icons/obj/storage.dmi maps/tgstation.2.0.8.dmm
@@ -329,8 +329,10 @@
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
head.screen_loc = ui_head
|
||||
else
|
||||
var/datum/organ/external/head = organs["head"]
|
||||
if(!head.destroyed)
|
||||
//if not wearing anything on the head, show the ears
|
||||
overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
|
||||
overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
|
||||
|
||||
// Belt
|
||||
if (belt)
|
||||
@@ -474,8 +476,8 @@
|
||||
else if (gender == FEMALE)
|
||||
g = "f"
|
||||
|
||||
stand_icon = new /icon('tajaran.dmi', "torso_s")
|
||||
lying_icon = new /icon('tajaran.dmi', "torso_l")
|
||||
stand_icon = new /icon('tajaran.dmi', "torso_[g]_s")
|
||||
lying_icon = new /icon('tajaran.dmi', "torso_[g]_l")
|
||||
|
||||
var/husk = (mutations & HUSK)
|
||||
//var/obese = (mutations & FAT)
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 19 KiB |
@@ -349,15 +349,20 @@ client
|
||||
|
||||
if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500))
|
||||
// not sure if this is completely right...
|
||||
if (0) // (L.vars.len > 0)
|
||||
if(0) //(L.vars.len > 0)
|
||||
html += "<ol>"
|
||||
for (var/entry in L)
|
||||
html += debug_variable(entry, L[entry], level + 1)
|
||||
|
||||
html += "</ol>"
|
||||
else
|
||||
html += "<ul>"
|
||||
for (var/index = 1, index <= L.len, index++)
|
||||
html += debug_variable("[index]", L[index], level + 1)
|
||||
var/index = 1
|
||||
for (var/entry in L)
|
||||
if(istext(entry))
|
||||
html += debug_variable(entry, L[entry], level + 1)
|
||||
//html += debug_variable("[index]", L[index], level + 1)
|
||||
else
|
||||
html += debug_variable(index, L[index], level + 1)
|
||||
index++
|
||||
html += "</ul>"
|
||||
else
|
||||
html += "[name] = <span class='value'>[value]</span>"
|
||||
|
||||
@@ -20,7 +20,7 @@ datum/shuttle_controller
|
||||
fake_recall = 0 //Used in rounds to prevent "ON NOES, IT MUST [INSERT ROUND] BECAUSE SHUTTLE CAN'T BE CALLED"
|
||||
deny_shuttle = 0 //for admins not allowing it to be called.
|
||||
departed = 0
|
||||
|
||||
sound_siren = 1 //if siren should go off
|
||||
// call the shuttle
|
||||
// if not called before, set the endtime to T+600 seconds
|
||||
// otherwise if outgoing, switch to incoming
|
||||
@@ -34,6 +34,13 @@ datum/shuttle_controller
|
||||
else
|
||||
settimeleft(SHUTTLEARRIVETIME*coeff)
|
||||
online = 1
|
||||
//turning on the red lights in hallways and siren
|
||||
for(var/area/A in world)
|
||||
if(istype(A, /area/hallway))
|
||||
A.readyalert()
|
||||
sound_siren = 1
|
||||
|
||||
|
||||
|
||||
proc/recall()
|
||||
if(direction == 1)
|
||||
@@ -45,6 +52,11 @@ datum/shuttle_controller
|
||||
world << sound('shuttlerecalled.ogg')
|
||||
setdirection(-1)
|
||||
online = 1
|
||||
//turning off the red lights in hallways and siren
|
||||
for(var/area/A in world)
|
||||
if(istype(A, /area/hallway))
|
||||
A.readyreset()
|
||||
sound_siren = 0
|
||||
|
||||
|
||||
// returns the time (in seconds) before shuttle arrival
|
||||
@@ -83,6 +95,11 @@ datum/shuttle_controller
|
||||
var/timeleft = timeleft()
|
||||
if(timeleft > 1e5) // midnight rollover protection
|
||||
timeleft = 0
|
||||
if (sound_siren) //playing siren every 90 seconds
|
||||
sound_siren = 0
|
||||
world << sound('siren.ogg')
|
||||
spawn(900)
|
||||
sound_siren = 1
|
||||
switch(location)
|
||||
if(0)
|
||||
if(timeleft>timelimit)
|
||||
|
||||
@@ -462,7 +462,40 @@
|
||||
/obj/structure/closet/secure_closet/personal/patient
|
||||
name = "Patient's closet"
|
||||
|
||||
/obj/structure/closet/secure_closet/kitchen
|
||||
name = "Kitchen Cabinet"
|
||||
req_access = list(access_kitchen)
|
||||
|
||||
/obj/structure/closet/secure_closet/kitchen/mining
|
||||
req_access = list()
|
||||
|
||||
/obj/structure/closet/secure_closet/meat
|
||||
name = "Meat Fridge"
|
||||
icon_state = "fridge1"
|
||||
icon_closed = "fridge"
|
||||
icon_locked = "fridge1"
|
||||
icon_opened = "fridgeopen"
|
||||
icon_broken = "fridgebroken"
|
||||
icon_off = "fridge1"
|
||||
|
||||
/obj/structure/closet/secure_closet/fridge
|
||||
name = "Refrigerator"
|
||||
icon_state = "fridge1"
|
||||
icon_closed = "fridge"
|
||||
icon_locked = "fridge1"
|
||||
icon_opened = "fridgeopen"
|
||||
icon_broken = "fridgebroken"
|
||||
icon_off = "fridge1"
|
||||
|
||||
/obj/structure/closet/secure_closet/money_freezer
|
||||
name = "Freezer"
|
||||
icon_state = "fridge1"
|
||||
icon_closed = "fridge"
|
||||
icon_locked = "fridge1"
|
||||
icon_opened = "fridgeopen"
|
||||
icon_broken = "fridgebroken"
|
||||
icon_off = "fridge1"
|
||||
req_access = list(access_heads_vault)
|
||||
|
||||
/obj/structure/closet/secure_closet/personal/patient
|
||||
name = "patient's closet"
|
||||
|
||||
@@ -321,6 +321,12 @@
|
||||
icon_state = "o2"
|
||||
item_state = "firstaid-o2"
|
||||
|
||||
/obj/item/weapon/storage/firstaid/adv
|
||||
name = "advanced first-aid kit"
|
||||
desc = "Contains advanced medical treatments."
|
||||
icon_state = "o2"
|
||||
item_state = "firstaid-advanced"
|
||||
|
||||
/obj/item/weapon/storage/flashbang_kit
|
||||
name = "Flashbangs (WARNING)"
|
||||
desc = "<FONT color=red><B>WARNING: Do not use without reading these preautions!</B></FONT>\n<B>These devices are extremely dangerous and can cause blindness or deafness if used incorrectly.</B>\nThe chemicals contained in these devices have been tuned for maximal effectiveness and due to\nextreme safety precuaiotn shave been incased in a tamper-proof pack. DO NOT ATTEMPT TO OPEN\nFLASH WARNING: Do not use continually. Excercise extreme care when detonating in closed spaces.\n\tMake attemtps not to detonate withing range of 2 meters of the intended target. It is imperative\n\tthat the targets visit a medical professional after usage. Damage to eyes increases extremely per\n\tuse and according to range. Glasses with flash resistant filters DO NOT always work on high powered\n\tflash devices such as this. <B>EXERCISE CAUTION REGARDLESS OF CIRCUMSTANCES</B>\nSOUND WARNING: Do not use continually. Visit a medical professional if hearing is lost.\n\tThere is a slight chance per use of complete deafness. Exercise caution and restraint.\nSTUN WARNING: If the intended or unintended target is too close to detonation the resulting sound\n\tand flash have been known to cause extreme sensory overload resulting in temporary\n\tincapacitation.\n<B>DO NOT USE CONTINUALLY</B>\nOperating Directions:\n\t1. Pull detonnation pin. <B>ONCE THE PIN IS PULLED THE GRENADE CAN NOT BE DISARMED!</B>\n\t2. Throw grenade. <B>NEVER HOLD A LIVE FLASHBANG</B>\n\t3. The grenade will detonste 10 seconds hafter being primed. <B>EXCERCISE CAUTION</B>\n\t-<B>Never prime another grenade until after the first is detonated</B>\nNote: Usage of this pyrotechnic device without authorization is an extreme offense and can\nresult in severe punishment upwards of <B>10 years in prison per use</B>.\n\nDefault 3 second wait till from prime to detonation. This can be switched with a screwdriver\nto 10 seconds.\n\nCopyright of Nanotrasen Industries- Military Armnaments Division\nThis device was created by Nanotrasen Labs a member of the Expert Advisor Corporation"
|
||||
@@ -481,7 +487,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
max_w_class = 2
|
||||
max_w_class = 1
|
||||
max_combined_w_class = 3
|
||||
storage_slots = 3
|
||||
flags = FPRINT | TABLEPASS
|
||||
@@ -492,7 +498,10 @@
|
||||
icon_state ="bible"
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 3.0
|
||||
w_class = 2.0
|
||||
max_w_class = 1
|
||||
max_combined_w_class = 7
|
||||
storage_slots = 7
|
||||
flags = FPRINT | TABLEPASS
|
||||
var/mob/affecting = null
|
||||
var/deity_name = "Christ"
|
||||
|
||||
@@ -643,7 +643,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
|
||||
total = rand(1, total)
|
||||
for (item in L)
|
||||
total -=L [item]
|
||||
total -= L[item]
|
||||
if (total <= 0)
|
||||
return item
|
||||
|
||||
|
||||
@@ -103,16 +103,16 @@
|
||||
/atom/proc/add_fingerprint(mob/living/M as mob)
|
||||
if(isnull(M)) return
|
||||
if(isnull(M.key)) return
|
||||
if (!( src.flags ) & 256)
|
||||
if (!( flags ) & 256)
|
||||
return
|
||||
if (ishuman(M))
|
||||
if(!fingerprintshidden)
|
||||
fingerprintshidden = list()
|
||||
add_fibers(M)
|
||||
if (M.mutations2 & mFingerprints)
|
||||
if(src.fingerprintslast != M.key)
|
||||
src.fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]"
|
||||
src.fingerprintslast = M.key
|
||||
if(fingerprintslast != M.key)
|
||||
fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]"
|
||||
fingerprintslast = M.key
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = M
|
||||
if (!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32))
|
||||
@@ -120,24 +120,24 @@
|
||||
H.dna = new /datum/dna(null)
|
||||
H.check_dna()
|
||||
if (H.gloves && H.gloves != src)
|
||||
if(src.fingerprintslast != H.key)
|
||||
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
|
||||
src.fingerprintslast = H.key
|
||||
if(fingerprintslast != H.key)
|
||||
fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
|
||||
fingerprintslast = H.key
|
||||
H.gloves.add_fingerprint(M)
|
||||
if(H.gloves != src)
|
||||
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
|
||||
return 0
|
||||
else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex))
|
||||
return 0
|
||||
if(src.fingerprintslast != H.key)
|
||||
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
|
||||
src.fingerprintslast = H.key
|
||||
if(fingerprintslast != H.key)
|
||||
fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
|
||||
fingerprintslast = H.key
|
||||
if(!fingerprints)
|
||||
fingerprints = list()
|
||||
var/new_prints = 0
|
||||
var/prints
|
||||
for(var/i = 1, i <= src.fingerprints.len, i++)
|
||||
var/list/L = params2list(src.fingerprints[i])
|
||||
for(var/i = 1, i <= fingerprints.len, i++)
|
||||
var/list/L = params2list(fingerprints[i])
|
||||
if(L[num2text(1)] == md5(H.dna.uni_identity))
|
||||
new_prints = i
|
||||
prints = L[num2text(2)]
|
||||
@@ -145,30 +145,28 @@
|
||||
else
|
||||
var/test_print = stars(L[num2text(2)], rand(80,90))
|
||||
if(stringpercent(test_print) == 32)
|
||||
if(src.fingerprints.len == 1)
|
||||
src.fingerprints = list()
|
||||
if(fingerprints.len == 1)
|
||||
fingerprints = list()
|
||||
else
|
||||
for(var/j = i, j < (src.fingerprints.len), j++)
|
||||
src.fingerprints[j] = src.fingerprints[j+1]
|
||||
src.fingerprints.len--
|
||||
fingerprints.Cut(i,i+1)
|
||||
else
|
||||
src.fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]"
|
||||
fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]"
|
||||
if(new_prints)
|
||||
src.fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
|
||||
else if(new_prints == 0)
|
||||
if(!src.fingerprints || !src.fingerprints.len)
|
||||
src.fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))))
|
||||
fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
|
||||
else
|
||||
if(!fingerprints || !fingerprints.len)
|
||||
fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))))
|
||||
else
|
||||
src.fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
|
||||
for(var/i = 1, i <= src.fingerprints.len, i++)
|
||||
if(length(src.fingerprints[i]) != 69)
|
||||
src.fingerprints.Remove(src.fingerprints[i])
|
||||
fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
|
||||
for(var/i = 1, i <= fingerprints.len, i++)
|
||||
if(length(fingerprints[i]) != 69)
|
||||
fingerprints.Remove(fingerprints[i])
|
||||
if(fingerprints && !fingerprints.len) del(fingerprints)
|
||||
return 1
|
||||
else
|
||||
if(src.fingerprintslast != M.key)
|
||||
src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
|
||||
src.fingerprintslast = M.key
|
||||
if(fingerprintslast != M.key)
|
||||
fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
|
||||
fingerprintslast = M.key
|
||||
return
|
||||
|
||||
//returns 1 if made bloody, returns 0 otherwise
|
||||
|
||||
@@ -1,48 +1,81 @@
|
||||
/proc/GenerateTheft(var/job,var/datum/mind/traitor)
|
||||
var/list/datum/objective/objectives = list()
|
||||
var/list/weight = list()
|
||||
var/index = 1
|
||||
|
||||
for(var/o in typesof(/datum/objective/steal))
|
||||
if(o != /datum/objective/steal) //Make sure not to get a blank steal objective.
|
||||
objectives += new o(null,job)
|
||||
|
||||
//objectives += GenerateAssassinate(job,traitor)
|
||||
return objectives
|
||||
var/datum/objective/target = new o(null,job)
|
||||
weight += list("[index]" = target.weight)
|
||||
objectives += target
|
||||
index++
|
||||
return list(objectives, weight)
|
||||
|
||||
/proc/GenerateAssassinate(var/job,var/datum/mind/traitor)
|
||||
var/list/datum/objective/assassinate/missions = list()
|
||||
var/list/weight = list()
|
||||
var/index = 1
|
||||
|
||||
for(var/datum/mind/target in ticker.minds)
|
||||
if((target != traitor) && istype(target.current, /mob/living/carbon/human))
|
||||
if(target && target.current)
|
||||
missions += new /datum/objective/assassinate(null,job,target)
|
||||
return missions
|
||||
var/datum/objective/target_obj = new /datum/objective/assassinate(null,job,target)
|
||||
weight += list("[index]" = target_obj.weight)
|
||||
missions += target_obj
|
||||
index++
|
||||
return list(missions, weight)
|
||||
|
||||
/proc/GenerateFrame(var/job,var/datum/mind/traitor)
|
||||
var/list/datum/objective/frame/missions = list()
|
||||
var/list/weight = list()
|
||||
var/index = 1
|
||||
|
||||
for(var/datum/mind/target in ticker.minds)
|
||||
if((target != traitor) && istype(target.current, /mob/living/carbon/human))
|
||||
if(target && target.current)
|
||||
missions += new /datum/objective/frame(null,job,target)
|
||||
return missions
|
||||
var/datum/objective/target_obj = new /datum/objective/frame(null,job,target)
|
||||
weight += list("[index]" = target_obj.weight)
|
||||
missions += target_obj
|
||||
index++
|
||||
return list(missions, weight)
|
||||
|
||||
/proc/GenerateProtection(var/job,var/datum/mind/traitor)
|
||||
var/list/datum/objective/frame/missions = list()
|
||||
var/list/weight = list()
|
||||
var/index = 1
|
||||
|
||||
for(var/datum/mind/target in ticker.minds)
|
||||
if((target != traitor) && istype(target.current, /mob/living/carbon/human))
|
||||
if(target && target.current)
|
||||
missions += new /datum/objective/protection(null,job,target)
|
||||
return missions
|
||||
var/datum/objective/target_obj = new /datum/objective/protection(null,job,target)
|
||||
weight += list("[index]" = target_obj.weight)
|
||||
missions += target_obj
|
||||
index++
|
||||
return list(missions, weight)
|
||||
|
||||
/proc/PickObjectiveFromList(var/list/objectivesArray)
|
||||
var/list/datum/objectives = objectivesArray[1]
|
||||
var/pick_index = text2num(pickweight(objectivesArray[2]))
|
||||
return objectives[pick_index]
|
||||
|
||||
/proc/RemoveObjectiveFromList(var/list/objectiveArray, var/datum/objective/objective)
|
||||
var/list/datum/objective/temp = objectiveArray[1]
|
||||
var/list/weight = objectiveArray[2]
|
||||
var/index = temp.Find(objective)
|
||||
if(index == temp.len)
|
||||
temp.Cut(index)
|
||||
weight.Cut(index)
|
||||
else
|
||||
temp.Cut(index, index+1)
|
||||
weight.Cut(index, index+1)
|
||||
return list(temp,weight)
|
||||
|
||||
/proc/SelectObjectives(var/job,var/datum/mind/traitor,var/hijack = 0)
|
||||
var/list/datum/objective/chosenobjectives = list()
|
||||
var/list/datum/objective/theftobjectives = GenerateTheft(job,traitor) //Separated all the objective types so they can be picked independantly of each other.
|
||||
var/list/datum/objective/killobjectives = GenerateAssassinate(job,traitor)
|
||||
var/list/datum/objective/frameobjectives = GenerateFrame(job,traitor)
|
||||
var/list/datum/objective/protectobjectives = GenerateProtection(job,traitor)
|
||||
var/list/chosenobjectives = list()
|
||||
var/list/theftobjectives = GenerateTheft(job,traitor) //Separated all the objective types so they can be picked independantly of each other.
|
||||
var/list/killobjectives = GenerateAssassinate(job,traitor)
|
||||
var/list/frameobjectives = GenerateFrame(job,traitor)
|
||||
var/list/protectobjectives = GenerateProtection(job,traitor)
|
||||
//var/points
|
||||
var/totalweight
|
||||
var/selectobj
|
||||
@@ -50,27 +83,30 @@
|
||||
|
||||
while(totalweight < 100)
|
||||
selectobj = rand(1,100) //Randomly determine the type of objective to be given.
|
||||
if(!length(killobjectives) || !length(protectobjectives)) //If any of these lists are empty, just give them theft objectives.
|
||||
var/datum/objective/objective = pick(theftobjectives)
|
||||
if(!length(killobjectives[1]) || !length(protectobjectives[1])|| !length(frameobjectives[1])) //If any of these lists are empty, just give them theft objectives.
|
||||
var/datum/objective/objective = PickObjectiveFromList(theftobjectives)
|
||||
chosenobjectives += objective
|
||||
totalweight += objective.weight
|
||||
theftobjectives -= objective
|
||||
totalweight += objective.points
|
||||
theftobjectives = RemoveObjectiveFromList(theftobjectives, objective)
|
||||
else switch(selectobj)
|
||||
if(1 to 55) //Theft Objectives (55% chance)
|
||||
var/datum/objective/objective = pick(theftobjectives)
|
||||
var/datum/objective/objective = PickObjectiveFromList(theftobjectives)
|
||||
for(1 to 10)
|
||||
if(objective.weight + totalweight <= 110)
|
||||
if(objective.points + totalweight <= 110)
|
||||
break
|
||||
objective = pick(theftobjectives)
|
||||
objective = PickObjectiveFromList(theftobjectives)
|
||||
chosenobjectives += objective
|
||||
totalweight += objective.weight
|
||||
theftobjectives -= objective
|
||||
totalweight += objective.points
|
||||
theftobjectives = RemoveObjectiveFromList(theftobjectives, objective)
|
||||
if(56 to 92) //Assassination Objectives (37% chance)
|
||||
var/datum/objective/assassinate/objective = pick(killobjectives)
|
||||
var/datum/objective/assassinate/objective = PickObjectiveFromList(killobjectives)
|
||||
world << objective
|
||||
for(1 to 10)
|
||||
if(objective.weight + totalweight <= 110)
|
||||
if(objective.points + totalweight <= 110)
|
||||
break
|
||||
objective = pick(killobjectives)
|
||||
objective = PickObjectiveFromList(killobjectives)
|
||||
if(!objective)
|
||||
continue
|
||||
for(var/datum/objective/protection/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Assassinate somebody they need to Protect.
|
||||
if(conflicttest.target == objective.target)
|
||||
conflict = 1
|
||||
@@ -81,24 +117,38 @@
|
||||
break
|
||||
if(!conflict)
|
||||
chosenobjectives += objective
|
||||
totalweight += objective.weight
|
||||
killobjectives -= objective
|
||||
totalweight += objective.points
|
||||
killobjectives = RemoveObjectiveFromList(killobjectives, objective)
|
||||
conflict = 0
|
||||
if(93 to 95) //Framing Objectives (3% chance)
|
||||
var/datum/objective/objective = pick(frameobjectives)
|
||||
var/datum/objective/objective = PickObjectiveFromList(frameobjectives)
|
||||
for(1 to 10)
|
||||
if(objective.weight + totalweight <= 110)
|
||||
if(objective.points + totalweight <= 110)
|
||||
break
|
||||
objective = pick(frameobjectives)
|
||||
chosenobjectives += objective
|
||||
totalweight += objective.weight
|
||||
frameobjectives -= objective
|
||||
objective = PickObjectiveFromList(frameobjectives)
|
||||
if(!objective)
|
||||
continue
|
||||
for(var/datum/objective/protection/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Assassinate somebody they need to Protect.
|
||||
if(conflicttest.target == objective.target)
|
||||
conflict = 1
|
||||
break
|
||||
for(var/datum/objective/assassinate/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate.
|
||||
if(conflicttest.target == objective.target)
|
||||
conflict = 1
|
||||
break
|
||||
if(!conflict)
|
||||
chosenobjectives += objective
|
||||
totalweight += objective.points
|
||||
frameobjectives = RemoveObjectiveFromList(frameobjectives, objective)
|
||||
conflict = 0
|
||||
if(96 to 100) //Protection Objectives (5% chance)
|
||||
var/datum/objective/protection/objective = pick(protectobjectives)
|
||||
var/datum/objective/protection/objective = PickObjectiveFromList(protectobjectives)
|
||||
for(1 to 10)
|
||||
if(objective.weight + totalweight <= 110)
|
||||
if(objective.points + totalweight <= 110)
|
||||
break
|
||||
objective = pick(protectobjectives)
|
||||
objective = PickObjectiveFromList(protectobjectives)
|
||||
if(!objective)
|
||||
continue
|
||||
for(var/datum/objective/assassinate/conflicttest in chosenobjectives) //Check to make sure we aren't telling them to Protect somebody they need to Assassinate.
|
||||
if(conflicttest.target == objective.target)
|
||||
conflict = 1
|
||||
@@ -109,8 +159,8 @@
|
||||
break
|
||||
if(!conflict)
|
||||
chosenobjectives += objective
|
||||
totalweight += objective.weight
|
||||
protectobjectives -= objective
|
||||
totalweight += objective.points
|
||||
protectobjectives = RemoveObjectiveFromList(protectobjectives, objective)
|
||||
conflict = 0
|
||||
|
||||
var/hasendgame = 0
|
||||
@@ -134,19 +184,22 @@ datum
|
||||
var/datum/mind/target
|
||||
var/explanation_text = "text not set"
|
||||
var/job
|
||||
// var/points = INFINITY //If this isn't set to something else, the objective is bugged and should be ignored
|
||||
var/points = INFINITY //If this isn't set to something else, the objective is bugged and should be ignored
|
||||
var/weight = INFINITY
|
||||
|
||||
New(var/text,var/joba)
|
||||
if(text)
|
||||
src.explanation_text = text
|
||||
job=joba
|
||||
weight = get_points(job)
|
||||
weight = get_weight(job)
|
||||
points = get_points(job)
|
||||
|
||||
proc/check_completion()
|
||||
return 1
|
||||
proc/get_points(var/job)
|
||||
return INFINITY
|
||||
proc/get_weight(var/job)
|
||||
return INFINITY
|
||||
proc/find_target_by_role(role, role_type=0)//Option sets either to check assigned role or special role. Default to assigned.
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if((possible_target != owner) && ishuman(possible_target.current) && ((role_type ? possible_target.special_role : possible_target.assigned_role) == role) )
|
||||
@@ -179,20 +232,26 @@ datum
|
||||
|
||||
get_points()
|
||||
if(target)
|
||||
var/difficulty = GetRank(target.assigned_role) + 1
|
||||
switch(GetRank(job))
|
||||
if(4)
|
||||
return 30
|
||||
return 20*difficulty
|
||||
if(3)
|
||||
return 40
|
||||
return 30*difficulty
|
||||
if(2)
|
||||
return 50
|
||||
return 40*difficulty
|
||||
if(1)
|
||||
return 55
|
||||
return 55*difficulty
|
||||
if(0)
|
||||
return 60
|
||||
return 60*difficulty
|
||||
else
|
||||
return INFINITY
|
||||
|
||||
get_weight()
|
||||
if(target)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
protection
|
||||
New(var/text,var/joba,var/datum/mind/targeta)
|
||||
@@ -218,7 +277,15 @@ datum
|
||||
return 0
|
||||
|
||||
get_points()
|
||||
return 30
|
||||
if(target)
|
||||
return 30
|
||||
else
|
||||
return INFINITY
|
||||
|
||||
get_weight()
|
||||
if(target)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
@@ -247,20 +314,26 @@ datum
|
||||
return 1
|
||||
get_points()
|
||||
if(target)
|
||||
var/difficulty = GetRank(target.assigned_role) + 1
|
||||
switch(GetRank(job))
|
||||
if(4)
|
||||
return 30
|
||||
return 20*difficulty
|
||||
if(3)
|
||||
return 40
|
||||
return 30*difficulty
|
||||
if(2)
|
||||
return 50
|
||||
return 40*difficulty
|
||||
if(1)
|
||||
return 55
|
||||
return 55*difficulty
|
||||
if(0)
|
||||
return 60
|
||||
return 60*difficulty
|
||||
else
|
||||
return 0
|
||||
|
||||
get_weight()
|
||||
if(target)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
find_target_by_role(var/role)
|
||||
for(var/datum/mind/possible_target in ticker.minds)
|
||||
if((possible_target != owner) && istype(possible_target.current, /mob/living/carbon/human) && (possible_target.assigned_role == role))
|
||||
@@ -327,19 +400,25 @@ datum
|
||||
|
||||
get_points()
|
||||
if(target)
|
||||
switch(GetRank(owner.assigned_role))
|
||||
var/difficulty = GetRank(target.assigned_role) + 1
|
||||
switch(GetRank(job))
|
||||
if(4)
|
||||
return 30
|
||||
return 20*difficulty
|
||||
if(3)
|
||||
return 40
|
||||
return 30*difficulty
|
||||
if(2)
|
||||
return 50
|
||||
return 40*difficulty
|
||||
if(1)
|
||||
return 55
|
||||
return 55*difficulty
|
||||
if(0)
|
||||
return 60
|
||||
return 60*difficulty
|
||||
else
|
||||
return 0
|
||||
return INFINITY
|
||||
|
||||
get_weight()
|
||||
if(target)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
hijack
|
||||
@@ -374,6 +453,8 @@ datum
|
||||
if(4)
|
||||
return 35
|
||||
|
||||
get_weight(var/job)
|
||||
return 1
|
||||
|
||||
escape
|
||||
explanation_text = "Escape on the shuttle alive, without being arrested."
|
||||
@@ -399,6 +480,9 @@ datum
|
||||
get_points()
|
||||
return INFINITY
|
||||
|
||||
get_weight(var/job)
|
||||
return 1
|
||||
|
||||
|
||||
survive
|
||||
explanation_text = "Stay alive."
|
||||
@@ -411,6 +495,9 @@ datum
|
||||
get_points()
|
||||
return INFINITY
|
||||
|
||||
get_weight(var/job)
|
||||
return 1
|
||||
|
||||
|
||||
steal
|
||||
var/obj/item/steal_target
|
||||
@@ -441,6 +528,12 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
|
||||
|
||||
plasmatank
|
||||
steal_target = /obj/item/weapon/tank/plasma
|
||||
@@ -452,6 +545,16 @@ datum
|
||||
return 20
|
||||
return 40
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
check_completion()
|
||||
var/list/all_items = owner.current.get_contents()
|
||||
for(var/obj/item/I in all_items)
|
||||
if(!istype(I, steal_target)) continue//If it's not actually that item.
|
||||
if(I:air_contents:toxins) return 1 //If they got one with plasma
|
||||
return 0
|
||||
|
||||
|
||||
/*Removing this as an objective. Not necessary to have two theft objectives in the same room.
|
||||
steal/captainssuit
|
||||
@@ -492,6 +595,12 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
|
||||
|
||||
RCD
|
||||
steal_target = /obj/item/weapon/rcd
|
||||
@@ -511,6 +620,12 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
|
||||
|
||||
/*burger
|
||||
steal_target = /obj/item/weapon/reagent_containers/food/snacks/human/burger
|
||||
@@ -549,6 +664,12 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
|
||||
|
||||
magboots
|
||||
steal_target = /obj/item/clothing/shoes/magboots
|
||||
@@ -568,6 +689,12 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
|
||||
|
||||
blueprints
|
||||
steal_target = /obj/item/blueprints
|
||||
@@ -587,6 +714,12 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
|
||||
|
||||
voidsuit
|
||||
steal_target = /obj/item/clothing/suit/space/nasavoid
|
||||
@@ -606,6 +739,9 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
|
||||
nuke_disk
|
||||
steal_target = /obj/item/weapon/disk/nuclear
|
||||
@@ -625,6 +761,12 @@ datum
|
||||
if(4)
|
||||
return 25
|
||||
|
||||
get_weight(var/job)
|
||||
if(GetRank(job) == 4)
|
||||
return 10
|
||||
else
|
||||
return 20
|
||||
|
||||
nuke_gun
|
||||
steal_target = /obj/item/weapon/gun/energy/gun/nuclear
|
||||
explanation_text = "Steal a nuclear powered gun."
|
||||
@@ -643,6 +785,9 @@ datum
|
||||
if(4)
|
||||
return 75
|
||||
|
||||
get_weight(var/job)
|
||||
return 2
|
||||
|
||||
diamond_drill
|
||||
steal_target = /obj/item/weapon/pickaxe/diamonddrill
|
||||
explanation_text = "Steal a diamond drill."
|
||||
@@ -661,6 +806,9 @@ datum
|
||||
if(4)
|
||||
return 75
|
||||
|
||||
get_weight(var/job)
|
||||
return 2
|
||||
|
||||
boh
|
||||
steal_target = /obj/item/weapon/storage/backpack/holding
|
||||
explanation_text = "Steal a \"bag of holding.\""
|
||||
@@ -679,6 +827,9 @@ datum
|
||||
if(4)
|
||||
return 75
|
||||
|
||||
get_weight(var/job)
|
||||
return 2
|
||||
|
||||
hyper_cell
|
||||
steal_target = /obj/item/weapon/cell/hyper
|
||||
explanation_text = "Steal a hyper capacity power cell."
|
||||
@@ -697,6 +848,9 @@ datum
|
||||
if(4)
|
||||
return 75
|
||||
|
||||
get_weight(var/job)
|
||||
return 2
|
||||
|
||||
lucy
|
||||
steal_target = /obj/item/stack/sheet/diamond
|
||||
explanation_text = "Steal 10 diamonds."
|
||||
@@ -715,6 +869,9 @@ datum
|
||||
if(4)
|
||||
return 75
|
||||
|
||||
get_weight(var/job)
|
||||
return 2
|
||||
|
||||
check_completion()
|
||||
var/target_amount = 10
|
||||
var/found_amount = 0.0//Always starts as zero.
|
||||
@@ -741,6 +898,9 @@ datum
|
||||
if(4)
|
||||
return 70
|
||||
|
||||
get_weight(var/job)
|
||||
return 2
|
||||
|
||||
check_completion()
|
||||
var/target_amount = 50
|
||||
var/found_amount = 0.0//Always starts as zero.
|
||||
@@ -767,6 +927,9 @@ datum
|
||||
if(4)
|
||||
return 70
|
||||
|
||||
get_weight(var/job)
|
||||
return 2
|
||||
|
||||
check_completion()
|
||||
var/target_amount = 25
|
||||
var/found_amount = 0.0//Always starts as zero.
|
||||
@@ -819,6 +982,9 @@ datum
|
||||
if(istype(objective,/obj/item/robot_parts/robot_suit) && objective.check_completion())
|
||||
return 1
|
||||
return 0
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
AI
|
||||
steal_target = /obj/structure/AIcore
|
||||
explanation_text = "Steal a finished AI, either by intellicard or stealing the whole construct."
|
||||
@@ -837,6 +1003,9 @@ datum
|
||||
if(4)
|
||||
return 20
|
||||
|
||||
get_weight(var/job)
|
||||
return 15
|
||||
|
||||
check_completion()
|
||||
if(steal_target)
|
||||
for(var/obj/item/device/aicard/C in owner.current.get_contents())
|
||||
@@ -878,6 +1047,9 @@ datum
|
||||
else
|
||||
return 0
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
|
||||
pacid
|
||||
steal_target = /datum/reagent/pacid
|
||||
@@ -904,6 +1076,9 @@ datum
|
||||
else
|
||||
return 0
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
|
||||
reagent
|
||||
var/target_name
|
||||
@@ -957,6 +1132,9 @@ datum
|
||||
else
|
||||
return 0
|
||||
|
||||
get_weight(var/job)
|
||||
return 20
|
||||
|
||||
|
||||
nuclear
|
||||
explanation_text = "Destroy the station with a nuclear device."
|
||||
|
||||
@@ -538,6 +538,8 @@
|
||||
A.skin = "tox"
|
||||
else if(istype(src,/obj/item/weapon/storage/firstaid/o2))
|
||||
A.skin = "o2"
|
||||
else if(istype(src,/obj/item/weapon/storage/firstaid/adv))
|
||||
A.skin = "adv"
|
||||
|
||||
A.loc = user
|
||||
if (user.r_hand == S)
|
||||
|
||||
@@ -203,7 +203,11 @@
|
||||
if (src.density)
|
||||
open()
|
||||
else
|
||||
var/holdopen_old = holdopen
|
||||
holdopen = 0
|
||||
close()
|
||||
spawn(1)
|
||||
holdopen = holdopen_old
|
||||
else if (src.density)
|
||||
flick("door_deny", src)
|
||||
return
|
||||
|
||||
@@ -195,26 +195,26 @@ FINGERPRINT CARD
|
||||
return "<B>There are no fingerprints on this card.</B>"
|
||||
return
|
||||
|
||||
/obj/item/weapon/f_card/attack_hand(mob/user as mob)
|
||||
///obj/item/weapon/f_card/attack_hand(mob/user as mob)
|
||||
|
||||
if ((user.r_hand == src || user.l_hand == src))
|
||||
src.add_fingerprint(user)
|
||||
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user )
|
||||
F.amount = 1
|
||||
src.amount--
|
||||
if (user.hand)
|
||||
user.l_hand = F
|
||||
else
|
||||
user.r_hand = F
|
||||
F.layer = 20
|
||||
F.add_fingerprint(user)
|
||||
if (src.amount < 1)
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
else
|
||||
..()
|
||||
return
|
||||
// if ((user.r_hand == src || user.l_hand == src))
|
||||
// add_fingerprint(user)
|
||||
// var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user )
|
||||
// F.amount = 1
|
||||
// src.amount--
|
||||
// if (user.hand)
|
||||
// user.l_hand = F
|
||||
// else
|
||||
// user.r_hand = F
|
||||
// F.layer = 20
|
||||
// F.add_fingerprint(user)
|
||||
// if (src.amount < 1)
|
||||
// //SN src = null
|
||||
// del(src)
|
||||
// return
|
||||
// else
|
||||
// ..()
|
||||
// return
|
||||
|
||||
/obj/item/weapon/f_card/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
@@ -253,10 +253,10 @@ FINGERPRINT CARD
|
||||
|
||||
..()
|
||||
if (!istype(usr, /mob/living/silicon))
|
||||
if (src.fingerprints)
|
||||
if (fingerprints)
|
||||
if (src.amount > 1)
|
||||
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card(get_turf(src))
|
||||
F.amount = --src.amount
|
||||
src.amount = 1
|
||||
src.icon_state = "fingerprint1"
|
||||
amount = 1
|
||||
icon_state = "fingerprint1"
|
||||
return
|
||||
@@ -12,6 +12,8 @@ BIKE HORN
|
||||
var/mob/M = AM
|
||||
if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP))
|
||||
return
|
||||
if (istype(M, /mob/living/carbon/metroid)) //I mean they float, seriously. - Erthilo
|
||||
return
|
||||
|
||||
M.pulling = null
|
||||
M << "\blue You slipped on the [name]!"
|
||||
@@ -24,6 +26,8 @@ BIKE HORN
|
||||
var/mob/M = AM
|
||||
if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP))
|
||||
return
|
||||
if (istype(M, /mob/living/carbon/metroid))
|
||||
return
|
||||
|
||||
M.pulling = null
|
||||
M << "\blue You slipped on the [name]!"
|
||||
@@ -36,6 +40,8 @@ BIKE HORN
|
||||
var/mob/M = AM
|
||||
if (istype(M, /mob/living/carbon/human) && (isobj(M:shoes) && M:shoes.flags&NOSLIP))
|
||||
return
|
||||
if (istype(M, /mob/living/carbon/metroid))
|
||||
return
|
||||
|
||||
M.pulling = null
|
||||
M << "\blue You slipped on the [name]!"
|
||||
|
||||
@@ -38,31 +38,36 @@ MEDICAL
|
||||
if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0)
|
||||
affecting = H.get_organ("head")
|
||||
if(affecting.destroyed && !affecting.gauzed)
|
||||
H.visible_message("\red You do your best to stop the bleeding from [H]'s stump.", "\red [user] does their best to stem [H]'s bleeding from [H.gender == MALE? "his" : "her"] stump.", "\red You hear something like gauze being ripped.")
|
||||
user.visible_message("\red You do your best to stop the bleeding from [H]'s stump.", "\red [user] does [user.gender == MALE? "his" : "her"] best to stem [H]'s bleeding from [H.gender == MALE? "his" : "her"] stump.", "\red You hear something like gauze being ripped.")
|
||||
affecting.gauzed = 1
|
||||
use(1)
|
||||
return
|
||||
|
||||
for(var/datum/organ/wound/W in affecting.wounds)
|
||||
if(W.bleeding || !W.healing_state)
|
||||
if(W.bleeding || !W.is_healing)
|
||||
if(heal_brute && W.wound_type == 2)
|
||||
continue
|
||||
if(heal_burn && W.wound_type < 2)
|
||||
continue
|
||||
if(stoppedblood)
|
||||
stoppedblood++
|
||||
break
|
||||
if(W.wound_size > 3)
|
||||
if(W.wound_size > 3 && (W.bleeding || !W.is_healing))
|
||||
if(stoppedblood)
|
||||
stoppedblood += 1
|
||||
break
|
||||
W.bleeding = 0
|
||||
else
|
||||
W.is_healing = 1
|
||||
stoppedblood = 1
|
||||
else if(W.wound_size <= 3)
|
||||
if(stoppedblood)
|
||||
stoppedblood += 1
|
||||
break
|
||||
W.stopbleeding()
|
||||
stoppedblood = 1
|
||||
stoppedblood = 1
|
||||
|
||||
if (user && stoppedblood)
|
||||
if (M != user)
|
||||
H.visible_message("\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts", "\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts with [src]", "\red You hear something like gauze being ripped.")
|
||||
user.visible_message("\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts with [src]", "\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] [H]'s cuts", "\red You hear something like gauze being ripped.")
|
||||
else
|
||||
H.visible_message("\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] your cuts", "\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] their own cuts with [src]", "\red You hear something like gauze being ripped.")
|
||||
user.visible_message("\red [user] bandages [stoppedblood - 1 ? "some of" : "the last of"] [user.gender == MALE? "his" : "her"] own cuts with [src]", "\red You bandage up [stoppedblood - 1 ? "some of" : "the last of"] your cuts", "\red You hear something like gauze being ripped.")
|
||||
else if(user)
|
||||
user << "\red Nothing to patch up!"
|
||||
return
|
||||
|
||||
@@ -167,14 +167,18 @@ SHARDS
|
||||
/obj/item/weapon/shard/HasEntered(AM as mob|obj)
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if (istype(M, /mob/living/carbon/metroid)) //I mean they float, seriously. - Erthilo
|
||||
return
|
||||
M << "\red <B>You step in the broken glass!</B>"
|
||||
playsound(src.loc, 'glass_step.ogg', 50, 1)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.shoes)
|
||||
var/datum/organ/external/affecting = H.get_organ(pick("l_leg", "r_leg"))
|
||||
if(!((H.shoes) || (H.wear_suit && H.wear_suit.body_parts_covered & FEET)))
|
||||
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||
H.Weaken(3)
|
||||
affecting.take_damage(5, 0)
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
..()
|
||||
..()
|
||||
|
||||
//&& H.wear_suit.body_parts_covered&FEET)))
|
||||
@@ -64,6 +64,18 @@
|
||||
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/firstaid/adv/New()
|
||||
..()
|
||||
if (empty) return
|
||||
new /obj/item/weapon/reagent_containers/syringe/inaprovaline( src )
|
||||
new /obj/item/stack/medical/advanced/bruise_pack(src)
|
||||
new /obj/item/stack/medical/advanced/bruise_pack(src)
|
||||
new /obj/item/stack/medical/advanced/bruise_pack(src)
|
||||
new /obj/item/stack/medical/advanced/ointment(src)
|
||||
new /obj/item/stack/medical/advanced/ointment(src)
|
||||
new /obj/item/stack/medical/advanced/ointment(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/kelotane
|
||||
name = "Pill bottle (kelotane)"
|
||||
desc = "Contains pills used to treat burns."
|
||||
|
||||
@@ -3,6 +3,15 @@
|
||||
name = "shuttle"
|
||||
icon = 'shuttle.dmi'
|
||||
|
||||
/obj/structure/shuttle/window
|
||||
name = "shuttle window"
|
||||
icon = 'podwindows.dmi'
|
||||
icon_state = "1"
|
||||
density = 1
|
||||
opacity = 0
|
||||
anchored = 1
|
||||
|
||||
|
||||
/obj/structure/shuttle/engine
|
||||
name = "engine"
|
||||
density = 1
|
||||
|
||||
@@ -142,6 +142,7 @@
|
||||
W.sd_SetOpacity(0)
|
||||
//This is probably gonna make lighting go a bit wonky in bombed areas, but sd_SetOpacity was the primary reason bombs have been so laggy. --NEO
|
||||
W.levelupdate()
|
||||
air_master.tiles_to_update += W
|
||||
return W
|
||||
|
||||
/turf/proc/ReplaceWithPlating()
|
||||
@@ -158,6 +159,7 @@
|
||||
W.opacity = 1
|
||||
W.sd_SetOpacity(0)
|
||||
W.levelupdate()
|
||||
air_master.tiles_to_update += W
|
||||
return W
|
||||
|
||||
/turf/proc/ReplaceWithEngineFloor()
|
||||
@@ -170,6 +172,7 @@
|
||||
E.dir = old_dir
|
||||
E.icon_state = "engine"
|
||||
E.levelupdate()
|
||||
air_master.tiles_to_update += E
|
||||
return E
|
||||
|
||||
/turf/simulated/Entered(atom/A, atom/OL)
|
||||
@@ -231,6 +234,7 @@
|
||||
var/old_dir = dir
|
||||
var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) )
|
||||
S.dir = old_dir
|
||||
air_master.tiles_to_update += S
|
||||
return S
|
||||
|
||||
/turf/proc/ReplaceWithLattice()
|
||||
@@ -238,6 +242,7 @@
|
||||
var/turf/space/S = new /turf/space( locate(src.x, src.y, src.z) )
|
||||
S.dir = old_dir
|
||||
new /obj/structure/lattice( locate(src.x, src.y, src.z) )
|
||||
air_master.tiles_to_update += S
|
||||
return S
|
||||
|
||||
/turf/proc/ReplaceWithWall()
|
||||
@@ -247,6 +252,7 @@
|
||||
S.opacity = 0
|
||||
S.sd_NewOpacity(1)
|
||||
levelupdate()
|
||||
air_master.tiles_to_update += S
|
||||
return S
|
||||
|
||||
/turf/proc/ReplaceWithRWall()
|
||||
@@ -256,6 +262,7 @@
|
||||
S.opacity = 0
|
||||
S.sd_NewOpacity(1)
|
||||
levelupdate()
|
||||
air_master.tiles_to_update += S
|
||||
return S
|
||||
|
||||
/turf/simulated/wall/New()
|
||||
|
||||
@@ -199,7 +199,6 @@ obj/machinery/computer/forensic_scanning
|
||||
M.drop_item()
|
||||
I.loc = src
|
||||
process_card()
|
||||
usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
|
||||
else
|
||||
usr << "\red Invalid Object Rejected."
|
||||
if("database")
|
||||
@@ -646,7 +645,9 @@ obj/machinery/computer/forensic_scanning
|
||||
return
|
||||
|
||||
proc/process_card() //Same as above, but for fingerprint cards
|
||||
if(card.fingerprints && !(card.amount > 1))
|
||||
if(card.fingerprints && !(card.amount > 1) && islist(card.fingerprints) && files && files.len)
|
||||
usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
|
||||
var/found = 0
|
||||
for(var/k = 1, k <= card.fingerprints.len, k++)
|
||||
var/list/test_prints = params2list(card.fingerprints[k])
|
||||
var/print = test_prints[num2text(1)]
|
||||
@@ -657,7 +658,12 @@ obj/machinery/computer/forensic_scanning
|
||||
if(perp == print)
|
||||
test_list[1] = "1=" + print + "&2=" + print
|
||||
files[i] = test_list
|
||||
found = 1
|
||||
break
|
||||
if(found)
|
||||
usr << "The machinery finds can completes a match."
|
||||
else
|
||||
usr << "No match found."
|
||||
del(card)
|
||||
else
|
||||
usr << "\red ERROR: No prints/too many cards."
|
||||
|
||||
@@ -511,8 +511,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
e.perma_injury = 0
|
||||
e.update_icon()
|
||||
for(var/datum/organ/wound/W in e.wounds)
|
||||
if(W.bleeding)
|
||||
if(W.bleeding || !W.is_healing)
|
||||
W.stopbleeding()
|
||||
del(H.vessel)
|
||||
H.vessel = new/datum/reagents(560)
|
||||
H.vessel.my_atom = H
|
||||
H.vessel.add_reagent("blood",560)
|
||||
|
||||
@@ -317,6 +317,10 @@ datum
|
||||
|
||||
for(var/A in reagent_list)
|
||||
var/datum/reagent/R = A
|
||||
if(R.id == "blood" && reagent == R.id)
|
||||
if(R.data && data)
|
||||
if(R.data["donor"] != data["donor"])
|
||||
continue
|
||||
if (R.id == reagent)
|
||||
R.volume += amount
|
||||
update_total()
|
||||
|
||||
@@ -103,8 +103,8 @@ datum
|
||||
color = "#C80000" // rgb: 200, 0, 0
|
||||
on_mob_life(var/mob/living/M)
|
||||
if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type))
|
||||
M.adjustToxLoss(rand(1.5,3))
|
||||
M.adjustOxyLoss(rand(1.5,3))
|
||||
M.adjustToxLoss(rand(0.5,1.5))
|
||||
M.adjustOxyLoss(rand(1,1.5))
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -1752,27 +1752,6 @@ datum
|
||||
reagent_state = LIQUID
|
||||
color = "#181818" // rgb: 24, 24, 24
|
||||
|
||||
ethanol
|
||||
name = "Ethanol"
|
||||
id = "ethanol"
|
||||
description = "A well-known alcohol with a variety of applications."
|
||||
reagent_state = LIQUID
|
||||
color = "#404030" // rgb: 64, 64, 48
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!data) data = 1
|
||||
data++
|
||||
M.make_dizzy(5)
|
||||
M:jitteriness = max(M:jitteriness-5,0)
|
||||
if(data >= 25)
|
||||
if (!M:slurring) M:slurring = 1
|
||||
M:slurring += 4
|
||||
if(data >= 40 && prob(33))
|
||||
if (!M:confused) M:confused = 1
|
||||
M:confused += 3
|
||||
..()
|
||||
return
|
||||
|
||||
ammonia
|
||||
name = "Ammonia"
|
||||
id = "ammonia"
|
||||
@@ -2557,32 +2536,6 @@ datum
|
||||
..()
|
||||
return
|
||||
|
||||
thirteenloko
|
||||
name = "Thirteen Loko"
|
||||
id = "thirteenloko"
|
||||
description = "A potent mixture of caffeine and alcohol."
|
||||
reagent_state = LIQUID
|
||||
color = "#102000" // rgb: 16, 32, 0
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
M:drowsyness = max(0,M:drowsyness-7)
|
||||
if(!M:sleeping_willingly)
|
||||
M:sleeping = 0
|
||||
if (M.bodytemperature > 310)
|
||||
M.bodytemperature = max(310, M.bodytemperature-5)
|
||||
M.make_jittery(1)
|
||||
M:nutrition += 1
|
||||
if(!data) data = 1
|
||||
data++
|
||||
M.dizziness +=4
|
||||
if(data >= 45 && data <115)
|
||||
if (!M.slurring) M.slurring = 1
|
||||
M.slurring += 3
|
||||
else if(data >= 125 && prob(33))
|
||||
M.confused = max(M:confused+2,0)
|
||||
..()
|
||||
return
|
||||
|
||||
dr_gibb
|
||||
name = "Dr. Gibb"
|
||||
id = "dr_gibb"
|
||||
@@ -2651,18 +2604,20 @@ datum
|
||||
|
||||
|
||||
//ALCOHOL WOO
|
||||
alcohol //Parent class for all alcoholic reagents.
|
||||
name = "Alcohol"
|
||||
id = "alcohol"
|
||||
ethanol
|
||||
name = "Ethanol" //Parent class for all alcoholic reagents.
|
||||
id = "ethanol"
|
||||
description = "A well-known alcohol with a variety of applications."
|
||||
reagent_state = LIQUID
|
||||
color = "#404030" // rgb: 64, 64, 48
|
||||
var
|
||||
dizzy_adj = 3
|
||||
slurr_adj = 3
|
||||
confused_adj = 2
|
||||
slur_start = 45 //amount absorbed after which mob starts slurring
|
||||
confused_start = 125 //amount absorbed after which mob starts confusing directions
|
||||
blur_start = 245 //amount absorbed after which mob starts getting blurred vision
|
||||
pass_out = 290 //amount absorbed after which mob starts passing out
|
||||
slur_start = 65 //amount absorbed after which mob starts slurring
|
||||
confused_start = 130 //amount absorbed after which mob starts confusing directions
|
||||
blur_start = 260 //amount absorbed after which mob starts getting blurred vision
|
||||
pass_out = 325 //amount absorbed after which mob starts passing out
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!src.data) data = 1
|
||||
@@ -2671,7 +2626,7 @@ datum
|
||||
var/d = data
|
||||
|
||||
// make all the beverages work together
|
||||
for(var/datum/reagent/alcohol/A in holder.reagent_list)
|
||||
for(var/datum/reagent/ethanol/A in holder.reagent_list)
|
||||
if(A.data) d += A.data
|
||||
|
||||
M.dizziness +=dizzy_adj.
|
||||
@@ -2692,14 +2647,13 @@ datum
|
||||
..()
|
||||
return
|
||||
|
||||
beer //It's really much more stronger than other drinks
|
||||
beer //It's really much more stronger than other drinks.
|
||||
name = "Beer"
|
||||
id = "beer"
|
||||
description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
|
||||
color = "#664300" // rgb: 102, 67, 0
|
||||
slur_start = 25 //amount absorbed after which mob starts slurring
|
||||
confused_start = 40 //amount absorbed after which mob starts confusing directions
|
||||
|
||||
// slur_start = 25 //amount absorbed after which mob starts slurring
|
||||
// confused_start = 40 //amount absorbed after which mob starts confusing directions //This is quite silly - Erthilo
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
..()
|
||||
M:jitteriness = max(M:jitteriness-3,0)
|
||||
@@ -2784,6 +2738,23 @@ datum
|
||||
description = "A dark alchoholic beverage made by malted barley and yeast."
|
||||
color = "#664300" // rgb: 102, 67, 0
|
||||
|
||||
thirteenloko
|
||||
name = "Thirteen Loko"
|
||||
id = "thirteenloko"
|
||||
description = "A potent mixture of caffeine and alcohol."
|
||||
reagent_state = LIQUID
|
||||
color = "#102000" // rgb: 16, 32, 0
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
M:drowsyness = max(0,M:drowsyness-7)
|
||||
if(!M:sleeping_willingly)
|
||||
M:sleeping = 0
|
||||
if (M.bodytemperature > 310)
|
||||
M.bodytemperature = max(310, M.bodytemperature-5)
|
||||
M.make_jittery(1)
|
||||
M:nutrition += 1
|
||||
return
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -972,6 +972,7 @@
|
||||
if(T:vessel.get_reagent_amount("blood") < amount)
|
||||
return
|
||||
T:vessel.trans_to(src, amount)
|
||||
on_reagent_change()
|
||||
else
|
||||
var/datum/reagent/B = new /datum/reagent/blood
|
||||
B.holder = src
|
||||
@@ -1077,8 +1078,8 @@
|
||||
var/trans
|
||||
if(B && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.vessel.add_reagent("blood",5,B)
|
||||
src.reagents.remove_reagent("blood",5)
|
||||
H.vessel.add_reagent("blood",(B.volume > 5? 5 : B.volume),B.data)
|
||||
src.reagents.remove_reagent("blood",(B.volume > 5? 5 : B.volume))
|
||||
else
|
||||
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
|
||||
user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units."
|
||||
@@ -1090,20 +1091,20 @@
|
||||
|
||||
update_icon()
|
||||
var/rounded_vol = round(reagents.total_volume,5)
|
||||
overlays = null
|
||||
has_blood = 0
|
||||
for(var/datum/reagent/blood/B in reagents.reagent_list)
|
||||
has_blood = 1
|
||||
break
|
||||
if(ismob(loc))
|
||||
var/mode_t
|
||||
var/injoverlay
|
||||
switch(mode)
|
||||
if (SYRINGE_DRAW)
|
||||
mode_t = "d"
|
||||
injoverlay = "draw"
|
||||
if (SYRINGE_INJECT)
|
||||
mode_t = "i"
|
||||
icon_state = "[mode_t][(has_blood?"b":"")][rounded_vol]"
|
||||
else
|
||||
icon_state = "[(has_blood?"b":"")][rounded_vol]"
|
||||
injoverlay = "inject"
|
||||
overlays += injoverlay
|
||||
icon_state = "[rounded_vol]"
|
||||
item_state = "syringe_[rounded_vol]"
|
||||
if(reagents.total_volume)
|
||||
var/obj/effect/overlay = new/obj
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
name = "security RIG suit"
|
||||
desc = "A suit specially designed for security to offer minor protection from environmental hazards, and greater protection from human hazards"
|
||||
icon_state = "rig-security"
|
||||
item_state = "rig-security"
|
||||
protective_temperature = 3000
|
||||
slowdown = 1
|
||||
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
|
||||
|
||||
@@ -21,7 +21,7 @@ mob/living/carbon/verb/give()
|
||||
if(!I)
|
||||
return
|
||||
if(src.r_hand == null)
|
||||
switch(alert(src,"[usr.name] wants to give you \a [I.name]?",,"Yes","No"))
|
||||
switch(alert(src,"[usr] wants to give you \a [I]?",,"Yes","No"))
|
||||
if("Yes")
|
||||
if(!check_can_reach(usr,src))
|
||||
usr << "You need to keep in reaching distance."
|
||||
@@ -50,7 +50,7 @@ mob/living/carbon/verb/give()
|
||||
if("No")
|
||||
src.visible_message("[usr.name] tried to hand [I.name] to [src.name] but [src.name] didn't want it.")
|
||||
else if(src.l_hand == null)
|
||||
switch(alert(src,"[src.name] wants to give you \a [I.name]?",,"Yes","No"))
|
||||
switch(alert(src,"[usr] wants to give you \a [I]?",,"Yes","No"))
|
||||
if("Yes")
|
||||
if(!check_can_reach(usr,src))
|
||||
usr << "You need to keep in reaching distance."
|
||||
@@ -79,4 +79,4 @@ mob/living/carbon/verb/give()
|
||||
if("No")
|
||||
src.visible_message("[usr.name] tried to hand [I.name] to [src.name] but [src.name] didn't want it.")
|
||||
else
|
||||
usr << "[src.name]\s hands are full."
|
||||
usr << "[src.name]'s hands are full."
|
||||
@@ -349,11 +349,11 @@
|
||||
"severe burn" = "severe burn", "deep burn" = "deep burn", "carbonised area" = "carbonised area")
|
||||
switch(i)
|
||||
if(2) //Healing wounds.
|
||||
if(tallied in list("cut","tiny bruise","small burn"))
|
||||
if(tallied in list("cut","small burn"))
|
||||
continue
|
||||
tallied_rename = list("deep cut" = "clotted cut", "flesh wound" = "small bandaged wound",\
|
||||
"gaping wound" = "bandaged wound", "big gaping wound" = "gauze wrapped wound",\
|
||||
"massive wound" = "massive blood soaked bandage", "small bruise" = "small bruise",\
|
||||
"massive wound" = "massive blood soaked bandage", "tiny bruise" = "tiny bruise", "small bruise" = "small bruise",\
|
||||
"moderate bruise" = "moderate bruise", "large bruise" = "large bruise",\
|
||||
"huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
|
||||
"moderate burn" = "moderate salved burn", "large burn" = "large salved burn",\
|
||||
@@ -380,7 +380,7 @@
|
||||
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
|
||||
"deep burn" = "deep burn scar", "carbonised area" = "healing carbonised area")
|
||||
if(5)
|
||||
if(tallied in list("cut","deep cut","tiny bruise", "small bruise", "moderate bruise","small burn", "moderate burn"))
|
||||
if(tallied in list("cut","deep cut","tiny bruise", "moderate bruise", "small bruise","small burn", "moderate burn"))
|
||||
continue
|
||||
tallied_rename = list("flesh wound" = "small scar", "gaping wound" = "straight scar",\
|
||||
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
|
||||
@@ -429,6 +429,7 @@
|
||||
flavor_text_string += flavor_text[text]
|
||||
flavor_text_string += " on [t_his] [named].</span><br>"
|
||||
wound_flavor_text["[named]"] = flavor_text_string
|
||||
world << "[named] + [flavor_text_string]"
|
||||
if(wound_flavor_text["head"] && !skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))
|
||||
msg += wound_flavor_text["head"]
|
||||
else if(is_bleeding["head"])
|
||||
@@ -436,29 +437,39 @@
|
||||
if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit)
|
||||
msg += wound_flavor_text["chest"]
|
||||
else if(is_bleeding["chest"])
|
||||
msg += "<span class='warning'>[src] has blood from under [t_his] clothing!</span>\n"
|
||||
msg += "<span class='warning'>[src] has blood soaking through from under [t_his] clothing!</span>\n"
|
||||
if(wound_flavor_text["left arm"] && !w_uniform && !skipjumpsuit)
|
||||
msg += wound_flavor_text["left arm"]
|
||||
else if(is_bleeding["left arm"])
|
||||
msg += "<span class='warning'>[src] has blood soaking through from under [t_his] clothing!</span>\n"
|
||||
if(wound_flavor_text["left hand"] && !gloves && !skipgloves)
|
||||
msg += wound_flavor_text["left hand"]
|
||||
else if(is_bleeding["left hand"])
|
||||
msg += "<span class='warning'>[src] has blood running from under [t_his] gloves!</span>\n"
|
||||
if(wound_flavor_text["right arm"] && !w_uniform && !skipjumpsuit)
|
||||
msg += wound_flavor_text["right arm"]
|
||||
else if(is_bleeding["right arm"])
|
||||
msg += "<span class='warning'>[src] has blood soaking through from under [t_his] clothing!</span>\n"
|
||||
if(wound_flavor_text["right hand"] && !gloves && !skipgloves)
|
||||
msg += wound_flavor_text["right hand"]
|
||||
else if(is_bleeding["right hand"])
|
||||
msg += "<span class='warning'>[src] has blood running from under [t_his] gloves!</span>\n"
|
||||
if(wound_flavor_text["groin"] && !w_uniform && !skipjumpsuit)
|
||||
msg += wound_flavor_text["groin"]
|
||||
else if(is_bleeding["groin"])
|
||||
msg += "<span class='warning'>[src] has blood soaking through from under [t_his] clothing!</span>\n"
|
||||
if(wound_flavor_text["left leg"] && !w_uniform && !skipjumpsuit)
|
||||
msg += wound_flavor_text["left leg"]
|
||||
else if(is_bleeding["left leg"])
|
||||
msg += "<span class='warning'>[src] has blood soaking through from under [t_his] clothing!</span>\n"
|
||||
if(wound_flavor_text["left foot"]&& !shoes && !skipshoes)
|
||||
msg += wound_flavor_text["left foot"]
|
||||
else if(is_bleeding["left foot"])
|
||||
msg += "<span class='warning'>[src] has blood running from [t_his] shoes!</span>\n"
|
||||
if(wound_flavor_text["right leg"] && !w_uniform && !skipjumpsuit)
|
||||
msg += wound_flavor_text["right leg"]
|
||||
else if(is_bleeding["right leg"])
|
||||
msg += "<span class='warning'>[src] has blood soaking through from under [t_his] clothing!</span>\n"
|
||||
if(wound_flavor_text["right foot"]&& !shoes && !skipshoes)
|
||||
msg += wound_flavor_text["right foot"]
|
||||
else if(is_bleeding["right foot"])
|
||||
|
||||
@@ -54,7 +54,6 @@
|
||||
|
||||
var/list/body_standing = list()
|
||||
var/list/body_lying = list()
|
||||
var/organs2 = list()
|
||||
|
||||
var/mutantrace = null
|
||||
|
||||
@@ -115,7 +114,7 @@
|
||||
update_clothing()
|
||||
src << "\blue Your icons have been generated!"
|
||||
|
||||
vessel = new/datum/reagents(560)
|
||||
vessel = new/datum/reagents(600)
|
||||
vessel.my_atom = src
|
||||
vessel.add_reagent("blood",560)
|
||||
spawn(1) fixblood()
|
||||
|
||||
@@ -447,7 +447,7 @@
|
||||
return null
|
||||
|
||||
update_canmove()
|
||||
if(paralysis || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0
|
||||
if(paralysis || resting || stunned || weakened || buckled || (changeling && changeling.changeling_fakedeath)) canmove = 0
|
||||
else canmove = 1
|
||||
|
||||
handle_breath(datum/gas_mixture/breath)
|
||||
@@ -857,7 +857,7 @@
|
||||
leg_tally-- // let it fail even if just foot&leg
|
||||
|
||||
// can't stand
|
||||
if(leg_tally == 0)
|
||||
if(leg_tally == 0 && !paralysis && !(lying || resting))
|
||||
emote("scream")
|
||||
emote("collapse")
|
||||
paralysis = 10
|
||||
@@ -1470,4 +1470,4 @@ snippets
|
||||
plcheck = t_plasma
|
||||
oxcheck = t_oxygen
|
||||
G.turf_add(T, G.total_moles())
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -24,26 +24,37 @@
|
||||
real_name = name
|
||||
var/datum/organ/external/chest/chest = new /datum/organ/external/chest( src )
|
||||
chest.owner = src
|
||||
organs2 += chest
|
||||
var/datum/organ/external/groin/groin = new /datum/organ/external/groin( src )
|
||||
groin.owner = src
|
||||
organs2 += groin
|
||||
var/datum/organ/external/head/head = new /datum/organ/external/head( src )
|
||||
head.owner = src
|
||||
organs2 += head
|
||||
var/datum/organ/external/l_arm/l_arm = new /datum/organ/external/l_arm( src )
|
||||
l_arm.owner = src
|
||||
organs2 += l_arm
|
||||
var/datum/organ/external/r_arm/r_arm = new /datum/organ/external/r_arm( src )
|
||||
r_arm.owner = src
|
||||
organs2 += r_arm
|
||||
var/datum/organ/external/l_hand/l_hand = new /datum/organ/external/l_hand( src )
|
||||
l_hand.owner = src
|
||||
organs2 += l_hand
|
||||
var/datum/organ/external/r_hand/r_hand = new /datum/organ/external/r_hand( src )
|
||||
r_hand.owner = src
|
||||
organs2 += r_hand
|
||||
var/datum/organ/external/l_leg/l_leg = new /datum/organ/external/l_leg( src )
|
||||
l_leg.owner = src
|
||||
organs2 += l_leg
|
||||
var/datum/organ/external/r_leg/r_leg = new /datum/organ/external/r_leg( src )
|
||||
r_leg.owner = src
|
||||
organs2 += r_leg
|
||||
var/datum/organ/external/l_foot/l_foot = new /datum/organ/external/l_foot( src )
|
||||
l_foot.owner = src
|
||||
organs2 += l_foot
|
||||
var/datum/organ/external/r_foot/r_foot = new /datum/organ/external/r_foot( src )
|
||||
r_foot.owner = src
|
||||
organs2 += r_foot
|
||||
|
||||
organs["chest"] = chest
|
||||
organs["groin"] = groin
|
||||
|
||||
@@ -282,7 +282,7 @@ the mob is also allowed to move without any sort of restriction. For instance, i
|
||||
|
||||
|
||||
var/list/organs = list( ) //List of organs.
|
||||
|
||||
var/list/organs2 = list()
|
||||
//Singularity wants you!
|
||||
var/grav_delay = 0
|
||||
var/being_strangled = 0
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
if(Process_Grab()) return
|
||||
|
||||
//Making mob movememnt changes instant.
|
||||
if(mob.paralysis || mob.stunned || mob.weakened || mob.buckled || (mob.changeling && mob.changeling.changeling_fakedeath))
|
||||
if(mob.paralysis || mob.stunned || mob.resting || mob.weakened || mob.buckled || (mob.changeling && mob.changeling.changeling_fakedeath))
|
||||
mob.canmove = 0
|
||||
return
|
||||
else
|
||||
|
||||
@@ -73,6 +73,11 @@
|
||||
owner = H
|
||||
H.organs[name] = src
|
||||
|
||||
Del()
|
||||
for(var/datum/organ/wound/W in wounds)
|
||||
del(W)
|
||||
..()
|
||||
|
||||
proc/take_damage(brute, burn, sharp, used_weapon = null)
|
||||
if((brute <= 0) && (burn <= 0))
|
||||
return 0
|
||||
@@ -99,7 +104,7 @@
|
||||
if(prob(brute) && brute > 20 && !sharp)
|
||||
createwound(rand(4,6),0,brute)
|
||||
else if(!sharp)
|
||||
createwound(max(1,min(6,round(brute/10) + rand(-1,1))),1,brute)
|
||||
createwound(max(1,min(6,round(brute/10) + rand(0,2))),1,brute)
|
||||
if(burn)
|
||||
burn_dam += burn
|
||||
createwound(max(1,min(6,round(burn/10) + rand(-1,1))),2,burn)
|
||||
@@ -152,15 +157,16 @@
|
||||
brute -= W.damage
|
||||
W.damage = 0
|
||||
W.initial_dmg = 0
|
||||
W.stopbleeding()
|
||||
W.stopbleeding(1)
|
||||
else
|
||||
W.damage -= brute
|
||||
W.initial_dmg -= brute
|
||||
W.stopbleeding()
|
||||
else if(brute)
|
||||
for(var/datum/organ/wound/W in brute_wounds)
|
||||
W.damage = 0
|
||||
W.initial_dmg = 0
|
||||
W.stopbleeding()
|
||||
W.stopbleeding(1)
|
||||
brute_dam = 0
|
||||
if(burn && burn >= burn_to_heal)
|
||||
for(var/datum/organ/wound/W in burn_wounds)
|
||||
@@ -173,6 +179,7 @@
|
||||
else
|
||||
W.damage -= burn
|
||||
W.initial_dmg -= burn
|
||||
W.stopbleeding()
|
||||
else if(burn)
|
||||
for(var/datum/organ/wound/W in burn_wounds)
|
||||
W.damage = 0
|
||||
@@ -226,8 +233,6 @@
|
||||
return
|
||||
if(brute_dam > min_broken_damage)
|
||||
if(broken == 0)
|
||||
var/dmgmsg = "[damage_msg] in your [display_name]"
|
||||
owner << dmgmsg
|
||||
//owner.unlock_medal("Broke Yarrr Bones!", 0, "Break a bone.", "easy")
|
||||
owner.visible_message("\red You hear a loud cracking sound coming from [owner.name].","\red <b>Something feels like it shattered in your [display_name]!</b>","You hear a sickening crack.")
|
||||
owner.emote("scream")
|
||||
@@ -275,6 +280,8 @@
|
||||
proc/droplimb()
|
||||
if(destroyed)
|
||||
//owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy")
|
||||
|
||||
owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.","\red <b>Your [display_name] goes flying off!</b>","You hear a terrible sound of ripping tendons and flesh.")
|
||||
switch(body_part)
|
||||
if(UPPER_TORSO)
|
||||
owner.gib()
|
||||
@@ -288,6 +295,7 @@
|
||||
H.transfer_identity(owner)
|
||||
H.pixel_x = -10
|
||||
H.pixel_y = 6
|
||||
H.name = "[owner.name]'s head"
|
||||
|
||||
var/lol = pick(cardinal)
|
||||
step(H,lol)
|
||||
@@ -332,29 +340,21 @@
|
||||
destroyed = 1
|
||||
if(HAND_RIGHT)
|
||||
var/obj/item/weapon/organ/r_hand/X = new(owner.loc, owner)
|
||||
for(var/mob/M in viewers(owner))
|
||||
M.show_message("\red [owner.name]'s [X.name] flies off in an arc.")
|
||||
var/lol2 = pick(cardinal)
|
||||
step(X,lol2)
|
||||
destroyed = 1
|
||||
if(HAND_LEFT)
|
||||
var/obj/item/weapon/organ/l_hand/X = new(owner.loc, owner)
|
||||
for(var/mob/M in viewers(owner))
|
||||
M.show_message("\red [owner.name]'s [X.name] flies off in an arc.")
|
||||
var/lol2 = pick(cardinal)
|
||||
step(X,lol2)
|
||||
destroyed = 1
|
||||
if(FOOT_RIGHT)
|
||||
var/obj/item/weapon/organ/r_foot/X = new(owner.loc, owner)
|
||||
for(var/mob/M in viewers(owner))
|
||||
M.show_message("\red [owner.name]'s [X.name] flies off in an arc.")
|
||||
var/lol2 = pick(cardinal)
|
||||
step(X,lol2)
|
||||
destroyed = 1
|
||||
if(FOOT_LEFT)
|
||||
var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner)
|
||||
for(var/mob/M in viewers(owner))
|
||||
M.show_message("\red [owner.name]'s [X.name] flies off in an arc.")
|
||||
var/lol2 = pick(cardinal)
|
||||
step(X,lol2)
|
||||
destroyed = 1
|
||||
@@ -377,7 +377,10 @@
|
||||
W.wound_size = size
|
||||
W.owner = owner
|
||||
W.parent = src
|
||||
spawn W.start_close() //Let small cuts close themselves.
|
||||
if(type == 1)
|
||||
spawn W.become_scar()
|
||||
else
|
||||
spawn W.start_close() //Let small cuts close themselves.
|
||||
wounds += W
|
||||
|
||||
/datum/organ/wound
|
||||
@@ -389,6 +392,8 @@
|
||||
var/datum/organ/external/parent
|
||||
var/bleeding = 0 //You got wounded, of course it's bleeding. -- Scratch that. Rewrote it.
|
||||
var/healing_state = 0
|
||||
var/is_healing = 0
|
||||
var/slowheal = 3
|
||||
|
||||
proc/start_close()
|
||||
sleep(rand(1800,3000)) //3-5 minutes
|
||||
@@ -400,7 +405,7 @@
|
||||
stopbleeding()
|
||||
return
|
||||
sleep(rand(1800,3000))
|
||||
if(wound_size == 1) //Small cuts heal in 3-10 minutes.
|
||||
if(wound_size == 1) //Small cuts heal in 6-10 minutes.
|
||||
parent.wounds.Remove(src)
|
||||
update_health(1)
|
||||
del(src)
|
||||
@@ -408,30 +413,34 @@
|
||||
stopbleeding()
|
||||
return
|
||||
if(wound_size < 5 && bleeding) //Give it a chance to stop bleeding on it's own.
|
||||
spawn(1)
|
||||
spawn while(1)
|
||||
sleep(1200)
|
||||
if(prob(50))
|
||||
stopbleeding()
|
||||
return
|
||||
return
|
||||
|
||||
proc/stopbleeding()
|
||||
if(healing_state)
|
||||
proc/stopbleeding(var/bleed = 0)
|
||||
if(is_healing)
|
||||
return 0
|
||||
// owner:bloodloss -= 10 * src.wound_size
|
||||
parent.bleeding = 0
|
||||
parent.bleeding = min(bleed,bleeding)
|
||||
for(var/datum/organ/wound/W in parent)
|
||||
if(W.bleeding && W != src)
|
||||
parent.bleeding = 1
|
||||
bleeding = 0
|
||||
break
|
||||
bleeding = min(bleed,bleeding)
|
||||
is_healing = 1
|
||||
slowheal = 1
|
||||
spawn become_scar() //spawn off the process of becoming a scar.
|
||||
return 1
|
||||
|
||||
proc/become_scar()
|
||||
healing_state = 1 //Patched
|
||||
update_health(0.5) //Heals some.
|
||||
spawn(200*slowheal) //20 seconds
|
||||
update_health(5) //Heals some.
|
||||
|
||||
sleep(rand(1800,3000)) //3-5 minutes
|
||||
sleep(rand(1800,3000)*slowheal) //3-5 minutes
|
||||
|
||||
if(parent.owner.stat == 2)
|
||||
return
|
||||
@@ -441,23 +450,26 @@
|
||||
del(src)
|
||||
|
||||
healing_state = 2 //Noticibly healing.
|
||||
update_health(1) //Heals the rest of the way.
|
||||
update_health(2) //Heals more.
|
||||
|
||||
sleep(rand(1800,3000)) //3-5 minutes
|
||||
sleep(rand(1800,3000)*slowheal) //3-5 minutes
|
||||
if(parent.owner.stat == 2)
|
||||
return
|
||||
if(prob(60) && wound_size < 3) //Cuts heal up
|
||||
parent.wounds.Remove(src)
|
||||
del(src)
|
||||
healing_state = 3 //Angry red scar
|
||||
sleep(rand(6000,9000)) //10-15 minutes
|
||||
update_health(1) //Heals the rest of the way.
|
||||
|
||||
|
||||
sleep(rand(6000,9000)*slowheal) //10-15 minutes
|
||||
if(parent.owner.stat == 2)
|
||||
return
|
||||
if(prob(80) && wound_size < 4) //Minor wounds heal up fully.
|
||||
parent.wounds.Remove(src)
|
||||
del(src)
|
||||
healing_state = 4 //Scar
|
||||
sleep(rand(6000,9000)) //10-15 minutes
|
||||
sleep(rand(6000,9000)*slowheal) //10-15 minutes
|
||||
if(parent.owner.stat == 2)
|
||||
return
|
||||
if(prob(30) || wound_size < 4 || wound_type == 1) //Small chance for the scar to disappear, any small remaining wounds deleted.
|
||||
@@ -467,11 +479,11 @@
|
||||
return
|
||||
|
||||
proc/update_health(var/percent = 1)
|
||||
damage -= damage/percent //Remove that amount of the damage
|
||||
damage = max(damage - damage/percent,0) //Remove that amount of the damage
|
||||
if(wound_type > 1)
|
||||
parent.burn_dam -= initial_dmg - damage
|
||||
parent.burn_dam = max(parent.burn_dam - (initial_dmg - damage),0)
|
||||
else
|
||||
parent.brute_dam -= initial_dmg - damage
|
||||
parent.brute_dam = max(parent.brute_dam - (initial_dmg - damage),0)
|
||||
initial_dmg = damage //reset it for further updates.
|
||||
parent.owner.updatehealth()
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
playsound(user, fire_sound, 10, 1)
|
||||
else
|
||||
playsound(user, fire_sound, 50, 1)
|
||||
M.apply_damage(30+in_chamber.damage, BRUTE, used_weapon = "Point Blank Shot") //So we'll put him an inch from death.
|
||||
M.apply_damage(30+in_chamber.damage, BRUTE, user.zone_sel.selecting, used_weapon = "Point Blank Shot") //So we'll put him an inch from death.
|
||||
M.attack_log += text("\[[]\] <b>[]/[]</b> shot <b>[]/[]</b> point blank with a <b>[]</b>", time_stamp(), user, user.ckey, M, M.ckey, src)
|
||||
user.attack_log += text("\[[]\] <b>[]/[]</b> shot <b>[]/[]</b> point blank with a <b>[]</b>", time_stamp(), user, user.ckey, M, M.ckey, src)
|
||||
log_admin("ATTACK: [user] ([user.ckey]) shot [M] ([M.ckey]) point blank with [src].")
|
||||
|
||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |