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