From 303a52fdfa39f5bb085125be510029d2116ba5e6 Mon Sep 17 00:00:00 2001 From: volas Date: Sat, 7 Mar 2015 18:03:49 +0300 Subject: [PATCH] Port Heartbeat from Baystation12(#8386) Conflicts: code/modules/mob/living/carbon/human/life.dm --- code/modules/mob/living/carbon/human/life.dm | 55 ++++++++++++++----- sound/effects/singlebeat.ogg | Bin 0 -> 15260 bytes 2 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 sound/effects/singlebeat.ogg diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 47af54c0d0b..2667535e50d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -32,9 +32,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc var/pressure_alert = 0 var/prev_gender = null // Debug for plural genders var/temperature_alert = 0 - var/in_stasis = 0 + var/in_stasis = 0 var/exposedtimenow = 0 - var/firstexposed = 0 + var/firstexposed = 0 + var/heartbeat = 0 /mob/living/carbon/human/Life() set invisibility = 0 @@ -109,9 +110,11 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc handle_pain() handle_medical_side_effects() - + + handle_heartbeat() + if(stat == DEAD) - handle_decay() + handle_decay() handle_stasis_bag() @@ -464,8 +467,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc affected.add_autopsy_data("Suffocation", oxyloss) oxygen_alert = max(oxygen_alert, 1) - - return 0 + + return 0 return species.handle_breath(breath, src) @@ -498,7 +501,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc //Body temperature is too hot. fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode - if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2) + + if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2) take_overall_damage(burn=HEAT_DAMAGE_LEVEL_1, used_weapon = "High Body Temperature") fire_alert = max(fire_alert, 2) if(bodytemperature > species.heat_level_2 && bodytemperature <= species.heat_level_3) @@ -515,7 +519,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc else if(bodytemperature < species.cold_level_1) fire_alert = max(fire_alert, 1) if(status_flags & GODMODE) return 1 //godmode + if(stat == DEAD) return 1 //ZomgPonies -- No need for cold burn damage if dead + if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) if(bodytemperature >= species.cold_level_2 && bodytemperature <= species.cold_level_1) take_overall_damage(burn=COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature") @@ -1610,7 +1616,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc break return temp - + proc/handle_decay() var/decaytime = world.time - timeofdeath @@ -1645,6 +1651,22 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return H << "You smell something foul..." H.vomit() + + proc/handle_heartbeat() + if(pulse == PULSE_NONE) + return + + if(pulse >= PULSE_2FAST || shock_stage >= 10 || istype(get_turf(src), /turf/space)) + //PULSE_THREADY - maximum value for pulse, currently it 5. + //High pulse value corresponds to a fast rate of heartbeat. + //Divided by 2, otherwise it is too slow. + var/rate = (PULSE_THREADY - pulse)/2 + + if(heartbeat >= rate) + heartbeat = 0 + src << sound('sound/effects/singlebeat.ogg',0,0,0,60) + else + heartbeat++ /* Called by life(), instead of having the individual hud items update icons each tick and check for status changes @@ -1664,7 +1686,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc hud_list[HEALTH_HUD] = holder - if(hud_updateflag & 1 << STATUS_HUD) + + if(hud_updateflag & 1 << STATUS_HUD) var/foundVirus = 0 for (var/ID in virus2) if (ID in virusDB) @@ -1698,7 +1721,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc hud_list[STATUS_HUD] = holder hud_list[STATUS_HUD_OOC] = holder2 - if(hud_updateflag & 1 << ID_HUD) + + if(hud_updateflag & 1 << ID_HUD) var/image/holder = hud_list[ID_HUD] if(wear_id) var/obj/item/weapon/card/id/I = wear_id.GetID() @@ -1712,7 +1736,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc hud_list[ID_HUD] = holder - if(hud_updateflag & 1 << WANTED_HUD) + + if(hud_updateflag & 1 << WANTED_HUD) var/image/holder = hud_list[WANTED_HUD] holder.icon_state = "hudblank" var/perpname = name @@ -1737,7 +1762,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc break hud_list[WANTED_HUD] = holder - if(hud_updateflag & 1 << IMPLOYAL_HUD || hud_updateflag & 1 << IMPCHEM_HUD || hud_updateflag & 1 << IMPTRACK_HUD) + + if(hud_updateflag & 1 << IMPLOYAL_HUD || hud_updateflag & 1 << IMPCHEM_HUD || hud_updateflag & 1 << IMPTRACK_HUD) var/image/holder1 = hud_list[IMPTRACK_HUD] var/image/holder2 = hud_list[IMPLOYAL_HUD] var/image/holder3 = hud_list[IMPCHEM_HUD] @@ -1756,10 +1782,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc holder3.icon_state = "hud_imp_chem" hud_list[IMPTRACK_HUD] = holder1 - hud_list[IMPLOYAL_HUD] = holder2 + hud_list[IMPLOYAL_HUD] = holder2 hud_list[IMPCHEM_HUD] = holder3 - if(hud_updateflag & 1 << SPECIALROLE_HUD) + if(hud_updateflag & 1 << SPECIALROLE_HUD) var/image/holder = hud_list[SPECIALROLE_HUD] holder.icon_state = "hudblank" @@ -1848,6 +1874,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc speech_problem_flag = 1 return stuttering + // Need this in species. //#undef HUMAN_MAX_OXYLOSS //#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/sound/effects/singlebeat.ogg b/sound/effects/singlebeat.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8dd550d5d846306b03465cc1779f155bafc01c7e GIT binary patch literal 15260 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