fix
This commit is contained in:
@@ -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,25 +161,6 @@
|
||||
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
|
||||
@@ -182,6 +168,9 @@
|
||||
//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)
|
||||
@@ -207,10 +196,12 @@
|
||||
//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(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 +255,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 +263,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 +277,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 +297,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? INFINTIY : VOG_MAX_BURST_DAMAGE), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
|
||||
|
||||
//BLEED
|
||||
else if((findtext(message, bleed_words)))
|
||||
@@ -334,14 +326,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 +588,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