-
-
Notifications
You must be signed in to change notification settings - Fork 457
New midround antag: Demons of Sin #13321
Changes from all commits
f45aa26
6e43c18
78f3310
45617e6
f57ca14
7025d48
254c993
b4ef42f
d00fe23
8e9fe28
c1bd1f6
c707add
5322cb7
174bdef
17b7d48
99cb39d
3555fd9
3854bb0
10816c1
887c5d2
02d04bc
835a264
3a76a13
d03ac01
9167921
1a92fa8
404f4b8
80c5a35
6a1ed8c
d551a94
0c35090
699bdc3
9a4165b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,173 @@ | ||||||
| #define SIN_GLUTTONY "gluttony" | ||||||
| #define SIN_GREED "greed" | ||||||
| #define SIN_SLOTH "sloth" | ||||||
| #define SIN_WRATH "wrath" | ||||||
| #define SIN_ENVY "envy" | ||||||
| #define SIN_PRIDE "pride" | ||||||
|
|
||||||
| /mob/living/carbon/human/Life() | ||||||
| . = ..() | ||||||
| if(is_sinfuldemon(src)) | ||||||
| var/datum/antagonist/sinfuldemon/demon = mind.has_antag_datum(/datum/antagonist/sinfuldemon) | ||||||
| demon.sinfuldemon_life() | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon | ||||||
| name = "Sinful Demon" | ||||||
| roundend_category = "demons of sin" | ||||||
| antagpanel_category = "Demon" | ||||||
| job_rank = ROLE_SINFULDEMON | ||||||
| show_to_ghosts = TRUE | ||||||
| ///The sin a specific demon is assigned to. Defines what objectives and powers they'll receive. | ||||||
| var/demonsin | ||||||
Marmio64 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| ///The list of choosable sins for demons. One will be assigned to a demon when spawned naturally. | ||||||
| var/static/list/demonsins = list(SIN_GLUTTONY, SIN_GREED, SIN_WRATH, SIN_ENVY, SIN_PRIDE) | ||||||
| var/static/list/demon_spells = typecacheof(list( | ||||||
Marmio64 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| /obj/effect/proc_holder/spell/targeted/shapeshift/demon, | ||||||
| /obj/effect/proc_holder/spell/targeted/shapeshift/demon/gluttony, | ||||||
| /obj/effect/proc_holder/spell/targeted/shapeshift/demon/wrath, | ||||||
| /obj/effect/proc_holder/spell/targeted/forcewall/gluttony, | ||||||
| /obj/effect/proc_holder/spell/aoe_turf/conjure/summon_greedslots, | ||||||
| /obj/effect/proc_holder/spell/targeted/inflict_handler/ignite, | ||||||
| /obj/effect/proc_holder/spell/targeted/touch/envy, | ||||||
| /obj/effect/proc_holder/spell/aoe_turf/conjure/summon_mirror)) | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/proc/sinfuldemon_life() | ||||||
| var/mob/living/carbon/C = owner.current | ||||||
| if(!C) | ||||||
| return | ||||||
| if(istype(get_area(C), /area/chapel)) | ||||||
| demon_burn() | ||||||
|
|
||||||
| ///Handles burning and hurting sinful demons while they're in the chapel. | ||||||
| /datum/antagonist/sinfuldemon/proc/demon_burn() //sinful demons are even more vulnerable to the chapel than vampires, but can turn into their true form to negate this. | ||||||
| var/mob/living/L = owner.current | ||||||
| if(!L) | ||||||
| return | ||||||
| if(L.stat != DEAD) //demons however wont dust from the chapel so this needs to be a check to avoid spam while they're already dead | ||||||
| if(prob(50) && L.health >= 50) | ||||||
| switch(L.health) | ||||||
| if(85 to 100) | ||||||
| L.visible_message(span_warning("[L]'s skin begins to heat up and darken!"), span_danger("Your flesh begins to sear...")) | ||||||
| if(60 to 85) | ||||||
| L.visible_message(span_warning("[L]'s skin begins to melt apart!"), span_danger("Your skin is melting!"), "You hear sizzling.") | ||||||
| L.adjustFireLoss(5) | ||||||
| else if(L.health < 60) | ||||||
| if(!L.on_fire) | ||||||
| L.visible_message(span_warning("[L] lights up in a holy blaze!"), span_danger("Your skin catches fire!")) | ||||||
| L.emote("scream") | ||||||
| else | ||||||
| L.visible_message(span_warning("[L] continues to burn!"), span_danger("You continue to burn!")) | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. won't this just keep spamming while they're alive and in the chapel?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes, it is also what happens to vamps. It can fuck you up pretty fast so I thought to keep it. |
||||||
| L.adjust_fire_stacks(5) | ||||||
| L.IgniteMob() | ||||||
| return | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/New() | ||||||
| . = ..() | ||||||
| demonsin = pick(demonsins) | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/proc/forge_objectives() | ||||||
| var/datum/objective/demon/O | ||||||
| switch(demonsin)//the 5 most interesting of the 8 sins. Left out sloth because it sounds boring, couldn't think of a good enough objective/power for acedia, and lust for obvious reasons. | ||||||
| if(SIN_GLUTTONY) | ||||||
| O = new /datum/objective/demon/gluttony | ||||||
| if(SIN_GREED) | ||||||
| O = new /datum/objective/demon/greed | ||||||
| if(SIN_WRATH) | ||||||
| O = new /datum/objective/demon/wrath | ||||||
| if(prob(50)) | ||||||
| var/N = pick(/datum/objective/assassinate, /datum/objective/assassinate/cloned, /datum/objective/assassinate/once) | ||||||
| var/datum/objective/assassinate/kill_objective = new N | ||||||
| kill_objective.owner = owner | ||||||
| kill_objective.find_target() | ||||||
| objectives += kill_objective | ||||||
| if(SIN_ENVY) | ||||||
| O = new /datum/objective/demon/envy | ||||||
| if(prob(50)) | ||||||
| var/datum/objective/escape/escape_with_identity/identity_theft = new | ||||||
| identity_theft.owner = owner | ||||||
| identity_theft.find_target() | ||||||
| identity_theft.update_explanation_text() | ||||||
| objectives += identity_theft | ||||||
| if(SIN_PRIDE) | ||||||
| O = new /datum/objective/demon/pride | ||||||
| objectives += O | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/can_be_owned(datum/mind/new_owner) | ||||||
| . = ..() | ||||||
| return . && (ishuman(new_owner.current) || iscyborg(new_owner.current)) | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/admin_add(datum/mind/new_owner,mob/admin) | ||||||
| var/choices = demonsins + "Random" | ||||||
| var/chosen_sin = input(admin,"What kind ?","Sin kind") as null|anything in choices | ||||||
| if(!chosen_sin) | ||||||
| return | ||||||
| if(chosen_sin in demonsins) | ||||||
| demonsin = chosen_sin | ||||||
| new_owner.add_antag_datum(src) | ||||||
| message_admins("[key_name_admin(admin)] has demonized [key_name_admin(new_owner)].") | ||||||
| log_admin("[key_name(admin)] has demonized [key_name(new_owner)].") | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/antag_listing_name() | ||||||
| return ..() + "(, demon of [demonsin])" // Boris Smith, demon of Wrath | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Wouldn't this just end up being Boris Smith (, demon of Wrath)? |
||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/greet() | ||||||
| to_chat(owner.current, span_warning("<b>You remember your link to the infernal. You are a demon of [demonsin] released from hell to spread sin amongst the living.</b>")) | ||||||
| to_chat(owner.current, span_warning("<b>However, your infernal form is not without weaknesses.</b>")) | ||||||
| to_chat(owner.current, "You are incredibly vulnerable to holy artifacts and influence.") | ||||||
| to_chat(owner.current, "While blessed with the unholy ability to transform into your true form, this form is extremely obvious and vulnerable to holy weapons.") | ||||||
| to_chat(owner.current, "[span_warning("Do your best to complete your objectives without unnessecary death, unless you are a wrathful demon.")]<br>") | ||||||
| owner.announce_objectives() | ||||||
| SEND_SOUND(owner.current, sound('sound/magic/ethereal_exit.ogg')) | ||||||
| .=..() | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/on_gain() | ||||||
| forge_objectives() | ||||||
| owner.special_role = "sinfuldemon" | ||||||
| owner.current.faction += "hell" | ||||||
| if(owner.assigned_role == "Clown" && ishuman(owner.current)) | ||||||
| var/mob/living/carbon/human/S = owner.current | ||||||
| to_chat(S, span_notice("Your infernal nature has allowed you to overcome your clownishness.")) | ||||||
| S.dna.remove_mutation(CLOWNMUT) | ||||||
| switch(demonsin) | ||||||
| if(SIN_GLUTTONY) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon/gluttony) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall/gluttony) | ||||||
| if(SIN_GREED) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/summon_greedslots) | ||||||
| if(SIN_WRATH) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon/wrath) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/ignite) | ||||||
| if(SIN_ENVY) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/envy) | ||||||
| if(SIN_PRIDE) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon) | ||||||
| owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/summon_mirror) | ||||||
| .=..() | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/on_removal() | ||||||
| owner.special_role = null | ||||||
| owner.current.faction -= "hell" | ||||||
| remove_spells() | ||||||
| to_chat(owner.current, span_userdanger("Your infernal link has been severed! You are no longer a demon!")) | ||||||
| .=..() | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/proc/remove_spells() | ||||||
| for(var/X in owner.spell_list) | ||||||
| var/obj/effect/proc_holder/spell/S = X | ||||||
| if(is_type_in_typecache(S, demon_spells)) | ||||||
| owner.RemoveSpell(S) | ||||||
|
|
||||||
| /datum/antagonist/sinfuldemon/roundend_report() | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. no greentext? sad
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For what? The flavor objectives that autocomplete give you an auto greentext but I haven't tested the assassinate or steal identity ones, though they should also work. |
||||||
| var/list/parts = list() | ||||||
| parts += printplayer(owner) | ||||||
| parts += printobjectives(objectives) | ||||||
| return parts.Join("<br>") | ||||||
|
|
||||||
| #undef SIN_ENVY | ||||||
| #undef SIN_GLUTTONY | ||||||
| #undef SIN_GREED | ||||||
| #undef SIN_PRIDE | ||||||
| #undef SIN_SLOTH | ||||||
| #undef SIN_WRATH | ||||||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,68 @@ | ||||||
| /obj/effect/proc_holder/spell/targeted/shapeshift/demon //emergency get out of jail card. | ||||||
| name = "Lesser Demon Form" | ||||||
| desc = "Take on your true demon form. This form is strong but very obvious, and especially weak to holy influence. \ | ||||||
| Also, note that damage taken in this form can transform into your normal body. Heal by attacking living creatures before transforming back if gravely wounded!" | ||||||
| invocation = "COWER, MORTALS!!" | ||||||
| shapeshift_type = /mob/living/simple_animal/lesserdemon | ||||||
| action_icon = 'icons/mob/actions/actions_minor_antag.dmi' | ||||||
| action_icon_state = "daemontransform" | ||||||
| action_background_icon_state = "bg_demon" | ||||||
|
|
||||||
| /mob/living/simple_animal/lesserdemon | ||||||
| name = "demon" | ||||||
| real_name = "demon" | ||||||
| desc = "A large, menacing creature covered in armored red scales." | ||||||
| speak_emote = list("cackles") | ||||||
| emote_hear = list("cackles","screeches") | ||||||
| response_help = "thinks better of touching" | ||||||
| response_disarm = "flails at" | ||||||
| response_harm = "punches" | ||||||
| icon = 'icons/mob/mob.dmi' | ||||||
| icon_state = "lesserdaemon" | ||||||
| icon_living = "lesserdaemon" | ||||||
| mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) | ||||||
| speed = 0.33 | ||||||
| a_intent = INTENT_HARM | ||||||
| stop_automated_movement = 1 | ||||||
| status_flags = CANPUSH | ||||||
| attack_sound = 'sound/magic/demon_attack1.ogg' | ||||||
| deathsound = 'sound/magic/demon_dies.ogg' | ||||||
| deathmessage = "wails in anger and fear as it collapses in defeat!" | ||||||
| atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) | ||||||
| minbodytemp = 250 //Weak to cold | ||||||
| maxbodytemp = INFINITY | ||||||
| faction = list("hell") | ||||||
| attacktext = "wildly tears into" | ||||||
| maxHealth = 200 | ||||||
| health = 200 | ||||||
| environment_smash = ENVIRONMENT_SMASH_STRUCTURES | ||||||
| obj_damage = 40 | ||||||
| melee_damage_lower = 24 | ||||||
| melee_damage_upper = 24 | ||||||
| wound_bonus = -15 | ||||||
| see_in_dark = 8 | ||||||
| lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE | ||||||
| loot = (/obj/effect/decal/cleanable/blood) | ||||||
| del_on_death = 1 | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| /mob/living/simple_animal/lesserdemon/attackby(obj/item/W, mob/living/user, params) | ||||||
| . = ..() | ||||||
| if(istype(W, /obj/item/nullrod)) | ||||||
| visible_message(span_warning("[src] screams in unholy pain from the blow!"), \ | ||||||
| span_cult("As \the [W] hits you, you feel holy power blast through your form, tearing it apart!")) | ||||||
| adjustBruteLoss(22) //22 extra damage from the nullrod while in your true form. On average this means 40 damage is taken now. | ||||||
|
|
||||||
| /mob/living/simple_animal/lesserdemon/UnarmedAttack(mob/living/L, proximity)//10 hp healed from landing a hit. | ||||||
| if(isliving(L)) | ||||||
| if(L.stat != DEAD && !L.anti_magic_check(TRUE, TRUE)) //demons do not gain succor from the dead or holy | ||||||
| adjustHealth(-maxHealth * 0.05) | ||||||
| return ..() | ||||||
|
|
||||||
| /mob/living/simple_animal/lesserdemon/Life() | ||||||
| . = ..() | ||||||
| if(!src) | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| return | ||||||
| if(istype(get_area(src.loc), /area/chapel)) //being a non-carbon will not save you! | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| if(src.stat != DEAD) //being dead, however, will save you | ||||||
| src.visible_message(span_warning("[src] begins to melt apart!"), span_danger("Your very soul melts from the holy room!"), "You hear sizzling.") | ||||||
| adjustHealth(20) //20 damage every ~2 seconds. About 20 seconds for a full HP demon to melt apart in the chapel. | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| /datum/objective/demon | ||
| completed = TRUE | ||
|
|
||
| /datum/objective/demon/gluttony | ||
| explanation_text = "Devour as much food as possible." | ||
|
|
||
| /datum/objective/demon/greed | ||
| explanation_text = "Acquire as much wealth as possible." | ||
|
|
||
| /datum/objective/demon/wrath | ||
| explanation_text = "Inflict as much pain as possible." | ||
|
|
||
| /datum/objective/demon/envy | ||
| explanation_text = "Do not allow anyone to become more popular than you." | ||
|
|
||
| /datum/objective/demon/pride | ||
| explanation_text = "Become as popular, powerful, and influential to as many people possible." |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| /obj/effect/proc_holder/spell/targeted/touch/envy | ||
| name = "Vanity Steal" | ||
| desc = "Engulfs your arm in a jealous might, allowing you to steal the look of the first human-like struck with it. Note, the form change is not reversible." | ||
| hand_path = /obj/item/melee/touch_attack/envy | ||
| school = "evocation" | ||
| charge_max = 150 | ||
| clothes_req = FALSE | ||
| invocation = "ETERNAL FLAMES" | ||
| invocation_type = "whisper" | ||
| action_icon = 'icons/mob/actions/actions_changeling.dmi' | ||
| action_icon_state = "transform" | ||
| action_background_icon_state = "bg_demon" | ||
|
|
||
| /obj/item/melee/touch_attack/envy | ||
| name = "Envious Hand" | ||
| desc = "A writhing, burning aura of jealousy, ready to be unleashed." | ||
Marmio64 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| icon_state = "flagellation" | ||
| item_state = "hivemind" | ||
| catchphrase = "I'M BETTER THAN YOU!!" | ||
|
|
||
| /obj/item/melee/touch_attack/envy/afterattack(atom/target, mob/living/carbon/human/user, proximity_flag, click_parameters) | ||
| if(!proximity_flag) | ||
| return | ||
| var/mob/living/M = target | ||
| if(M.anti_magic_check()) | ||
| to_chat(user, span_warning("[M] resists your unholy jealousy!")) | ||
| to_chat(M, span_warning("A creeping feeling of jealousy dances around your mind before being suddenly dispelled.")) | ||
| ..() | ||
| return | ||
| playsound(user, 'sound/magic/demon_attack1.ogg', 75, TRUE) | ||
| if(ishuman(target)) | ||
| var/mob/living/carbon/human/H = target | ||
| if(user.real_name != H.dna.real_name) | ||
| user.real_name = H.dna.real_name | ||
| H.dna.transfer_identity(user, transfer_SE=1) | ||
| user.updateappearance(mutcolor_update=1) | ||
| user.domutcheck() | ||
| user.visible_message(span_warning("[user]'s appearance shifts into [H]'s!"), \ | ||
| span_boldannounce("[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] <i>sooo</i> much better than you. Not anymore, [H.p_they()] won't.")) | ||
| return ..() | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,56 @@ | ||||||
| /obj/effect/proc_holder/spell/targeted/forcewall/gluttony | ||||||
| name = "Gluttonous Wall" | ||||||
| desc = "Create a magical barrier that only allows fat people to pass through." | ||||||
| school = "transmutation" | ||||||
| charge_max = 150 | ||||||
| clothes_req = FALSE | ||||||
| invocation = "INDULGE" | ||||||
| invocation_type = "shout" | ||||||
| sound = 'sound/magic/forcewall.ogg' | ||||||
| action_icon = 'icons/mob/actions/actions_minor_antag.dmi' | ||||||
| action_icon_state = "blob" | ||||||
| action_background_icon_state = "bg_demon" | ||||||
| range = -1 | ||||||
| include_user = TRUE | ||||||
| cooldown_min = 50 //12 deciseconds reduction per rank | ||||||
| wall_type = /obj/effect/gluttony/timed | ||||||
|
|
||||||
| /obj/effect/proc_holder/spell/targeted/shapeshift/demon/gluttony //emergency get out of jail card, but better. It also eats everything. | ||||||
| name = "Gluttony Demon Form" | ||||||
| desc = "Take on your true demon form. This form is strong but very obvious and especially weak to holy influence. \ | ||||||
| Also, note that damage taken in this form can transform into your normal body. Heal by attacking living creatures before transforming back if gravely wounded! \ | ||||||
| Your unique form as a demon of gluttony also allows you to eat corpses to heal yourself." | ||||||
| shapeshift_type = /mob/living/simple_animal/lesserdemon/gluttony | ||||||
|
|
||||||
| /mob/living/simple_animal/lesserdemon/gluttony //capable of devouring corpses for health | ||||||
| name = "gluttonous demon" | ||||||
| real_name = "gluttonous demon" | ||||||
| icon_state = "lesserdaemon_gluttony" | ||||||
| icon_living = "lesserdaemon_gluttony" | ||||||
|
|
||||||
| /mob/living/simple_animal/lesserdemon/gluttony/UnarmedAttack(mob/living/L) | ||||||
| if(isliving(L)) //Eat Corpses to regen health | ||||||
| if(L.stat == DEAD) | ||||||
| if(do_after(src, 3 SECONDS, target = L)) | ||||||
| devour(L) | ||||||
| return | ||||||
| return ..() | ||||||
|
|
||||||
| /mob/living/simple_animal/lesserdemon/gluttony/proc/devour(mob/living/L) | ||||||
| if(!L) | ||||||
| return FALSE | ||||||
| visible_message( | ||||||
| span_danger("[src] devours [L]!"), | ||||||
| span_userdanger("You feast on [L], restoring your health!")) | ||||||
| adjustBruteLoss(-50) | ||||||
| L.gib() | ||||||
| return TRUE | ||||||
|
|
||||||
| /obj/effect/gluttony/timed | ||||||
| ///Time in deciseconds before it deletes itself. | ||||||
| var/timeleft = 150 | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| /obj/effect/gluttony/timed/Initialize() | ||||||
| . = ..() | ||||||
| if(timeleft) | ||||||
| QDEL_IN(src, timeleft) | ||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
early return might be good here.