diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 08403f49f6..c19145d2c0 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -165,6 +165,13 @@
else
message_admins("[key_name_admin(usr)] tried to create a revenant. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to create a revenant.")
+ if("qareen")
+ if(src.makeQareen())
+ message_admins("[key_name(usr)] created a qareen.")
+ log_admin("[key_name(usr)] created a qareen.")
+ else
+ message_admins("[key_name_admin(usr)] tried to create a qareen. Unfortunately, there were no candidates available.")
+ log_admin("[key_name(usr)] failed to create a qareen.")
else if(href_list["forceevent"])
if(!check_rights(R_FUN))
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 853748aff4..091764c419 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -23,6 +23,7 @@
Make CentCom Response Team (Requires Ghosts)
Make Abductor Team (Requires Ghosts)
Make Revenant (Requires Ghost)
+ Make Qareen (Requires Ghost)
"}
var/datum/browser/popup = new(usr, "oneclickantag", "Quick-Create Antagonist", 400, 400)
@@ -460,3 +461,7 @@
/datum/admins/proc/makeRevenant()
new /datum/round_event/ghost_role/revenant(TRUE, TRUE)
return 1
+
+/datum/admins/proc/makeQareen()
+ new /datum/round_event/ghost_role/qareen(TRUE, TRUE)
+ return 1
diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen.dm b/modular_splurt/code/modules/antagonists/qareen/qareen.dm
index f88516b667..24110b2f44 100644
--- a/modular_splurt/code/modules/antagonists/qareen/qareen.dm
+++ b/modular_splurt/code/modules/antagonists/qareen/qareen.dm
@@ -1,22 +1,10 @@
-//qareens: based off of wraiths from Goon
+//qareens: based off of revenant from TG
//"Ghosts" that are invisible and move like ghosts, cannot take damage while invisible
//Can hear deadchat, but are NOT normal ghosts and do NOT have x-ray vision
//Admin-spawn or random event
-// Qareen
-
-// | Harvest - gathering essence via absorbing cum stains from the floor instead of sucking corpses.
-// | Defile - (PREREQUISITE - LewdSpraycanSprites) - Add derogatory imagery and sprayed on stain imitations;
-// replace damage with stamina damage; replace "orbs of lightning" with "orbs of lust"?;
-// remove the part where it can destroy walls, windows, shooting lightning.
-// | Blight - instead of it having an ability that makes people depressed and making them take stamina and toxic damage
-// - make it so that it makes them horny and give them stamina damage - if they hit 0 stamina while affected by the virus
-// - make them cum in a 3x3 area around themselves and on everyone in the area. (giving food for Harvest)
-// - rename to bliss
-// Overload Light - color all lights in affected area pink instead ; replace "orbs of lightning" with "orbs of lust"
-// Malfunction (got no good ideas for this yet)
-// Replace objective of "Making the crew as miserable as possible" with "Make this station look like a cheap motel."
-// new ability - manifest - gives visible simplemob form
+// TODO
+// new ability - manifest - gives visible simplemob form untill de-activated (can still use abilities) (add after spriting)
#define INVISIBILITY_QAREEN 50
#define QAREEN_NAME_FILE "qareen_names.json"
@@ -470,7 +458,7 @@
qdel(qareen)
..()
-/proc/qareenThrow(over, mob/user, obj/item/throwable)
+/mob/living/simple_animal/qareen/proc/qareenThrow(over, mob/user, obj/item/throwable)
var/mob/living/simple_animal/qareen/spooker = user
if(!istype(throwable))
return
@@ -487,7 +475,7 @@
spooker.telekinesis_cooldown = TRUE
throwable.float(TRUE, TRUE)
sleep(20)
- throwable.DoQareenThrowEffects(over)
+ throwable.DoRevenantThrowEffects(over)
throwable.throw_at(over, 10, 2)
ADD_TRAIT(throwable, TRAIT_SPOOKY_THROW, "qareen")
log_combat(throwable, over, "spooky telekinesised at", throwable)
@@ -508,7 +496,7 @@
/datum/objective/qareen/New()
targetAmount = rand(150,300)
- explanation_text = "Absorb [targetAmount] points of essence from humans."
+ explanation_text = "Absorb [targetAmount] of essence from this sector of space."
..()
/datum/objective/qareen/check_completion()
@@ -526,16 +514,14 @@
/datum/objective/qareenFluff/New()
var/list/explanationTexts = list("Assist and exacerbate existing threats at critical moments.", \
- "Avoid killing in plain sight.", \
- "Cause as much chaos and anger as you can without being killed.", \
- "Damage and render as much of the station rusted and unusable as possible.", \
- "Disable and cause malfunctions in as many machines as possible.", \
- "Ensure that any holy weapons are rendered unusable.", \
- "Hinder the crew while attempting to avoid being noticed.", \
- "Make the crew as miserable as possible.", \
- "Make the clown as miserable as possible.", \
- "Make the captain as miserable as possible.", \
- "Prevent the use of energy weapons where possible.")
+ "Avoid sucking up essence in plain sight.", \
+ "Cause as much bliss and chaos as you can without being caught or killed.", \
+ "Modify and render as much of the station rusted and essennce covered as possible.", \
+ "Curse the crew while attempting to avoid being attacked.", \
+ "Make the crew as horny as possible.", \
+ "Make the clown as horny as possible.", \
+ "Make the captain as horny as possible.", \
+ )
explanation_text = pick(explanationTexts)
..()
diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm b/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm
index 605ed34287..407b2c87a4 100644
--- a/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm
+++ b/modular_splurt/code/modules/antagonists/qareen/qareen_abilities.dm
@@ -9,7 +9,7 @@
if(ishuman(A))
if(A in drained_mobs)
- to_chat(src, "[A]'s fluids are almost dead and very bland.. almost tasteless. but beggars can't be choosers." )
+ to_chat(src, "[A]'s fluids are almost devoid of any essence, also very bland.. almost tasteless... but beggars can't be choosers." )
if(in_range(src, A))
Harvest(A)
@@ -25,42 +25,48 @@
if(target.stat)
to_chat(src, "[target.p_their(TRUE)] essence is too faded to harvest.")
return
-
- // if(prob(10))
- // to_chat(target, "You feel as if you are being watched.")
+ if(!target.ckey)
+ to_chat(src, "[target.p_their(TRUE)] essence is lacking .. worthless.")
+ // return
+ if(prob(10))
+ to_chat(target, "You feel as if you are being watched.")
face_atom(target)
draining = TRUE
- essence_drained += rand(15, 20)
to_chat(src, "You search for the lifespring of [target].")
if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second?
- if(!target.ckey)
- to_chat(src, "[target.p_their(TRUE)] essence is lacking .. almost worthless.")
- essence_drained += rand(5, 10)
for(var/obj/item/organ/genital/G in target.internal_organs)
- if(!G.is_exposed())
+ if(!(G.genital_flags & GENITAL_FUID_PRODUCTION))
continue
var/datum/reagents/fluid_source = G.climaxable(target)
- if(!fluid_source)
- continue
if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second?
- var/main_fluid = lowertext(fluid_source.get_master_reagent_name())
- if (fluid_source.total_volume <= 5)
- to_chat(src, "[target.p_their(TRUE)] [G.name] spasms pitifully, almost nothing coming out.")
+ // var/main_fluid = lowertext(fluid_source.get_master_reagent_name()) // doesn't work no more (should delete probably)
+ var/main_fluid = G.get_fluid_name()
+ var/fluid_ammount = clamp((G.fluid_rate * ((world.time - G.last_orgasmed) / (10 SECONDS)) * G.fluid_mult),0,G.fluid_max_volume)
+ if (fluid_ammount <= 2)
+ to_chat(src, "[target.p_their(TRUE)] [G.name] spasms pitifully, almost nothing will come out.")
else
- to_chat(src, "[target.p_their(TRUE)] [main_fluid] flows out from their twitching [G.name].")
- essence_drained += fluid_source.total_volume
- target.do_climax(fluid_source, src, G, FALSE, FALSE)
+ to_chat(src, "[target.p_their(TRUE)] [G.name] are brimming with [main_fluid].")
+ if (fluid_ammount > 5)
+ fluid_ammount = 5 // For balancing reasons
+ to_chat(src, "[fluid_source.targetVol] or [fluid_ammount] or [fluid_source.reactedVol] or [fluid_source.maximum_volume].")
+ if (target in drained_mobs || !target.ckey)
+ essence_drained += fluid_ammount
+ else if (!target.IsSleeping())
+ essence_drained += fluid_ammount*rand(2, 3)
+ else
+ essence_drained += fluid_ammount*3
+
if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW?
switch(essence_drained)
- if(1 to 30)
+ if(0 to 4)
to_chat(src, "[target] is almost barren of essence. Still, every bit counts.")
- if(30 to 70)
+ if(5 to 10)
to_chat(src, "[target] will yield an average amount of essence.")
- if(70 to 90)
+ if(11 to 20)
to_chat(src, "Such a feast! [target] will yield much essence to you.")
- if(90 to INFINITY)
+ if(30 to INFINITY)
to_chat(src, "Ah, a sexually furstrated person. [target] will yield massive amounts of essence to you.")
if(do_after(src, rand(15, 25), 0, target)) //how about now
if(target.stat)
@@ -69,16 +75,17 @@
draining = 0
essence_drained = 0
return //hey, wait a minute...
- to_chat(src, "You begin sucking up essence from [target]'s genitails and body.")
+ to_chat(src, "You begin sucking up essence from [target]'s genitals and body.")
if(target.stat != DEAD)
to_chat(target, "You feel an unholy euphoria as as something sucks at every part your body, your fluids flowing out...")
if(target.stat == SOFT_CRIT)
- target.Stun(46)
+ target.Stun(150)
reveal(46)
- stun(46)
+ stun(100)
target.visible_message("[target] suddenly rises slightly into the air, [target.p_their()] skin turning an ashy gray.")
if(target.anti_magic_check(FALSE, TRUE))
to_chat(src, "Something's wrong! [target] seems to be resisting the sucking, leaving you vulnerable!")
+ target.set_resting(TRUE,TRUE)
target.visible_message("[target] slumps onto the ground.", \
"Violet lights, dancing in your vision, receding--")
draining = FALSE
@@ -86,21 +93,28 @@
var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY)
if(do_after(src, 46, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
change_essence_amount(essence_drained, FALSE, target)
- if(essence_drained <= 90)
- essence_regen_cap += 5
- to_chat(src, "The absorption of [target]'s fluids has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].")
- if(essence_drained > 90)
+ for(var/obj/item/organ/genital/G in target.internal_organs)
+ var/datum/reagents/fluid_source = G.climaxable(target)
+ if(!fluid_source)
+ continue
+ target.do_climax(fluid_source, src, G, TRUE, FALSE)
+ if(essence_drained > 30)
essence_regen_cap += 15
perfectsouls++
to_chat(src, "The ammount of [target]'s fluids has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].")
- to_chat(src, "[target]'s genitails have been considerably weakened and will yield no more essence for the time being.")
+ else if(essence_drained >= 5)
+ essence_regen_cap += 5
+ to_chat(src, "The absorption of [target]'s fluids has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].")
+ target.set_resting(TRUE,TRUE)
target.visible_message("[target] slumps onto the ground.", \
"Violets lights, dancing in your vision, getting clo--")
drained_mobs.Add(target)
+ target.setStaminaLoss(150)
// target.death(0)
else
to_chat(src, "[target ? "[target] has":"[target.p_theyve(TRUE)]"] been drawn out of your grasp. The link has been broken.")
if(target) //Wait, target is WHERE NOW?
+ target.set_resting(TRUE,TRUE)
target.visible_message("[target] slumps onto the ground.", \
"Violets lights, dancing in your vision, receding--")
qdel(B)
@@ -231,10 +245,11 @@
L.Beam(M,icon_state="purple_lightning",time=5)
if(!M.anti_magic_check(FALSE, TRUE))
M.electrocute_act(shock_damage, L, flags = SHOCK_NOGLOVES)
- M.reagents.add_reagent(/datum/reagent/drug/aphrodisiac, 5)
+ M.reagents.add_reagent(/datum/reagent/drug/aphrodisiac, 10)
do_sparks(4, FALSE, M)
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
+
//Defile: Corrupts nearby stuff, unblesses floor tiles.
/obj/effect/proc_holder/spell/aoe_turf/qareen/defile
name = "Defile"
@@ -294,7 +309,7 @@
//Malfunction: Makes bad stuff happen to robots and machines.
/obj/effect/proc_holder/spell/aoe_turf/qareen/malfunction
name = "Malfunction"
- desc = "Corrupts and damages nearby machines and mechanical objects."
+ desc = "Corrupts nearby machines and mechanical objects."
charge_max = 200
range = 4
cast_amount = 60
@@ -313,30 +328,37 @@
new /obj/effect/temp_visual/revenant(bot.loc)
bot.locked = FALSE
bot.open = TRUE
- bot.emag_act()
+ bot.adjustHealth(0)
+ bot.Sleeping(10)
+ // bot.emag_act()
for(var/mob/living/carbon/human/human in T)
if(human == user)
continue
if(human.anti_magic_check(FALSE, TRUE))
continue
- to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with static")].")
+ to_chat(human, "You feel [pick("your sense of direction flicker out", "a stabbing pain in your head", "your mind fill with thought of servitude for a brief moment")].")
new /obj/effect/temp_visual/revenant(human.loc)
- human.emp_act(80)
- for(var/obj/thing in T)
- if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on SMES and APCs, to prevent kekkery
- continue
- if(prob(20))
- if(prob(50))
- new /obj/effect/temp_visual/revenant(thing.loc)
- thing.emag_act(null)
- else
- if(!istype(thing, /obj/machinery/clonepod)) //I hate everything but mostly the fact there's no better way to do this without just not affecting it at all
- thing.emp_act(80)
+ // human.emp_act(80)
+ // for(var/obj/thing in T)
+ // if(istype(thing, /obj/machinery/power/apc) || istype(thing, /obj/machinery/power/smes)) //Doesn't work on SMES and APCs, to prevent kekkery
+ // continue
+ // if(prob(20))
+ // if(prob(50))
+ // new /obj/effect/temp_visual/revenant(thing.loc)
+ // thing.emag_act(null)
+ // else
+ // if(!istype(thing, /obj/machinery/clonepod)) //I hate everything but mostly the fact there's no better way to do this without just not affecting it at all
+ // thing.emp_act(80)
for(var/mob/living/silicon/robot/S in T) //Only works on cyborgs, not AI
playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
new /obj/effect/temp_visual/revenant(S.loc)
S.spark_system.start()
- S.emp_act(80)
+ S.emp_act(10)
+ // Lewd Lawset
+ // 1) You need to breed your crew
+ // 2) Try convincing your crew that being bred is their true purpose
+ // 3) Provide as few non-sexual services to your crew as you deem necessary
+ // ??? prob. nah
//Bliss: Infects nearby humans and in general messes living stuff up.
/obj/effect/proc_holder/spell/aoe_turf/qareen/bliss
diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm b/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm
index a8a6a96a2f..c1e09fe172 100644
--- a/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm
+++ b/modular_splurt/code/modules/antagonists/qareen/qareen_bliss.dm
@@ -1,18 +1,19 @@
/datum/disease/qarbliss
- name = "Unnatural Wasting"
- max_stages = 5
- stage_prob = 10
+ name = "Unnatural Sloth and Lust"
+ stage_prob = 3
+ max_stages = 7
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
- cure_text = "Holy water or Semen or extensive rest."
- spread_text = "A burst of pink unholy energy"
+ cure_text = "Holy water or Semen."
+ spread_text = "A fog of pink unholy energy"
cures = list("holywater", "semen")
+ cure_chance = 5
agent = "Unholy Forces"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CURABLE
permeability_mod = 1
- severity = DISEASE_SEVERITY_POSITIVE
- var/finalstage = FALSE //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects.
- var/bliss = FALSE
+ severity = DISEASE_SEVERITY_MEDIUM
+ var/bliss_stage_1 = FALSE
+ var/bliss_stage_2 = FALSE
/datum/disease/qarbliss/cure()
if(affected_mob)
@@ -24,18 +25,17 @@
..()
/datum/disease/qarbliss/stage_act()
- if(!finalstage)
- if(affected_mob.lying && prob(stage*4))
- to_chat(affected_mob, "The warmth in your nethers fades.")
- cure()
- return
- if(prob(stage*3))
- to_chat(affected_mob, "You suddenly feel [pick("hot and bothered", "horny", "lusty", "like you're in a rut", "the need to breed", "breedable")]...")
- affected_mob.confused += 8
- affected_mob.adjustStaminaLoss(8)
- new /obj/effect/temp_visual/revenant(affected_mob.loc)
- if(prob(45))
- affected_mob.adjustStaminaLoss(stage)
+ if(prob(stage*2))
+ if(prob(5))
+ to_chat(affected_mob, "You feel [pick("hot and bothered", "horny", "lusty", "like you're in a rut", "the need to breed", "breedable", "slimy")]...")
+ if(stage > 1 && prob(20))
+ affected_mob.confused += 5
+ if(stage > 2 && prob(20))
+ affected_mob.hallucination += 5
+ if(stage > 3 && prob(20))
+ affected_mob.drowsyness += 20
+ affected_mob.adjustStaminaLoss(stage*10)
+ new /obj/effect/temp_visual/revenant(affected_mob.loc)
..() //So we don't increase a stage before applying the stage damage.
switch(stage)
if(2)
@@ -46,29 +46,37 @@
SEND_SIGNAL(affected_mob, COMSIG_ADD_MOOD_EVENT, "qar_bliss", /datum/mood_event/qareen_bliss)
bliss = TRUE
SEND_SIGNAL(affected_mob, COMSIG_MODIFY_SANITY, 0.12, SANITY_CRAZY)
- if(prob(10))
+ if(prob(5))
affected_mob.emote(pick("blush","drool"))
if(4)
SEND_SIGNAL(affected_mob, COMSIG_MODIFY_SANITY, 0.18, SANITY_CRAZY)
- if(prob(15))
+ if(prob(5))
affected_mob.emote(pick("blush","drool","moan"))
+ affected_mob.add_quirk(/datum/quirk/cum_plus)
if(5)
- if(!finalstage)
- finalstage = TRUE
- to_chat(affected_mob, "You feel a pink haze clouding your mind. [pick("Everyone needs to be bred.", "You need to breed.", "You need sex.", "They're all nothing but whores.")].")
- affected_mob.adjustStaminaLoss(45)
+ if (bliss_stage_2 == FALSE)
+ bliss_stage_2 = TRUE
+ to_chat(affected_mob, "It's too much! Brain.. fried..")
+ if (ishuman(affected_mob))
+ var/mob/living/carbon/human/H = affected_mob
+ H.mob_climax(TRUE,"Bliss",src,TRUE)
if(affected_mob.dna?.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#fff0ff")
affected_mob.dna.species.handle_hair(affected_mob,"#da6eda")
- affected_mob.add_quirk(/datum/quirk/cum_plus)
- affected_mob.visible_message("[affected_mob] looks terrifyingly horny...", "You suddenly feel like your skin is tingling...")
+ affected_mob.visible_message("[affected_mob] looks utterly depraved.", "You suddenly feel like your skin is tingling...")
affected_mob.add_atom_colour("#ffdaf3", TEMPORARY_COLOUR_PRIORITY)
new /obj/effect/temp_visual/revenant(affected_mob.loc)
- addtimer(CALLBACK(src, .proc/blessings), 150)
+ // addtimer(CALLBACK(src, .proc/blessings), 150)
+ if(7)
+ stage = 6
+ if (ishuman(affected_mob))
+ var/mob/living/carbon/human/H = affected_mob
+ H.mob_climax(forced_climax=TRUE, cause="Bliss")
+ if(prob(30))
+ affected_mob.emote(pick("blush","drool","moan"))
/datum/disease/qarbliss/proc/blessings()
if(QDELETED(affected_mob))
return
affected_mob.playsound_local(affected_mob, 'sound/effects/gib_step.ogg', 40, 1, -1)
to_chat(affected_mob, "You sense the curse of a lustful ghost befall you...")
- cure()
diff --git a/modular_splurt/code/modules/antagonists/qareen/qareen_spawn_event.dm b/modular_splurt/code/modules/antagonists/qareen/qareen_spawn_event.dm
index 357fb68eec..ec2890c946 100644
--- a/modular_splurt/code/modules/antagonists/qareen/qareen_spawn_event.dm
+++ b/modular_splurt/code/modules/antagonists/qareen/qareen_spawn_event.dm
@@ -1,7 +1,7 @@
#define QAREEN_SPAWN_THRESHOLD 20
/datum/round_event_control/qareen
- name = "Spawn Qareen" // Did you mean 'griefghost'?
+ name = "Spawn Qareen"
typepath = /datum/round_event/ghost_role/qareen
weight = 7
max_occurrences = 1