From 0e11e0c04166895d4dbbf08f5f6908c935acc769 Mon Sep 17 00:00:00 2001 From: cib Date: Thu, 15 Nov 2012 17:48:13 +0100 Subject: [PATCH 01/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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 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 Date: Fri, 16 Nov 2012 15:55:41 +0400 Subject: [PATCH 07/14] 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/14] 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/14] 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/14] 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 4ed9b40cb9a713b630d797b0c173acd24ba92d2d Mon Sep 17 00:00:00 2001 From: Ater Ignis Date: Fri, 16 Nov 2012 18:41:26 +0400 Subject: [PATCH 11/14] 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 12/14] 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 13/14] 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 14/14] 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