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)