Merge branch 'Citadel-Station-13:master' into WanderingFox95-TribalOverhaul
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
return TRUE
|
||||
/datum/surgery_step/revive
|
||||
name = "electrically stimulate brain"
|
||||
implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60)
|
||||
implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/rod_of_asclepius = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60)
|
||||
time = 120
|
||||
/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool)
|
||||
. = TRUE
|
||||
@@ -69,7 +69,7 @@
|
||||
for(var/obj/item/organ/O in target.internal_organs)//zap those buggers back to life!
|
||||
if(O.organ_flags & ORGAN_FAILING)
|
||||
O.applyOrganDamage(-5)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
|
||||
var/late = timelimit && (tplus > timelimit)
|
||||
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
needs_processing = .
|
||||
|
||||
//Return TRUE to get whatever mob this is in to update health.
|
||||
/obj/item/bodypart/proc/on_life()
|
||||
/obj/item/bodypart/proc/on_life(seconds, times_fired)
|
||||
if(stam_heal_tick && stamina_dam > DAMAGE_PRECISION) //DO NOT update health here, it'll be done in the carbon's life.
|
||||
if(heal_damage(brute = 0, burn = 0, stamina = (stam_heal_tick * (disabled ? 2 : 1)), only_robotic = FALSE, only_organic = FALSE, updating_health = FALSE))
|
||||
. |= BODYPART_LIFE_UPDATE_HEALTH
|
||||
@@ -792,6 +792,7 @@
|
||||
. += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
|
||||
var/image/second_limb
|
||||
var/list/aux = list()
|
||||
var/list/auxmarking = list()
|
||||
|
||||
@@ -825,6 +826,11 @@
|
||||
else
|
||||
limb.icon_state = "[species_id]_[body_zone]"
|
||||
|
||||
if(istype(src, /obj/item/bodypart/l_leg) || istype(src, /obj/item/bodypart/r_leg))
|
||||
second_limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
|
||||
second_limb.icon = limb.icon
|
||||
. += second_limb
|
||||
|
||||
// Body markings
|
||||
if(length(body_markings_list))
|
||||
if(species_id == "husk")
|
||||
@@ -913,7 +919,8 @@
|
||||
draw_color = "#[draw_color]"
|
||||
if(draw_color)
|
||||
if(grayscale)
|
||||
limb.icon_state += "_g"
|
||||
if(!second_limb)
|
||||
limb.icon_state += "_g"
|
||||
limb.color = draw_color
|
||||
if(aux_icons)
|
||||
for(var/a in aux)
|
||||
@@ -931,6 +938,12 @@
|
||||
for(var/image/marking in markings_list)
|
||||
marking.color = "#141414"
|
||||
|
||||
if(second_limb)
|
||||
var/original_state = limb.icon_state
|
||||
limb.icon_state = "[original_state]_front"
|
||||
second_limb.icon_state = "[original_state]_behind"
|
||||
second_limb.color = limb.color
|
||||
|
||||
/obj/item/bodypart/deconstruct(disassembled = TRUE)
|
||||
drop_organs()
|
||||
qdel(src)
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
C.handcuffed = null
|
||||
C.update_handcuffed()
|
||||
if(C.hud_used)
|
||||
var/obj/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"]
|
||||
var/atom/movable/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"]
|
||||
if(R)
|
||||
R.update_icon()
|
||||
if(C.gloves)
|
||||
@@ -255,7 +255,7 @@
|
||||
C.handcuffed = null
|
||||
C.update_handcuffed()
|
||||
if(C.hud_used)
|
||||
var/obj/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"]
|
||||
var/atom/movable/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"]
|
||||
if(L)
|
||||
L.update_icon()
|
||||
if(C.gloves)
|
||||
@@ -340,7 +340,7 @@
|
||||
if(C.dna.species.mutanthands && !is_pseudopart)
|
||||
C.put_in_hand(new C.dna.species.mutanthands(), held_index)
|
||||
if(C.hud_used)
|
||||
var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"]
|
||||
var/atom/movable/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"]
|
||||
if(hand)
|
||||
hand.update_icon()
|
||||
C.update_inv_gloves()
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
if(held_index)
|
||||
owner.dropItemToGround(owner.get_item_for_held_index(held_index))
|
||||
if(owner.hud_used)
|
||||
var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"]
|
||||
var/atom/movable/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"]
|
||||
if(L)
|
||||
L.update_icon()
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
if(held_index)
|
||||
owner.dropItemToGround(owner.get_item_for_held_index(held_index))
|
||||
if(owner.hud_used)
|
||||
var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"]
|
||||
var/atom/movable/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"]
|
||||
if(R)
|
||||
R.update_icon()
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
if(target.revive())
|
||||
target.visible_message("...[target]'s posibrain flickers to life once again!")
|
||||
target.emote("ping")
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
|
||||
var/late = timelimit && (tplus > timelimit)
|
||||
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
return
|
||||
switch(eye_damaged)
|
||||
if(BLURRY_VISION_ONE, BLURRY_VISION_TWO)
|
||||
owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged)
|
||||
owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, eye_damaged)
|
||||
if(BLIND_VISION_THREE)
|
||||
owner.become_blind(EYE_DAMAGE)
|
||||
if(ishuman(owner))
|
||||
@@ -106,7 +106,7 @@
|
||||
else if(eye_damaged == BLIND_VISION_THREE)
|
||||
owner.become_blind(EYE_DAMAGE)
|
||||
if(eye_damaged && eye_damaged != BLIND_VISION_THREE)
|
||||
owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged)
|
||||
owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, eye_damaged)
|
||||
else
|
||||
owner.clear_fullscreen("eye_damage")
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/cachedmoveCalc = 1
|
||||
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5)
|
||||
|
||||
/obj/item/organ/liver/on_life()
|
||||
/obj/item/organ/liver/on_life(seconds, times_fired)
|
||||
. = ..()
|
||||
if(!. || !owner)//can't process reagents with a failing liver
|
||||
return
|
||||
@@ -40,7 +40,7 @@
|
||||
damage += (thisamount*toxLethality)
|
||||
|
||||
//metabolize reagents
|
||||
owner.reagents.metabolize(owner, can_overdose=TRUE)
|
||||
owner.reagents.metabolize(owner, seconds, times_fired, can_overdose=TRUE)
|
||||
|
||||
if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability
|
||||
to_chat(owner, "<span class='warning'>You feel a dull pain in your abdomen.</span>")
|
||||
|
||||
@@ -54,7 +54,8 @@
|
||||
|
||||
var/SA_para_min = 1 //nitrous values
|
||||
var/SA_sleep_min = 5
|
||||
var/BZ_trip_balls_min = 1 //BZ gas
|
||||
var/BZ_trip_balls_min = 0.1 //BZ gas
|
||||
var/BZ_brain_damage_min = 1
|
||||
var/gas_stimulation_min = 0.002 //Nitryl and Stimulum
|
||||
|
||||
var/cold_message = "your face freezing and an icicle forming"
|
||||
@@ -269,13 +270,13 @@
|
||||
// BZ
|
||||
|
||||
var/bz_pp = PP(breath, GAS_BZ)
|
||||
if(bz_pp > BZ_trip_balls_min)
|
||||
if(bz_pp > BZ_brain_damage_min)
|
||||
H.hallucination += 10
|
||||
H.reagents.add_reagent(/datum/reagent/bz_metabolites,5)
|
||||
if(prob(33))
|
||||
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
|
||||
|
||||
else if(bz_pp > 0.01)
|
||||
else if(bz_pp > BZ_trip_balls_min)
|
||||
H.hallucination += 5
|
||||
H.reagents.add_reagent(/datum/reagent/bz_metabolites,1)
|
||||
|
||||
@@ -476,7 +477,7 @@
|
||||
)
|
||||
SA_para_min = 30
|
||||
SA_sleep_min = 50
|
||||
BZ_trip_balls_min = 30
|
||||
BZ_brain_damage_min = 30
|
||||
emp_vulnerability = 3
|
||||
|
||||
cold_level_1_threshold = 200
|
||||
@@ -509,8 +510,29 @@
|
||||
heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3
|
||||
|
||||
/obj/item/organ/lungs/ashwalker/populate_gas_info()
|
||||
// humans usually breathe 21 but require 16/17, so 80% - 1, which is more lenient but it's fine
|
||||
#define SAFE_THRESHOLD_RATIO 0.8
|
||||
var/datum/gas_mixture/breath = SSair.planetary[LAVALAND_DEFAULT_ATMOS] // y'all know
|
||||
var/pressure = breath.return_pressure()
|
||||
var/total_moles = breath.total_moles()
|
||||
for(var/id in breath.get_gases())
|
||||
var/this_pressure = PP(breath, id)
|
||||
var/req_pressure = (this_pressure * SAFE_THRESHOLD_RATIO) - 1
|
||||
if(req_pressure > 0)
|
||||
gas_min[id] = req_pressure
|
||||
if(id in gas_max)
|
||||
gas_max[id] += this_pressure
|
||||
var/bz = breath.get_moles(GAS_BZ)
|
||||
if(bz)
|
||||
BZ_trip_balls_min += bz
|
||||
BZ_brain_damage_min += bz
|
||||
|
||||
gas_max[GAS_N2] = PP(breath, GAS_N2) + 5
|
||||
var/o2_pp = PP(breath, GAS_O2)
|
||||
safe_breath_min = 0.3 * o2_pp
|
||||
safe_breath_max = 1.3 * o2_pp
|
||||
..()
|
||||
gas_max[GAS_N2] = 28
|
||||
#undef SAFE_THRESHOLD_RATIO
|
||||
|
||||
/obj/item/organ/lungs/slime
|
||||
name = "vacuole"
|
||||
@@ -533,7 +555,7 @@
|
||||
var/total_moles = breath.total_moles()
|
||||
var/pressure = breath.return_pressure()
|
||||
var/plasma_pp = PP(breath, GAS_PLASMA)
|
||||
owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
|
||||
owner.adjust_integration_blood(0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
|
||||
|
||||
/obj/item/organ/lungs/yamerol
|
||||
name = "Yamerol lungs"
|
||||
|
||||
@@ -92,18 +92,18 @@
|
||||
on_death() //Kinda hate doing it like this, but I really don't want to call process directly.
|
||||
|
||||
//Sources; life.dm process_organs
|
||||
/obj/item/organ/proc/on_death() //Runs when outside AND inside.
|
||||
decay()
|
||||
/obj/item/organ/proc/on_death(seconds, times_fired) //Runs when outside AND inside.
|
||||
decay(seconds, times_fired)
|
||||
|
||||
//Applys the slow damage over time decay
|
||||
/obj/item/organ/proc/decay()
|
||||
/obj/item/organ/proc/decay(seconds, times_fired)
|
||||
if(!can_decay())
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return
|
||||
is_cold()
|
||||
if(organ_flags & ORGAN_FROZEN)
|
||||
return
|
||||
applyOrganDamage(maxHealth * decay_factor)
|
||||
applyOrganDamage(maxHealth * decay_factor * (seconds * 0.5))
|
||||
|
||||
/obj/item/organ/proc/can_decay()
|
||||
if(CHECK_BITFIELD(organ_flags, ORGAN_NO_SPOIL | ORGAN_SYNTHETIC | ORGAN_FAILING))
|
||||
@@ -151,7 +151,7 @@
|
||||
organ_flags &= ~ORGAN_FROZEN
|
||||
return FALSE
|
||||
|
||||
/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic
|
||||
/obj/item/organ/proc/on_life(seconds, times_fired) //repair organ damage if the organ is not failing or synthetic
|
||||
if(organ_flags & ORGAN_FAILING || !owner)
|
||||
return FALSE
|
||||
if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing.
|
||||
|
||||
@@ -62,13 +62,13 @@
|
||||
H.clear_alert("disgust")
|
||||
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust")
|
||||
if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS)
|
||||
H.throw_alert("disgust", /obj/screen/alert/gross)
|
||||
H.throw_alert("disgust", /atom/movable/screen/alert/gross)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/gross)
|
||||
if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED)
|
||||
H.throw_alert("disgust", /obj/screen/alert/verygross)
|
||||
H.throw_alert("disgust", /atom/movable/screen/alert/verygross)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/verygross)
|
||||
if(DISGUST_LEVEL_DISGUSTED to INFINITY)
|
||||
H.throw_alert("disgust", /obj/screen/alert/disgusted)
|
||||
H.throw_alert("disgust", /atom/movable/screen/alert/disgusted)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted)
|
||||
|
||||
/obj/item/organ/stomach/Remove(special = FALSE)
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
#define COOLDOWN_STUN 1200
|
||||
#define COOLDOWN_KNOCKDOWN 600
|
||||
#define COOLDOWN_DAMAGE 600
|
||||
#define COOLDOWN_MEME 300
|
||||
#define COOLDOWN_NONE 100
|
||||
#define COOLDOWN_STUN 300
|
||||
#define COOLDOWN_KNOCKDOWN 300
|
||||
#define COOLDOWN_DAMAGE 300
|
||||
#define COOLDOWN_MEME 150
|
||||
#define COOLDOWN_NONE 50
|
||||
|
||||
/// anything above this requires adminbus, to prevent a cultist from stacking chaplain + cult + specific listener = 8x, which is enough to instantly kill someone with damage.
|
||||
#define VOG_MAX_STANDARD_POWER 3
|
||||
/// max damage we can do in one "blast" to a listener
|
||||
#define VOG_MAX_BURST_DAMAGE 40
|
||||
/// max healing we can do in one "blast" to a listener
|
||||
#define VOG_MAX_BURST_HEAL 40
|
||||
|
||||
/obj/item/organ/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel
|
||||
name = "vocal cords"
|
||||
@@ -130,13 +137,11 @@
|
||||
return 0 //no cooldown
|
||||
|
||||
var/log_message = uppertext(message)
|
||||
if(!span_list || !span_list.len)
|
||||
if(iscultist(user))
|
||||
span_list = list("narsiesmall")
|
||||
else if (is_servant_of_ratvar(user))
|
||||
span_list = list("ratvar")
|
||||
else
|
||||
span_list = list()
|
||||
if(iscultist(user))
|
||||
span_list = list("narsiesmall")
|
||||
else if (is_servant_of_ratvar(user))
|
||||
span_list = list("ratvar")
|
||||
LAZYINITLIST(span_list)
|
||||
|
||||
user.say(message, spans = span_list, sanitize = FALSE)
|
||||
|
||||
@@ -156,39 +161,24 @@
|
||||
cooldown = COOLDOWN_NONE
|
||||
return cooldown
|
||||
|
||||
var/power_multiplier = base_multiplier
|
||||
|
||||
if(user.mind)
|
||||
//Chaplains are very good at speaking with the voice of god
|
||||
if(user.mind.assigned_role == "Chaplain")
|
||||
power_multiplier *= 2
|
||||
//Command staff has authority
|
||||
if(user.mind.assigned_role in GLOB.command_positions)
|
||||
power_multiplier *= 1.4
|
||||
//Why are you speaking
|
||||
if(user.mind.assigned_role == "Mime")
|
||||
power_multiplier *= 0.5
|
||||
|
||||
//Cultists are closer to their gods and are more powerful, but they'll give themselves away
|
||||
if(iscultist(user))
|
||||
power_multiplier *= 2
|
||||
else if (is_servant_of_ratvar(user))
|
||||
power_multiplier *= 2
|
||||
|
||||
//Try to check if the speaker specified a name or a job to focus on
|
||||
var/list/specific_listeners = list()
|
||||
var/found_string = null
|
||||
var/devil_target = FALSE
|
||||
|
||||
//Get the proper job titles
|
||||
message = get_full_job_name(message)
|
||||
|
||||
// limitation: this only checks at the start of the message.
|
||||
// if we wanted to check anywhere we'd have to make the user use delimiters to specify who they're talking to,
|
||||
// as otherwise it'd be far too computationally and logically expensive to find out who we want.
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
var/datum/antagonist/devil/devilinfo = is_devil(L)
|
||||
if(devilinfo && findtext(message, devilinfo.truename))
|
||||
var/start = findtext(message, devilinfo.truename)
|
||||
listeners = list(L) //Devil names are unique.
|
||||
power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up
|
||||
devil_target = TRUE //if you're a devil and god himself addressed you, you fucked up
|
||||
//Cut out the name so it doesn't trigger commands
|
||||
message = copytext(message, 1, start) + copytext(message, start + length(devilinfo.truename))
|
||||
break
|
||||
@@ -207,10 +197,14 @@
|
||||
//Cut out the job so it doesn't trigger commands
|
||||
found_string = L.mind.assigned_role
|
||||
|
||||
var/power_multiplier = get_vog_multiplier(user, base_multiplier, specific_listeners)
|
||||
var/adminbus = power_multiplier > VOG_MAX_STANDARD_POWER // an admin is being a dunce, bypass hard scaling limits on this message
|
||||
if(devil_target)
|
||||
power_multiplier = max(power_multiplier, 5)
|
||||
|
||||
if(specific_listeners.len)
|
||||
listeners = specific_listeners
|
||||
power_multiplier *= (1 + (1/specific_listeners.len)) //2x on a single guy, 1.5x on two and so on
|
||||
message = copytext(message, length(found_string) + 1)
|
||||
listeners = specific_listeners.Copy()
|
||||
|
||||
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
|
||||
var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown")
|
||||
@@ -264,7 +258,7 @@
|
||||
cooldown = COOLDOWN_STUN
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.Stagger(60 * power_multiplier)
|
||||
L.Stagger(40 * power_multiplier)
|
||||
|
||||
//KNOCKDOWN
|
||||
else if(findtext(message, knockdown_words))
|
||||
@@ -272,6 +266,7 @@
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.DefaultCombatKnockdown()
|
||||
L.Stagger(10 * power_multiplier)
|
||||
|
||||
//VOMIT
|
||||
else if((findtext(message, vomit_words)))
|
||||
@@ -285,13 +280,13 @@
|
||||
for(var/mob/living/carbon/C in listeners)
|
||||
if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime"))
|
||||
power_multiplier *= 3
|
||||
C.silent += (10 * power_multiplier)
|
||||
C.silent += (5 * power_multiplier)
|
||||
|
||||
//HALLUCINATE
|
||||
else if((findtext(message, hallucinate_words)))
|
||||
cooldown = COOLDOWN_MEME
|
||||
for(var/mob/living/carbon/C in listeners)
|
||||
new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0)
|
||||
new /datum/hallucination/delusion(C, TRUE, null, 150 * power_multiplier, 0)
|
||||
|
||||
//WAKE UP
|
||||
else if((findtext(message, wakeup_words)))
|
||||
@@ -305,14 +300,14 @@
|
||||
cooldown = COOLDOWN_DAMAGE
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, FALSE, FALSE)
|
||||
L.heal_overall_damage(min(17.5 * power_multiplier, adminbus? INFINITY : VOG_MAX_BURST_HEAL), min(17.5 * power_multiplier, VOG_MAX_BURST_HEAL), 0, FALSE, FALSE)
|
||||
|
||||
//BRUTE DAMAGE
|
||||
else if((findtext(message, hurt_words)))
|
||||
cooldown = COOLDOWN_DAMAGE
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST, wound_bonus=CANT_WOUND)
|
||||
L.apply_damage(min(20 * power_multiplier, adminbus? INFINITY : VOG_MAX_BURST_DAMAGE), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
|
||||
|
||||
//BLEED
|
||||
else if((findtext(message, bleed_words)))
|
||||
@@ -334,14 +329,14 @@
|
||||
cooldown = COOLDOWN_DAMAGE
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.adjust_bodytemperature(50 * power_multiplier)
|
||||
L.adjust_bodytemperature(75 * power_multiplier)
|
||||
|
||||
//COLD
|
||||
else if((findtext(message, cold_words)))
|
||||
cooldown = COOLDOWN_DAMAGE
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.adjust_bodytemperature(-50 * power_multiplier)
|
||||
L.adjust_bodytemperature(-75 * power_multiplier)
|
||||
|
||||
//REPULSE
|
||||
else if((findtext(message, repulse_words)))
|
||||
@@ -596,6 +591,34 @@
|
||||
|
||||
return cooldown
|
||||
|
||||
/proc/get_vog_multiplier(mob/living/carbon/user, base_multiplier = 1, list/specific_listeners = list())
|
||||
if(base_multiplier >= VOG_MAX_STANDARD_POWER)
|
||||
return base_multiplier // an admin bussed you and they probably didn't realize you were a chaplain/cultist.
|
||||
|
||||
var/special_check = get_vog_special(user)
|
||||
if(!special_check)
|
||||
return 0
|
||||
|
||||
. = min(base_multiplier * special_check, VOG_MAX_STANDARD_POWER) // anything above should require conscious admin fuckery, as things are balanced around 3 multiplier tops (see: damage being 15*3)
|
||||
if(!specific_listeners.len)
|
||||
return
|
||||
. = min(. * (1 + (1 / specific_listeners.len)), VOG_MAX_STANDARD_POWER)
|
||||
|
||||
/// get special role multiplier for voice of god. No double dipping.
|
||||
/proc/get_vog_special(mob/living/carbon/user)
|
||||
if(iscultist(user) || is_servant_of_ratvar(user))
|
||||
return 2 // servant of god
|
||||
if(user.mind)
|
||||
// servant of god
|
||||
if(user.mind.assigned_role == "Chaplain")
|
||||
return 2
|
||||
// shut up you broke your vow
|
||||
if(user.mind.assigned_role == "Mime")
|
||||
return 0.5
|
||||
if(user.mind.assigned_role in GLOB.command_positions)
|
||||
return 1.4 // heads are great at speaking with authority
|
||||
return 1
|
||||
|
||||
//////////////////////////////////////
|
||||
///////ENTHRAL VELVET CHORDS//////////
|
||||
//////////////////////////////////////
|
||||
|
||||
Reference in New Issue
Block a user