diff --git a/baystation12.dme b/baystation12.dme
index d762df503c..8e69350ebe 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -616,7 +616,6 @@
#include "code\game\mecha\working\firefighter.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"
-#include "code\game\objects\biomass.dm"
#include "code\game\objects\blood.dm"
#include "code\game\objects\bodybag.dm"
#include "code\game\objects\bombspawner.dm"
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 624a731e3e..0c8c8f4134 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -108,8 +108,8 @@ Filter types:
else
filtered_out = null
-
- filtered_out.update_values()
+ if(filtered_out)
+ filtered_out.update_values()
air2.merge(filtered_out)
air3.merge(removed)
diff --git a/code/FEA/FEA_gas_mixture.dm b/code/FEA/FEA_gas_mixture.dm
index 1819129532..8edefe79d7 100644
--- a/code/FEA/FEA_gas_mixture.dm
+++ b/code/FEA/FEA_gas_mixture.dm
@@ -466,6 +466,8 @@ datum
//Outputs: 0 if the self-check failed (local airgroup breaks?)
// then -1 if sharer-check failed (sharing airgroup breaks?)
// then 1 if both checks pass (share succesful?)
+ if(!istype(sharer))
+ return
var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/TRANSFER_FRACTION
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/TRANSFER_FRACTION
@@ -552,6 +554,10 @@ datum
//Inputs: Air datum to share with
//Outputs: Amount of gas exchanged (Negative if lost air, positive if gained.)
+
+ if(!istype(sharer))
+ return
+
var/delta_oxygen = QUANTIZE(oxygen_archived - sharer.oxygen_archived)/TRANSFER_FRACTION
var/delta_carbon_dioxide = QUANTIZE(carbon_dioxide_archived - sharer.carbon_dioxide_archived)/TRANSFER_FRACTION
var/delta_nitrogen = QUANTIZE(nitrogen_archived - sharer.nitrogen_archived)/TRANSFER_FRACTION
diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm
index fa4081b8af..38083f52ce 100644
--- a/code/FEA/FEA_turf_tile.dm
+++ b/code/FEA/FEA_turf_tile.dm
@@ -378,25 +378,24 @@ turf
enemy_tile.consider_pressure_difference(connection_difference, direction)
else
air_master.active_singletons -= src //not active if not processing!
+ if(air)
+ air.react()
- air.react()
+ if(active_hotspot)
+ if (!active_hotspot.process(possible_fire_spreads))
+ return 0
- if(active_hotspot)
- if (!active_hotspot.process(possible_fire_spreads))
- return 0
+ if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION)
+ consider_superconductivity(starting = 1)
- if(air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION)
- consider_superconductivity(starting = 1)
+ if(air.check_tile_graphic())
+ update_visuals(air)
- if(air.check_tile_graphic())
- update_visuals(air)
-
- if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
-// reset_delay() //hotspots always process quickly
- hotspot_expose(air.temperature, CELL_VOLUME)
- for(var/atom/movable/item in src)
- item.temperature_expose(air, air.temperature, CELL_VOLUME)
- temperature_expose(air, air.temperature, CELL_VOLUME)
+ if(air.temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
+ hotspot_expose(air.temperature, CELL_VOLUME)
+ for(var/atom/movable/item in src)
+ item.temperature_expose(air, air.temperature, CELL_VOLUME)
+ temperature_expose(air, air.temperature, CELL_VOLUME)
return 1
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm
index 44360cace8..c8906cf31d 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajara_transformation.dm
@@ -37,6 +37,7 @@
updateappearance(O,O.dna.uni_identity)
O.loc = loc
O.viruses = viruses
+ O.s_tone = s_tone
viruses = list()
for(var/datum/disease/D in O.viruses)
D.affected_mob = O
@@ -47,6 +48,10 @@
client.mob = O
if(mind)
mind.transfer_to(O)
+
+ del(O.stand_icon) //Force it to update.
+ del(O.lying_icon)
+
O.update_body()
O.update_face()
spawn(1)
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
index 1f80c190dd..29f4cc2b95 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/tajaran.dm
@@ -303,7 +303,12 @@
if ( istype(wear_suit, /obj/item/clothing/suit/bio_suit) || istype(wear_suit, /obj/item/clothing/suit/bomb_suit) || istype(wear_suit, /obj/item/clothing/suit/space) )
tail_shown = 0
if(tail_shown)
- overlays += image("icon" = icon('tajaran.dmi', "tail_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
+ var/icon/tail_icon = image("icon" = icon('tajaran.dmi', "tail_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
+ if (s_tone >= 0)
+ tail_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
+ else
+ tail_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
+ overlays += tail_icon
if (lying)
if (face_lying)
@@ -339,7 +344,12 @@
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)
+ var/icon/ears_icon = image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
+ if (s_tone >= 0)
+ ears_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
+ else
+ ears_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
+ overlays += ears_icon
// Belt
if (belt)
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 8aaa42b3a2..c1ad8303a4 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -1044,11 +1044,12 @@
potency = 40
On_Consume()
if(!reagents.total_volume)
- var/mob/M = usr
- var/obj/item/weapon/corncob/W = new /obj/item/weapon/corncob( M )
- M << "You chew on the corn, leaving nothing behind but a cob."
- M.put_in_hand(W)
- W.add_fingerprint(M)
+ var/mob/living/M = usr
+ if(M)
+ var/obj/item/weapon/corncob/W = new /obj/item/weapon/corncob( M )
+ M << "You chew on the corn, leaving nothing behind but a cob."
+ M.put_in_hand(W)
+ W.add_fingerprint(M)
New()
..()
reagents.add_reagent("nutriment", 1+round((potency / 10), 1))
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 7174a69624..1409642550 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -213,7 +213,8 @@
for(var/obj/effect/decal/cleanable/blood/B in T.contents)
if(!B.blood_DNA[M.dna.unique_enzymes])
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
- B.virus2 += M.virus2
+ if(!B.virus2)
+ B.virus2 = M.virus2
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
B.viruses += newDisease
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 2816b3d099..6b4b2ea12f 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -193,17 +193,19 @@
del(ghost) //Don't leave ghosts everywhere!!
if(!src.occupant.dna)
- src.occupant.dna = new /datum/dna( )
+ src.occupant.dna = new /datum/dna()
if(ui)
src.occupant.dna.uni_identity = ui
updateappearance(src.occupant, ui)
if(se)
src.occupant.dna.struc_enzymes = se
- randmutb(src.occupant) //Sometimes the clones come out wrong.
+ for(var/i = 0 to 5)
+ randmutb(src.occupant) //Sometimes the clones come out wrong.
src.occupant:update_face()
src.occupant:update_body()
src.occupant:mutantrace = mrace
src.occupant:suiciding = 0
+ occupant.brainloss = 100
src.attempting = 0
return 1
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 84a9ed1356..2e8b706008 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -217,8 +217,9 @@
if(2)
dat += "
Current records
"
dat += "Back
"
- for(var/datum/data/record/R in geneticsrecords)
- dat += "[R.fields["id"]]-[R.fields["name"]]
"
+ for(var/id in geneticsrecords)
+ var/datum/data/record/R = geneticsrecords[id]
+ dat += "[R.fields["id"]]-[R.fields["name"]]
"
if(3)
dat += "Selected Record
"
@@ -250,7 +251,7 @@
dat += {"UI: [src.active_record.fields["UI"]]
SE: [src.active_record.fields["SE"]]
"}
if(wantspod)
- dat += "Clone
"
+ dat += "Clone
"
if(4)
if (!src.active_record)
@@ -281,7 +282,7 @@
src.scanner.locked = 0
else if (href_list["view_rec"])
- src.active_record = locate(href_list["view_rec"])
+ src.active_record = geneticsrecords[href_list["view_rec"]]
if ((isnull(src.active_record.fields["ckey"])) || (src.active_record.fields["ckey"] == ""))
del(src.active_record)
src.temp = "ERROR: Record Corrupt"
@@ -299,7 +300,7 @@
var/obj/item/weapon/card/id/C = usr.equipped()
if (istype(C)||istype(C, /obj/item/device/pda))
if(src.check_access(C))
- geneticsrecords.Remove(src.active_record)
+ geneticsrecords.Remove(active_record["id"])
del(src.active_record)
src.temp = "Record deleted."
src.menu = 2
@@ -359,10 +360,11 @@
src.updateUsrDialog()
else if (href_list["clone"])
- var/datum/data/record/C = locate(href_list["clone"])
+ var/datum/data/record/C = geneticsrecords[href_list["clone"]]
//Look for that player! They better be dead!
if(C)
var/mob/selected = find_dead_player("[C.fields["ckey"]]")
+ selected << 'chime.ogg' //probably not the best sound but I think it's reasonable
var/answer = alert(selected,"Do you want to return to life?","Cloning","Yes","No")
if(answer == "No")
selected = null
@@ -371,7 +373,7 @@
src.temp = "Unable to initiate cloning cycle." // most helpful error message in THE HISTORY OF THE WORLD
else if (src.pod1.growclone(selected, C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["interface"],C.fields["changeling"],C.fields["original"]))
src.temp = "Cloning cycle activated."
- geneticsrecords.Remove(C)
+ geneticsrecords.Remove(C.fields["id"])
del(C)
src.menu = 1
@@ -438,7 +440,7 @@
if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.fields["mind"] = "\ref[subject.mind]"
- geneticsrecords += R //Save it to the global scan list.
+ geneticsrecords["[copytext(md5(subject.real_name), 2, 6)]"] = R //Save it to the global scan list.
src.temp = "Subject successfully scanned."
//Find a specific record by key.
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 144e3d8ce9..b998a79aa9 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1612,7 +1612,7 @@ About the new airlock wires panel:
name = "CentCom Secure Airlock"
desc = "I hope you have insulated gloves...."
icon = 'Doorhatchele.dmi'
- var/list/mob/morons
+ var/list/mob/morons = list()
pulse(var/wireColor)
if(prob(25))
diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm
index 2c834a06ea..5b4cb7f5c8 100644
--- a/code/game/magic/cultist/ritual.dm
+++ b/code/game/magic/cultist/ritual.dm
@@ -562,6 +562,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.word2 = w2
R.word3 = w3
R.check_icon()
+ if(!R.blood_DNA)
+ R.blood_DNA = list()
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
return
else
diff --git a/code/game/objects/biomass.dm b/code/game/objects/biomass.dm
index 1bfca36eef..f9a52da417 100644
--- a/code/game/objects/biomass.dm
+++ b/code/game/objects/biomass.dm
@@ -1,3 +1,5 @@
+//UNTICKED DUE TO BUGGY SHIT
+
/obj/effect/biomass
icon = 'biomass.dmi'
icon_state = "stage1"
diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm
index 1cbde9ffce..0c750fed26 100644
--- a/code/game/objects/devices/PDA/cart.dm
+++ b/code/game/objects/devices/PDA/cart.dm
@@ -466,7 +466,7 @@ Code:
else
for(var/obj/machinery/bot/mulebot/B in QC.botlist)
- menu += "[B] at [B.loc.loc]
"
+ menu += "[B] at [get_area(B)]
"
menu += "
Scan for active bots
"
diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm
index deaa37ee5a..807fd6296e 100644
--- a/code/modules/DetectiveWork/detective_work.dm
+++ b/code/modules/DetectiveWork/detective_work.dm
@@ -238,9 +238,8 @@ obj/machinery/computer/forensic_scanning
var/list/blood = outputs[3]
if(blood && blood.len)
temp += " Blood:
"
- for(var/j = 1, j <= blood.len, j++)
- var/list/templist2 = blood[j]
- temp += " Type: [templist2[2]], DNA: [templist2[1]]
"
+ for(var/named in blood)
+ temp += " Type: [blood[named]], DNA: [named]
"
temp += "
{Delete this Dossier}"
temp += "
{Print}"
else
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index 422bd5a5e4..4ac979182f 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -104,7 +104,7 @@ datum
on_mob_life(var/mob/living/M)
if(!data || !data["blood_type"])
..()
- else if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type))
+ else if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type) && !M.changeling)
M.adjustToxLoss(rand(0.5,1.5))
M.adjustOxyLoss(rand(1,1.5))
..()
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 77735e6ccc..ac56d023d0 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -185,9 +185,10 @@
if(W:amount >= 1)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
- W:use(1)
- user << "\blue You put in the glass lens."
- src.state = 5
+ if(W)
+ W:use(1)
+ user << "\blue You put in the glass lens."
+ src.state = 5
if(5)
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'Crowbar.ogg', 50, 1)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 48f22381d6..ffb3d985a1 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -872,7 +872,7 @@
if(E.name == "l_hand" || E.name == "l_arm")
if(hand && equipped())
drop_item()
- emote("custom v drops what they were holding, their limb malfunctioning!")
+ emote("custom v drops what they were holding, their [E] malfunctioning!")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -882,7 +882,7 @@
else if(E.name == "r_hand" || E.name == "r_arm")
if(!hand && equipped())
drop_item()
- emote("custom v drops what they were holding, their limb malfunctioning!")
+ emote("custom v drops what they were holding, their [E] malfunctioning!")
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -915,6 +915,15 @@
var/blood_volume = round(vessel.get_reagent_amount("blood"))
if(bloodloss)
drip(bloodloss)
+ else if(blood_volume < 560 && blood_volume)
+ var/datum/reagent/blood/B = locate() in vessel //Grab some blood
+ if(!B.data["donor"] == src) //If it's not theirs, then we look for theirs
+ for(var/datum/reagent/blood/D in vessel)
+ if(D.data["donor"] == src)
+ B = D
+ break
+ //At this point, we dun care which blood we are adding to, as long as they get more blood.
+ B.volume = max(min(B.volume + 560/blood_volume,560), 0) //Less blood = More blood generated per tick
if(!blood_volume)
bloodloss = 0
else if(blood_volume > 448)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index fc9d1abe9a..d5575e28ae 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -23,7 +23,7 @@
del(O.organs)
O.organs = organs
for(var/name in O.organs)
- var/datum/organ/external/organ = O[name]
+ var/datum/organ/external/organ = O.organs[name]
organ.owner = O
for(var/obj/item/weapon/implant/implant in organ.implant)
implant.imp_in = O
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 3ad116b455..6a0a57fa38 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -30,7 +30,9 @@
overlays += image('power.dmi', "cell-o1")
/obj/item/weapon/cell/proc/percent() // return % charge of cell
- return 100.0*charge/maxcharge
+ if(maxcharge)
+ return 100.0*charge/maxcharge
+ return 0
// use power from a cell
/obj/item/weapon/cell/proc/use(var/amount)