Merge branch 'pr/12'
This commit is contained in:
@@ -21,7 +21,7 @@
|
||||
timeout = 3000
|
||||
|
||||
/datum/mood_event/orgasm
|
||||
description = "<font color = #780A53><i><b>I came!</font></i></b>" //funny meme haha
|
||||
description = "<span class='userlove'>I came!</span>\n" //funny meme haha
|
||||
mood_change = 3
|
||||
timeout = 1000
|
||||
|
||||
|
||||
@@ -3,4 +3,15 @@
|
||||
desc = "A shiny bike horn handcrafted in the artisan workshops of Mars, with superior kevlar-reinforced rubber bulb attached to a polished plasteel reed horn."
|
||||
attack_verb = list("elegantly HONKED")
|
||||
icon = 'modular_citadel/icons/obj/honk.dmi'
|
||||
icon_state = "silverhorn"
|
||||
icon_state = "silverhorn"
|
||||
|
||||
/obj/item/bikehorn/bluespacehonker
|
||||
name = "bluespace bike horn"
|
||||
desc = "A normal bike horn colored blue and has bluespace dust held in to reed horn allowing for silly honks through space and time, into your in childhood."
|
||||
attack_verb = list("HONKED in bluespace", "HONKED", "quantumly HONKED")
|
||||
icon = 'modular_citadel/icons/obj/honk.dmi'
|
||||
icon_state = "bluespacehonker"
|
||||
|
||||
/obj/item/bikehorn/bluespacehonker/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "bshonk", /datum/mood_event/bshonk)
|
||||
return ..()
|
||||
|
||||
@@ -117,6 +117,28 @@
|
||||
desc = "The Non-Eutactic Blade utilizes a hardlight blade that is dynamically 'forged' on demand to create a deadly sharp edge that is unbreakable. This one seems to have a damaged handle and misaligned components, causing the blade to be unstable at best"
|
||||
force_on = 15 //As strong a survival knife/bone dagger
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/cx/attackby(obj/item/W, mob/living/user, params)
|
||||
if(istype(W, /obj/item/melee/transforming/energy/sword/cx))
|
||||
if((W.item_flags & NODROP) || (item_flags & NODROP))
|
||||
to_chat(user, "<span class='warning'>\the [item_flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [item_flags & NODROP ? W : src]!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You combine the two light swords, making a single supermassive blade! You're cool.</span>")
|
||||
new /obj/item/twohanded/hypereutactic(user.drop_location())
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/cx/chaplain
|
||||
name = "divine lightblade"
|
||||
force_on = 20 //haha i'll regret this
|
||||
block_chance = 50
|
||||
|
||||
/obj/item/melee/transforming/energy/sword/cx/chaplain/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/anti_magic, TRUE, TRUE)
|
||||
|
||||
//OBLIGATORY TOY MEMES /////////////////////////////////////
|
||||
|
||||
/obj/item/toy/sword/cx
|
||||
@@ -235,21 +257,21 @@
|
||||
inhand_y_dimension = 64
|
||||
name = "hypereutactic blade"
|
||||
desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
|
||||
force = 3
|
||||
force = 7
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/w_class_on = WEIGHT_CLASS_BULKY
|
||||
force_unwielded = 3
|
||||
force_wielded = 30
|
||||
force_unwielded = 7
|
||||
force_wielded = 40
|
||||
wieldsound = 'sound/weapons/nebon.ogg'
|
||||
unwieldsound = 'sound/weapons/neboff.ogg'
|
||||
hitsound = "swing_hit"
|
||||
armour_penetration = 10
|
||||
armour_penetration = 60
|
||||
light_color = "#37FFF7"
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
|
||||
block_chance = 25
|
||||
block_chance = 75
|
||||
max_integrity = 200
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
|
||||
resistance_flags = FIRE_PROOF
|
||||
@@ -265,7 +287,6 @@
|
||||
user.visible_message("<span class='notice'>[user] points the tip of [src] at [target].</span>", "<span class='notice'>You point the tip of [src] at [target].</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
|
||||
if(M.has_dna())
|
||||
if(M.dna.check_mutation(HULK))
|
||||
@@ -278,7 +299,6 @@
|
||||
hitsound = 'sound/weapons/nebhit.ogg'
|
||||
START_PROCESSING(SSobj, src)
|
||||
set_light(brightness_on)
|
||||
slowdown = 1
|
||||
|
||||
/obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds.
|
||||
sharpness = initial(sharpness)
|
||||
@@ -338,12 +358,8 @@
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to recolor it.</span>")
|
||||
|
||||
|
||||
|
||||
////////// stuff beneath this is all taken from the desword //////////// wow very professional such OOP wow
|
||||
|
||||
|
||||
|
||||
/obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user)
|
||||
if(user.has_dna())
|
||||
if(user.dna.check_mutation(HULK))
|
||||
@@ -426,7 +442,7 @@
|
||||
It appears to have a wooden grip and a shaved down guard."
|
||||
icon_state = "cxsword_hilt_traitor"
|
||||
force_on = 30
|
||||
armour_penetration = 35
|
||||
armour_penetration = 50
|
||||
embedding = list("embedded_pain_multiplier" = 10, "embed_chance" = 75, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 10)
|
||||
block_chance = 50
|
||||
hitsound_on = 'sound/weapons/blade1.ogg'
|
||||
|
||||
@@ -6,7 +6,12 @@
|
||||
var/saltresult = "The wheel of salt [pick("clatters","screams","vibrates","clanks","resonates","groans","moans","squeaks","emits a[pick(" god-forsaken"," lewd"," creepy"," generic","n orgasmic"," demonic")] [pick("airhorn","bike horn","trumpet","clown","latex","vore","dog","laughing")] noise")] as it spins violently... And it seems the salt of the day is the "
|
||||
var/saltprimarysubject = "[pick("combat","medical","grab","furry","wall","orgasm","cat","ERP","lizard","dog","latex","vision cone","atmospherics","table","chem","vore","dogborg","Skylar Lineman","Mekhi Anderson","Peppermint","rework","cum","dick","cockvore","Medihound","sleeper","belly sleeper","door wires","flightsuit","coder privilege","Developer abuse","ban reason","github self merge","red panda","beret","male catgirl","powergame","hexacrocin","Discord server","Clitadel","Cargonia","Solarian Republic","Main and RP merger","bluespace","salt","chem dispenser theft","Botany","moth","BWOINK","anal vore","stamina","Mason Jakops","mining","noodle","milf","Lavaland","Necropolis","Ashwalker","Chase Redtail","Drew Mint","Pavel Marsk","Jecca Qua","Joker Amari","Durgit","chaplain","Antag","nanite","Syndicate","Nar-Sie","Ratvar","Cult","maint","Foam-Force","AI","cyborg","ghost","clockwork","cyberpunk","vaporwave","Clown","Leon Beech","Mime","security","research","Megafauna","Bubblegum","Ash Drake","Legion","Colossus","White Shuttle","Changeling","Cowboy","Space Ninja","Poly","Revolutionary","Skyrim","forbidden fruits","xenomorph","blob","Nuclear Operative","crossdressing")]"
|
||||
var/saltsecondarysubject = "[pick("rework","changes","r34","ban","removal","addition","leak","proposal","fanart","introduction","tabling","ERP","bikeshedding","crossdressing","sprites","semen keg","argument","theft","nerf","screeching","salt","creampie","lewding","murder","kissing","marriage","replacement","fucking","ship","netflix adaptation","dance","remaster","system","voyeur","decoration","pre-order","bukkake","seduction","worship","gangbang","handholding")]"
|
||||
saltresult += "[saltprimarysubject] [saltsecondarysubject]"
|
||||
if(prob(10))
|
||||
saltresult += "@here for your salt, all day every day"
|
||||
if(prob(1))
|
||||
saltresult += " @everyone gets some salt this time too"
|
||||
else
|
||||
saltresult += "[saltprimarysubject] [saltsecondarysubject]"
|
||||
return "[saltresult]!"
|
||||
|
||||
/datum/tgs_chat_command/despacito
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
//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 //5 second cooldown for masturbating because fuck spam.
|
||||
var/mb_cd_timer = 0 //The timer itself
|
||||
var/arousalloss = 0 //How aroused the mob is.
|
||||
var/min_arousal = AROUSAL_MINIMUM_DEFAULT //The lowest this mobs arousal will get. default = 0
|
||||
var/max_arousal = AROUSAL_MAXIMUM_DEFAULT //The highest this mobs arousal will get. default = 100
|
||||
var/arousal_rate = AROUSAL_START_VALUE //The base rate that arousal will increase in this mob.
|
||||
var/arousal_loss_rate = AROUSAL_START_VALUE //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 = 5 SECONDS //5 second cooldown for masturbating because fuck spam.
|
||||
var/mb_cd_timer = 0 //The timer itself
|
||||
|
||||
/mob/living/carbon/human
|
||||
canbearoused = TRUE
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
//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
|
||||
var/arousal_gain_rate = AROUSAL_START_VALUE //Rate at which this species becomes aroused
|
||||
var/arousal_lose_rate = AROUSAL_START_VALUE //Multiplier for how easily arousal can be relieved
|
||||
var/list/cum_fluids = list("semen")
|
||||
var/list/milk_fluids = list("milk")
|
||||
var/list/femcum_fluids = list("femcum")
|
||||
@@ -77,7 +77,8 @@
|
||||
updatearousal()
|
||||
|
||||
/mob/living/proc/getPercentAroused()
|
||||
return ((100 / max_arousal) * arousalloss)
|
||||
var/percentage = ((100 / max_arousal) * arousalloss)
|
||||
return percentage
|
||||
|
||||
/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) || percentage > 100 || percentage < 0)
|
||||
@@ -104,6 +105,8 @@
|
||||
S = GLOB.breasts_shapes_list[G.shape]
|
||||
if(S?.alt_aroused)
|
||||
G.aroused_state = isPercentAroused(G.aroused_amount)
|
||||
if(getArousalLoss() >= ((max_arousal / 100) * 33))
|
||||
G.aroused_state = TRUE
|
||||
else
|
||||
G.aroused_state = FALSE
|
||||
G.update_appearance()
|
||||
@@ -219,17 +222,17 @@
|
||||
fluid_source = G.linked_organ.reagents
|
||||
total_fluids = fluid_source.total_volume
|
||||
if(mb_time)
|
||||
src.visible_message("<span class='danger'>[src] starts to [G.masturbation_verb] [p_their()] [G.name].</span>", \
|
||||
"<span class='green'>You start to [G.masturbation_verb] your [G.name].</span>", \
|
||||
"<span class='green'>You start to [G.masturbation_verb] your [G.name].</span>")
|
||||
src.visible_message("<span class='love'>[src] starts to [G.masturbation_verb] [p_their()] [G.name].</span>", \
|
||||
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name].</span>", \
|
||||
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name].</span>")
|
||||
|
||||
if(do_after(src, mb_time, target = src))
|
||||
if(total_fluids > 5)
|
||||
fluid_source.reaction(src.loc, TOUCH, 1, 0)
|
||||
fluid_source.clear_reagents()
|
||||
src.visible_message("<span class='danger'>[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!</span>", \
|
||||
"<span class='green'>You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].</span>", \
|
||||
"<span class='green'>You have relieved yourself.</span>")
|
||||
src.visible_message("<span class='love'>[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!</span>", \
|
||||
"<span class='userlove'>You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].</span>", \
|
||||
"<span class='userlove'>You have relieved yourself.</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
if(G.can_climax)
|
||||
setArousalLoss(min_arousal)
|
||||
@@ -257,16 +260,16 @@
|
||||
else
|
||||
total_fluids = fluid_source.total_volume
|
||||
if(mb_time) //as long as it's not instant, give a warning
|
||||
src.visible_message("<span class='danger'>[src] looks like they're about to cum.</span>", \
|
||||
"<span class='green'>You feel yourself about to orgasm.</span>", \
|
||||
"<span class='green'>You feel yourself about to orgasm.</span>")
|
||||
src.visible_message("<span class='love'>[src] looks like they're about to cum.</span>", \
|
||||
"<span class='userlove'>You feel yourself about to orgasm.</span>", \
|
||||
"<span class='userlove'>You feel yourself about to orgasm.</span>")
|
||||
if(do_after(src, mb_time, target = src))
|
||||
if(total_fluids > 5)
|
||||
fluid_source.reaction(src.loc, TOUCH, 1, 0)
|
||||
fluid_source.clear_reagents()
|
||||
src.visible_message("<span class='danger'>[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], using [p_their()] [G.name]!</span>", \
|
||||
"<span class='green'>You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].</span>", \
|
||||
"<span class='green'>You climax using your [G.name].</span>")
|
||||
src.visible_message("<span class='love'>[src] orgasms[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""], using [p_their()] [G.name]!</span>", \
|
||||
"<span class='userlove'>You climax[istype(src.loc, /turf/open/floor) ? ", spilling onto [src.loc]" : ""] with your [G.name].</span>", \
|
||||
"<span class='userlove'>You climax using your [G.name].</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
if(G.can_climax)
|
||||
setArousalLoss(min_arousal)
|
||||
@@ -285,9 +288,9 @@
|
||||
fluid_source = G.linked_organ.reagents
|
||||
total_fluids = fluid_source.total_volume
|
||||
if(mb_time) //Skip warning if this is an instant climax.
|
||||
src.visible_message("[src] is about to climax with [L]!", \
|
||||
"You're about to climax with [L]!", \
|
||||
"<span class='danger'>You're preparing to climax with someone!</span>")
|
||||
src.visible_message("<span class='love'>[src] is about to climax with [L]!</span>", \
|
||||
"<span class='userlove'>You're about to climax with [L]!</span>", \
|
||||
"<span class='userlove'>You're preparing to climax with someone!</span>")
|
||||
if(spillage)
|
||||
if(do_after(src, mb_time, target = src) && in_range(src, L))
|
||||
fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor)
|
||||
@@ -295,9 +298,9 @@
|
||||
if(total_fluids > 5)
|
||||
fluid_source.reaction(L.loc, TOUCH, 1, 0)
|
||||
fluid_source.clear_reagents()
|
||||
src.visible_message("<span class='danger'>[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!</span>", \
|
||||
"<span class='green'>You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].</span>", \
|
||||
"<span class='green'>You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].</span>")
|
||||
src.visible_message("<span class='love'>[src] climaxes with [L][spillage ? ", overflowing and spilling":""], using [p_their()] [G.name]!</span>", \
|
||||
"<span class='userlove'>You orgasm with [L][spillage ? ", spilling out of them":""], using your [G.name].</span>", \
|
||||
"<span class='userlove'>You have climaxed with someone[spillage ? ", spilling out of them":""], using your [G.name].</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
if(G.can_climax)
|
||||
@@ -306,9 +309,9 @@
|
||||
if(do_after(src, mb_time, target = src) && in_range(src, L))
|
||||
fluid_source.trans_to(L, total_fluids)
|
||||
total_fluids = 0
|
||||
src.visible_message("<span class='danger'>[src] climaxes with [L], [p_their()] [G.name] spilling nothing!</span>", \
|
||||
"<span class='green'>You ejaculate with [L], your [G.name] spilling nothing.</span>", \
|
||||
"<span class='green'>You have climaxed inside someone, your [G.name] spilling nothing.</span>")
|
||||
src.visible_message("<span class='love'>[src] climaxes with [L], [p_their()] [G.name] spilling nothing!</span>", \
|
||||
"<span class='userlove'>You ejaculate with [L], your [G.name] spilling nothing.</span>", \
|
||||
"<span class='userlove'>You have climaxed inside someone, your [G.name] spilling nothing.</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
if(G.can_climax)
|
||||
@@ -332,14 +335,14 @@
|
||||
// to_chat(src, "<span class='warning'>You need a container to do this!</span>")
|
||||
// return
|
||||
|
||||
src.visible_message("<span class='danger'>[src] starts to [G.masturbation_verb] their [G.name] over [container].</span>", \
|
||||
"<span class='userdanger'>You start to [G.masturbation_verb] your [G.name] over [container].</span>", \
|
||||
"<span class='userdanger'>You start to [G.masturbation_verb] your [G.name] over something.</span>")
|
||||
src.visible_message("<span class='love'>[src] starts to [G.masturbation_verb] their [G.name] over [container].</span>", \
|
||||
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name] over [container].</span>", \
|
||||
"<span class='userlove'>You start to [G.masturbation_verb] your [G.name] over something.</span>")
|
||||
if(do_after(src, mb_time, target = src) && in_range(src, container))
|
||||
fluid_source.trans_to(container, total_fluids)
|
||||
src.visible_message("<span class='danger'>[src] uses [p_their()] [G.name] to fill [container]!</span>", \
|
||||
"<span class='green'>You used your [G.name] to fill [container].</span>", \
|
||||
"<span class='green'>You have relieved some pressure.</span>")
|
||||
src.visible_message("<span class='love'>[src] uses [p_their()] [G.name] to fill [container]!</span>", \
|
||||
"<span class='userlove'>You used your [G.name] to fill [container].</span>", \
|
||||
"<span class='userlove'>You have relieved some pressure.</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
|
||||
if(G.can_climax)
|
||||
setArousalLoss(min_arousal)
|
||||
|
||||
@@ -47,8 +47,6 @@
|
||||
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))
|
||||
|
||||
/obj/item/organ/genital/breasts/update_appearance()
|
||||
var/string = "breasts_[lowertext(shape)]_[size]"
|
||||
icon_state = sanitize_text(string)
|
||||
var/lowershape = lowertext(shape)
|
||||
switch(lowershape)
|
||||
if("pair")
|
||||
@@ -66,11 +64,13 @@
|
||||
|
||||
if(producing && aroused_state)
|
||||
desc += " They're leaking [fluid_id]."
|
||||
var/string
|
||||
if(owner)
|
||||
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
|
||||
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
|
||||
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
|
||||
color = "#[skintone2hex(H.skin_tone)]"
|
||||
string = "breasts_[lowertext(shape)]_[size]-s"
|
||||
else
|
||||
color = "#[owner.dna.features["breasts_color"]]"
|
||||
string = "breasts_[lowertext(shape)]_[size]"
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
var/list/genital_list = list()
|
||||
for(var/obj/item/organ/O in internal_organs)
|
||||
if(istype(O, /obj/item/organ/genital))
|
||||
if(isgenital(O))
|
||||
var/obj/item/organ/genital/G = O
|
||||
if(!G.internal)
|
||||
genital_list += G
|
||||
@@ -110,10 +110,13 @@
|
||||
|
||||
|
||||
/obj/item/organ/genital/proc/update_size()
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/update_appearance()
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/update_link()
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/remove_ref()
|
||||
if(linked_organ)
|
||||
@@ -130,12 +133,12 @@
|
||||
|
||||
//proc to give a player their genitals and stuff when they log in
|
||||
/mob/living/carbon/human/proc/give_genitals(clean=0)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA
|
||||
if (NOGENITALS in dna.species.species_traits)
|
||||
return
|
||||
if(clean)
|
||||
var/obj/item/organ/genital/GtoClean
|
||||
for(GtoClean in internal_organs)
|
||||
qdel(GtoClean)
|
||||
if (NOGENITALS in dna.species.species_traits)
|
||||
return
|
||||
//Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in.
|
||||
if(dna.features["has_breasts"])
|
||||
give_breasts()
|
||||
@@ -218,6 +221,7 @@
|
||||
return
|
||||
/mob/living/carbon/human/proc/give_eggsack()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/give_vagina()
|
||||
if(!dna)
|
||||
return FALSE
|
||||
@@ -308,12 +312,13 @@
|
||||
var/list/standing = list()
|
||||
var/size
|
||||
var/aroused_state
|
||||
|
||||
for(var/L in relevant_layers) //Less hardcode
|
||||
H.remove_overlay(L)
|
||||
//start scanning for genitals
|
||||
//var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again
|
||||
for(var/obj/item/organ/O in H.internal_organs)
|
||||
if(istype(O, /obj/item/organ/genital))
|
||||
if(isgenital(O))
|
||||
var/obj/item/organ/genital/G = O
|
||||
if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes
|
||||
genitals_to_add += H.getorganslot(G.slot)
|
||||
|
||||
@@ -87,6 +87,13 @@
|
||||
icon_state = "hairy"
|
||||
name = "Hairy"
|
||||
|
||||
/datum/sprite_accessory/vagina/spade
|
||||
icon_state = "spade"
|
||||
name = "Spade"
|
||||
|
||||
/datum/sprite_accessory/vagina/furred
|
||||
icon_state = "furred"
|
||||
name = "Furred"
|
||||
|
||||
//BREASTS BE HERE
|
||||
/datum/sprite_accessory/breasts
|
||||
|
||||
@@ -17,12 +17,11 @@
|
||||
var/clits = 1
|
||||
var/clit_diam = 0.25
|
||||
var/clit_len = 0.25
|
||||
var/list/vag_types = list("tentacle", "dentata", "hairy")
|
||||
var/list/vag_types = list("tentacle", "dentata", "hairy", "spade", "furred")
|
||||
|
||||
|
||||
/obj/item/organ/genital/vagina/update_appearance()
|
||||
var/string = "vagina" //Keeping this code here, so making multiple sprites for the different kinds is easier.
|
||||
icon_state = sanitize_text(string)
|
||||
var/string //Keeping this code here, so making multiple sprites for the different kinds is easier.
|
||||
var/lowershape = lowertext(shape)
|
||||
var/details
|
||||
|
||||
@@ -37,6 +36,10 @@
|
||||
details = "It is taut with smooth skin, though without much hair and "
|
||||
if("gaping")
|
||||
details = "It is gaping slightly open, though without much hair and "
|
||||
if("spade")
|
||||
details = "It is a plush canine spade, it "
|
||||
if("furred")
|
||||
details = "It has neatly groomed fur around the outer folds, it "
|
||||
else
|
||||
details = "It has an exotic shape and "
|
||||
if(aroused_state)
|
||||
@@ -51,9 +54,15 @@
|
||||
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
|
||||
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
|
||||
color = "#[skintone2hex(H.skin_tone)]"
|
||||
string = "vagina-s"
|
||||
else
|
||||
color = "#[owner.dna.features["vag_color"]]"
|
||||
string = "vagina"
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
H.update_genitals()
|
||||
|
||||
icon_state = sanitize_text(string)
|
||||
|
||||
/obj/item/organ/genital/vagina/update_link()
|
||||
if(owner)
|
||||
|
||||
@@ -18,6 +18,16 @@
|
||||
category = SLOT_NECK
|
||||
path = /obj/item/clothing/neck/petcollar
|
||||
|
||||
/datum/gear/leathercollar
|
||||
name = "Leather collar"
|
||||
category = SLOT_NECK
|
||||
path = /obj/item/clothing/neck/petcollar/leather
|
||||
|
||||
/datum/gear/choker
|
||||
name = "Choker"
|
||||
category = SLOT_NECK
|
||||
path = /obj/item/clothing/neck/petcollar/choker
|
||||
|
||||
/datum/gear/scarf
|
||||
name = "White scarf"
|
||||
category = SLOT_NECK
|
||||
|
||||
@@ -49,6 +49,66 @@
|
||||
item_color = "steele"
|
||||
medaltype = "medal-silver"
|
||||
|
||||
/obj/item/toy/sword/darksabre
|
||||
name = "Kiara's Sabre"
|
||||
desc = "This blade looks as dangerous as its owner."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
alternate_worn_icon = 'icons/mob/custom_w.dmi'
|
||||
icon_state = "darksabre"
|
||||
item_state = "darksabre"
|
||||
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
|
||||
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("attacked", "struck", "hit")
|
||||
|
||||
|
||||
/obj/item/storage/belt/sabre/darksabre
|
||||
name = "Ornate Sheathe"
|
||||
desc = "An ornate and rather sinister looking sabre sheathe."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
alternate_worn_icon = 'icons/mob/custom_w.dmi'
|
||||
icon_state = "darksheath"
|
||||
item_state = "darksheath"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/storage/belt/sabre/darksabre/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_items = 1
|
||||
STR.rustle_sound = FALSE
|
||||
STR.max_w_class = WEIGHT_CLASS_BULKY
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/toy/sword/darksabre
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/sabre/darksabre/update_icon()
|
||||
icon_state = "darksheath"
|
||||
item_state = "darksheath"
|
||||
if(contents.len)
|
||||
icon_state += "-darksabre"
|
||||
item_state += "-darksabre"
|
||||
if(loc && isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
L.regenerate_icons()
|
||||
..()
|
||||
|
||||
/obj/item/storage/belt/sabre/darksabre/PopulateContents()
|
||||
new /obj/item/toy/sword/darksabre(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/darkcarapace
|
||||
name = "Dark Armor"
|
||||
desc = "A dark, non-functional piece of armor sporting a red and black finish."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
alternate_worn_icon = 'icons/mob/custom_w.dmi'
|
||||
icon_state = "darkcarapace"
|
||||
item_state = "darkcarapace"
|
||||
blood_overlay_type = "armor"
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
|
||||
/obj/item/lighter/gold
|
||||
name = "\improper Engraved Zippo"
|
||||
desc = "A shiny and relatively expensive zippo lighter. There's a small etched in verse on the bottom that reads, 'No Gods, No Masters, Only Man.'"
|
||||
@@ -307,51 +367,6 @@
|
||||
if(prob(5) && H.hallucination < 15)
|
||||
H.hallucination += 10
|
||||
|
||||
/obj/item/toy/sword/darksabre
|
||||
name = "Kiara's Sabre"
|
||||
desc = "This blade looks as dangerous as its owner."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
alternate_worn_icon = 'icons/mob/custom_w.dmi'
|
||||
icon_state = "darksabre"
|
||||
item_state = "darksabre"
|
||||
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
|
||||
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("attacked", "struck", "hit")
|
||||
|
||||
|
||||
/obj/item/storage/belt/sabre/darksabre
|
||||
name = "Ornate Sheathe"
|
||||
desc = "An ornate and rather sinister looking sabre sheathe."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
alternate_worn_icon = 'icons/mob/custom_w.dmi'
|
||||
icon_state = "darksheath"
|
||||
item_state = "darksheath"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/storage/belt/sabre/darksabre/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_items = 1
|
||||
STR.rustle_sound = FALSE
|
||||
STR.max_w_class = WEIGHT_CLASS_BULKY
|
||||
STR.can_hold = typecacheof(list(
|
||||
/obj/item/toy/sword/darksabre
|
||||
))
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/darkcarapace
|
||||
name = "Dark Armor"
|
||||
desc = "A dark, non-functional piece of armor sporting a red and black finish."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
alternate_worn_icon = 'icons/mob/custom_w.dmi'
|
||||
icon_state = "darkcarapace"
|
||||
item_state = "darkcarapace"
|
||||
blood_overlay_type = "armor"
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
|
||||
|
||||
/obj/item/clothing/neck/cloak/green
|
||||
name = "Generic Green Cloak"
|
||||
desc = "This cloak doesn't seem too special."
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
ext_cooldown = 25
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/electric_stimulator/do_work()
|
||||
..()
|
||||
set_pin_data(IC_OUTPUT, 1, 0)
|
||||
var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
|
||||
if(!check_target(M))
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
feeding = TRUE
|
||||
vore_active = TRUE
|
||||
isPredator = TRUE
|
||||
vore_default_mode = DM_HOLD
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
/mob/living/simple_animal/hostile/bear
|
||||
devourable = TRUE
|
||||
@@ -99,14 +99,14 @@
|
||||
feeding = TRUE
|
||||
vore_active = TRUE
|
||||
isPredator = TRUE
|
||||
vore_default_mode = DM_HOLD
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider
|
||||
devourable = TRUE
|
||||
digestable = TRUE
|
||||
feeding = TRUE
|
||||
vore_active = TRUE
|
||||
vore_default_mode = DM_HOLD
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake
|
||||
devourable = TRUE
|
||||
@@ -114,7 +114,7 @@
|
||||
feeding = TRUE
|
||||
vore_active = TRUE
|
||||
isPredator = TRUE
|
||||
vore_default_mode = DM_HOLD
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
/mob/living/simple_animal/hostile/gorilla
|
||||
devourable = TRUE
|
||||
@@ -122,7 +122,7 @@
|
||||
feeding = TRUE
|
||||
vore_active = TRUE
|
||||
isPredator = TRUE
|
||||
vore_default_mode = DM_HOLD
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath
|
||||
devourable = TRUE
|
||||
@@ -130,7 +130,7 @@
|
||||
feeding = TRUE
|
||||
vore_active = TRUE
|
||||
isPredator = TRUE
|
||||
vore_default_mode = DM_HOLD
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
/mob/living/simple_animal/hostile/carp
|
||||
devourable = TRUE
|
||||
@@ -138,4 +138,4 @@
|
||||
feeding = TRUE
|
||||
vore_active = TRUE
|
||||
isPredator = TRUE
|
||||
vore_default_mode = DM_HOLD
|
||||
vore_default_mode = DM_DIGEST
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
|
||||
icon_state = "mag-casing-live"
|
||||
projectile_type = /obj/item/projectile/bullet/magrifle
|
||||
energy_cost = 300
|
||||
energy_cost = 200
|
||||
|
||||
/obj/item/ammo_casing/caseless/mag_e/anlmagm_e
|
||||
desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
|
||||
@@ -17,7 +17,7 @@
|
||||
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
|
||||
icon_state = "mag-casing-live"
|
||||
projectile_type = /obj/item/projectile/bullet/nlmagrifle
|
||||
energy_cost = 300
|
||||
energy_cost = 200
|
||||
|
||||
/obj/item/ammo_casing/caseless/mag_e/amags
|
||||
desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
|
||||
@@ -25,7 +25,7 @@
|
||||
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
|
||||
icon_state = "mag-casing-live"
|
||||
projectile_type = /obj/item/projectile/bullet/mags
|
||||
energy_cost = 200
|
||||
energy_cost = 125
|
||||
|
||||
/obj/item/ammo_casing/caseless/mag_e/anlmags
|
||||
desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
|
||||
@@ -33,7 +33,7 @@
|
||||
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
|
||||
icon_state = "mag-casing-live"
|
||||
projectile_type = /obj/item/projectile/bullet/nlmags
|
||||
energy_cost = 200
|
||||
energy_cost = 125
|
||||
|
||||
///magazines///
|
||||
|
||||
@@ -53,14 +53,13 @@
|
||||
ammo_type = /obj/item/ammo_casing/caseless/mag_e/amagm_e
|
||||
max_ammo = 24
|
||||
|
||||
|
||||
/obj/item/ammo_box/magazine/mmag_e/small
|
||||
name = "magpistol magazine (non-lethal disabler)"
|
||||
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
|
||||
icon_state = "nlmagmag"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmags
|
||||
caliber = "mag_e"
|
||||
max_ammo = 15
|
||||
max_ammo = 16
|
||||
multiple_sprites = 2
|
||||
|
||||
/obj/item/ammo_box/magazine/mmag_e/small/lethal
|
||||
@@ -68,16 +67,19 @@
|
||||
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
|
||||
icon_state = "smallmagmag"
|
||||
ammo_type = /obj/item/ammo_casing/caseless/mag_e/amags
|
||||
max_ammo = 16
|
||||
|
||||
///cells///
|
||||
|
||||
/obj/item/stock_parts/cell/magrifle_e
|
||||
name = "magrifle power supply"
|
||||
maxcharge = 14400
|
||||
chargerate = 3520
|
||||
|
||||
/obj/item/stock_parts/cell/magpistol_e
|
||||
name = "magpistol power supply"
|
||||
maxcharge = 6000
|
||||
chargerate = 1000
|
||||
|
||||
///sci designs///
|
||||
|
||||
@@ -216,7 +218,6 @@
|
||||
pin = null
|
||||
spawnwithmagazine = FALSE
|
||||
|
||||
|
||||
///magpistol///
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/mag_e
|
||||
@@ -276,7 +277,6 @@
|
||||
if(!dead_cell)
|
||||
cell.give(cell.maxcharge)
|
||||
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/mag_e/update_icon()
|
||||
..()
|
||||
if(magazine)
|
||||
@@ -286,7 +286,6 @@
|
||||
cut_overlays()
|
||||
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
|
||||
|
||||
|
||||
/obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
|
||||
pin = null
|
||||
spawnwithmagazine = FALSE
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
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.")
|
||||
to_chat(M, "<span class='love'>[aroused_message]</span>")
|
||||
to_chat(M, "<span class='userlove'>[aroused_message]</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus
|
||||
@@ -133,7 +133,7 @@
|
||||
aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
|
||||
else
|
||||
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.")
|
||||
to_chat(M, "<span class='love'>[aroused_message]</span>")
|
||||
to_chat(M, "<span class='userlove'>[aroused_message]</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M)
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/datum/design/hypovialsmall
|
||||
name = "Hypovial"
|
||||
id = "hypovial"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 500)
|
||||
build_path = /obj/item/reagent_containers/glass/bottle/vial/small
|
||||
category = list("initial","Medical")
|
||||
|
||||
/datum/design/hypoviallarge
|
||||
name = "Large Hypovial"
|
||||
id = "large_hypovial"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 2500)
|
||||
build_path = /obj/item/reagent_containers/glass/bottle/vial/large
|
||||
category = list("initial","Medical")
|
||||
Reference in New Issue
Block a user