diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index a58d7762a0..f732287cf8 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -130,4 +130,7 @@ #define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi) #define MUTCOLORS2 26 #define MUTCOLORS3 27 +//citadel code +#define NOAROUSAL 28//Stops all arousal effects +#define NOGENITALS 29//Cannot create, use, or otherwise have genitals //#define SUBSPECIES 28 \ No newline at end of file diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm new file mode 100644 index 0000000000..98153f06a4 --- /dev/null +++ b/code/__DEFINES/citadel_defines.dm @@ -0,0 +1,67 @@ +//Global defines for most of the unmentionables. +//Be sure to update the min/max of these if you do change them. +//Measurements are in imperial units. Inches, feet, yards, miles. Tsp, tbsp, cups, quarts, gallons, etc + +//arousal HUD location +#define ui_arousal "EAST-1:28,CENTER-3:11"//Below the health doll + + +//organ defines +#define COCK_SIZE_MIN 1 +#define COCK_SIZE_MAX 24 + +#define COCK_GIRTH_RATIO_MAX 1.25 +#define COCK_GIRTH_RATIO_DEF 0.75 +#define COCK_GIRTH_RATIO_MIN 0.5 + +#define KNOT_GIRTH_RATIO_MAX 3 +#define KNOT_GIRTH_RATIO_DEF 2.1 +#define KNOT_GIRTH_RATIO_MIN 1.25 + +#define BALLS_VOLUME_BASE 50 +#define BALLS_VOLUME_MULT 1 + +#define BALLS_SIZE_MIN 1 +#define BALLS_SIZE_SMALL 2 +#define BALLS_SIZE_NORMAL 3 +#define BALLS_SIZE_BIG 4 +#define BALLS_SIZE_BIGGER 5 +#define BALLS_SIZE_BIGGEST 6 +#define BALLS_SIZE_MAX 7 + +#define BALLS_SACK_SIZE_DEF 8 + +#define CUM_RATE 5 +#define CUM_RATE_MULT 1 +#define CUM_EFFICIENCY 1//amount of nutrition required per life() + +#define EGG_GIRTH_MIN 1//inches +#define EGG_GIRTH_DEF 6 +#define EGG_GIRTH_MAX 16 + +#define BREASTS_VOLUME_BASE 50 //base volume for the reagents in the breasts, multiplied by the size then multiplier. 50u for A cups, 850u for HH cups. +#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume. +#define BREASTS_SIZE_FLAT 0 +#define BREASTS_SIZE_A 1 +#define BREASTS_SIZE_AA 1.5 +#define BREASTS_SIZE_B 2 +#define BREASTS_SIZE_BB 2.5 +#define BREASTS_SIZE_C 3 +#define BREASTS_SIZE_CC 3.5 +#define BREASTS_SIZE_D 4 +#define BREASTS_SIZE_DD 4.5 +#define BREASTS_SIZE_E 5 +#define BREASTS_SIZE_EE 5.5 +#define BREASTS_SIZE_F 6 +#define BREASTS_SIZE_FF 6.5 +#define BREASTS_SIZE_G 7 +#define BREASTS_SIZE_GG 7.5//Are these even real sizes? The world may never know because cup sizes make no fucking sense. +#define BREASTS_SIZE_H 8 +#define BREASTS_SIZE_HH 8.5//Largest size, ever. For now. + +#define BREASTS_SIZE_MIN BREASTS_SIZE_A +#define BREASTS_SIZE_MAX BREASTS_SIZE_HH + +#define MILK_RATE 5 +#define MILK_RATE_MULT 1 +#define MILK_EFFICIENCY 1 diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 90eef6c091..12810e8aba 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -9,6 +9,8 @@ #define OXY "oxy" #define CLONE "clone" #define STAMINA "stamina" +//citadel code +#define AROUSAL "arousal" //bitflag damage defines used for suicide_act #define BRUTELOSS 1 @@ -16,6 +18,8 @@ #define TOXLOSS 4 #define OXYLOSS 8 #define SHAME 16 +//citadel code +#define AROUSAL 32 #define STUN "stun" #define WEAKEN "weaken" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index cd1f0799f7..d81841fa54 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -50,6 +50,8 @@ var/obj/screen/healths var/obj/screen/healthdoll var/obj/screen/internals + //citadel code + var/obj/screen/arousal var/ui_style_icon = 'icons/mob/screen_midnight.dmi' diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 57df2b003a..c15dbf761c 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -293,6 +293,10 @@ healths = new /obj/screen/healths() infodisplay += healths + //citadel code + arousal = new /obj/screen/arousal() + infodisplay += arousal + healthdoll = new /obj/screen/healthdoll() infodisplay += healthdoll diff --git a/code/citadel/_helpers.dm b/code/citadel/_helpers.dm index 3879c0ec50..c0b0c0769b 100644 --- a/code/citadel/_helpers.dm +++ b/code/citadel/_helpers.dm @@ -1,6 +1,5 @@ //THIS FILE CONTAINS CONSTANTS, PROCS, DEFINES, AND OTHER THINGS// //////////////////////////////////////////////////////////////////// - /mob/proc/setClickCooldown(var/timeout) next_move = max(world.time + timeout, next_move) diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm new file mode 100644 index 0000000000..ff77bb06e0 --- /dev/null +++ b/code/citadel/cit_arousal.dm @@ -0,0 +1,156 @@ +//Mob vars +/mob/living + var/arousalloss = 0 //How aroused the mob is. + var/min_arousal = 0 //The lowest this mobs arousal will get. default = 0 + var/max_arousal = 100 //The highest this mobs arousal will get. default = 100 + var/arousal_rate = 1 //The base rate that arousal will increase in this mob. + var/arousal_loss_rate = 1 //How easily arousal can be relieved for this mob. + var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types. + var/mb_cd_length = 100 //10 second cooldown for masturbating because fuck spam + var/mb_cd_timer = 0 //The timer itself + +/mob/living/carbon/human + canbearoused = TRUE + +//Species vars +/datum/species + var/arousal_gain_rate = 1 //Rate at which this species becomes aroused + var/arousal_lose_rate = 1 //Multiplier for how easily arousal can be relieved + +//Mob procs +/mob/living/Life() + if(stat != DEAD) + handle_arousal() + ..() + +/mob/living/proc/handle_arousal() + return + +/mob/living/carbon/handle_arousal() + ..() + var/datum/species/S + if(has_dna()) + S = dna.species + if(S && SSmob.times_fired%36==2 && getArousalLoss() < 100)//Totally stolen from breathing code. Do this every 36 ticks. + adjustArousalLoss(arousal_rate * S.arousal_gain_rate) + +/mob/living/proc/getArousalLoss() + return arousalloss + +/mob/living/proc/adjustArousalLoss(amount, updating_arousal=1) + if(status_flags & GODMODE || !canbearoused) + return 0 + arousalloss = Clamp(arousalloss + amount, min_arousal, max_arousal) + if(updating_arousal) + updatearousal() + +/mob/living/proc/setArousalLoss(amount, updating_arousal=1) + if(status_flags & GODMODE || !canbearoused) + return 0 + arousalloss = Clamp(amount, min_arousal, max_arousal) + if(updating_arousal) + updatearousal() + +/mob/living/proc/getPercentAroused() + return ((100 / max_arousal) * arousalloss) + +/mob/living/proc/isPercentAroused(percentage)//returns true if the mob's arousal (measured in a percent of 100) is greater than the arg percentage. + if(!isnum(percentage)) + return FALSE + if(getPercentAroused() >= percentage) + return TRUE + +/mob/living/proc/mob_masturbate()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while. + set name = "Masturbate" + set category = "IC" + if(canbearoused && !restrained() && !stat) + if(mb_cd_timer <= world.time) + //start the cooldown even if it fails + mb_cd_timer = world.time + mb_cd_length + if(getArousalLoss() >= ((max_arousal / 100) * 33))//33% arousal or greater required + src.visible_message("[src] starts masturbating!", \ + "You start masturbating.") + if(do_after(src, 100, target = src)) + src.visible_message("[src] relieves themself!", \ + "You have relieved yourself.") + setArousalLoss(min_arousal) + /* + switch(gender) + if(MALE) + PoolOrNew(/obj/effect/decal/cleanable/semen, loc) + if(FEMALE) + PoolOrNew(/obj/effect/decal/cleanable/femcum, loc) + */ + else + src << "You aren't aroused enough for that." + +//H U D// +/mob/living/proc/updatearousal() + update_arousal_hud() + +/mob/living/proc/update_arousal_hud() + return 0 + +/datum/species/proc/update_arousal_hud(mob/living/carbon/human/H) + return 0 + +/mob/living/carbon/human/update_arousal_hud() + if(!client || !hud_used) + return 0 + if(dna.species.update_arousal_hud()) + return 0 + if(!canbearoused) + hud_used.arousal.icon_state = "arousal0" + return 0 + else + if(hud_used.arousal) + if(stat == DEAD) + hud_used.arousal.icon_state = "arousal0" + return 1 + if(getArousalLoss() == max_arousal) + hud_used.arousal.icon_state = "arousal100" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 90)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal90" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 80)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal80" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 70)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal70" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 60)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal60" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 50)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal50" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 40)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal40" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 30)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal30" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 20)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return 1 + if(getArousalLoss() >= (max_arousal / 100) * 10)//M O D U L A R , W O W + hud_used.arousal.icon_state = "arousal10" + return 1 + else + hud_used.arousal.icon_state = "arousal0" + +/obj/screen/arousal + name = "arousal" + icon_state = "arousal0" + screen_loc = ui_arousal + +/obj/screen/arousal/Click() + if(!isliving(usr)) + return 0 + var/mob/living/M = usr + if(M.canbearoused) + M.mob_masturbate() + return 1 + else + M << "Arousal is disabled. Feature is unavailable." diff --git a/code/citadel/cit_reagents.dm b/code/citadel/cit_reagents.dm new file mode 100644 index 0000000000..5b982656cc --- /dev/null +++ b/code/citadel/cit_reagents.dm @@ -0,0 +1,211 @@ +//body bluids +/datum/reagent/consumable/semen + name = "Semen" + id = "semen" + description = "Sperm from some animal. Useless for anything but insemination, really." + data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) + reagent_state = LIQUID + color = "#FFFFFF" // rgb: 255, 255, 255 + nutriment_factor = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume) + if(!istype(T)) + return + if(reac_volume < 3) + return + + var/obj/effect/decal/cleanable/semen/S = locate() in T + if(!S) + S = new(T) + S.reagents.add_reagent("semen", reac_volume) + if(data["blood_DNA"]) + S.blood_DNA[data["blood_DNA"]] = data["blood_type"] + +/obj/effect/decal/cleanable/semen + name = "semen" + desc = null + gender = PLURAL + density = 0 + layer = ABOVE_NORMAL_TURF_LAYER + icon = 'code/citadel/icons/effects.dmi' + icon_state = "semen1" + random_icon_states = list("semen1", "semen2", "semen3", "semen4") +// blood_state = BLOOD_STATE_SEMEN +// bloodiness = MAX_SHOE_BLOODINESS + +/obj/effect/decal/cleanable/semen/New() + dir = pick(1,2,4,8) + ..() + +/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S) +// if(S.reagent_DNA["semen"]) +// reagent_DNA["semen"] |= S.reagent_DNA["semen"] + ..() + +/datum/reagent/consumable/femcum + name = "Female Ejaculate" + id = "femcum" + description = "Vaginal lubricant found in most mammals and other animals of similar nature. Where you found this is your own business." + data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null) + reagent_state = LIQUID + color = "#AAAAAA77" + nutriment_factor = 0.5 * REAGENTS_METABOLISM + +/obj/effect/decal/cleanable/femcum + name = "female ejaculate" + desc = null + gender = PLURAL + density = 0 + layer = ABOVE_NORMAL_TURF_LAYER + icon = 'code/citadel/icons/effects.dmi' + icon_state = "fem1" + random_icon_states = list("fem1", "fem2", "fem3", "fem4") + blood_DNA = list() + blood_state = null + bloodiness = null + +/obj/effect/decal/cleanable/femcum/New() + dir = pick(1,2,4,8) + ..() + +/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F) + if (F.blood_DNA) + blood_DNA |= F.blood_DNA.Copy() + ..() + +//aphrodisiac & anaphrodisiac + +/datum/reagent/aphrodisiac + name = "Crocin" + id = "aphro" + description = "Naturally found in the crocus and gardenia flowers, this drug acts as a natural and safe aphrodisiac." + color = "#FFADFF"//PINK, rgb(255, 173, 255) + +/datum/reagent/aphrodisiac/on_mob_life(mob/living/M) + if(prob(33)) + M.adjustArousalLoss(2) + if(prob(5)) + M.emote(pick("moan","blush")) + if(prob(5)) + var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.") + M << "[aroused_message]" + ..() + +/datum/reagent/aphrodisiacplus + name = "Hexacrocin" + id = "aphro+" + description = "Chemically condensed form of basic crocin. This aphrodisiac is extremely powerful and addictive in most animals.\ + Addiction withdrawals can cause brain damage and shortness of breath. Overdosage can lead to brain damage and a\ + permanent increase in libido (commonly referred to as 'bimbofication')." + color = "#FF2BFF"//dark pink + addiction_threshold = 20 + overdose_threshold = 20 + +/datum/reagent/aphrodisiacplus/on_mob_life(mob/living/M) + if(prob(33)) + M.adjustArousalLoss(6)//not quite six times as powerful, but still considerably more powerful. + if(prob(5)) + if(M.getArousalLoss() > 75) + M.say(pick("Hnnnnngghh...", "Ohh...", "Mmnnn...")) + else + M.emote(pick("moan","blush")) + if(prob(5)) + if(M.getArousalLoss() > 90) + var/aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") + M << "[aroused_message]" + else + var/aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") + M << "[aroused_message]" +// if(iscarbon(M) && has_dna(M)) +// M.force_ejaculation() + ..() +/datum/reagent/aphrodisiacplus/addiction_act_stage2(mob/living/M) + if(prob(30)) + M.adjustBrainLoss(2) + ..() +/datum/reagent/aphrodisiacplus/addiction_act_stage3(mob/living/M) + if(prob(30)) + M.adjustBrainLoss(3) + + ..() +/datum/reagent/aphrodisiacplus/addiction_act_stage4(mob/living/M) + if(prob(30)) + M.adjustBrainLoss(4) + ..() + +/datum/reagent/aphrodisiacplus/overdose_process(mob/living/M) + if(prob(66)) + if(M.min_arousal < 50) + M.min_arousal += 1 + if(M.max_arousal < 200) + M.max_arousal += 1 + M.adjustArousalLoss(2) + ..() + +/datum/reagent/anaphrodisiac + name = "Camphor" + id = "anaphro" + description = "Naturally found in some species of evergreen trees, camphor is a waxy substance. When injested by most animals, it acts as an anaphrodisiac\ + , reducing libido and calming them. Non-habit forming and not addictive." + color = "#D9D9D9"//rgb(217, 217, 217) + reagent_state = SOLID + +/datum/reagent/anaphrodisiac/on_mob_life(mob/living/M) + if(prob(33)) + M.adjustArousalLoss(-2) + ..() + +/datum/reagent/anaphrodisiacplus + name = "Hexacamphor" + id = "anaphro+" + description = "Chemically condensed camphor. Causes an extreme reduction in libido and a permanent one if overdosed. Non-addictive." + color = "#D9D9D9"//rgb(217, 217, 217) + reagent_state = SOLID + overdose_threshold = 20 + +/datum/reagent/anaphrodisiacplus/on_mob_life(mob/living/M) + if(prob(33)) + M.adjustArousalLoss(-4) + ..() + +/datum/reagent/anaphrodisiacplus/overdose_process(mob/living/M) + if(prob(33)) + if(M.min_arousal > 0) + M.min_arousal -= 1 + if(M.max_arousal > 75) + M.min_arousal -= 1 + M.adjustArousalLoss(-2) + ..() + +//recipes +/datum/chemical_reaction/aphro + name = "crocin" + id = "aphro" + results = list("aphro" = 6) + required_reagents = list("carbon" = 2, "hydrogen" = 2, "oxygen" = 2, "water" = 1) + required_temp = 400 + mix_message = "The mixture boils off a pink vapor..."//The water boils off, leaving the crocin + +/datum/chemical_reaction/aphroplus + name = "hexacrocin" + id = "aphro+" + results = list("aphro+" = 1) + required_reagents = list("aphro" = 6, "phenol" = 1) + required_temp = 400 + mix_message = "The mixture rapidly condenses and darkens in color..." + +/datum/chemical_reaction/anaphro + name = "camphor" + id = "anaphro" + results = list("anaphro" = 6) + required_reagents = list("carbon" = 2, "hydrogen" = 2, "oxygen" = 2, "sulfur" = 1) + required_temp = 400 + mix_message = "The mixture boils off a yellow, smelly vapor..."//Sulfur burns off, leaving the camphor + +/datum/chemical_reaction/anaphroplus + name = "pentacamphor" + id = "anaphro+" + results = list("anaphro+" = 1) + required_reagents = list("anaphro" = 5, "acetone" = 1) + required_temp = 300 + mix_message = "The mixture thickens and heats up slighty..." \ No newline at end of file diff --git a/code/citadel/icons/effects.dmi b/code/citadel/icons/effects.dmi new file mode 100644 index 0000000000..9a99bc085a Binary files /dev/null and b/code/citadel/icons/effects.dmi differ diff --git a/code/citadel/icons/misc.dmi b/code/citadel/icons/misc.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/code/citadel/icons/misc.dmi differ diff --git a/code/citadel/icons/mobs.dmi b/code/citadel/icons/mobs.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/code/citadel/icons/mobs.dmi differ diff --git a/code/citadel/icons/objects.dmi b/code/citadel/icons/objects.dmi new file mode 100644 index 0000000000..55a6867303 Binary files /dev/null and b/code/citadel/icons/objects.dmi differ diff --git a/code/citadel/icons/structures.dmi b/code/citadel/icons/structures.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/code/citadel/icons/structures.dmi differ diff --git a/code/citadel/kegs.dm b/code/citadel/kegs.dm new file mode 100644 index 0000000000..d7e4ac03b9 --- /dev/null +++ b/code/citadel/kegs.dm @@ -0,0 +1,41 @@ +/obj/structure/reagent_dispensers/keg + name = "keg" + desc = "A keg." + icon = 'code/citadel/icons/objects.dmi' + icon_state = "keg" + reagent_id = "water" + +/obj/structure/reagent_dispensers/keg/mead + name = "keg of mead" + desc = "A keg of mead." + icon_state = "orangekeg" + reagent_id = "mead" + +/obj/structure/reagent_dispensers/keg/aphro + name = "keg of aphrodisiac" + desc = "A keg of aphrodisiac." + icon_state = "pinkkeg" + reagent_id = "aphro" + +/obj/structure/reagent_dispensers/keg/aphro/strong + name = "keg of strong aphrodisiac" + desc = "A keg of strong and addictive aphrodisiac." + reagent_id = "aphro+" + +/obj/structure/reagent_dispensers/keg/milk + name = "keg of milk" + desc = "It's not quite what you were hoping for." + icon_state = "whitekeg" + reagent_id = "milk" + +/obj/structure/reagent_dispensers/keg/semen + name = "keg of semen" + desc = "Dear lord, where did this even come from?" + icon_state = "whitekeg" + reagent_id = "semen" + +/obj/structure/reagent_dispensers/keg/gargle + name = "keg of pan galactic gargleblaster" + desc = "A keg of... wow that's a long name." + icon_state = "bluekeg" + reagent_id = "gargleblaster" \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 72e6f62a6b..6a4c85a9cd 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -80,6 +80,7 @@ if(A.dir) atomsnowflake += "<< [dir2text(A.dir)] >>" var/mob/living/M = A + //citadel code atomsnowflake += {" [M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"] @@ -90,6 +91,7 @@ CLONE:[M.getCloneLoss()] BRAIN:[M.getBrainLoss()] STAMINA:[M.getStaminaLoss()] + AROUSAL:[M.getArousalLoss()] "} else diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 90fa7c6fcf..6008a094e4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -84,6 +84,9 @@ var/list/preferences_datums = list() var/job_engsec_med = 0 var/job_engsec_low = 0 + //citadel code + var/arousable = TRUE //Allows players to disable arousal from the character creation menu + // Want randomjob if preferences already filled - Donkie var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants @@ -435,6 +438,24 @@ var/list/preferences_datums = list() dat += "" dat += "" + //citadel code + if(NOGENITALS in pref_species.species_traits) + dat += "Your species ([pref_species.name]) does not support genitals!" + else + dat += "Genitals" + + dat += "" + + dat += "" + + dat += "Options" + dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"]" + dat += "More Coming Soon(tm)" + + dat += "" + + + dat += "" if (1) // Game Preferences @@ -1301,6 +1322,17 @@ var/list/preferences_datums = list() else switch(href_list["preference"]) + + //citadel code + if("arousable") + switch(arousable) + if(TRUE) + arousable = FALSE + if(FALSE) + arousable = TRUE + else//failsafe + arousable = FALSE + if("publicity") if(unlock_content) toggles ^= MEMBER_PUBLIC @@ -1420,6 +1452,8 @@ var/list/preferences_datums = list() else if(firstspace == name_length) real_name += "[pick(last_names)]" + //citadel code + character.canbearoused = arousable character.real_name = real_name character.name = character.real_name diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 6c60de6a7c..accff361b1 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -175,6 +175,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["clientfps"] >> clientfps S["parallax"] >> parallax S["uplink_loc"] >> uplink_spawn_loc + //citadel code + S["arousable"] >> arousable //try to fix any outdated data if necessary if(needs_update >= 0) @@ -231,6 +233,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["uses_glasses_colour"]<< uses_glasses_colour S["clientfps"] << clientfps S["parallax"] << parallax + //citadel code + S["arousable"] << arousable return 1 diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 781f06b4ac..74bc234a5b 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -2,6 +2,7 @@ /mob/living/carbon/human/verb/suicide() set hidden = 1 + return if(!canSuicide()) return var/oldkey = ckey diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 5f748c42f4..6cb3adcc39 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -25,6 +25,9 @@ adjustCloneLoss(damage * hit_percent) if(STAMINA) adjustStaminaLoss(damage * hit_percent) + //citadel code + if(AROUSAL) + adjustArousalLoss(damage * hit_percent) return 1 /mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs @@ -41,6 +44,9 @@ return adjustCloneLoss(damage) if(STAMINA) return adjustStaminaLoss(damage) + //citadel code + if(AROUSAL) + return adjustArousalLoss(damage) /mob/living/proc/get_damage_amount(damagetype = BRUTE) switch(damagetype) @@ -56,9 +62,12 @@ return getCloneLoss() if(STAMINA) return getStaminaLoss() + //citadel code + if(AROUSAL) + return getArousalLoss() -/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = 0, stamina = 0) +/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = 0, stamina = 0, arousal = 0) if(blocked >= 100) return 0 if(brute) @@ -73,6 +82,9 @@ apply_damage(clone, CLONE, def_zone, blocked) if(stamina) apply_damage(stamina, STAMINA, def_zone, blocked) + //citadel code + if(arousal) + apply_damage(arousal, AROUSAL, def_zone, blocked) return 1 @@ -232,7 +244,6 @@ /mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE) return - // heal ONE external organ, organ gets randomly selected from damaged ones. /mob/living/proc/heal_bodypart_damage(brute, burn, updating_health = 1) adjustBruteLoss(-brute, 0) //zero as argument for no instant health update diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 40500e84a8..28c8385c56 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index a9ae384e72..91295dd233 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -145,4 +145,7 @@ BIG IMG.icon {width: 32px; height: 32px;} .memoedit {text-align: center; font-size: 2;} .abductor {color: #800080; font-style: italic;} +.love {color: #FF69Bf;} +.lovebold {color: #FF69Bf; font-weight: bold;} + "} diff --git a/tgstation.dme b/tgstation.dme index fccf050e3d..4fb22b301f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -25,6 +25,7 @@ #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\atom_hud.dm" #include "code\__DEFINES\callbacks.dm" +#include "code\__DEFINES\citadel_defines.dm" #include "code\__DEFINES\clockcult.dm" #include "code\__DEFINES\combat.dm" #include "code\__DEFINES\construction.dm" @@ -143,7 +144,10 @@ #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" #include "code\citadel\_helpers.dm" +#include "code\citadel\cit_arousal.dm" +#include "code\citadel\cit_reagents.dm" #include "code\citadel\discordbot.dm" +#include "code\citadel\kegs.dm" #include "code\controllers\admin.dm" #include "code\controllers\configuration.dm" #include "code\controllers\controller.dm"