From 0e11e0c04166895d4dbbf08f5f6908c935acc769 Mon Sep 17 00:00:00 2001 From: cib Date: Thu, 15 Nov 2012 17:48:13 +0100 Subject: [PATCH 01/40] Fix for issue #1947 Fire alarms now clear from computers when cancelled. --- code/game/area/areas.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 29eb5cd6763..e0e15c0ecd3 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -123,7 +123,7 @@ D.open() for (var/mob/living/silicon/ai/aiPlayer in player_list) aiPlayer.cancelAlarm("Fire", src, src) - for (var/obj/machinery/computer/station_alert/a in player_list) + for (var/obj/machinery/computer/station_alert/a in world) a.cancelAlarm("Fire", src, src) return From 1213a50298ec1a3883e78fbdd51af4d261c64b0e Mon Sep 17 00:00:00 2001 From: cib Date: Thu, 15 Nov 2012 18:09:33 +0100 Subject: [PATCH 02/40] Removed alien player limit. I don't want to know what will happen now, considering medbay *already* was more than 50% non-humans most of the time. --- code/modules/mob/new_player/new_player.dm | 54 +---------------------- 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 1d7a7705ec4..4c35e671d04 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -147,24 +147,7 @@ return 1 if(href_list["ready"]) - var/num_old_slots = GetAvailableAlienPlayerSlots() - var/new_slots = num_old_slots - if(!ready) - if(num_old_slots >= 1 || preferences.species == "Human") - ready = 1 - new_slots = GetAvailableAlienPlayerSlots() - else - src << "\red Unable to declare ready. Too many players have already elected to play as aliens." - else - ready = 0 - new_slots = GetAvailableAlienPlayerSlots() - - if(num_old_slots < 1 && new_slots >= 1) - for(var/mob/new_player/N in world) - N << "\blue A new alien player slot has opened." - else if(num_old_slots >= 1 && new_slots < 1) - for(var/mob/new_player/N in world) - N << "\red New alien players can no longer enter the game." + ready = !ready if(href_list["refresh"]) src << browse(null, "window=playersetup") //closes the player setup window @@ -205,9 +188,6 @@ if(!is_alien_whitelisted(src, preferences.species) && config.usealienwhitelist) src << alert("You are currently not whitelisted to play [preferences.species].") return 0 - else if(GetAvailableAlienPlayerSlots() < 1) - src << "\red Unable to join game. Too many players have already joined as aliens." - return 0 LateChoices() @@ -356,15 +336,10 @@ src << alert("[rank] is not available. Please try another.") return 0 - var/num_old_slots = GetAvailableAlienPlayerSlots() - var/new_slots = num_old_slots if(preferences.species != "Human") if(!is_alien_whitelisted(src, preferences.species) && config.usealienwhitelist) src << alert("You are currently not whitelisted to play [preferences.species].") return 0 - else if(num_old_slots < 1) - src << "\red Unable to join game. Too many players have already joined as aliens." - return 0 job_master.AssignRole(src, rank, 1) @@ -384,14 +359,6 @@ ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn AnnounceArrival(character, rank) - new_slots = GetAvailableAlienPlayerSlots() - if(num_old_slots < 1 && new_slots >= 1) - for(var/mob/new_player/N in world) - N << "\blue A new alien player slot has opened." - else if(num_old_slots >= 1 && new_slots < 1) - for(var/mob/new_player/N in world) - N << "\red New alien players can no longer enter the game." - else character.Robotize() del(src) @@ -492,22 +459,3 @@ proc/close_spawn_windows() src << browse(null, "window=latechoices") //closes late choices window src << browse(null, "window=playersetup") //closes the player setup window - -//limits the number of alien players in a game -/proc/GetAvailableAlienPlayerSlots() - if(!config.limitalienplayers) - return 9999 - - var/num_players = 0 - - //check new players - for(var/mob/new_player/N in world) - if(N.preferences && N.ready) - num_players++ - - //check players already spawned, only count humans or aliens - for(var/mob/living/carbon/human/H in world) - if(H.ckey) - num_players++ - - return round(num_players * (config.alien_to_human_ratio / 100)) From 866a113494f37ac128f7b686fd8c8ea06b160958 Mon Sep 17 00:00:00 2001 From: cib Date: Thu, 15 Nov 2012 18:40:24 +0100 Subject: [PATCH 03/40] Fixes for issue #1872 --- code/game/sound.dm | 12 +++++++++++- code/modules/mob/emote.dm | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index 35d80594ac8..f943b9947e1 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -19,7 +19,7 @@ if (vary) S.frequency = rand(32000, 55000) - for (var/mob/M in range(world.view+extrarange, source)) // Plays for people in range. + for (var/mob/M in range(world.view+extrarange, source)) // Plays for people in range. if(locate(/mob/, M)) var/mob/M2 = locate(/mob/, M) if (M2.client) @@ -48,6 +48,16 @@ S.pan = max(-100, min(100, dx/8.0 * 100)) M << S + + for(var/obj/mecha/mech in range(world.view+extrarange, source)) + var/mob/M = mech.occupant + if (M && M.client) + if(M.ear_deaf <= 0 || !M.ear_deaf) + if(isturf(source)) + var/dx = source.x - M.x + S.pan = max(-100, min(100, dx/8.0 * 100)) + + M << S // Now plays for people in lockers! -- Polymorph /mob/proc/playsound_local(var/atom/source, soundin, vol as num, vary, extrarange as num) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 783f3404e85..9b4c459264b 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -31,13 +31,13 @@ mob/proc/custom_emote(var/m_type=1,var/message = null) if (istype(M, /mob/new_player)) continue if(findtext(message," snores.")) //Because we have so many sleeping people. - continue + break // can break here simply.. if(M.stat == 2 && M.client.ghost_sight && !(M in viewers(src,null))) M.show_message(message) if (m_type & 1) - for (var/mob/O in viewers(src, null)) + for (var/mob/O in get_mobs_in_view(world.view,src)) if(istype(O,/mob/living/carbon/human)) for(var/mob/living/parasite/P in O:parasites) P.show_message(message, m_type) From b6f16cb62a2a7439fdc1e8dbc6524bedd367a777 Mon Sep 17 00:00:00 2001 From: cib Date: Thu, 15 Nov 2012 19:07:45 +0100 Subject: [PATCH 04/40] Fix for the emote fix. --- code/modules/mob/emote.dm | 4 ++-- code/modules/mob/living/carbon/human/emote.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 9b4c459264b..4b6e4e17539 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -31,13 +31,13 @@ mob/proc/custom_emote(var/m_type=1,var/message = null) if (istype(M, /mob/new_player)) continue if(findtext(message," snores.")) //Because we have so many sleeping people. - break // can break here simply.. + break if(M.stat == 2 && M.client.ghost_sight && !(M in viewers(src,null))) M.show_message(message) if (m_type & 1) - for (var/mob/O in get_mobs_in_view(world.view,src)) + for (var/mob/O in viewers(src, null)) if(istype(O,/mob/living/carbon/human)) for(var/mob/living/parasite/P in O:parasites) P.show_message(message, m_type) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index f0407f0ec3f..6dff94c60c3 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -482,9 +482,9 @@ if (m_type & 1) - for (var/mob/O in viewers(src, null)) + for (var/mob/O in get_mobs_in_view(world.view,src)) O.show_message(message, m_type) else if (m_type & 2) - for (var/mob/O in hearers(src.loc, null)) + for (var/mob/O in (hearers(src.loc, null) | get_mobs_in_view(world.view,src))) O.show_message(message, m_type) From 7b7a200155a768fbe27059ed9d56ace70fddb7d8 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Fri, 16 Nov 2012 18:53:03 +1000 Subject: [PATCH 05/40] added nullcheck to ZAS func, fix for severed powernets still being connected Signed-off-by: Cael_Aislinn --- code/ZAS/FEA_system.dm | 4 ++++ code/modules/power/power.dm | 2 ++ 2 files changed, 6 insertions(+) diff --git a/code/ZAS/FEA_system.dm b/code/ZAS/FEA_system.dm index 4434d9d2d40..11f48bfdb93 100644 --- a/code/ZAS/FEA_system.dm +++ b/code/ZAS/FEA_system.dm @@ -277,6 +277,10 @@ datum proc/ConsiderRebuild(var/turf/simulated/T, var/turf/NT) + //zones should naturally spread to these tiles eventually + if(!T.zone || !NT.zone) + return + if(istype(NT, /turf/simulated) && NT.zone != T.zone) T.zone.RemoveTurf(NT) if(NT.zone) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 8fff49211e6..c5447698f18 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -119,6 +119,8 @@ if(!unmarked || !C.powernet) if(C.d1 == fdir || C.d2 == fdir) . += C + else if(C.d1 == turn(C.d2, 180)) + . += C return . From 46bd2ce7e6b7ec27a0ded3222eff430135de8b18 Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 15:19:20 +0400 Subject: [PATCH 06/40] human icon generation update, tajarnan darkseeing *lying icon generated from standing one *sprites for dismembering major races (tajarnan,skrell,soghun) *tajarnans can see in darkness better than others --- code/datums/datacore.dm | 34 +-- code/defines/procs/icon_procs.dm | 10 + code/game/dna.dm | 20 +- code/modules/mob/living/carbon/human/human.dm | 23 ++- code/modules/mob/living/carbon/human/life.dm | 6 +- .../mob/living/carbon/human/update_icons.dm | 194 ++++++++++-------- icons/mob/human_races/r_human.dmi | Bin 0 -> 8316 bytes icons/mob/human_races/r_lizard.dmi | Bin 0 -> 5698 bytes icons/mob/human_races/r_skeleton.dmi | Bin 0 -> 2221 bytes icons/mob/human_races/r_skrell.dmi | Bin 0 -> 1873 bytes icons/mob/human_races/r_tajaran.dmi | Bin 0 -> 9309 bytes 11 files changed, 177 insertions(+), 110 deletions(-) create mode 100644 icons/mob/human_races/r_human.dmi create mode 100644 icons/mob/human_races/r_lizard.dmi create mode 100644 icons/mob/human_races/r_skeleton.dmi create mode 100644 icons/mob/human_races/r_skrell.dmi create mode 100644 icons/mob/human_races/r_tajaran.dmi diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 7358096104d..2522523e4d7 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -111,29 +111,31 @@ proc/get_id_photo(var/mob/living/carbon/human/H) var/g = "m" if (H.gender == FEMALE) g = "f" + + var/icon/icobase switch(H.get_species()) if("Tajaran") - preview_icon = new /icon('icons/effects/species.dmi', "tajaran_[g]_s") - preview_icon.Blend(new /icon('icons/effects/species.dmi', "tajtail_s"), ICON_OVERLAY) + icobase = 'icons/mob/human_races/r_tajaran.dmi' if( "Soghun") - preview_icon = new /icon('icons/effects/species.dmi', "lizard_[g]_s") - preview_icon.Blend(new /icon('icons/effects/species.dmi', "sogtail_s"), ICON_OVERLAY) + icobase = 'icons/mob/human_races/r_lizard.dmi' if("Skrell") - preview_icon = new /icon('icons/effects/species.dmi', "skrell_[g]_s") + icobase = 'icons/mob/human_races/r_skrell.dmi' else - preview_icon = new /icon('human.dmi', "torso_[g]_s") - preview_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY) - preview_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) - preview_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY) + icobase = 'icons/mob/human_races/r_human.dmi' - for(var/datum/organ/external/E in H.organs) - if(E.status & ORGAN_CUT_AWAY) continue + preview_icon = new /icon(icobase, "torso_[g]") + var/icon/temp + temp = new /icon(icobase, "groin_[g]") + preview_icon.Blend(temp, ICON_OVERLAY) + temp = new /icon(icobase, "head_[g]") + preview_icon.Blend(temp, ICON_OVERLAY) - var/icon/temp = new /icon('human.dmi', "[E.name]_s") - if(E.status & ORGAN_ROBOT) - temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - - preview_icon.Blend(temp, ICON_OVERLAY) + for(var/datum/organ/external/E in H.organs) + if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue + temp = new /icon(icobase, "[E.name]") + if(E.status & ORGAN_ROBOT) + temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + preview_icon.Blend(temp, ICON_OVERLAY) // Skin tone if(H.get_species() == "Human") diff --git a/code/defines/procs/icon_procs.dm b/code/defines/procs/icon_procs.dm index c8d731bcde1..ce56408ead4 100644 --- a/code/defines/procs/icon_procs.dm +++ b/code/defines/procs/icon_procs.dm @@ -7,6 +7,16 @@ #define TO_HEX_DIGIT(n) ascii2text((n&15) + ((n&15)<10 ? 48 : 87)) icon + proc/MakeLying() + var/icon/I = new(src,dir=SOUTH) + I.BecomeLying() + return I + + proc/BecomeLying() + Turn(90) + Shift(SOUTH,6) + Shift(EAST,1) + // Multiply all alpha values by this float proc/ChangeOpacity(opacity = 1.0) MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,opacity, 0,0,0,0) diff --git a/code/game/dna.dm b/code/game/dna.dm index d4628e6f9a7..80a250620f0 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -399,9 +399,17 @@ var/old_mutations = M.mutations M.mutations = list() - M.see_in_dark = 2 - M.see_invisible = 0 +// M.see_in_dark = 2 +// M.see_invisible = 0 + if(PLANT in old_mutations) + M.mutations.Add(PLANT) + if(SKELETON in old_mutations) + M.mutations.Add(SKELETON) + if(FAT in old_mutations) + M.mutations.Add(FAT) + if(HUSK in old_mutations) + M.mutations.Add(HUSK) if(ismuton(NOBREATHBLOCK,M)) if(probinj(45,inj) || (mNobreath in old_mutations)) @@ -478,9 +486,9 @@ if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK)) if(probinj(30,inj) || (XRAY in old_mutations)) M << "\blue The walls suddenly disappear." - M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) - M.see_in_dark = 8 - M.see_invisible = 2 +// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) +// M.see_in_dark = 8 +// M.see_invisible = 2 M.mutations.Add(XRAY) if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK)) M.disabilities |= NERVOUS @@ -1648,4 +1656,4 @@ src.add_fingerprint(usr) src.updateUsrDialog() return -/////////////////////////// DNA MACHINES \ No newline at end of file +/////////////////////////// DNA MACHINES diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a8f55c066f8..d164c4fb9d9 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -821,6 +821,12 @@ /mob/living/carbon/human/proc/morph() set name = "Morph" set category = "Superpower" + + if(stat!=CONSCIOUS) + reset_view(0) + remoteview_target = null + return + if(!(mMorph in mutations)) src.verbs -= /mob/living/carbon/human/proc/morph return @@ -894,6 +900,12 @@ /mob/living/carbon/human/proc/remotesay() set name = "Project mind" set category = "Superpower" + + if(stat!=CONSCIOUS) + reset_view(0) + remoteview_target = null + return + if(!(mRemotetalk in src.mutations)) src.verbs -= /mob/living/carbon/human/proc/remotesay return @@ -917,12 +929,19 @@ set name = "Remote View" set category = "Superpower" + if(stat!=CONSCIOUS) + remoteview_target = null + reset_view(0) + return + if(!(mRemote in src.mutations)) + remoteview_target = null reset_view(0) src.verbs -= /mob/living/carbon/human/proc/remoteobserve return if(client.eye != client.mob) + remoteview_target = null reset_view(0) return @@ -930,15 +949,17 @@ for(var/mob/living/carbon/h in world) var/turf/temp_turf = get_turf(h) - if(temp_turf.z != 1 && temp_turf.z != 5) //Not on mining or the station. + if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat==DEAD) //Not on mining or the station. Or dead continue creatures += h var/mob/target = input ("Who do you want to project your mind to ?") as mob in creatures if (target) + remoteview_target = target reset_view(target) else + remoteview_target = null reset_view(0) /mob/living/carbon/human/proc/get_visible_gender() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 92522f701be..6908d550ae4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1295,9 +1295,13 @@ sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) if(dna) switch(dna.mutantrace) - if("lizard","metroid") + if("metroid") see_in_dark = 3 see_invisible = SEE_INVISIBLE_LEVEL_ONE + if("lizard") + see_in_dark = 3 + if("tajaran") + see_in_dark = 5 else see_in_dark = 2 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 13c2a87ac08..5de8d28fd18 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -218,107 +218,127 @@ proc/get_damage_icon_part(damage_state, body_part) /mob/living/carbon/human/proc/update_body(var/update_icons=1) if(stand_icon) del(stand_icon) if(lying_icon) del(lying_icon) - if(dna && dna.mutantrace) return + + var/husk_color_mod = rgb(96,88,80) + var/hulk_color_mod = rgb(24,72,24) + var/plant_color_mod = rgb(144,224,144) var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete var/fat = (FAT in src.mutations) + var/hulk = (HULK in src.mutations) var/skeleton = (SKELETON in src.mutations) + var/plant = (PLANT in src.mutations) var/g = "m" if(gender == FEMALE) g = "f" - // whether to draw the individual limbs - var/individual_limbs = 0 - - //Base mob icon - if(husk) - stand_icon = new /icon('icons/mob/human.dmi', "husk_s") - lying_icon = new /icon('icons/mob/human.dmi', "husk_l") - else if(fat) - stand_icon = new /icon('icons/mob/human.dmi', "fatbody_s") - lying_icon = new /icon('icons/mob/human.dmi', "fatbody_l") - else if(skeleton) - stand_icon = new /icon('icons/mob/human.dmi', "skeleton_s") - lying_icon = new /icon('icons/mob/human.dmi', "skeleton_l") + var/icon/icobase + if(skeleton) + icobase = 'icons/mob/human_races/r_skeleton.dmi' + else if(dna) + switch(dna.mutantrace) + if("tajaran") + icobase = 'icons/mob/human_races/r_tajaran.dmi' + if("lizard") + icobase = 'icons/mob/human_races/r_lizard.dmi' + if("skrell") + icobase = 'icons/mob/human_races/r_skrell.dmi' + else + icobase = 'icons/mob/human_races/r_human.dmi' else - stand_icon = new /icon('icons/mob/human.dmi', "torso_[g]_s") - lying_icon = new /icon('icons/mob/human.dmi', "torso_[g]_l") - individual_limbs = 1 + icobase = 'icons/mob/human_races/r_human.dmi' - // Draw each individual limb - if(individual_limbs) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_l"), ICON_OVERLAY) + if(!skeleton) + stand_icon = new /icon(icobase, "torso_[g][fat?"_fat":""]") + if(husk) + stand_icon.ColorTone(husk_color_mod) + else if(hulk) + stand_icon.ColorTone(hulk_color_mod) + else if(plant) + stand_icon.ColorTone(plant_color_mod) + else + stand_icon = new /icon(icobase, "torso") - var/datum/organ/external/head = get_organ("head") - if(head && !(head.status & ORGAN_DESTROYED)) - stand_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_l"), ICON_OVERLAY) + var/datum/organ/external/head = get_organ("head") + var/has_head = 0 + if(head && !(head.status & ORGAN_DESTROYED)) + has_head = 1 - for(var/datum/organ/external/part in organs) - if(!istype(part, /datum/organ/external/groin) \ - && !istype(part, /datum/organ/external/chest) \ - && !istype(part, /datum/organ/external/head) \ - && !(part.status & ORGAN_DESTROYED)) - var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s") - if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + for(var/datum/organ/external/part in organs) + if(!istype(part, /datum/organ/external/chest) && !(part.status & ORGAN_DESTROYED)) + var/icon/temp + if(istype(part, /datum/organ/external/groin)) + if(skeleton) + temp = new /icon(icobase, "groin") + else + temp = new /icon(icobase, "groin_[g]") + else if(istype(part, /datum/organ/external/head)) + if(skeleton) + temp = new /icon(icobase, "head") + else + temp = new /icon(icobase, "head_[g]") + else + temp = new /icon(icobase, "[part.icon_name]") + if(part.status & ORGAN_ROBOT) + temp.GrayScale() + else if(!skeleton) + if(husk) + temp.ColorTone(husk_color_mod) + else if(hulk) + temp.ColorTone(hulk_color_mod) + else if(plant) + temp.ColorTone(plant_color_mod) + + if(part.icon_position&(LEFT|RIGHT)) + var/icon/temp2 = new('icons/mob/human.dmi',"blank") + temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) + temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) + if(!(part.icon_position & LEFT)) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(!(part.icon_position & RIGHT)) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + stand_icon.Blend(temp2, ICON_OVERLAY) + temp2 = new('icons/mob/human.dmi',"blank") + if(part.icon_position & LEFT) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(part.icon_position & RIGHT) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + stand_icon.Blend(temp2, ICON_UNDERLAY) + else stand_icon.Blend(temp, ICON_OVERLAY) - temp = new /icon('human.dmi', "[part.icon_name]_l") - if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - lying_icon.Blend(temp , ICON_OVERLAY) - - stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY) - - if (husk) - var/icon/husk_s = new /icon('human.dmi', "husk_s") - var/icon/husk_l = new /icon('human.dmi', "husk_l") - - for(var/datum/organ/external/part in organs) - if(!istype(part, /datum/organ/external/groin) \ - && !istype(part, /datum/organ/external/chest) \ - && !istype(part, /datum/organ/external/head) \ - && (part.status & ORGAN_DESTROYED)) - husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT) - husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT) - - stand_icon.Blend(husk_s, ICON_OVERLAY) - lying_icon.Blend(husk_l, ICON_OVERLAY) //Skin tone - if(!skeleton) + if(!skeleton && !husk && !hulk && !plant) if(s_tone >= 0) stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - lying_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) else stand_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - lying_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - //Eyes - if(!skeleton) - var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s") - var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - stand_icon.Blend(eyes_s, ICON_OVERLAY) - lying_icon.Blend(eyes_l, ICON_OVERLAY) - // Note: These used to be in update_face(), and the fact they're here will make it difficult to create a disembodied head - var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s") - var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l") - eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - stand_icon.Blend(eyes_s, ICON_OVERLAY) - lying_icon.Blend(eyes_l, ICON_OVERLAY) + if(husk) + var/icon/mask = new(stand_icon) + var/icon/husk_over = new(icobase,"overlay_husk") + mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) + husk_over.Blend(mask, ICON_ADD) + stand_icon.Blend(husk_over, ICON_OVERLAY) + + if(has_head) + //Eyes + if(!skeleton) + var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s") + eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + stand_icon.Blend(eyes_s, ICON_OVERLAY) //Mouth (lipstick!) if(lip_style) //skeletons are allowed to wear lipstick no matter what you think, agouri. stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY) - lying_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY) //Underwear if(underwear >0 && underwear < 12) if(!fat && !skeleton) stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY) + + lying_icon = stand_icon.MakeLying() + if(update_icons) update_icons() @@ -417,27 +437,29 @@ proc/get_damage_icon_part(damage_state, body_part) var/fat if( FAT in mutations ) fat = "fat" - var/g = "m" - if (gender == FEMALE) g = "f" +// var/g = "m" +// if (gender == FEMALE) g = "f" //BS12 EDIT if(dna) switch(dna.mutantrace) if("golem","metroid") - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_l") - overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_s") - if("lizard", "tajaran", "skrell") - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_l") - overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_s") - if("plant") - if(stat == DEAD) //TODO - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d") - else - overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l") - overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s") + var/icon/I = new('icons/effects/genetics.dmi',"[dna.mutantrace][fat]_s") + overlays_standing[MUTANTRACE_LAYER] = image(I) + overlays_lying[MUTANTRACE_LAYER] = image(I.MakeLying()) +// if("lizard", "tajaran", "skrell") +// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_l") +// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_s") +// if("plant") +// if(stat == DEAD) //TODO +// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d") +// else +// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l") +// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s") else overlays_lying[MUTANTRACE_LAYER] = null overlays_standing[MUTANTRACE_LAYER] = null - update_body(0) + if(!dna || !(dna.mutantrace in list("golem","metroid"))) + update_body(0) update_hair(0) if(update_icons) update_icons() diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3fec1061f6478eacfe9f7fbc006b74f38acc4d4a GIT binary patch literal 8316 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 literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi new file mode 100644 index 0000000000000000000000000000000000000000..70d29e573eb76229f2d7e739005e086b2cbea5d6 GIT binary patch literal 5698 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 N40Nt(zrSQ3^FJxv#Q6XK literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/r_skeleton.dmi b/icons/mob/human_races/r_skeleton.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cbf854161d9918c83fe3689728227c9d1ab417cd GIT binary patch literal 2221 zcmbtWc{JNu8%{82EQ1kL6)n>u*0wXKwDu*fp+c!+iBi9)iY`Kt=1Ynhrb-npa~P?j zwI}4nGNg3c(b^JA5s5vW#M;nIg4(|HkNLjud^0_#=gc4XKIc96-uJ%ed7iucc+SgR z38D=Ffj~+K4;Q2aXFfK0SxK*L7CkEgQnKF#tV?8E#Er|>u$QmKfJe44M>IYg4P8bD0i$)tac0-v)5e**SXm;^* z4@cydy^f_Nxb4provGVBZ`?u(xLX*YMAzDsHO>0LEs}fmH3%fvjc{@FODtZQw93?p z)OoeGmu4`bR_2wTrbIx|N}^6}lg>YG)P0Xg0cI z!W1^`ZiULzcYHZ}$`K1tifM0c|Bq>ES4yg4?y=ZxbNu9#h0=g+K$0M$?`tgqo~-vx zoB3O@_w_xyyA}SO-IsFTlzB%BSBeHW9nAHkXh(3Vl1K(Q%y;MJI31*lL@e^dwfpKs zWp79DAt{+Oc@>qz4h|Whe;62f5E-r2MiBEKq;!xJs3kMbz-i`MiVSO=DUf6TYV{vR zp4WfL8oeHduj1xsALo?B`KX^S;Uh44g-)@1O@dxSe+K~`iN4U=*cTo=1{Z&em_1#| z*NWc434-vCmTnQJaJ@o!6>PYR{w&uYAS=HHfliyB*Zx`D6uo{|oGE0sP|T;mj~TMYd_HQ498 zK^}3|n{Y!wfzkjhpr{ z=?%;Feu9|ZO8$k1kxj}G3EvfQ9@p4Y1F57U38zjv(*JWB2Zqp&x6OY#1=AKPVlm>1 zobF4F?>B0R9*pg?YInwnLU{9sn(n1snGD09ZR2>I>wc>GxmZ5qXX$C*->md=Pv9oT ze!tn>t|&-z%>Ct>+7V`)aLW4RzC5hN_-7i{+AN=aK$Au)TFZ}AfeMnU2YK0+xF#4= zxWl2ZZxLeON41#pgMX*nTc)$XeN&pE;EdJPT-$xV)3Z}J;gn!{JTedvVW@lcS!Pu}H zCg(S>d*gFZ%Tbd~2urWKmIwgcHJcjLcCB*|HYiAvN;dVjl5DCpY-StNK#_W4(F&zx z$Jprjiy$_*APy{y{=)2}g67gC8CV#>P;_!85zYVzTP)jv{^?QPhNQq3v#XsO!e*N7 z?&HmuI)c5fcRlVdgG#VSPaJ-KZrscln(a}d>A-v4NgaP==TpZM^yCn z^RdK5_Yl#B2Wkjh-=-z_1#wZ?`0Qe&{G+RX=WlH}R>cwxTot(4&oU;cK?k5Pxz`*D zk(av_Up~;(+&tpjsm(Q1{PVKS$_6`!7?{x-ZlCiH1v`ftm{l~~&hdv(l*2|hh5S^{ zsQtnS)k8?=vX&(;o{j7{qH`|DxN|e2o<+)OkAi1Q-+$~TNUI{<>G}{h!QOs)>?=Lw z$h>J(hJt$iV`cncgHcYd8@PJ<%buR}H)~GtKR5myKeGwP5(?miD}t?N?I~@+F5-GIf$;@xC*wKapyTk{pK@~i=1JnF>aSfOxt zW1_DXV)c$K$J)qNNJO(pN5l)7LhTyhzkX!~y%VAp2m;w1gLu{|5-+>g7`J6qfRD>;A?s literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi new file mode 100644 index 0000000000000000000000000000000000000000..daf33ee223e48d80e0e53cc9d06ba8ca6e8b2016 GIT binary patch literal 1873 zcmZ8hX;_kp7XAoaP;eZ#QmpJz$ficA9JNIyTuR3+#j?@TqFhtlDpXY5MsX>Z)Uqhe zOdBjN5T(_SQIaCX*#bl+gP`R>%4lCtdEO`>oClhfl;E^h^LauMN=YbOZu% zdLQs-ql5Y1OhX)O9RbYDfX7Z!6^3&TF}o3r5AqHO@h12K0P%5Z_bHiXGz{Pj8pm6% zcJqb`wc=nM$|=mdez|5EZ+~u#pnA;VN^N3__7`91ul_34I}#?WR08XKdDi*1QK{TL zqpNjZJHDn#ScyD(hIXR#9JnJ(31#n^{Cp48<1IVkX|8ipWdaMGTk${>maJnpI`Uz_ zpLVxG{cQTa9~BE!labF8Q+_qLNbhk$yIy#bBrHS`eZ`4uQMDHqI3zJ2oa0&>Eolee z;V<#Z((DY5_;`UD5k8DkVo9j@a`lv74A$59FFdAC1yV_3f#aaRFR;tn`66`K6Jg$9qnvlC}n&`~saGtP@nC4e zvZ{04ONBIwNy}4(5h!$zKxN(1im5lMH*3y0jU?)W7I|QWG{XGHDn;a&;kHJUA@Q)5 z`?)RBLTeZXwT+H4)K^TiVRF!pL{<4Hf1`hJ|Hn*SLVHo#lec1!H{#81`#I>-Pu(TB z-QP6DzS~G#7xyX4Hs}d&vLJaHy9*aDhc{qb9_AG4CSYx?m=!NlLbKf9RY9*2S!+PJ z60fox^#!E!l+1?xrm2OyVpC$-VyGc|B7CJiSqDfJ{!9N z-I?RRno1v-ns;1xvT%$TO^zc*4d3Sn2C7N=lNW(?9qOUKx(t?#wJe6G@uiU-vq{#4 z{g|f8cRBV(R$glEx&Z0&LxQS?Tw@uNXRzQ4p{f}Dx%+!=g&j#`&gwYKr3w18Bo~Y>ZaX|W$S*p;1iDzFgVkng4n{1+-q&J@VZ`m*7z-(wY= zj@w?=tq_cskG(`Cd*Z#1p*m}QzTRmvmJb@$`Zmp2QHCV=&2s6rK}p=|I(plw;vTXDiz70*2ZS? zGiA%m%XsQx(sS6E#;T}Gn^z)@!epZiI5CpA-hOz?9G`ikpyF&^b!2)pBR`shSl3Wp z=OCo<3h1IpO7uN339?(xbS~vK#QI>QLw{dC+;w$&X?3;amH0@kEA>1cqXX`^df$k_z=^au z1ir4FVJ6M8_qtSIF*1ie{-mm{_u}l3L`Xn&iBoZz33P}=@(_O6_-B=~N!2kg^3*SA zYnPYY^WY+<1_-QxN2psrjLnKUS2^hDkEM`Afb4dg=d~lqABKR3|w3V)QEaMT{A&*Yft=5q7p^530FyDAkyw#;oMLw>lIzFakZK`d_*x#_lWQzI>ATm8+L zP|(T$Yl7c84Q0f(4*nc^l2kJ+ToC!+IheyMny2BO*e?|nmLH2m!2S8GrOPb^sFoal zC1gw{iz3>+GG+`OU<@^w*ND%)9yyM2^zpy0*l7&LBVNxz+_Sf!+xQ0)nxxjfc>}}q rsm?*m39emDn&WR+cKGdvV*=f5i(b&vTE_~?`; literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi new file mode 100644 index 0000000000000000000000000000000000000000..def8ba83d27f225f199cb83902fa82c0289713b2 GIT binary patch literal 9309 zcmcI~byQSQyZ51yE@>DPC8R?^NdW=r?vh4nq-zLi1eBHrQIYNrk&dCe5$T2jW*GPm z?|biB-(BnGy6gTiGjPs6yPp00;+ct5Q;{RYqs0RNfbg}vj0OOpF@Y}t7aP1n&hxVt z{P^XgrT1RO%FV*n&iTEalOq6lWyFq%;dSy7V6DuGe~^cdWfz+$NcF`Vb>MRL6uu^? z{4zH0DW9wPL$;%5{PWv-kGgB+CJ-SHs5mR+j!M%AtMo-Y*&ZH40s1;O;?l&Z5%ioD7+YbN2f$QzMdo zKflL4vv?clcTz03eelW>BbR)FAXH_9-{H4FtG(ABB#)7_Q0)j&O8~}au`xIysa662 zFafV+UTS$|>@T{!r_c`OJ}PT`K*k;%DJ;gq@~NB2j7*-t8!9!IvvvuHPu(S8OwTj?jqYIX%sm)mhk9FFpC2DqKSo2 zfnrEP!4hP#Zu_@nqlmV9Q{Tnz`h)Emf2ZjZ1Y)YB$WX!1kS-#^vb?VpAXPRcV0!o| z3{6I6j29XqPm4`L`nnT%_|T48QsxmMMnpux8-O%H@U9Wd0dV4z?k>P#p7{R9WGuZ3D|WDqdcM;!zXKjAg|mSnqdzq@ZNaI zcY;kSe|{=|?JG%>_C);RJh!=4r6NyCQ`^Mwo8Q5%z&=WV--hmnFp!&cV7b>SQDrxq zlO}Dap$T7B#xjiNGm3cDTjj9`%TS1ol_Px<FH`v1!jCyfm1SZ&?9e1+TVDiS=`PxO0WMTA5ySHMmo6ul0J1AyR|wI9);`^$ zdJ#DD6%4z3*|*t5{^8#{C!gM&oe;w>cEEPYJiC^CdaS|V!f!jd7pGfzxRTYM@QFgv zLugePA%NLUKd;R&y}+`Gk9S{h11~G$R4b*;3)Q!dflKgKvpDT(y-Gm}jcnT+m1I0X z*k!ML)QJ!nb*5uPkmaiN{>ylzmk*)OJC~{90eK9snhIag?EWr>LfW_8$Cbc2G^Vdh z+G)F=HI#l78$l2FlftPx$bD-sw!0^4^J{~{!NEbZXhi0>kd3!PCOiJ`y$e-OS#AjT zZl8WjjNc;itZSf5&cowba0k=U@xac=Z1Pw#IO-2O;54wgcCczumo>PvQb1Gc(9O*1HNFUk>0)i+jRTi1m}O) zlYpfz)8b|0#Wt9AU$rMkHydBTCGjs4Oe>A}ny$?P%K{49tTvx3^JMqRYwn<3fi3Ui z?%`2;a4wkb(#e|+X19%v&2FCG&wecE^{0&}$|GiK0(2m_Bgbm>^V>p0q_5b}UDy?; z>%6d#zFZC%`Hv`qug=;=7?QqTUcI-yaC4WW0m%FQH`+plgH*$_K3%e>KI!MtC;0ho(e7o3 zW^x+yL1R->)_NPgv>i7l{y7)M6eZ2CpN}mS!Q4zb7J2Z!#D;uU$BJw(sle+9eyV-q zM-cQ#vIl~bM`*&>iOH3x844a*yg&kUO=o^0Y@Fk>H- z*mJF9kL}V($|O>7t@LcRwzBWT`JfSO?6P}zpYpVfSj-RYW-$I;Sp7eUbGjP~^cv!^ z4Fa>HH4XUAxOe!ph9Ga-QkI_w#PIW9U$uemrHp{0i%6BJ9;dcESc_$@)dm=t^F7gT z8`q6q>gT0FUU9?_4no5ZED04h!jJbjZw$|FVglr1BHuRzp(fGR7qX=c3f2evc^ zUgP=fn9uJ4EbOPiYEt~7)4Rw;UQ!^B%W^7+jRrhzk*L5=avpTO+}UG>b8%>->IjXw zxjD<}AX|+!`Z91OAQJF`5UF8ax4dgN<;FeOv7ksPMNcExWU{7p$1M736(+uRU$Q=b z&2zS!Obj>s^ny5|SD|8)0Znox8v1+A&#+!RJi+Y^5!Bg#h$s~1@2}=YPcqOI#UJE+ zsa4$Us3cYxj3#6E(r+C9#|RSb*ZC1hgdEc9iO&Pl^tyU${|U!0ZT~AKRoCG5XgHe* zEcx@1T{B5d95C8*W#<=1*1yZ5%ZaV({1`{)B6XYdBsY*ws&VAefl7jlld zS63g{jJ5H#wR7!g8{s~A)0k=AkuvsI730td{D(u_619wZMAJ9f%jiI@NQ(XoR!`|e z5dbPQwfJr}!^pZ?0wZFLOoXO2eZ9TcTi;oj{s@UG4-})$OdTvHd~=QU!^RwbJyWro zk9Do5?u-9IM8xI&Z8jHSPH;b+nvPCboha96V=9f5b&Z5)hph%xlaUWN0Jy)SS#tXN zG_G!L>N+~uz-ZgkvsR1C`jN_#*iolzJ@TP$z543@YGeKiQk|tXw32f|@R_ZhnUKm# zehRH6v%XlokJWXuo!@?15KqwK80^xidEa6iC7Rmy+d!6YKp3-_YpX7Lu?^pxJfaXf zj+HR6(|!u9aH--0W&+T8Le7g$V`Oek4SU3Cmc2DxhM(WY!tKxI<8#8)<54*PnwR&G zp6}-f^=x!X{`c>=l3oqj2IW8rF3;)Hv?^sTL;OqF3yi``Dft4_EJogI2U)Kei{q2s z(a8!{gdYfoXPY3$=rv#a*n4t!?mIYyVM8gs+xq@yPoW18oVC8Q93^kG+w|acLa@Vc z5q(=HYTEaS!mq~1U(geMFT!JL9=y0kyuQ2bIM=XP&HoA+{e>?AR%|zyx-8fFBEcCc z0JYUH|8U|z^5J?wk(2;?v~~A6#r^xa{?l%_*de`b%@nP~jY=gwAc5KtJOGgi{DaNF z`}2==-cD&#b1!*mHVP@(zxK9h5+LBq2+4BTrc-hYtjK}aLZu!M5Zh5RBE}L=WRN(m zxF8?!i59#Zuij!hJBr8VT2XzQCyY(f^%WFJeZy`~#L5n(V7pD_W?cr~i=wbNrldqu zGB>pb7f@-OMuS8Ure^%)gdehjR2c0cAtAyOaJj1Jp4?gqb7$ux!zO7E%=wiTu%aEN zW0aoG;cIHU51zDyA}R+zRy zw|GOqq%d>+(^2d1U>b(nr=NRp;=$;i?9v@E ze;&Bt_CZX5b2lasj|TKKmd&5ch@FSeH8Bj-WE;m@)T3L4RfPaXMYpwz?3jr`Be)(^n7XYf@Xtsmq_hT5O_ zHo38BDkC7V?LZkNJZ8IBV%(wahWLphmH?OhOT-L>oKv$LG;4s0{)G#)db{TZ^ z71z9jXMT>&;W34k>7MJh4mSpvOcLHlOvzv~2D0R~K{$`ZSq_)R5*t$)iU;JT)V^)G zmMrU*>yeP;J@pL5{p^vnkvt|B(n2QgFwEkHM@(=jH5cjH{b8$Q6HN$2Y1_v39rhWmx1?k}5JoE;1Zmqv)k;U zC$3Uus2ox&D=Ygzr4rQo4nOz&-1oS)dvs7f&qpMK^|U4=v3F!pJtZUwo_mlWw6wc+ z5J=~OmdUfytpvD^zdOobP5Y^l$43m1SiUz0VsQ8K2yRr}Z4zP2VT|1t$TENa{>>{c zCTQPI%E`T8=0J-WP-3?mFZVu9uH(#dDn@!@^y zEq^K`PbyB0h3b2Z4EGLE%>f2eS=}B++qM9*fjDBbtW!J!;xxCwqah$FbD;d~)%jM` zRdZ%$<|v~Y*o@O8K&%#taQ2<2l*V9Um^0PZ7N#ePiHT9V!PZ=H7S1!3)Ts*`)@6mt zmz9CbNH2Wly9V%{Ox^=2PVpyP)pp|M&vDSbCgX|^prG!X2&!Mr8FU7Z{ZZ^Jx#AUmDP9GH&H3G63X2{Dw zrY3mHIL3vEJO$>+cW8maxPoraZX*B5RCU!T3{yFKX^oZ6${aa@XLzqGU&sze9v0|jbt zt3}BT=zX5<(y@}}5#^~^-xW&0+5+Fjrw_eDLs$TKmdp3>cZ} zP+(GvP0la(SABwgfM<^toauZ}DF$Jj#0~FyyHQ@4fF}Z>$A`|Em|IbxEe6v%`f%AyUreLx5^j39 zSN+BKFUSm;`%W35=(dx|4!vbg0EzhCvk~M$YNxAMg8!SUM9>%Ks^Nm`$RjNKD?Bpq z);{6NIyUddgdk+vA;q60^P*V=c2{{g9i49RIj^gdoU9nMQWWdVtrV?vW1AgC z8XN5f*v!x*uBfBtbX zKVZcHxicDNBQD}p(6aju07J}U!8!i7zQL6O*yB)ySzJD1bpXo;@7v7i&IDH0~tXf#8}`LHGcxBPklP4m92XSQJz)3Bk?gVkVC9HW_kB^^uF3Ihnobu9d)G zdkNwSD5WIxQ4rFF$zWNe#4mlLH+|UgQ5jwL0cg*}es8Z<0yxtan5fld*a&h^b2JNP zu>xU?e5hCYFONr zR=FKtt<^V>>A)hHIYFL_7I}2t*6qvr4hl+7e`jYB)ZsPGNwPn&zP>&Pp2=Jo6%cO6 zew&Sc)_$s%gw+Rx(WS+VrxzC&2i=~E{RAbjKo8HIXx+&e?}HIjxXiBE22;IlVB0cr zcqd=Ue4xoo(#p!pyg>2+tEFadmr2%bfDB)9A>N_ME$yq^%isHIOM0GViL$A~=JU(? zMnN4N9ejZh8XCT@40|5P)Fnq99ZDZxqH+|MwI!03UUGfh^VL4rh#+Cv;dSg+wCcti zanK)tu5hgNUWDyiGFl9>Rn7m1tdCQf_e(~Pws&SQz&gaw+20j+T57W~_ zVWGnyx(_8}r%VW$b<07};@vFj$BN!&+&MMi8HS#Ka-0n5*PjL4UG<>X0&Q0`3alW_ zRp5NpUVYgMR+9v(UCAT4@&d)y@`D zKsyH%H#{w2lTJ)acuof*R;P6O<8brHUg6jK!ChI{*-tboRAkFM zaw0NfOzsz2_1`2009s>M`*PtS6(Bg&c$_j*306v8W>B#2$jWR#SOwmenBcg;D}-s( zNZdkF?fhu+h(LWiYS1!#b^;D@FAgnJR2=9TN?P_Y>3-w&a-t{drSn7n;Y4m(2k=p@ zmGG*1bkH`;eyWNec(ccsi@e&gDAOke4`Q}aM(Cx! z4sJn_rLWv;ocMawP{wmN-rZpDULO5n?A*|#$4VS(SL9m1jjSTL4_dHypJ}+P4&&XKqZk5JXq#%AOdzhMEH&0(g`!6 zr+1TwzWQ%kmDEZG5JK zQ|R^0k+3S5*@DW_+eHQhL`3E*TclutAQ>jl)-6%|gomNPg1X6`n@B1g^2ryRC zeS{hu3{ur$V`Y_Fw+Y>7fmD{(S=2h+>`WM?eK8&kX@Zh5ijwjXHfXLC>*X7@9Hj5{ z_V)s*VR6;<6rDrIS!@^2Da3)5%BHMDjSzggu;?{&CS%Y4%{wVJp_EO!*fDMM*iO?~vX}|obP=+@6tmZhljDVK_B0$foOi3zCMGL7cxl{H z5I@0kX?4x(3BM!}sK9-dkiBW4zHoj?A)pRz?u9LP=q_U(D*cYjE}NlG#d43W>c5q9?7Z-&us2}DN*YB?-#)T267{=v%25}x~ z`un%stVQ#n1K{l(f_4ZVR2g=N4J>%fJIpk=eY2x8v%iX4Ru4IZh@t9KfWZC%ftu^% zVTyolE%?ui*4o}V?VC18<2K2PK4#1sESfCS&Sg7yOgisiF`9@cJxPWTzNS3bu2A1S zT$(Bg&`-wgJTod1PWruRvnMB!HH|-#6O%_08F0hW@|sFQqR3vW5OFpB1PUErL~%S^ zM%=B*^WEE{aP$>j$I~{HoSaR(=k3jhV2t~=LVwTHlN7TYtuI>MjU0t z;@5Q-Q>~r|1{2dt-#$+@>djq;@>TNdDtHupWi*=swfade`I<<1m092(rsU^VgWLHF z6Q9GNUbdFP`ZaN>vqMC*58cOZ(e>Y%{ajH3L9oNAMZ~rZZ6fyLQP^_9VMJ>u zbANYeoYT`>cEsshQFPsfp1(H?5ZmQZd$y54L?4&j_&q2rV%jtf!nd1kTdJv%E zJYKz4-M#+o(CBjc()(D{Pq||V8$foQ~3H!Oy}~7%0kJ) z4~iJysjzG|x}-f}ljWR+pA>7JKA#;s*ZXCySkli}PzD>U3WUQqK6LgoK`f}x^1wpL z%#rV6*ttT!tKGr_R|;h>(q{`;bS4p^o~*Q_sxc0~Sgz$ROdHGC14{q6Sc%)0uk!i3 zd&&_z53Jo9p0vkQ1qQRKh`H<#AGV#{WGi^26mOSqV-uw`t5?dk)glkFvdB#Puv{i? zUo}Ux?YGv6C}Tuug!@K?EXCbiR($;?w3p3Jm(<|m5Ukut{7i87SX$G02RTGNS4bHfNt$@;IjO3B|XF<#Tq##t+*cOFTyS1)!A{stIgCW(_h?v zCc5c}1dsfZcBY`oCCn4Up+?$$xJAf zS|~$i+a6|s>69AW+KX9*2{Y=Qq)Hu-KjuHv;w;fybNidhrb_`Lh zSXFL$X{WVzdu>N0DY@gY_d^HrQ+eYw@N_)x$+K0gnGuqELCWR1*u=Rk2TAo??K>Ef zzFn;MQ`W{XuyCOM_aQpJAr=C}gTjDlb3tVR?8b?vhQ@IL8m|8RHywuWxiZ3JAzxI& zZ)n<`*c|PDw zBOVsqlcah?jHpq_Ckw=Vw(W@GwrVk#6F)f)y^)a;L!(n6-lP154LSG~Ru4md^a~JN z9ZFTtC7elZ-wpJww7zZgKr2&#YTU@sl$KmmiOBi1#D{O?0G%4oIy^i4-fvRoHEV|#bq|i!evRkl?H%#l>8R}UB$^>65;4 Date: Fri, 16 Nov 2012 15:55:41 +0400 Subject: [PATCH 07/40] update to remote view --- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d164c4fb9d9..dadf5a4a8c5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -949,7 +949,7 @@ for(var/mob/living/carbon/h in world) var/turf/temp_turf = get_turf(h) - if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat==DEAD) //Not on mining or the station. Or dead + if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead continue creatures += h diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6908d550ae4..851ab7e435a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1474,7 +1474,7 @@ if(machine) if(!machine.check_eye(src)) reset_view(null) else - if(!(mRemote in mutations) && !client.adminobs) + if(!(remoteview_target && mRemote in mutations && remoteview_target.stat==CONSCIOUS) && !client.adminobs) reset_view(null) return 1 From cc79346c3b70881d655a80224c14d4deda51c0bf Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 16:02:36 +0400 Subject: [PATCH 08/40] forgot one row --- baystation12.dme | 2 +- code/modules/mob/living/carbon/human/life.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/baystation12.dme b/baystation12.dme index 1c5182a856f..5ab7609868a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -237,6 +237,7 @@ #define FILE_DIR "icons/mecha" #define FILE_DIR "icons/misc" #define FILE_DIR "icons/mob" +#define FILE_DIR "icons/mob/human_races" #define FILE_DIR "icons/obj" #define FILE_DIR "icons/obj/assemblies" #define FILE_DIR "icons/obj/atmospherics" @@ -252,7 +253,6 @@ #define FILE_DIR "icons/vending_icons" #define FILE_DIR "interface" #define FILE_DIR "maps" -#define FILE_DIR "maps/backup" #define FILE_DIR "maps/RandomZLevels" #define FILE_DIR "sound" #define FILE_DIR "sound/AI" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 851ab7e435a..599b262c2bc 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1475,6 +1475,7 @@ if(!machine.check_eye(src)) reset_view(null) else if(!(remoteview_target && mRemote in mutations && remoteview_target.stat==CONSCIOUS) && !client.adminobs) + remoteview_target = null reset_view(null) return 1 From 7f55f25ead2483461de1a7c6a1b235d537565f68 Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 17:06:47 +0400 Subject: [PATCH 09/40] comments, and better hulk color --- code/modules/mob/living/carbon/human/update_icons.dm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5de8d28fd18..b81fe7ecbbc 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -220,7 +220,7 @@ proc/get_damage_icon_part(damage_state, body_part) if(lying_icon) del(lying_icon) var/husk_color_mod = rgb(96,88,80) - var/hulk_color_mod = rgb(24,72,24) + var/hulk_color_mod = rgb(48,224,40) var/plant_color_mod = rgb(144,224,144) var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete @@ -253,7 +253,9 @@ proc/get_damage_icon_part(damage_state, body_part) if(husk) stand_icon.ColorTone(husk_color_mod) else if(hulk) - stand_icon.ColorTone(hulk_color_mod) +// stand_icon.ColorTone(hulk_color_mod) + var/list/TONE = ReadRGB(hulk_color_mod) + stand_icon.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3])) else if(plant) stand_icon.ColorTone(plant_color_mod) else @@ -285,10 +287,14 @@ proc/get_damage_icon_part(damage_state, body_part) if(husk) temp.ColorTone(husk_color_mod) else if(hulk) - temp.ColorTone(hulk_color_mod) +// temp.ColorTone(hulk_color_mod) + var/list/TONE = ReadRGB(hulk_color_mod) + temp.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3])) else if(plant) temp.ColorTone(plant_color_mod) + //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST + //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) if(part.icon_position&(LEFT|RIGHT)) var/icon/temp2 = new('icons/mob/human.dmi',"blank") temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) From 3d88251a3faddf095118f7fd42152bfb41ed3e38 Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 17:12:17 +0400 Subject: [PATCH 10/40] limbs patch *don't drop limbs if already did that *subraces icons for limbs *left and right legs --- code/datums/organs/organ_external.dm | 39 +++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 4e44edf173d..3478c0e6e1a 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -5,7 +5,9 @@ name = "external" var/icon_name = null var/body_part = null + var/icon_position = 0 + var/dropped = 0 var/damage_state = "00" var/brute_dam = 0 var/burn_dam = 0 @@ -63,8 +65,7 @@ var/nux = brute * rand(10,15) if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier) if(prob(5 * brute)) - status |= ORGAN_DESTROYED - droplimb() + droplimb(1) return else if(prob(nux)) @@ -75,8 +76,7 @@ else if(brute > 20) if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier) if(prob(5 * brute)) - status |= ORGAN_DESTROYED - droplimb() + droplimb(1) return // If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking @@ -319,10 +319,18 @@ return 1 return 0 + proc/setAmputatedTree() + for(var/datum/organ/external/O in owner.organs) + if(O.parent == src) + O.amputated=amputated + proc/droplimb(var/override = 0,var/no_explode = 0) + if(dropped) return if(override) status |= ORGAN_DESTROYED if(status & ORGAN_DESTROYED) + dropped = 1 + if(status & ORGAN_SPLINTED) status &= ~ORGAN_SPLINTED if(implant) @@ -337,8 +345,8 @@ var/obj/item/weapon/organ/H switch(body_part) - // if(UPPER_TORSO) just no. - // owner.gib() +// if(UPPER_TORSO) +// owner.gib() if(LOWER_TORSO) owner << "\red You are now sterile." if(HEAD) @@ -398,6 +406,19 @@ owner.u_equip(owner.shoes) if(ismonkey(owner)) H.icon = 'monkey.dmi' + else if(owner.dna && owner.dna.mutantrace) + var/icon/I + switch(owner.dna.mutantrace) + if("tajaran") + I = 'icons/mob/human_races/r_tajaran.dmi' + if("lizard") + I = 'icons/mob/human_races/r_lizard.dmi' + if("skrell") + I = 'icons/mob/human_races/r_skrell.dmi' + if(I) + I.BecomeLying() + H.icon = I + var/lol = pick(cardinal) step(H,lol) destspawn = 1 @@ -573,6 +594,7 @@ max_damage = 75 min_broken_damage = 30 body_part = LEG_LEFT + icon_position = LEFT /datum/organ/external/r_arm name = "r_arm" @@ -589,6 +611,7 @@ max_damage = 75 min_broken_damage = 30 body_part = LEG_RIGHT + icon_position = RIGHT /datum/organ/external/l_foot name = "l_foot" @@ -597,6 +620,7 @@ max_damage = 40 min_broken_damage = 15 body_part = FOOT_LEFT + icon_position = LEFT /datum/organ/external/r_foot name = "r_foot" @@ -605,6 +629,7 @@ max_damage = 40 min_broken_damage = 15 body_part = FOOT_RIGHT + icon_position = RIGHT /datum/organ/external/r_hand name = "r_hand" @@ -627,7 +652,7 @@ ****************************************************/ obj/item/weapon/organ - icon = 'human.dmi' + icon = 'icons/mob/human.dmi' obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) ..(loc) From e6a2bb594bdd1c0f175d9e3c0b2dd8d8feef8239 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 16 Nov 2012 18:28:09 +0400 Subject: [PATCH 11/40] Reverted revert of my fix. No idea why I did that at all... --- code/datums/organs/organ_external.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 4e44edf173d..6b51d6fe234 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -122,7 +122,7 @@ if(status & ORGAN_BROKEN) owner.emote("scream") - + if(used_weapon) add_autopsy_data(used_weapon, brute + burn) owner.updatehealth() @@ -464,7 +464,7 @@ W = new wound_type(damage) // Possibly trigger an internal wound, too. - if(damage > 10 && prob(damage)) + if(damage > 10 && prob(damage) && type != BURN) var/datum/wound/internal_bleeding/I = new (15) wounds += I From 4ed9b40cb9a713b630d797b0c173acd24ba92d2d Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 18:41:26 +0400 Subject: [PATCH 12/40] tajarans see_in_dark -> 8, disembodied organs rendering correction --- code/datums/organs/organ_external.dm | 56 ++++++++++--------- code/modules/mob/living/carbon/human/life.dm | 14 +++-- icons/mob/human_races/r_human.dmi | Bin 8316 -> 8306 bytes 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 3478c0e6e1a..3073edccdbf 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -7,7 +7,6 @@ var/body_part = null var/icon_position = 0 - var/dropped = 0 var/damage_state = "00" var/brute_dam = 0 var/burn_dam = 0 @@ -325,11 +324,12 @@ O.amputated=amputated proc/droplimb(var/override = 0,var/no_explode = 0) - if(dropped) return + if(destspawn) return if(override) status |= ORGAN_DESTROYED if(status & ORGAN_DESTROYED) - dropped = 1 + if(body_part == UPPER_TORSO) + return if(status & ORGAN_SPLINTED) status &= ~ORGAN_SPLINTED @@ -404,20 +404,24 @@ if(ismonkey(owner)) H.icon_state = "l_foot_l" owner.u_equip(owner.shoes) - if(ismonkey(owner)) - H.icon = 'monkey.dmi' - else if(owner.dna && owner.dna.mutantrace) - var/icon/I - switch(owner.dna.mutantrace) - if("tajaran") - I = 'icons/mob/human_races/r_tajaran.dmi' - if("lizard") - I = 'icons/mob/human_races/r_lizard.dmi' - if("skrell") - I = 'icons/mob/human_races/r_skrell.dmi' - if(I) - I.BecomeLying() - H.icon = I + if(H) + if(ismonkey(owner)) + H.icon = 'monkey.dmi' + else if(ishuman(owner) && owner.dna) + var/icon/I + switch(owner.dna.mutantrace) + if("tajaran") + I = new('icons/mob/human_races/r_tajaran.dmi') + if("lizard") + I = new('icons/mob/human_races/r_lizard.dmi') + if("skrell") + I = new('icons/mob/human_races/r_skrell.dmi') + else + I = new('icons/mob/human_races/r_human.dmi') + if(I) + H.icon = I.MakeLying() + else + H.icon_state = initial(H.icon_state)+"_l" var/lol = pick(cardinal) step(H,lol) @@ -652,7 +656,7 @@ ****************************************************/ obj/item/weapon/organ - icon = 'icons/mob/human.dmi' + icon = 'icons/mob/human_races/r_human.dmi' obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) ..(loc) @@ -743,25 +747,25 @@ obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob) obj/item/weapon/organ/l_arm name = "left arm" - icon_state = "l_arm_l" + icon_state = "l_arm" obj/item/weapon/organ/l_foot name = "left foot" - icon_state = "l_foot_l" + icon_state = "l_foot" obj/item/weapon/organ/l_hand name = "left hand" - icon_state = "l_hand_l" + icon_state = "l_hand" obj/item/weapon/organ/l_leg name = "left leg" - icon_state = "l_leg_l" + icon_state = "l_leg" obj/item/weapon/organ/r_arm name = "right arm" - icon_state = "r_arm_l" + icon_state = "r_arm" obj/item/weapon/organ/r_foot name = "right foot" - icon_state = "r_foot_l" + icon_state = "r_foot" obj/item/weapon/organ/r_hand name = "right hand" - icon_state = "r_hand_l" + icon_state = "r_hand" obj/item/weapon/organ/r_leg name = "right leg" - icon_state = "r_leg_l" + icon_state = "r_leg" diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 599b262c2bc..45cca8c29f2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1004,7 +1004,8 @@ proc/handle_chemicals_in_body() if(reagents) reagents.metabolize(src) - if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist +// if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist + if(PLANT in mutations) var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing if(isturf(loc)) //else, there's considered to be no light var/turf/T = loc @@ -1050,7 +1051,8 @@ if(overeatduration > 1) overeatduration -= 2 //doubled the unfat rate - if(dna && dna.mutantrace == "plant") +// if(dna && dna.mutantrace == "plant") + if(PLANT in mutations) if(nutrition < 200) take_overall_damage(2,0) @@ -1301,7 +1303,7 @@ if("lizard") see_in_dark = 3 if("tajaran") - see_in_dark = 5 + see_in_dark = 8 else see_in_dark = 2 @@ -1474,7 +1476,11 @@ if(machine) if(!machine.check_eye(src)) reset_view(null) else - if(!(remoteview_target && mRemote in mutations && remoteview_target.stat==CONSCIOUS) && !client.adminobs) + var/isRemoteObserve = 0 + if((mRemote in mutations) && remoteview_target) + if(remoteview_target.stat==CONSCIOUS) + isRemoteObserve = 1 + if(!isRemoteObserve && !client.adminobs) remoteview_target = null reset_view(null) return 1 diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi index 3fec1061f6478eacfe9f7fbc006b74f38acc4d4a..16324b2bee52a7c41a9f399f7e97890d3c575afa 100644 GIT binary patch delta 7346 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 V;kr{YLICu7cu!ZO;;voD{{b|zt1 Date: Fri, 16 Nov 2012 18:54:43 +0400 Subject: [PATCH 13/40] final pass of merging with my branch I hope I have not forgot anything Still, it compiled for me at least, and passes test cases i did --- code/game/machinery/hydroponics.dm | 5 +++-- code/modules/mob/living/carbon/human/human_defines.dm | 4 +++- code/modules/projectiles/projectile/special.dm | 6 ++++-- code/modules/reagents/Chemistry-Reagents.dm | 3 ++- code/setup.dm | 4 ++++ 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm index 16fd85b8dc6..b611b974a30 100644 --- a/code/game/machinery/hydroponics.dm +++ b/code/game/machinery/hydroponics.dm @@ -941,8 +941,9 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob) if(se) podman.dna.struc_enzymes = se if(!prob(potency)) //if it fails, plantman! - if(podman.dna) - podman.dna.mutantrace = "plant" + if(podman) +// podman.dna.mutantrace = "plant" + podman.mutations.Add(PLANT) podman.update_mutantrace() else //else, one packet of seeds. maybe two diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 1cf5788612d..cf91b4b43a8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -55,4 +55,6 @@ var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. - var/xylophone = 0 //For the spoooooooky xylophone cooldown \ No newline at end of file + var/xylophone = 0 //For the spoooooooky xylophone cooldown + + var/mob/remoteview_target = null diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 7225b022cf0..99be701f987 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -79,7 +79,8 @@ on_hit(var/atom/target, var/blocked = 0) var/mob/living/M = target - if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays. +// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays. + if(ishuman(target) && (PLANT in M.mutations)) //Plantmen possibly get mutated and damaged by the rays. if(prob(15)) M.apply_effect((rand(30,80)),IRRADIATE) M.Weaken(5) @@ -116,7 +117,8 @@ on_hit(var/atom/target, var/blocked = 0) var/mob/M = target - if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat. +// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat. + if(ishuman(target) && (PLANT in M.mutations)) //These rays make plantmen fat. if(M.nutrition < 500) //sanity check M.nutrition += 30 else if (istype(target, /mob/living/carbon/)) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 5d140703ac2..355ee6a84d9 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1146,7 +1146,8 @@ datum if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.dna) - if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage +// if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage + if(PLANT in H.mutations) //plantmen take a LOT of damage H.adjustToxLoss(10) plasma diff --git a/code/setup.dm b/code/setup.dm index 731245a5402..3837273bd45 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -351,6 +351,7 @@ var/MAX_EXPLOSION_RANGE = 14 //2spooky #define SKELETON 29 +#define PLANT 30 // Other Mutations: #define mNobreath 100 // no need to breathe @@ -595,3 +596,6 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define HOSTILE_STANCE_ATTACK 3 #define HOSTILE_STANCE_ATTACKING 4 #define HOSTILE_STANCE_TIRED 5 + +#define LEFT 1 +#define RIGHT 2 From a96e4c360051c1f0d0dc793d4c1b19c477c7d29c Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 19:00:45 +0400 Subject: [PATCH 14/40] if amputated full arm or leg, make hand or foot amputated too --- code/WorkInProgress/surgery.dm | 1 + code/datums/organs/organ_external.dm | 1 + 2 files changed, 2 insertions(+) diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index 5d773037370..a008a058594 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -959,6 +959,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) "\blue You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].") affected.status |= ORGAN_ATTACHABLE affected.amputated = 1 + affected.setAmputatedTree() affected.open = 0 fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 3073edccdbf..7494acc189b 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -322,6 +322,7 @@ for(var/datum/organ/external/O in owner.organs) if(O.parent == src) O.amputated=amputated + O.setAmputatedTree() proc/droplimb(var/override = 0,var/no_explode = 0) if(destspawn) return From 137ed48938f189bcb25bf7e5c4b18db7b79e885f Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 19:18:28 +0400 Subject: [PATCH 15/40] clean out --- code/datums/organs/organ_external.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 7494acc189b..18aa9ee5b7b 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -319,10 +319,9 @@ return 0 proc/setAmputatedTree() - for(var/datum/organ/external/O in owner.organs) - if(O.parent == src) - O.amputated=amputated - O.setAmputatedTree() + for(var/datum/organ/external/O in children) + O.amputated=amputated + O.setAmputatedTree() proc/droplimb(var/override = 0,var/no_explode = 0) if(destspawn) return From 25a346628538bcaec863661a2c099eaaa7de8376 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 16 Nov 2012 19:37:09 +0400 Subject: [PATCH 16/40] Runtime fix. --- code/ZAS/FEA_system.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ZAS/FEA_system.dm b/code/ZAS/FEA_system.dm index 4434d9d2d40..6912102a93d 100644 --- a/code/ZAS/FEA_system.dm +++ b/code/ZAS/FEA_system.dm @@ -276,7 +276,7 @@ datum rebuilds_to_consider[NT] = T proc/ConsiderRebuild(var/turf/simulated/T, var/turf/NT) - + if(!istype(T)) return if(istype(NT, /turf/simulated) && NT.zone != T.zone) T.zone.RemoveTurf(NT) if(NT.zone) From 650dc3dab8f4a66d690539c8b59d4b1d7980cab2 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 16 Nov 2012 20:11:28 +0400 Subject: [PATCH 17/40] Changed way CPR lock works, no dependancy on world time.stored time now. When someone starts doing CPR, it locks. After 3 ticks after CPR is done it unlocks. No other mobs can do CPR on same mob while it is locked. ((also it's one of places that can make CPR not start so I wanted ot replace timer with more simple semaphore)) --- code/modules/mob/living/carbon/human/inventory.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index e220b673744..d5dec03baaf 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -433,8 +433,9 @@ return message = "\red [source] is trying to empty [target]'s pockets." if("CPR") - if (target.cpr_time >= world.time + 3) + if (!target.cpr_time) del(src) + target.cpr_time = 0 message = "\red [source] is trying perform CPR on [target]!" if("id") message = "\red [source] is trying to take off [target.wear_id] from [target]'s uniform!" @@ -540,10 +541,7 @@ It can still be worn/put on as normal. if (target.legcuffed) strip_item = target.legcuffed if("CPR") - if (target.cpr_time >= world.time + 30) - del(src) if ((target.health >= -99.0 && target.health <= 0)) - target.cpr_time = world.time var/suff = min(target.getOxyLoss(), 7) target.adjustOxyLoss(-suff) target.updatehealth() @@ -551,6 +549,8 @@ It can still be worn/put on as normal. O.show_message("\red [source] performs CPR on [target]!", 1) target << "\blue You feel a breath of fresh air enter your lungs. It feels good." source << "\red Repeat at least every 7 seconds." + spawn(3) + target.cpr_time = 1 if("dnainjector") var/obj/item/weapon/dnainjector/S = item if(S) From f520a79384422ccab04cc47780b29dc02c68d875 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 16 Nov 2012 21:12:55 +0400 Subject: [PATCH 18/40] Added logging for what I believe to be cause of CPR failing. Apparently SOMEHOW it goes into shake proc where it quietly returns meeting check for health being above zero. I ahve no idea why it is not stopped bu check right before the shake proc call, that's what logging is for, maybe health was computed incorrectly, or threshold for crit is wrong. --- code/modules/mob/living/carbon/human/human_attackhand.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 96df8c88465..15a56b9ece9 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -61,6 +61,7 @@ switch(M.a_intent) if("help") if(health > config.health_threshold_crit) + diary << "\[[time2text(world.timeofday, "hh:mm.ss")]\] CPR BUGHINTING: [M] shakes [src]: health - [health], threshold - [config.health_threshold_crit]. Health details: OX [getOxyLoss()] TX [getToxLoss()] BU [getFireLoss()] BR [getBruteLoss()] Blood: [round(vessel.get_reagent_amount("blood"))] out of 560" help_shake_act(M) return 1 // if(M.health < -75) return 0 From beb028d1965df824e7343c227470ba4fbd59c6af Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 17 Nov 2012 00:17:50 +0400 Subject: [PATCH 19/40] Using spawn in proc that deletes self was not so smart... GC outrun me. --- code/modules/mob/living/carbon/human/inventory.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index d5dec03baaf..d3519e65cae 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -549,8 +549,7 @@ It can still be worn/put on as normal. O.show_message("\red [source] performs CPR on [target]!", 1) target << "\blue You feel a breath of fresh air enter your lungs. It feels good." source << "\red Repeat at least every 7 seconds." - spawn(3) - target.cpr_time = 1 + target.cpr_time = 1 if("dnainjector") var/obj/item/weapon/dnainjector/S = item if(S) From 6017e8c5db16221fec53700e5e3ed78927d1b9c8 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 17 Nov 2012 19:46:44 +0400 Subject: [PATCH 20/40] Can never have too much nullchecks. --- code/modules/mob/living/carbon/alien/humanoid/life.dm | 6 +++--- code/modules/mob/living/carbon/alien/larva/life.dm | 7 +++---- code/modules/mob/living/carbon/brain/life.dm | 6 +++--- code/modules/mob/living/carbon/human/life.dm | 4 ++-- code/modules/mob/living/carbon/monkey/life.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 2 +- 6 files changed, 13 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index edb8ff7decb..2fd220b170b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -418,8 +418,8 @@ if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" //NOTE: the alerts dont reset when youre out of danger. dont blame me, //blame the person who coded them. Temporary fix added. - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if (client) + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) if ((blind && stat != 2)) if ((blinded)) @@ -441,7 +441,7 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 612b0bb6f8b..d24be56a049 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -332,9 +332,8 @@ FUCK YOU MORE FAT CODE -Hawk*/ if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" //NOTE: the alerts dont reset when youre out of danger. dont blame me, //blame the person who coded them. Temporary fix added. - - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if (client) + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) if ((blind && stat != 2)) if ((blinded)) @@ -356,7 +355,7 @@ FUCK YOU MORE FAT CODE -Hawk*/ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index cf5ee8ce95c..9da4b432274 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -242,8 +242,8 @@ healths.icon_state = "health7" if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]" - - client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) + if (client) + client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired) if ((blind && stat != 2)) if ((blinded)) @@ -265,7 +265,7 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 45cca8c29f2..0198fdb8532 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -489,7 +489,7 @@ domutcheck(src,null) emote("gasp") updatehealth() - + if(damage && organs.len) var/datum/organ/external/O = pick(organs) if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) @@ -1480,7 +1480,7 @@ if((mRemote in mutations) && remoteview_target) if(remoteview_target.stat==CONSCIOUS) isRemoteObserve = 1 - if(!isRemoteObserve && !client.adminobs) + if(!isRemoteObserve && client && !client.adminobs) remoteview_target = null reset_view(null) return 1 diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 307d97b7b61..35be674639c 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -551,7 +551,7 @@ if (!( machine.check_eye(src) )) reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 77e9e64d65c..aa308f90835 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -255,7 +255,7 @@ if (!( src.machine.check_eye(src) )) src.reset_view(null) else - if(!client.adminobs) + if(client && !client.adminobs) reset_view(null) return 1 From ce0c2fc7928c931f3ac7bfff5023d1baf90ba5dd Mon Sep 17 00:00:00 2001 From: Ispil Date: Sat, 17 Nov 2012 12:16:02 -0700 Subject: [PATCH 21/40] Fix to Issue #1961. Changes the Space Law book to link to the Baystation 12 wiki. Also changes the Engineering Textbook to link to the Baystation 12 wiki. --- code/game/objects/items/weapons/manuals.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 5d67a68caca..6cba41021be 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -589,7 +589,7 @@ - + @@ -607,7 +607,7 @@ - + From ffe541adec7a15fe3196687f4461479487f7bfd4 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 18 Nov 2012 11:05:21 +0400 Subject: [PATCH 22/40] Fixes issue #1970 Did not unlock CPR in case CPR was not completed successfully. --- code/modules/mob/living/carbon/human/inventory.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index d3519e65cae..614715275e9 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -461,6 +461,7 @@ The else statement is for equipping stuff to empty slots. It can still be worn/put on as normal. */ /obj/effect/equip_e/human/done() //TODO: And rewrite this :< ~Carn + target.cpr_time = 1 if(!source || !target) return //Target or source no longer exist if(source.loc != s_loc) return //source has moved if(target.loc != t_loc) return //target has moved @@ -549,7 +550,6 @@ It can still be worn/put on as normal. O.show_message("\red [source] performs CPR on [target]!", 1) target << "\blue You feel a breath of fresh air enter your lungs. It feels good." source << "\red Repeat at least every 7 seconds." - target.cpr_time = 1 if("dnainjector") var/obj/item/weapon/dnainjector/S = item if(S) From 684679cefbee4302bec777f7cc8b0509baf2b01d Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 18 Nov 2012 11:24:17 +0400 Subject: [PATCH 23/40] Fixes issue #1971 Lasertag and practice beams won't explode tanks anymore. --- code/game/machinery/bots/ed209bot.dm | 12 ++++++------ code/game/machinery/portable_turret.dm | 12 ++++++------ code/game/machinery/turrets.dm | 4 ++-- code/modules/projectiles/guns/energy/laser.dm | 4 ++-- code/modules/projectiles/projectile/beams.dm | 6 +++--- code/modules/reagents/reagent_dispenser.dm | 3 ++- code/modules/research/xenoarchaeology/artifact.dm | 2 -- 7 files changed, 21 insertions(+), 22 deletions(-) diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index 4fa8f095fe0..f43b43ac07d 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -820,14 +820,14 @@ Auto Patrol: []"}, projectile = /obj/item/projectile/energy/electrode else if(lasercolor == "b") if (src.emagged == 2) - projectile = /obj/item/projectile/beam/omnitag + projectile = /obj/item/projectile/beam/lastertag/omni else - projectile = /obj/item/projectile/beam/bluetag + projectile = /obj/item/projectile/beam/lastertag/blue else if(lasercolor == "r") if (src.emagged == 2) - projectile = /obj/item/projectile/beam/omnitag + projectile = /obj/item/projectile/beam/lastertag/omni else - projectile = /obj/item/projectile/beam/redtag + projectile = /obj/item/projectile/beam/lastertag/red if (!( istype(U, /turf) )) return @@ -1011,7 +1011,7 @@ Auto Patrol: []"}, /obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj) if((src.lasercolor == "b") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/redtag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/red)) src.disabled = 1 del (Proj) sleep(100) @@ -1019,7 +1019,7 @@ Auto Patrol: []"}, else ..() else if((src.lasercolor == "r") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/bluetag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/blue)) src.disabled = 1 del (Proj) sleep(100) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 7be13d3d1e3..a16b545c196 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -76,8 +76,8 @@ // All energy-based weapons are applicable switch(E.type) if(/obj/item/weapon/gun/energy/laser/bluetag) - projectile = /obj/item/projectile/beam/bluetag - eprojectile = /obj/item/projectile/beam/omnitag//This bolt will stun ERRYONE with a vest + projectile = /obj/item/projectile/beam/lastertag/blue + eprojectile = /obj/item/projectile/beam/lastertag/omni//This bolt will stun ERRYONE with a vest iconholder = null reqpower = 100 lasercolor = "b" @@ -90,8 +90,8 @@ shot_delay = 30 if(/obj/item/weapon/gun/energy/laser/redtag) - projectile = /obj/item/projectile/beam/redtag - eprojectile = /obj/item/projectile/beam/omnitag + projectile = /obj/item/projectile/beam/lastertag/red + eprojectile = /obj/item/projectile/beam/lastertag/omni iconholder = null reqpower = 100 lasercolor = "r" @@ -375,13 +375,13 @@ Status: []
"}, if (src.health <= 0) src.die() // the death process :( if((src.lasercolor == "b") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/redtag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/red)) src.disabled = 1 del (Proj) sleep(100) src.disabled = 0 if((src.lasercolor == "r") && (src.disabled == 0)) - if(istype(Proj, /obj/item/projectile/beam/bluetag)) + if(istype(Proj, /obj/item/projectile/beam/lastertag/blue)) src.disabled = 1 del (Proj) sleep(100) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index 990b823ef15..ae5dd51891d 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -221,9 +221,9 @@ if(4) A = new /obj/item/projectile/change( loc ) if(5) - A = new /obj/item/projectile/beam/bluetag( loc ) + A = new /obj/item/projectile/beam/lastertag/blue( loc ) if(6) - A = new /obj/item/projectile/beam/redtag( loc ) + A = new /obj/item/projectile/beam/lastertag/red( loc ) A.original = target.loc use_power(500) else diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index b6afa3fbcd4..d769acf00b2 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -90,7 +90,7 @@ obj/item/weapon/gun/energy/laser/retro name = "laser tag gun" icon_state = "bluetag" desc = "Standard issue weapon of the Imperial Guard" - projectile_type = "/obj/item/projectile/beam/bluetag" + projectile_type = "/obj/item/projectile/beam/lastertag/blue" origin_tech = "combat=1;magnets=2" clumsy_check = 0 var/charge_tick = 0 @@ -127,7 +127,7 @@ obj/item/weapon/gun/energy/laser/retro name = "laser tag gun" icon_state = "redtag" desc = "Standard issue weapon of the Imperial Guard" - projectile_type = "/obj/item/projectile/beam/redtag" + projectile_type = "/obj/item/projectile/beam/lastertag/red" origin_tech = "combat=1;magnets=2" clumsy_check = 0 var/charge_tick = 0 diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 8f2d39bf9de..924a8a7f20f 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -111,7 +111,7 @@ var/list/beam_master = list() -/obj/item/projectile/beam/bluetag +/obj/item/projectile/beam/lastertag/blue name = "lasertag beam" icon_state = "bluelaser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -126,7 +126,7 @@ var/list/beam_master = list() M.Weaken(5) return 1 -/obj/item/projectile/beam/redtag +/obj/item/projectile/beam/lastertag/red name = "lasertag beam" icon_state = "laser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -141,7 +141,7 @@ var/list/beam_master = list() M.Weaken(5) return 1 -/obj/item/projectile/beam/omnitag//A laser tag bolt that stuns EVERYONE +/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE name = "lasertag beam" icon_state = "omnilaser" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 6887a35b08d..63dba43d518 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -145,7 +145,8 @@ bullet_act(var/obj/item/projectile/Proj) if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) - explode() + if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) + explode() blob_act() explode() diff --git a/code/modules/research/xenoarchaeology/artifact.dm b/code/modules/research/xenoarchaeology/artifact.dm index 06a3c9a6e92..53edfb54a07 100644 --- a/code/modules/research/xenoarchaeology/artifact.dm +++ b/code/modules/research/xenoarchaeology/artifact.dm @@ -153,8 +153,6 @@ if(istype(P,/obj/item/projectile/beam)) src.Artifact_Activate() else if(istype(P,/obj/item/projectile/ion)) src.Artifact_Activate() else if(istype(P,/obj/item/projectile/energy)) src.Artifact_Activate() - else if(istype(P,/obj/item/projectile/beam/bluetag)) src.Artifact_Activate() - else if(istype(P,/obj/item/projectile/beam/redtag)) src.Artifact_Activate() if (my_effect.trigger == "heat") if(istype(P,/obj/item/projectile/temp)) src.Artifact_Activate() From 8947dc7a0e976b5903c2efe354f2ef9f41bd151f Mon Sep 17 00:00:00 2001 From: cib Date: Sun, 18 Nov 2012 15:48:38 +0100 Subject: [PATCH 24/40] Lung damage now occurs pressure-based, not oxyloss-based. --- code/modules/mob/living/carbon/human/life.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 45cca8c29f2..894de8b26a1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -489,7 +489,7 @@ domutcheck(src,null) emote("gasp") updatehealth() - + if(damage && organs.len) var/datum/organ/external/O = pick(organs) if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) @@ -499,6 +499,7 @@ if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return var/lung_ruptured = is_lung_ruptured() + if(lung_ruptured && prob(2)) spawn emote("me", 1, "coughs up blood!") src.drip(10) @@ -565,6 +566,12 @@ var/obj/location_as_object = loc location_as_object.handle_internal_lifeform(src, 0) + + if(!lung_ruptured && breath) + if(breath.total_moles < BREATH_VOLUME / 5 || breath.total_moles > BREATH_VOLUME * 5) + if(prob(5)) + rupture_lung() + handle_breath(breath) if(breath) @@ -713,9 +720,6 @@ apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat") fire_alert = max(fire_alert, 2) - if(oxyloss >= 50 && prob(oxyloss / 5)) - rupture_lung() - //Temporary fixes to the alerts. return 1 From e24d6ee90242362ce02ee0d1095fe63065d2e858 Mon Sep 17 00:00:00 2001 From: cib Date: Sun, 18 Nov 2012 15:59:28 +0100 Subject: [PATCH 25/40] Reduced internal bleeding speed. --- code/datums/organs/organ_external.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index da3c60bf304..9806f1d0acf 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -188,7 +188,7 @@ if(W.internal && !W.is_treated()) // internal wounds get worse over time W.open_wound(0.1 * wound_update_accuracy) - owner.vessel.remove_reagent("blood",0.2 * W.damage * wound_update_accuracy) + owner.vessel.remove_reagent("blood",0.07 * W.damage * wound_update_accuracy) if(W.bandaged || W.salved) // slow healing From d0a542bc546e9f766ac8053ea04802de56913d87 Mon Sep 17 00:00:00 2001 From: cib Date: Sun, 18 Nov 2012 16:18:22 +0100 Subject: [PATCH 26/40] You now come out of cloning with slightly more damage. --- code/game/machinery/cloning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index cba4e84c484..4370b1044f5 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -133,7 +133,7 @@ return 0 - src.heal_level = rand(75,100) //Randomizes what health the clone is when ejected + src.heal_level = rand(0,40) //Randomizes what health the clone is when ejected src.attempting = 1 //One at a time!! src.locked = 1 From 56c20b7fb302fc5138bfdc86aba70f38f9a09065 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sun, 18 Nov 2012 19:32:58 +0400 Subject: [PATCH 27/40] Fixed couple of runtimes --- code/game/jobs/access.dm | 2 +- code/modules/mob/living/logout.dm | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 37f1a721aae..2ea34728e9e 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -499,7 +499,7 @@ // hack for alt titles if(istype(loc, /mob)) var/mob/M = loc - if(M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs()) + if(M.mind && M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs()) return M.mind.assigned_role if(istype(src, /obj/item/device/pda)) diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index a25a631a937..7c272660503 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -1,6 +1,7 @@ /mob/living/Logout() ..() - if(!key && mind) //key and mind have become seperated. - mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body. - if(!immune_to_ssd && sleeping < 2 && mind.active) - sleeping = 2 + if (mind) + if(!key) //key and mind have become seperated. + mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body. + if(!immune_to_ssd && sleeping < 2 && mind.active) + sleeping = 2 From 3a3f2ff4a191f395cf754d04a28bc0d42a6eaacd Mon Sep 17 00:00:00 2001 From: cib Date: Sun, 18 Nov 2012 16:38:29 +0100 Subject: [PATCH 28/40] Medical scanner additions. - Stationary scanners detect vira. - Portable scanners detect internal bleeding. --- code/game/machinery/adv_med.dm | 3 +++ code/game/objects/items/devices/scanners.dm | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 5e6f6e9d1fc..3bb0f83bad9 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -235,6 +235,9 @@ else dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1) + if(occupant.virus2) + dat += text("Viral pathogen detected in blood stream.
") + dat += text("[]\t-Brute Damage %: []

", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss()) dat += text("[]\t-Respiratory Damage %: []
", (occupant.getOxyLoss() < 60 ? "" : ""), occupant.getOxyLoss()) dat += text("[]\t-Toxin Content %: []
", (occupant.getToxLoss() < 60 ? "" : ""), occupant.getToxLoss()) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 2793ce28d80..55b2be019e9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -158,6 +158,10 @@ MASS SPECTROMETER if(e.status & ORGAN_BROKEN) user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1) break + for(var/datum/organ/external/e in H.organs) + for(var/datum/wound/W in e.wounds) if(W.internal) + user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1) + break if(M:vessel) var/blood_volume = round(M:vessel.get_reagent_amount("blood")) var/blood_percent = blood_volume / 560 From 7b74e199c5278365a147344fcea7930ba73bea61 Mon Sep 17 00:00:00 2001 From: cib Date: Sun, 18 Nov 2012 17:51:28 +0100 Subject: [PATCH 29/40] Fix to breath pressure tresholds. This also increases default breathing speed a good deal. --- code/modules/mob/living/carbon/human/life.dm | 2 +- code/setup.dm | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 894de8b26a1..0db7a81589e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -568,7 +568,7 @@ if(!lung_ruptured && breath) - if(breath.total_moles < BREATH_VOLUME / 5 || breath.total_moles > BREATH_VOLUME * 5) + if(breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5) if(prob(5)) rupture_lung() diff --git a/code/setup.dm b/code/setup.dm index 3837273bd45..f7935d741d5 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -19,8 +19,9 @@ #define MOLES_PLASMA_VISIBLE 0.7 //Moles in a standard cell after which plasma is visible #define MIN_PLASMA_DAMAGE 20 -#define BREATH_VOLUME 0.5 //liters in a normal breath -#define BREATH_PERCENTAGE BREATH_VOLUME/CELL_VOLUME +#define BREATH_VOLUME 5 //liters in a normal breath +#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME /(T20C*R_IDEAL_GAS_EQUATION)) +#define BREATH_PERCENTAGE BREATH_MOLES/MOLES_CELLSTANDARD //Amount of air to take a from a tile #define HUMAN_NEEDED_OXYGEN MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16 //Amount of air needed before pass out/suffocation commences From d6505fd06462d107ae2b77f523ca6ea236a70afa Mon Sep 17 00:00:00 2001 From: Ispil Date: Sun, 18 Nov 2012 15:40:55 -0700 Subject: [PATCH 30/40] Fix to Issue #1972. Humans now spawn with full SE length, as do monkeys. --- code/game/dna.dm | 3 ++- code/modules/mob/living/carbon/monkey/monkey.dm | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/dna.dm b/code/game/dna.dm index 80a250620f0..c6b27658158 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -116,9 +116,10 @@ uni_identity = temp var/mutstring = "" - for(var/i = 1, i <= 13, i++) + for(var/i = 1, i <= STRUCDNASIZE, i++) mutstring += add_zero2(num2hex(rand(1,1024)),3) + struc_enzymes = mutstring unique_enzymes = md5(character.real_name) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 0476926c32c..326bf4dd663 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -25,7 +25,7 @@ dna = new /datum/dna( null ) dna.real_name = real_name dna.uni_identity = "00600200A00E0110148FC01300B009" - dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8" + dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" dna.unique_enzymes = md5(name) //////////blah var/gendervar From afe7e4642a5d54a9cf3038400e9006a9e8079554 Mon Sep 17 00:00:00 2001 From: Ispil Date: Sun, 18 Nov 2012 16:38:01 -0700 Subject: [PATCH 31/40] Fix to Issue #1978. Removes the extra "t" in "the." --- code/modules/clothing/clothing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3e373c7d5f2..5a559e3310d 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -259,6 +259,6 @@ BLIND // can't see anything "\red You draw \the [H.holstered], ready to shoot!") else usr.visible_message("\blue [usr] draws \the [H.holstered], pointing it at the ground.", \ - "\blue You draw \the [H.holstered], pointing it at tthe ground.") + "\blue You draw \the [H.holstered], pointing it at the ground.") usr.put_in_hands(H.holstered) H.holstered = null From a4074de7b06daf31afd81bae7a578dad4349cf96 Mon Sep 17 00:00:00 2001 From: Ispil Date: Sun, 18 Nov 2012 16:47:52 -0700 Subject: [PATCH 32/40] Adds a /The to the holstering and drawing a firearm messages, for when the name of the user is improper or not capitalized. --- code/modules/clothing/clothing.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 5a559e3310d..543586dba46 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -249,16 +249,16 @@ BLIND // can't see anything H.holstered = usr.get_active_hand() usr.drop_item() H.holstered.loc = src - usr.visible_message("\blue [usr] holsters \the [H.holstered].", "You holster \the [H.holstered].") + usr.visible_message("\blue \The [usr] holsters \the [H.holstered].", "You holster \the [H.holstered].") else if(istype(usr.get_active_hand(),/obj) && istype(usr.get_inactive_hand(),/obj)) usr << "\red You need an empty hand to draw the gun!" else if(usr.a_intent == "hurt") - usr.visible_message("\red [usr] draws \the [H.holstered], ready to shoot!", \ + usr.visible_message("\red \The [usr] draws \the [H.holstered], ready to shoot!", \ "\red You draw \the [H.holstered], ready to shoot!") else - usr.visible_message("\blue [usr] draws \the [H.holstered], pointing it at the ground.", \ + usr.visible_message("\blue \The [usr] draws \the [H.holstered], pointing it at the ground.", \ "\blue You draw \the [H.holstered], pointing it at the ground.") usr.put_in_hands(H.holstered) H.holstered = null From c5d35839ba47b21c6f843ec4bb2db54dac80b9d0 Mon Sep 17 00:00:00 2001 From: cib Date: Mon, 19 Nov 2012 12:24:14 +0100 Subject: [PATCH 33/40] Fixes issue #1959 Crew transfer shuttles now force the mode to finish, even if the mode has other finish conditions. --- code/game/gamemodes/gameticker.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 8dce6c6e441..fbdc336282d 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -300,7 +300,8 @@ var/global/datum/controller/gameticker/ticker emergency_shuttle.process() - if(!mode.explosion_in_progress && mode.check_finished()) + var/mode_finished = mode.check_finished() || (emergency_shuttle.location == 2 && emergency_shuttle.alert == 1) + if(!mode.explosion_in_progress && mode_finished) current_state = GAME_STATE_FINISHED spawn From 59a31bab8694ac664f60388a9875f64d3ad23b3d Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 21 Nov 2012 08:19:10 +0400 Subject: [PATCH 34/40] Added delay to vessel repair surgery. Fixed metroid core surgery exploit. --- code/WorkInProgress/surgery.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index ab19b0e525c..3989e7d8804 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -308,6 +308,9 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) /datum/surgery_step/fix_vein required_tool = /obj/item/weapon/FixOVein + min_duration = 70 + max_duration = 90 + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -855,7 +858,8 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) target.cores-- user.visible_message("\blue [user] cuts out one of [target]'s cores with \the [tool].",, \ "\blue You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.") - new/obj/item/metroid_core(target.loc) + if(target.cores >= 0) + new/obj/item/metroid_core(target.loc) if(target.cores <= 0) target.icon_state = "baby roro dead-nocore" From c686245263b61c6502084b91e26fec352120fb21 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 21 Nov 2012 20:54:50 +0400 Subject: [PATCH 35/40] Fixes issue #1981 Only secborgs are THE LAW. --- code/modules/mob/living/silicon/robot/emote.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 1eb1d159c9a..34d01953679 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -195,10 +195,13 @@ m_type = 2 if("law") - message = "[src] shows its legal authorization barcode." + if (istype(module,/obj/item/weapon/robot_module/security)) + message = "[src] shows its legal authorization barcode." - playsound(src.loc, 'biamthelaw.ogg', 50, 0) - m_type = 2 + playsound(src.loc, 'biamthelaw.ogg', 50, 0) + m_type = 2 + else + src << "You are not THE LAW, pal." else src << text("Invalid Emote: []", act) if ((message && src.stat == 0)) From 15abc757d3270d14e23e832545c3e3ece059ac93 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 21 Nov 2012 20:55:53 +0400 Subject: [PATCH 36/40] Nullchecks. And one zero division. --- code/game/objects/items/devices/taperecorder.dm | 4 ++-- code/modules/admin/verbs/adminsay.dm | 2 +- code/modules/paperwork/paper.dm | 2 +- code/modules/power/smes.dm | 2 +- code/modules/research/xenoarchaeology/artifact_analysis.dm | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index e98c28e7dc4..555dbe1caea 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -124,8 +124,8 @@ usr << "You can't clear the memory while playing or recording!" return else - storedinfo -= storedinfo - timestamp -= timestamp + if(storedinfo) storedinfo.Cut() + if(timestamp) timestamp.Cut() timerecorded = 0 usr << "Memory cleared." return diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index f567abc87e0..8175482402c 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -25,7 +25,7 @@ for (var/client/C in admin_list) if (src.holder.rank == "Admin Observer") C << "ADMIN: [key_name(usr, C)]: [msg]" - else if(C.holder.level != 0) + else if(C.holder && C.holder.level != 0) C << "ADMIN: [key_name(usr, C)] (JMP): [msg]" /client/proc/cmd_mod_say(msg as text) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 16fa20c5de5..c007425c9b8 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -226,7 +226,7 @@ /obj/item/weapon/paper/Topic(href, href_list) ..() - if((usr.stat || usr.restrained())) + if(!usr || (usr.stat || usr.restrained())) return if(href_list["write"]) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 63f9f9ab3d9..a0f320873ac 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -61,7 +61,7 @@ /obj/machinery/power/smes/proc/chargedisplay() - return round(5.5*charge/capacity) + return round(5.5*charge/(capacity ? capacity : 5e6)) #define SMESRATE 0.05 // rate of internal charge to external power diff --git a/code/modules/research/xenoarchaeology/artifact_analysis.dm b/code/modules/research/xenoarchaeology/artifact_analysis.dm index 1a83768937b..5225b650e7f 100644 --- a/code/modules/research/xenoarchaeology/artifact_analysis.dm +++ b/code/modules/research/xenoarchaeology/artifact_analysis.dm @@ -221,7 +221,7 @@ findarti++ cur_artifact = A if (findarti == 1) - if(cur_artifact.being_used) + if(cur_artifact && cur_artifact.being_used) var/message = "[src] states, \"Cannot analyse. Excess energy drain is disrupting signal.\"" src.visible_message(message, message) else From 558097d87d37cc22586a5d3fc1eeda710e62696f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 21 Nov 2012 21:49:33 +0400 Subject: [PATCH 37/40] Attempt to fix mods not loading on main server. I STILL THINK MLOC SHOULD UNLAZY AND CHECK PERMISSIONS OR SOMETHING. --- code/world.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index b73100d519f..917ccc1d3cc 100644 --- a/code/world.dm +++ b/code/world.dm @@ -18,8 +18,8 @@ src.load_mode() src.load_motd() - src.load_mods() src.load_admins() + src.load_mods() investigate_reset() if (config.usewhitelist) load_whitelist() From 7150999fc6920ee950571b7a62b20c9599752501 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 21 Nov 2012 22:29:46 +0400 Subject: [PATCH 38/40] Rolling pins now work not inly only in full moon at the odd day of week between 1 and 3 am if stars are right. Fixes issue #1980 --- code/game/objects/items/weapons/kitchen.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index b91b5a560d3..2ab6bbc9caf 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -86,13 +86,12 @@ else H.Stun(time) if(H.stat != 2) H.stat = 1 - for(var/mob/O in viewers(H, null)) - O.show_message(text("\red [] has been knocked unconscious!", H), 1, "\red You hear someone fall.", 2) + user.visible_message("\red [H] has been knocked unconscious!", "\red You knock [H] unconscious!") + return else - H << text("\red [] tried to knock you unconscious!",user) + H.visible_message("\red [user] tried to knock [H] unconscious!", "\red [user] tried to knock you unconscious!") H.eye_blurry += 3 - - return + return ..() /* * Trays - Agouri From 8270ea9b9e134aafb5c038867d7993005da673d9 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Wed, 21 Nov 2012 23:05:13 +0400 Subject: [PATCH 39/40] Made incubator eat right chems, issue #1991 --- code/WorkInProgress/virus2/dishincubator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/WorkInProgress/virus2/dishincubator.dm b/code/WorkInProgress/virus2/dishincubator.dm index e6d0da12394..f2aefe07ead 100644 --- a/code/WorkInProgress/virus2/dishincubator.dm +++ b/code/WorkInProgress/virus2/dishincubator.dm @@ -165,5 +165,5 @@ if(beaker) if(!beaker.reagents.remove_reagent("virusfood",5)) foodsupply += 10 - if(!beaker.reagents.remove_reagent("toxins",1)) + if(!beaker.reagents.remove_reagent("toxin",1)) toxins += 1 \ No newline at end of file From eb1d24429a68935aab4cf2a34e06bf54d2b2ca8e Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 22 Nov 2012 15:16:17 +0400 Subject: [PATCH 40/40] Fixed typo and wrong colors for ribcage surgery messages. --- code/WorkInProgress/surgery.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index 3989e7d8804..71ee76d797d 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -1093,8 +1093,8 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) target.custom_pain("Something hurts horribly in your chest!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/msg = "[user] bends [target]'s ribcage back into place with \the [tool]." - var/self_msg = "You bends [target]'s ribcage back into place with \the [tool]." + var/msg = "\blue [user] bends [target]'s ribcage back into place with \the [tool]." + var/self_msg = "\blue You bend [target]'s ribcage back into place with \the [tool]." user.visible_message(msg, self_msg) target.ribcage_op_stage = 1 @@ -1116,8 +1116,8 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/msg = "[user] applied \the [tool] to [target]'s ribcage." - var/self_msg = "You applied \the [tool] to [target]'s ribcage." + var/msg = "\blue [user] applied \the [tool] to [target]'s ribcage." + var/self_msg = "\blue You applied \the [tool] to [target]'s ribcage." user.visible_message(msg, self_msg) target.ribcage_op_stage = 0 @@ -1168,8 +1168,8 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/chest/affected = target.get_organ("chest") - user.visible_message("[user] mends the rupture in [target]'s lungs with \the [tool].", \ - "You mend the rupture in [target]'s lungs with \the [tool]." ) + user.visible_message("\blue [user] mends the rupture in [target]'s lungs with \the [tool].", \ + "\blue You mend the rupture in [target]'s lungs with \the [tool]." ) affected.ruptured_lungs = 0 fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)