Merge remote-tracking branch 'refs/remotes/Citadel-Station-13/master' into syntheticbloods

This commit is contained in:
Poojawa
2019-05-06 02:53:42 -05:00
124 changed files with 3858 additions and 2579 deletions
@@ -4,7 +4,7 @@
icon_state = "penis"
icon = 'modular_citadel/icons/obj/genitals/penis.dmi'
zone = "groin"
slot = "penis"
slot = ORGAN_SLOT_PENIS
w_class = 3
can_masturbate_with = TRUE
masturbation_verb = "stroke"
@@ -40,7 +40,8 @@
var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
icon_state = sanitize_text(string)
var/lowershape = lowertext(shape)
desc = "You see a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long."
desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth."
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...
@@ -1,33 +1,54 @@
/obj/item/integrated_circuit/manipulation/electric_stimulator
name = "electronic stimulation module"
desc = "Used to induce sexual stimulation with electricity."
desc = "Used to induce sexual stimulation in a target via electricity."
icon_state = "power_relay"
extended_desc = "The circuit accepts a reference to a person and upon activation, attempts to stimulate them to orgasm."
complexity = 10
size = 3
inputs = list("target" = IC_PINTYPE_REF)
outputs = list()
activators = list("fire" = IC_PINTYPE_PULSE_IN)
extended_desc = "The circuit accepts a reference to a person, as well as a number representing the strength of the shock, and upon activation, attempts to stimulate them to orgasm. The number ranges from -35 to 35, with negative numbers reducing arousal and positive numbers increasing it by that amount."
complexity = 15
size = 2
inputs = list("target" = IC_PINTYPE_REF, "strength" = IC_PINTYPE_NUMBER)
outputs = list("arousal gain"=IC_PINTYPE_NUMBER)
activators = list("fire" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT, "on orgasm" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
power_draw_per_use = 500
cooldown_per_use = 50
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))
return
if(ismob(M) && M.canbearoused)
if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
var/mob/living/carbon/human/H = M
var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!")
H.visible_message("<span class='warning'>\The [assembly] electrodes shock [H]!</span>", "<span class='warning'>[orgasm_message]</span>")
playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
H.mob_climax(forced_climax=TRUE)
var/arousal_gain = CLAMP(get_pin_data(IC_INPUT, 2),-35,35)
set_pin_data(IC_OUTPUT, 1, arousal_gain)
if(ismob(M) && M.canbearoused && arousal_gain != 0)
var/orgasm = FALSE
if(arousal_gain > 0)
if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
var/mob/living/carbon/human/H = M
var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!")
H.visible_message("<span class='warning'>\The [assembly] electrodes shock [H]!</span>", "<span class='warning'>[orgasm_message]</span>")
playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
H.mob_climax(forced_climax=TRUE)
orgasm = TRUE
else
M.adjustArousalLoss(arousal_gain)
var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!")
M.visible_message("<span class='warning'>\The [assembly] electrodes shock [M]!</span>", "<span class='warning'>[stimulate_message]</span>")
else
M.adjustArousalLoss(35)
var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!")
var/stimulate_message = pick("You feel a dull prickle of electricity through your body!", "A burst of dull electricity flows through your body!")
M.visible_message("<span class='warning'>\The [assembly] electrodes shock [M]!</span>", "<span class='warning'>[stimulate_message]</span>")
playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
M.adjustArousalLoss(arousal_gain)
playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
push_data()
activate_pin(2)
if(orgasm) activate_pin(4)
else
visible_message("<span class='warning'>\The [assembly] electrodes fail to shock [M]!</span>")
push_data()
activate_pin(3)
@@ -70,16 +70,16 @@
else //recipient is an mentor but sender is not
to_chat(C, "<font color='purple'>Reply PM from-<b>[key_name_mentor(src, C, 1, 0, show_char)]</b>: [msg]</font>")
to_chat(src, "<font color='green'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, 0)]</b>: [msg]</font>")
to_chat(src, "<font color='brown'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, 0)]</b>: [msg]</font>")
else
if(is_mentor()) //sender is an mentor but recipient is not.
to_chat(C, "<font color='purple'>Mentor PM from-<b>[key_name_mentor(src, C, 1, 0, 0)]</b>: [msg]</font>")
to_chat(src, "<font color='green'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, show_char)]</b>: [msg]</font>")
to_chat(src, "<font color='brown'>Mentor PM to-<b>[key_name_mentor(C, C, 1, 0, show_char)]</b>: [msg]</font>")
//we don't use message_Mentors here because the sender/receiver might get it too
var/show_char_sender = !is_mentor() && CONFIG_GET(flag/mentors_mobname_only)
var/show_char_recip = !C.is_mentor() && CONFIG_GET(flag/mentors_mobname_only)
for(var/client/X in GLOB.mentors | GLOB.admins)
if(X.key!=key && X.key!=C.key) //check client/X is an Mentor and isn't the sender or recipient
to_chat(X, "<B><font color='green'>Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]-&gt;[key_name_mentor(C, X, 0, 0, show_char_recip)]:</B> <font color ='blue'> [msg]</font>") //inform X
to_chat(X, "<B><font color='brown'>Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]-&gt;[key_name_mentor(C, X, 0, 0, show_char_recip)]:</B> <font color ='blue'> [msg]</font>") //inform X
@@ -55,7 +55,7 @@
/obj/item/projectile/bullet/nlmags //non-lethal boolets
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "magjectile-nl"
damage = 0
damage = 2
knockdown = 0
stamina = 25
armour_penetration = -10
@@ -123,7 +123,7 @@
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
///research memes///
/*
/obj/item/gun/ballistic/automatic/pistol/mag/nopin
pin = null
spawnwithmagazine = FALSE
@@ -155,7 +155,7 @@
materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
build_path = /obj/item/ammo_box/magazine/mmag/small
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
*/
//////toy memes/////
/obj/item/projectile/bullet/reusable/foam_dart/mag
@@ -210,7 +210,7 @@
/obj/item/projectile/bullet/nlmagrifle //non-lethal boolets
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "magjectile-large-nl"
damage = 0
damage = 2
knockdown = 0
stamina = 25
armour_penetration = -10
@@ -271,7 +271,8 @@
recoil = 0.15
casing_ejector = 0
///research///
/*
//research///
/obj/item/gun/ballistic/automatic/magrifle/nopin
pin = null
@@ -304,7 +305,7 @@
materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
build_path = /obj/item/ammo_box/magazine/mmag
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
*/
///foamagrifle///
/obj/item/ammo_box/magazine/toy/foamag
@@ -326,10 +327,9 @@
spread = 60
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_HEAVY
/*
// TECHWEBS IMPLEMENTATION
*/
//
/datum/techweb_node/magnetic_weapons
id = "magnetic_weapons"
@@ -339,7 +339,7 @@
design_ids = list("magrifle", "magpisol", "mag_magrifle", "mag_magrifle_nl", "mag_magpistol", "mag_magpistol_nl")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
*/
//////Hyper-Burst Rifle//////
@@ -0,0 +1,279 @@
///ammo///
/obj/item/ammo_casing/caseless/mag_e
var/energy_cost = 0
/obj/item/ammo_casing/caseless/mag_e/amagm_e
desc = "A large ferromagnetic slug intended to be launched out of a compatible weapon."
caliber = "mag_e"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/magrifle
energy_cost = 300
/obj/item/ammo_casing/caseless/mag_e/anlmagm_e
desc = "A large, specialized ferromagnetic slug designed with a less-than-lethal payload."
caliber = "mag_e"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/nlmagrifle
energy_cost = 300
/obj/item/ammo_casing/caseless/mag_e/amags
desc = "A ferromagnetic slug intended to be launched out of a compatible weapon."
caliber = "mag_e"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/mags
energy_cost = 200
/obj/item/ammo_casing/caseless/mag_e/anlmags
desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload."
caliber = "mag_e"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mag-casing-live"
projectile_type = /obj/item/projectile/bullet/nlmags
energy_cost = 200
///magazines///
/obj/item/ammo_box/magazine/mmag_e/
name = "magrifle magazine (non-lethal disabler)"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mediummagmag"
ammo_type = /obj/item/ammo_casing/caseless/mag_e/anlmagm_e
caliber = "mag_e"
max_ammo = 24
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmag_e/lethal
name = "magrifle magazine (lethal)"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "mediummagmag"
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
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmag_e/small/lethal
name = "magpistol magazine (lethal)"
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "smallmagmag"
ammo_type = /obj/item/ammo_casing/caseless/mag_e/amags
///cells///
/obj/item/stock_parts/cell/magrifle_e
name = "magrifle power supply"
maxcharge = 14400
/obj/item/stock_parts/cell/magpistol_e
name = "magpistol power supply"
maxcharge = 6000
///sci designs///
/datum/design/magrifle_e
name = "Magrifle"
desc = "An upscaled Magpistol in rifle form."
id = "magrifle_e"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 10000, MAT_SILVER = 4000, MAT_GOLD = 2000)
build_path = /obj/item/gun/ballistic/automatic/magrifle_e/nopin
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_magrifle_e
name = "Magrifle Magazine (Lethal)"
desc = "A 24-round magazine for the Magrifle."
id = "mag_magrifle_e"
build_type = PROTOLATHE
materials = list(MAT_METAL = 8000, MAT_SILVER = 1000)
build_path = /obj/item/ammo_box/magazine/mmag_e/lethal
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_magrifle_e/nl
name = "Magrifle Magazine (Non-Lethal)"
desc = "A 24- round non-lethal magazine for the Magrifle."
id = "mag_magrifle_e_nl"
materials = list(MAT_METAL = 6000, MAT_SILVER = 500, MAT_TITANIUM = 500)
build_path = /obj/item/ammo_box/magazine/mmag_e
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/magpistol_e
name = "Magpistol"
desc = "A weapon which fires ferromagnetic slugs."
id = "magpistol_e"
build_type = PROTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000)
build_path = /obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_magpistol_e
name = "Magpistol Magazine"
desc = "A 14 round magazine for the Magpistol."
id = "mag_magpistol_e"
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_SILVER = 500)
build_path = /obj/item/ammo_box/magazine/mmag_e/small/lethal
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_magpistol_e/nl
name = "Magpistol Magazine (Non-Lethal)"
desc = "A 14 round non-lethal magazine for the Magpistol."
id = "mag_magpistol_e_nl"
materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250)
build_path = /obj/item/ammo_box/magazine/mmag_e/small
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/*
// TECHWEBS IMPLEMENTATION
*/
/datum/techweb_node/magnetic_weapons
id = "magnetic_weapons"
display_name = "Magnetic Weapons"
description = "Weapons using magnetic technology"
prereq_ids = list("weaponry", "adv_weaponry", "emp_adv")
design_ids = list("magrifle_e", "magpistol_e", "mag_magrifle_e", "mag_magrifle_e_nl", "mag_magpistol_e", "mag_magpistol_e_nl")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
///magrifle///
/obj/item/gun/ballistic/automatic/magrifle_e
name = "\improper Magnetic Rifle"
desc = "A simple upscalling of the technologies used in the magpistol, the magrifle is capable of firing slightly larger slugs in bursts. Compatible with the magpistol's slugs."
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "magrifle"
item_state = "arg"
slot_flags = 0
mag_type = /obj/item/ammo_box/magazine/mmag_e
fire_sound = 'sound/weapons/magrifle.ogg'
can_suppress = 0
burst_size = 3
fire_delay = 2
spread = 5
recoil = 0.15
casing_ejector = 0
var/obj/item/stock_parts/cell/cell
var/cell_type = /obj/item/stock_parts/cell/magrifle_e
var/dead_cell = FALSE
/obj/item/gun/ballistic/automatic/magrifle_e/can_shoot()
if(QDELETED(cell))
return 0
var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
if(!shot)
return 0
if(cell.charge < shot.energy_cost*burst_size)
return 0
. = ..()
/obj/item/gun/ballistic/automatic/magrifle_e/shoot_live_shot()
var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
cell.use(shot.energy_cost)
. = ..()
/obj/item/gun/ballistic/automatic/magrifle_e/emp_act(severity)
. = ..()
if(!(. & EMP_PROTECT_CONTENTS))
cell.use(round(cell.charge / severity))
/obj/item/gun/ballistic/automatic/magrifle_e/get_cell()
return cell
/obj/item/gun/ballistic/automatic/magrifle_e/Initialize()
. = ..()
if(cell_type)
cell = new cell_type(src)
else
cell = new(src)
if(!dead_cell)
cell.give(cell.maxcharge)
/obj/item/gun/ballistic/automatic/magrifle_e/nopin
pin = null
spawnwithmagazine = FALSE
///magpistol///
/obj/item/gun/ballistic/automatic/pistol/mag_e
name = "magpistol"
desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities."
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "magpistol"
force = 10
fire_sound = 'sound/weapons/magpistol.ogg'
mag_type = /obj/item/ammo_box/magazine/mmag_e/small
can_suppress = 0
casing_ejector = 0
fire_delay = 2
recoil = 0.2
var/obj/item/stock_parts/cell/cell
var/cell_type = /obj/item/stock_parts/cell/magpistol_e
var/dead_cell = FALSE
/obj/item/gun/ballistic/automatic/pistol/mag_e/can_shoot()
if(QDELETED(cell))
return 0
var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
if(!shot)
return 0
if(cell.charge < shot.energy_cost)
return 0
. = ..()
/obj/item/gun/ballistic/automatic/pistol/mag_e/shoot_live_shot()
var/obj/item/ammo_casing/caseless/mag_e/shot = chambered
cell.use(shot.energy_cost)
. = ..()
/obj/item/gun/ballistic/automatic/pistol/mag_e/emp_act(severity)
. = ..()
if(!(. & EMP_PROTECT_CONTENTS))
cell.use(round(cell.charge / severity))
/obj/item/gun/ballistic/automatic/pistol/mag_e/get_cell()
return cell
/obj/item/gun/ballistic/automatic/pistol/mag_e/Initialize()
. = ..()
if(cell_type)
cell = new cell_type(src)
else
cell = new(src)
if(!dead_cell)
cell.give(cell.maxcharge)
/obj/item/gun/ballistic/automatic/pistol/mag_e/update_icon()
..()
if(magazine)
cut_overlays()
add_overlay("magpistol-magazine")
else
cut_overlays()
icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
/obj/item/gun/ballistic/automatic/pistol/mag_e/nopin
pin = null
spawnwithmagazine = FALSE
@@ -17,30 +17,3 @@
/obj/item/gun/energy/laser/redtag
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
/obj/item/gun/energy/laser/carbine
name = "VGS blaster carbine"
desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal blaster carbine."
icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi'
icon_state = "lasernew"
item_state = "laser"
force = 10
throwforce = 10
ammo_type = list(/obj/item/ammo_casing/energy/lasergun)
cell_type = /obj/item/stock_parts/cell/lascarbine
/obj/item/gun/energy/laser/carbine/nopin
pin = null
/obj/item/stock_parts/cell/lascarbine
name = "laser carbine power supply"
maxcharge = 2500
/datum/design/lasercarbine
name = "VGS Blaster Carbine"
desc = "Beefed up version of a normal blaster carbine."
id = "lasercarbine"
build_type = PROTOLATHE
materials = list(MAT_GOLD = 2500, MAT_METAL = 5000, MAT_GLASS = 5000)
build_path = /obj/item/gun/energy/laser/carbine/nopin
category = list("Weapons")
@@ -97,7 +97,7 @@
color = "#FFADFF"//PINK, rgb(255, 173, 255)
/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M)
if(M && M.canbearoused)
if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE))
if(prob(33))
M.adjustArousalLoss(2)
if(prob(5))
@@ -119,7 +119,7 @@
overdose_threshold = 20
/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M)
if(M && M.canbearoused)
if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE))
if(prob(33))
M.adjustArousalLoss(6)//not quite six times as powerful, but still considerably more powerful.
if(prob(5))
@@ -151,7 +151,7 @@
..()
/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M)
if(M && M.canbearoused && prob(33))
if(M && M.canbearoused && !M.has_trait(TRAIT_CROCRIN_IMMUNE) && prob(33))
if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
var/mob/living/carbon/human/H = M
if(prob(50)) //Less spam
@@ -232,10 +232,11 @@
M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
items_preserved -= M
for(var/mob/H in get_hearers_in_view(2, get_turf(owner)))
if(H.client && (H.client.prefs.cit_toggles & EATING_NOISES))
var/sound/releasement = GLOB.release_sounds[release_sound]
playsound(get_turf(owner),releasement,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
if(!silent)
for(var/mob/H in get_hearers_in_view(2, get_turf(owner)))
if(H.client && (H.client.prefs.cit_toggles & EATING_NOISES))
var/sound/releasement = GLOB.release_sounds[release_sound]
playsound(get_turf(owner),releasement,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
if(istype(M,/mob/living))
var/mob/living/ML = M
@@ -289,8 +289,7 @@
if(!confirm == "Okay" || loc != B)
return
//Actual escaping
forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave.
src.cure_blind("belly_[REF(src)]")
B.release_specific_contents(src,TRUE) //we might as well take advantage of that specific belly's handling. Else we stay blinded forever.
src.stop_sound_channel(CHANNEL_PREYLOOP)
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey)
for(var/mob/living/simple_animal/SA in range(10))