Merge branch 'master' into FermiChem

This commit is contained in:
Thalpy
2019-05-11 14:14:20 +01:00
committed by GitHub
486 changed files with 10019 additions and 1000259 deletions
@@ -79,7 +79,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...
@@ -367,4 +367,10 @@ datum/gear/darksabresheath
name = "Soul Necklace"
category = SLOT_NECK
path = /obj/item/clothing/neck/undertale
ckeywhitelist = list("twilightic")
ckeywhitelist = list("twilightic")
/datum/gear/frenchberet
name = "French Beret"
category = SLOT_HEAD
path = /obj/item/clothing/head/frenchberet
ckeywhitelist = list("notazoltan")
@@ -29,10 +29,10 @@
restricted_roles = list("Security Officer")
/datum/gear/navyblueuniformofficer
name = "security officer navyblue uniform"
name = "Security officer navyblue uniform"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/security/navyblue
restricted_roles = list("Security officer")
restricted_roles = list("Security Officer")
/datum/gear/navybluejacketwarden
name = "warden navyblue jacket"
@@ -72,3 +72,15 @@
name = "Box of crayons"
category = SLOT_IN_BACKPACK
path = /obj/item/storage/crayons
/datum/gear/toykatana
name = "Toy Katana"
category = SLOT_IN_BACKPACK
path = /obj/item/toy/katana
cost = 3
//datum/gear/lumeyes
// name = "Luminescent eye auto surgeon"
// category = SLOT_IN_BACKPACK
// path = /obj/item/autosurgeon/gloweyes
// cost = 4
@@ -56,25 +56,34 @@
//trek fancy Hats!
/datum/gear/trekcap
name = "Federation Officer's Cap"
name = "Federation Officer's Cap (White)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover
restricted_roles = list("Captain","Head of Personnel")
/datum/gear/trekcapcap
name = "Federation Officer's Cap (Black)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/black
restricted_roles = list("Captain","Head of Personnel")
/datum/gear/trekcapmedisci
name = "Federation Officer's Cap"
name = "Federation Officer's Cap (Blue)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/medsci
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekcapeng
name = "Federation Officer's Cap"
name = "Federation Officer's Cap (Yellow)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/eng
restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
/datum/gear/trekcapsec
name = "Federation Officer's Cap"
name = "Federation Officer's Cap (Red)"
category = SLOT_HEAD
path = /obj/item/clothing/head/caphat/formal/fedcover/sec
restricted_desc = "Engineering, Security, and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -52,6 +52,7 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids)
var/geargroupID //defines the ID that the gear inherits from the config
var/list/restricted_roles
var/list/ckeywhitelist
var/restricted_desc
/datum/gear/New()
..()
@@ -84,31 +84,62 @@
name = "DS9 Overcoat (use uniform)"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/trek/ds9
restricted_desc = "All, barring Service and Civilian"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster",
"Medical Doctor","Chemist","Virologist","Geneticist","Scientist", "Roboticist",
"Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer",
"Cargo Technician", "Shaft Miner") //everyone who actually deserves a job.
//Federation jackets from movies
/datum/gear/trekcmdcap
name = "fed (movie) uniform, Captain"
name = "Fed (movie) uniform, Black"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/capt
restricted_roles = list("Captain","Head of Personnel")
/datum/gear/trekcmdmov
name = "fed (movie) uniform, sec"
name = "Fed (movie) uniform, Red"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat
restricted_desc = "Heads of Staff and Security"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer")
/datum/gear/trekmedscimov
name = "fed (movie) uniform, med/sci"
name = "Fed (movie) uniform, Blue"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/medsci
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengmov
name = "fed (movie) uniform, ops/eng"
name = "Fed (movie) uniform, Yellow"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/fedcoat/eng
restricted_desc = "Engineering and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster")
/datum/gear/trekcmdcapmod
name = "Fed (Modern) uniform, White"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/modernfedcoat
restricted_roles = list("Captain","Head of Personnel")
/datum/gear/trekcmdmod
name = "Fed (Modern) uniform, Red"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
restricted_desc = "Heads of Staff and Security"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster","Warden","Detective","Security Officer")
/datum/gear/trekmedscimod
name = "Fed (Modern) uniform, Blue"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengmod
name = "Fed (Modern) uniform, Yellow"
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
restricted_desc = "Engineering and Cargo"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -179,18 +179,21 @@
name = "TOS uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitos
name = "TOS uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtos
name = "TOS uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//TNG
@@ -198,18 +201,21 @@
name = "TNG uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/next
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscitng
name = "TNG uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/next
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengtng
name = "TNG uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/next
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//VOY
@@ -217,18 +223,21 @@
name = "VOY uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/voy
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscivoy
name = "VOY uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/voy
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengvoy
name = "VOY uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/voy
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//DS9
@@ -236,18 +245,21 @@
name = "DS9 uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ds9
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscids9
name = "DS9 uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ds9
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengds9
name = "DS9 uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ds9
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
//ENT
@@ -255,16 +267,19 @@
name = "ENT uniform, cmd"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/command/ent
restricted_desc = "Heads of Staff"
restricted_roles = list("Head of Security","Captain","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Quartermaster")
/datum/gear/trekmedscient
name = "ENT uniform, med/sci"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/medsci/ent
restricted_desc = "Medical and Science"
restricted_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Virologist","Geneticist","Research Director","Scientist", "Roboticist")
/datum/gear/trekengent
name = "ENT uniform, ops/sec"
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/rank/trek/engsec/ent
restricted_desc = "Engineering and Security"
restricted_roles = list("Chief Engineer","Atmospheric Technician","Station Engineer","Warden","Detective","Security Officer","Head of Security","Cargo Technician", "Shaft Miner", "Quartermaster")
@@ -24,77 +24,7 @@
// stuff that was in base
max_save_slots = 10
features = list("mcolor" = "FFF",
"tail_lizard" = "Smooth",
"tail_human" = "None",
"snout" = "Round",
"horns" = "None",
"ears" = "None",
"wings" = "None",
"frills" = "None",
"spines" = "None",
"body_markings" = "None",
"legs" = "Normal Legs",
"moth_wings" = "Plain",
"mcolor2" = "FFF",
"mcolor3" = "FFF",
"mam_body_markings" = "None",
"mam_ears" = "None",
"mam_snouts" = "None",
"mam_tail" = "None",
"mam_tail_animated" = "None",
"xenodorsal" = "Standard",
"xenohead" = "Standard",
"xenotail" = "Xenomorph Tail",
"taur" = "None",
"exhibitionist" = FALSE,
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = "Human",
"cock_length" = 6,
"cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
"cock_color" = "fff",
"has_sheath" = FALSE,
"sheath_color" = "fff",
"has_balls" = FALSE,
"balls_internal" = FALSE,
"balls_color" = "fff",
"balls_amount" = 2,
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
"balls_size" = BALLS_SIZE_DEF,
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
"balls_fluid" = "semen",
"has_ovi" = FALSE,
"ovi_shape" = "knotted",
"ovi_length" = 6,
"ovi_color" = "fff",
"has_eggsack" = FALSE,
"eggsack_internal" = TRUE,
"eggsack_color" = "fff",
"eggsack_size" = BALLS_SACK_SIZE_DEF,
"eggsack_egg_color" = "fff",
"eggsack_egg_size" = EGG_GIRTH_DEF,
"has_breasts" = FALSE,
"breasts_color" = "fff",
"breasts_size" = "C",
"breasts_shape" = "Pair",
"breasts_fluid" = "milk",
"has_vag" = FALSE,
"vag_shape" = "Human",
"vag_color" = "fff",
"vag_clits" = 1,
"vag_clit_diam" = 0.25,
"has_womb" = FALSE,
"womb_cum_rate" = CUM_RATE,
"womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY,
"womb_fluid" = "femcum",
"ipc_screen" = "Sunburst",
"ipc_antenna" = "None",
"flavor_text" = ""
)
/datum/preferences/New(client/C)
..()
@@ -86,6 +86,7 @@
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
actions_types = list(/datum/action/item_action/toggle_helmet)
var/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/linkedhelm
tauric = TRUE //Citadel Add for tauric hardsuits
var/energy_color = "#35FFF0"
@@ -101,7 +102,14 @@
update_icon()
/obj/item/clothing/suit/space/hardsuit/lavaknight/update_icon()
var/mutable_appearance/suit_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
var/mutable_appearance/suit_overlay
if(taurmode == SNEK_TAURIC)
suit_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else if(taurmode == PAW_TAURIC)
suit_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else
suit_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
if(energy_color)
suit_overlay.color = energy_color
@@ -122,7 +130,14 @@
emissivelightsoff()
/obj/item/clothing/suit/space/hardsuit/lavaknight/proc/emissivelights(mob/user = usr)
var/mutable_appearance/energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
var/mutable_appearance/energy_overlay
if(taurmode == SNEK_TAURIC)
energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_naga.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else if(taurmode == PAW_TAURIC)
energy_overlay = mutable_appearance('modular_citadel/icons/mob/taur_canine.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
else
energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
energy_overlay.color = energy_color
energy_overlay.plane = LIGHTING_PLANE + 1
user.cut_overlay(energy_overlay) //honk
@@ -15,7 +15,6 @@
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
item_state = ""
can_adjust = FALSE //to prevent you from "wearing it casually"
mutantrace_variation = NO_MUTANTRACE_VARIATION
//TOS
/obj/item/clothing/under/rank/trek/command
@@ -117,25 +116,25 @@
/obj/item/clothing/under/rank/trek/command/ds9
desc = "The uniform worn by command officers of the 2380s."
icon_state = "trek_command"
icon_state = "trek_ds9_command"
item_state = "trek_ds9_command"
/obj/item/clothing/under/rank/trek/engsec/ds9
desc = "The uniform worn by operations officers of the 2380s."
icon_state = "trek_engsec"
icon_state = "trek_ds9_engsec"
item_state = "trek_ds9_engsec"
/obj/item/clothing/under/rank/trek/medsci/ds9
desc = "The uniform undershirt worn by medsci officers of the 2380s."
icon_state = "trek_medsci"
icon_state = "trek_ds9_medsci"
item_state = "trek_ds9_medsci"
//MODERN ish Joan sqrl sprites. I think
//For general use
/obj/item/clothing/suit/storage/fluff/fedcoat
name = "Federation Uniform Jacket (Red)"
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Set phasers to awesome."
name = "Federation Uniform Jacket"
desc = "A uniform jacket from the United Federation. Set phasers to awesome."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
@@ -177,27 +176,24 @@
icon_state = "[initial(icon_state)]_open"
item_state = "[initial(item_state)]_open"
unbuttoned = 1
usr << "You unbutton the coat."
to_chat(usr,"You unbutton the coat.")
if(1)
icon_state = "[initial(icon_state)]"
item_state = "[initial(item_state)]"
unbuttoned = 0
usr << "You button up the coat."
to_chat(usr,"You button up the coat.")
usr.update_inv_wear_suit()
//Variants
/obj/item/clothing/suit/storage/fluff/fedcoat/medsci
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. Wearing this may make you feel all scientific."
icon_state = "fedblue"
item_state = "fedblue"
/obj/item/clothing/suit/storage/fluff/fedcoat/eng
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it.Wearing it may make you feel like checking a warp core, whatever that is."
icon_state = "fedeng"
item_state = "fedeng"
/obj/item/clothing/suit/storage/fluff/fedcoat/capt
desc = "A uniform jacket from the United Federation. Starfleet still uses this uniform and there are variations of it. You feel like a commanding officer of Starfleet."
icon_state = "fedcapt"
item_state = "fedcapt"
@@ -205,34 +201,31 @@
/obj/item/clothing/suit/storage/fluff/modernfedcoat
name = "Modern Federation Uniform Jacket"
desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a competant commander."
desc = "A modern uniform jacket from the United Federation."
icon = 'modular_citadel/icons/obj/clothing/trek_item_icon.dmi'
alternate_worn_icon = 'modular_citadel/icons/mob/clothing/trek_mob_icon.dmi'
icon_state = "fedmodern"
item_state = "fedmodern"
body_parts_covered = CHEST|GROIN|ARMS
allowed = list(
/obj/item/tank/internals/emergency_oxygen,
/obj/item/flashlight,
/obj/item/gun,
/obj/item/melee/baton,
/obj/item/restraints/handcuffs,
/obj/item/taperecorder)
armor = list("melee" = 45, "bullet" = 25, "laser" = 25,"energy" = 25, "bomb" = 25, "bio" = 25, "rad" = 50, "fire" = 50, "acid" = 50)
/obj/item/flashlight, /obj/item/analyzer,
/obj/item/radio, /obj/item/tank/internals/emergency_oxygen,
/obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer,/obj/item/reagent_containers/syringe,
/obj/item/reagent_containers/glass/bottle/vial,/obj/item/reagent_containers/glass/beaker,
/obj/item/reagent_containers/pill,/obj/item/storage/pill_bottle, /obj/item/restraints/handcuffs,/obj/item/hypospray
)
armor = list("melee" = 10, "bullet" = 5, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 5, "rad" = 10, "fire" = 10, "acid" = 0)
//Variants
/obj/item/clothing/suit/storage/fluff/modernfedcoat/medsci
desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. Wearing this makes you feel like a scientist or a pilot."
icon_state = "fedmodernblue"
item_state = "fedmodernblue"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/eng
desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. You feel like you can handle any type of technical engineering problems."
icon_state = "fedmoderneng"
item_state = "fedmoderneng"
/obj/item/clothing/suit/storage/fluff/modernfedcoat/sec
desc = "A modern uniform jacket from the United Federation. Their Starfleet had recently started using these uniforms. This uniform makes you want to protect and serve as an officer."
icon_state = "fedmodernsec"
item_state = "fedmodernsec"
@@ -256,3 +249,7 @@
/obj/item/clothing/head/caphat/formal/fedcover/sec
icon_state = "fedcapsec"
item_state = "fedcapsec"
/obj/item/clothing/head/caphat/formal/fedcover/black
icon_state = "fedcapblack"
item_state = "fedcapblack"
@@ -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)
@@ -1,9 +1,9 @@
/datum/job/captain
minimal_player_age = 60
minimal_player_age = 20
exp_type = EXP_TYPE_COMMAND
/datum/job/hop
minimal_player_age = 60
minimal_player_age = 20
head_announce = list("Service")
exp_type_department = EXP_TYPE_SERVICE
@@ -1,5 +1,5 @@
/datum/job/chief_engineer
minimal_player_age = 30
minimal_player_age = 10
/datum/job/engineer
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
@@ -1,5 +1,5 @@
/datum/job/cmo
minimal_player_age = 30
minimal_player_age = 10
/datum/outfit/job/doctor
backpack_contents = list(/obj/item/storage/hypospraykit/regular)
@@ -1,2 +1,2 @@
/datum/job/rd
minimal_player_age = 30
minimal_player_age = 10
@@ -1,5 +1,5 @@
/datum/job/hos
minimal_player_age = 30
minimal_player_age = 10
/datum/outfit/job/warden
suit_store = /obj/item/gun/energy/pumpaction/defender
suit_store = /obj/item/gun/energy/pumpaction/defender
@@ -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
@@ -36,7 +36,26 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/************* Lizard compatable snoots ************/
/datum/sprite_accessory/body_markings/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/tails/lizard/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/lizard/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
//christ this was a mistake, but it's here just in case someone wants to selectively fix
/************* Lizard compatable snoots ***********
/datum/sprite_accessory/snouts/bird
name = "Beak"
icon_state = "bird"
@@ -155,73 +174,29 @@
icon_state = "toucan"
icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
color_src = MATRIXED
*/
/******************************************
************ Human Ears/Tails *************
*************** Human Ears ****************
*******************************************/
/datum/sprite_accessory/tails/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/bear
name = "Bear"
icon_state = "bear"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/bear
name = "Bear"
icon_state = "bear"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/bear
name = "Bear"
icon_state = "bear"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/catbig
name = "Cat, Big"
icon_state = "catbig"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/catbig
name = "Cat, Big"
icon_state = "catbig"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/cow
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/cow
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/curled
name = "Curled Horn"
icon_state = "horn1"
@@ -234,69 +209,228 @@
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/eevee
name = "Eevee"
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/elephant
name = "Elephant"
icon_state = "elephant"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/elf
name = "Elf"
icon_state = "elf"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = SKINTONE
/datum/sprite_accessory/ears/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/fox
name = "Fox"
icon_state = "fox"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/jellyfish
name = "Jellyfish"
icon_state = "jellyfish"
color_src = HAIR
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/human/skunk
name = "skunk"
icon_state = "skunk"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/******************************************
************** Human Tails ****************
*******************************************/
/datum/sprite_accessory/tails/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/ailurus
name = "Red Panda"
icon_state = "wah"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/axolotl
name = "Axolotl"
icon_state = "axolotl"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/bee
name = "Bee"
icon_state = "bee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/bee
name = "Bee"
icon_state = "bee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/cat
name = "Cat"
icon_state = "cat"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = HAIR
/datum/sprite_accessory/tails_animated/human/cat
name = "Cat"
icon_state = "cat"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = HAIR
/datum/sprite_accessory/tails/human/catbig
name = "Cat, Big"
icon_state = "catbig"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/catbig
name = "Cat, Big"
icon_state = "catbig"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/cow
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/cow
name = "Cow"
icon_state = "cow"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/corvid
name = "Corvid"
icon_state = "crow"
/datum/sprite_accessory/tails_animated/human/corvid
name = "Corvid"
icon_state = "crow"
/datum/sprite_accessory/tails/human/eevee
name = "Eevee"
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/eevee
name = "Eevee"
icon_state = "eevee"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/fennec
name = "Fennec"
icon_state = "fennec"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/fish
name = "Fish"
icon_state = "fish"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/fox
name = "Fox"
icon_state = "fox"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/fox
name = "Fox"
icon_state = "fox"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/horse
name = "Horse"
@@ -314,26 +448,25 @@
name = "Husky"
icon_state = "husky"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/husky
name = "Husky"
icon_state = "husky"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/insect
name = "Insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails_animated/human/insect
name = "insect"
icon_state = "insect"
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/jellyfish
name = "Jellyfish"
icon_state = "jellyfish"
color_src = HAIR
color_src = MATRIXED
/datum/sprite_accessory/tails/human/kitsune
name = "Kitsune"
@@ -347,18 +480,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/lab
name = "Dog, Floppy"
icon_state = "lab"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/murid
name = "Murid"
icon_state = "murid"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/murid
name = "Murid"
icon_state = "murid"
@@ -371,12 +492,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/otie
name = "Otusian"
icon_state = "otie"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/otie
name = "Otusian"
icon_state = "otie"
@@ -401,12 +516,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/pede
name = "Scolipede"
icon_state = "pede"
@@ -419,12 +528,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails/human/rabbit
name = "Rabbit"
icon_state = "rabbit"
@@ -437,12 +540,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/sergal
name = "Sergal"
icon_state = "sergal"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/sergal
name = "Sergal"
icon_state = "sergal"
@@ -455,12 +552,6 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/human/skunk
name = "skunk"
icon_state = "skunk"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
color_src = MATRIXED
/datum/sprite_accessory/tails/human/skunk
name = "skunk"
icon_state = "skunk"
@@ -479,17 +570,31 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/shark/datashark
/datum/sprite_accessory/tails_animated/human/shark
name = "Shark"
icon_state = "shark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/datashark
name = "datashark"
icon_state = "datashark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/squirrel
name = "Squirrel"
icon_state = "squirrel"
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/tails_animated/human/datashark
name = "datashark"
icon_state = "datashark"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
/datum/sprite_accessory/tails_animated/human/straighttail
name = "Straight Tail"
icon_state = "straighttail"
/datum/sprite_accessory/tails/human/squirrel
name = "Squirrel"
@@ -503,7 +608,7 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/yentacle
/datum/sprite_accessory/tails/human/tentacle
name = "Tentacle"
icon_state = "tentacle"
color_src = MATRIXED
@@ -515,11 +620,17 @@
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/ears/wolf
name = "Wolf"
icon_state = "wolf"
/datum/sprite_accessory/tails/human/tiger
name = "Tiger"
icon_state = "tiger"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/tiger
name = "Tiger"
icon_state = "tiger"
color_src = MATRIXED
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/datum/sprite_accessory/tails/human/wolf
name = "Wolf"
@@ -534,7 +645,7 @@
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
/******************************************
*************** Body Parts ****************
*********** Mammal Body Parts *************
*******************************************/
/datum/sprite_accessory/mam_ears
@@ -624,6 +735,10 @@
name = "WahCoon"
icon_state = "wah"
/datum/sprite_accessory/mam_snouts/redpandaalt
name = "WahCoon ALT"
icon_state = "wahalt"
/datum/sprite_accessory/mam_snouts/rhino
name = "Horn"
icon_state = "rhino"
@@ -931,13 +1046,13 @@
name = "Axolotl"
icon_state = "axolotl"
/datum/sprite_accessory/mam_tails/bear
name = "Bear"
icon_state = "bear"
/datum/sprite_accessory/mam_tails/bee
name = "Bee"
icon_state = "bee"
/datum/sprite_accessory/mam_tails_animated/bear
name = "Bear"
icon_state = "bear"
/datum/sprite_accessory/mam_tails_animated/bee
name = "Bee"
icon_state = "bee"
/datum/sprite_accessory/mam_tails/cat
name = "Cat"
@@ -1189,27 +1304,32 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/none
name = "None"
icon_state = "none"
color_src = MUTCOLORS
ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme")
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/plain
name = "Plain"
icon_state = "plain"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/ailurus
/datum/sprite_accessory/mam_body_markings/redpanda
name = "Redpanda"
icon_state = "wah"
icon_state = "redpanda"
/datum/sprite_accessory/mam_body_markings/bee
name = "Bee"
icon_state = "bee"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/belly
name = "Belly"
icon_state = "belly"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/bellyslim
name = "Bellyslim"
icon_state = "bellyslim"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/corgi
name = "Corgi"
@@ -1254,6 +1374,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/frog
name = "Frog"
icon_state = "frog"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/goat
name = "Goat"
@@ -1262,6 +1383,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/handsfeet
name = "Handsfeet"
icon_state = "handsfeet"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/hawk
name = "Hawk"
@@ -1282,6 +1404,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/moth
name = "Moth"
icon_state = "moth"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
@@ -1310,6 +1433,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
icon_state = "scolipede"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/shark
name = "Shark"
@@ -1338,6 +1462,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/turian
name = "Turian"
icon_state = "turian"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/datum/sprite_accessory/mam_body_markings/wolf
name = "Wolf"
@@ -1346,6 +1471,7 @@ datum/sprite_accessory/mam_tails/insect
/datum/sprite_accessory/mam_body_markings/xeno
name = "Xeno"
icon_state = "xeno"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
/******************************************
@@ -1655,19 +1781,6 @@ datum/sprite_accessory/mam_tails/insect
// *** Snooooow flaaaaake ***
/datum/sprite_accessory/body_markings/guilmon
name = "Guilmon"
icon_state = "guilmon"
color_src = MATRIXED
/datum/sprite_accessory/tails/lizard/guilmon
name = "Guilmon"
icon_state = "guilmon"
/datum/sprite_accessory/tails_animated/lizard/guilmon
name = "Guilmon"
icon_state = "guilmon"
/datum/sprite_accessory/horns/guilmon
name = "Guilmon"
icon_state = "guilmon"
@@ -1697,6 +1810,7 @@ datum/sprite_accessory/mam_tails/insect
name = "sabresune"
icon_state = "sabresune"
ckeys_allowed = list("poojawa")
extra = TRUE
/datum/sprite_accessory/mam_tails/sabresune
name = "sabresune"
@@ -1730,7 +1844,7 @@ datum/sprite_accessory/mam_tails/insect
icon_state = "lunasune"
/*************** VIRGO PORTED HAIRS ****************************/
#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = "Virgo - " + #_name
#define VHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = #_name + " (Virgo)"
//VIRGO PORTED HAIRS
VHAIR("Short Hair Rosa", hair_rosa_s)
VHAIR("Short Hair 80s", hair_80s_s)
@@ -1888,7 +2002,7 @@ VHAIR("Tressshoulder", hair_tressshoulder_s)
//END
#undef VHAIR
#define VFACE(_name, new_state) /datum/sprite_accessory/facial_hair/##new_state/icon_state=#new_state;;/datum/sprite_accessory/facial_hair/##new_state/name="Virgo" + #_name
#define VFACE(_name, new_state) /datum/sprite_accessory/facial_hair/##new_state/icon_state=#new_state;;/datum/sprite_accessory/facial_hair/##new_state/name= #_name + " (Virgo)"
VFACE("Watson", facial_watson_s)
VFACE("Chaplin", facial_chaplin_s)
VFACE("Fullbeard", facial_fullbeard_s)
@@ -1927,4 +2041,4 @@ VFACE("Cropped Fullbeard", facial_croppedfullbeard_s)
VFACE("Chinless Beard", facial_chinlessbeard_s)
VFACE("Moonshiner", facial_moonshiner_s)
VFACE("Tribearder", facial_tribearder_s)
#undef VFACE
#undef VFACE
@@ -5,6 +5,9 @@
var/lastdirchange
var/combatmessagecooldown
//oh no vore time
var/voremode = FALSE
/mob/living/carbon/CanPass(atom/movable/mover, turf/target)
. = ..()
if(.)
@@ -19,6 +22,8 @@
if(recoveringstam)
return TRUE
combatmode = !combatmode
if(voremode)
toggle_vore_mode()
if(combatmode)
playsound_local(src, 'modular_citadel/sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay!
else
@@ -34,6 +39,16 @@
SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode)
return TRUE
mob/living/carbon/proc/toggle_vore_mode()
voremode = !voremode
if(hud_used && hud_used.static_inventory)
for(var/obj/screen/voretoggle/selector in hud_used.static_inventory)
selector.rebaseintomygut(src)
if(combatmode)
return FALSE //let's not override the main draw of the game these days
SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode)
return TRUE
/mob/living/carbon/Move(atom/newloc, direct = 0)
var/currentdirection = dir
. = ..()
@@ -1,9 +1,3 @@
/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0)
if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling))
vore_attack(user, pulling)
else
..()
/mob/living/carbon/human/alt_attack_hand(mob/user)
if(..())
return
@@ -4,7 +4,7 @@
/mob/living/carbon/human/Move(NewLoc, direct)
var/oldpseudoheight = pseudo_z_axis
. = ..()
if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN)
if(. && sprinting && !(movement_type & FLYING) && canmove && !resting && m_intent == MOVE_INTENT_RUN && has_gravity(loc) && !pulledby)
adjustStaminaLossBuffered(0.3)
if((oldpseudoheight - pseudo_z_axis) >= 8)
to_chat(src, "<span class='warning'>You trip off of the elevated surface!</span>")
@@ -82,7 +82,7 @@
if(get_turf(target) == target_oldturf)
target_table = locate(/obj/structure/table) in target_shove_turf.contents
shove_blocked = TRUE
if(shove_blocked && !target.is_shove_knockdown_blocked())
var/directional_blocked = FALSE
if(shove_dir in GLOB.cardinals) //Directional checks to make sure that we're not shoving through a windoor or something like that
@@ -151,28 +151,3 @@
/obj/item/bodypart
var/should_draw_citadel = FALSE
/datum/species/proc/citadel_mutant_bodyparts(bodypart, mob/living/carbon/human/H)
switch(bodypart)
if("ipc_screen")
return GLOB.ipc_screens_list[H.dna.features["ipc_screen"]]
if("ipc_antenna")
return GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]]
if("mam_tail")
return GLOB.mam_tails_list[H.dna.features["mam_tail"]]
if("mam_waggingtail")
return GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]]
if("mam_body_markings")
return GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if("mam_ears")
return GLOB.mam_ears_list[H.dna.features["mam_ears"]]
if("mam_snouts")
return GLOB.mam_snouts_list[H.dna.features["mam_snouts"]]
if("taur")
return GLOB.taur_list[H.dna.features["taur"]]
if("xenodorsal")
return GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]]
if("xenohead")
return GLOB.xeno_head_list[H.dna.features["xenohead"]]
if("xenotail")
return GLOB.xeno_tail_list[H.dna.features["xenotail"]]
@@ -195,10 +195,10 @@
say_mod = "hisses"
default_color = "00FF00"
should_draw_citadel = TRUE
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE)
species_traits = list(MUTCOLORS,EYECOLOR,LIPS)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "mam_body_markings", "taur")
default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None")
mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "mam_body_markings", "taur", "legs")
default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade Legs")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -233,3 +233,5 @@
/mob/living/carbon/human/vore
devourable = TRUE
digestable = TRUE
feeding = TRUE
@@ -10,16 +10,44 @@
default_color = "00FFFF"
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
inherent_traits = list(TRAIT_TOXINLOVER)
mutant_bodyparts = list("mam_tail", "mam_ears", "taur")
default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None")
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur")
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None")
say_mod = "says"
hair_color = "mutcolor"
hair_alpha = 180
hair_alpha = 160 //a notch brighter so it blends better.
liked_food = MEAT
coldmod = 3
heatmod = 1
burnmod = 1
/datum/species/jelly/roundstartslime/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
stop_wagging_tail(H)
/datum/species/jelly/roundstartslime/spec_stun(mob/living/carbon/human/H,amount)
if(H)
stop_wagging_tail(H)
. = ..()
/datum/species/jelly/roundstartslime/can_wag_tail(mob/living/carbon/human/H)
return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
/datum/species/jelly/roundstartslime/is_wagging_tail(mob/living/carbon/human/H)
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/jelly/roundstartslime/start_wagging_tail(mob/living/carbon/human/H)
if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
/datum/species/jelly/roundstartslime/stop_wagging_tail(mob/living/carbon/human/H)
if("mam_waggingtail" in mutant_bodyparts)
mutant_bodyparts -= "mam_waggingtail"
mutant_bodyparts |= "mam_tail"
H.update_body()
/datum/action/innate/slime_change
name = "Alter Form"
check_flags = AB_CHECK_CONSCIOUS
@@ -41,7 +69,7 @@
/datum/action/innate/slime_change/proc/change_form()
var/mob/living/carbon/human/H = owner
var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Hair Style", "Genitals", "Tail", "Ears", "Taur body", "Cancel")
var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Cancel")
if(select_alteration == "Hair Style")
if(H.gender == MALE)
var/new_style = input(owner, "Select a facial hair style", "Hair Alterations") as null|anything in GLOB.facial_hair_styles_list
@@ -102,6 +130,39 @@
H.dna.features["mam_ears"] = new_ears
H.update_body()
else if (select_alteration == "Snout")
var/list/snowflake_snouts_list = list("Normal" = null)
for(var/path in GLOB.mam_snouts_list)
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_snouts_list[S.name] = path
var/new_snout
new_snout = input(owner, "Choose your character's face:", "Face Alteration") as null|anything in snowflake_snouts_list
if(new_snout)
H.dna.features["mam_snouts"] = new_snout
H.update_body()
else if (select_alteration == "Markings")
var/list/snowflake_markings_list = list()
for(var/path in GLOB.mam_body_markings_list)
var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
if(istype(instance, /datum/sprite_accessory))
var/datum/sprite_accessory/S = instance
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
snowflake_markings_list[S.name] = path
var/new_mam_body_markings
new_mam_body_markings = input(H, "Choose your character's body markings:", "Marking Alteration") as null|anything in snowflake_markings_list
if(new_mam_body_markings)
H.dna.features["mam_body_markings"] = new_mam_body_markings
if(new_mam_body_markings == "None")
H.dna.features["mam_body_markings"] = "Plain"
for(var/X in H.bodyparts) //propagates the markings changes
var/obj/item/bodypart/BP = X
BP.update_limb(FALSE, H)
H.update_body()
else if (select_alteration == "Tail")
var/list/snowflake_tails_list = list("Normal" = null)
for(var/path in GLOB.mam_tails_list)
@@ -113,7 +174,7 @@
var/new_tail
new_tail = input(owner, "Choose your character's Tail(s):", "Tail Alteration") as null|anything in snowflake_tails_list
if(new_tail)
H.dna.features["mam_tails"] = new_tail
H.dna.features["mam_tail"] = new_tail
if(new_tail != "None")
H.dna.features["taur"] = "None"
H.update_body()
@@ -132,7 +193,6 @@
H.dna.features["taur"] = new_taur
if(new_taur != "None")
H.dna.features["mam_tail"] = "None"
H.dna.features["xenotail"] = "None"
H.update_body()
else
return
@@ -1,85 +1,141 @@
/mob/living/simple_animal/pet/cat
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/crab
devourable = TRUE
/mob/living/simple_animal/pet/dog
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/hostile/retaliate/goat
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/cow
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/chick
devourable = TRUE
/mob/living/simple_animal/chicken
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/pet/fox
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/hostile/lizard
devourable = TRUE
/mob/living/simple_animal/mouse
devourable = TRUE
/mob/living/simple_animal/pet/penguin
no_vore = TRUE
/mob/living/simple_animal/pet
devourable = TRUE
/mob/living/simple_animal/sloth
devourable = TRUE
/mob/living/simple_animal/hostile/alien
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/hostile/bear
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/hostile/poison/giant_spider
devourable = TRUE
/mob/living/simple_animal/hostile/retaliate/poison/snake
devourable = TRUE
no_vore = FALSE //oh yes my pretty.
/mob/living/simple_animal/hostile/gorilla
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal/hostile/megafauna/dragon
no_vore = FALSE
/mob/living/simple_animal/hostile/asteroid/goliath
no_vore = FALSE
/mob/living/simple_animal/parrot
devourable = TRUE
no_vore = FALSE
/mob/living/simple_animal
no_vore = TRUE
//CARBON MOBS
/mob/living/carbon/alien
devourable = TRUE
digestable = TRUE
feeding = TRUE
/mob/living/carbon/monkey
devourable = TRUE
digestable = TRUE
feeding = TRUE
/*
REFER TO code/modules/mob/living/simple_animal/simple_animal_vr.dm for Var information!
*/
//NUETRAL MOBS
/mob/living/simple_animal/crab
devourable = TRUE
digestable = TRUE
feeding = TRUE
/mob/living/simple_animal/cow
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/chick
devourable = TRUE
digestable = TRUE
/mob/living/simple_animal/chicken
devourable = TRUE
digestable = TRUE
/mob/living/simple_animal/mouse
devourable = TRUE
digestable = TRUE
//STATION PETS
/mob/living/simple_animal/pet
devourable = TRUE
digestable = TRUE
feeding = TRUE
/mob/living/simple_animal/pet/fox
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/pet/cat
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/pet/dog
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/sloth
devourable = TRUE
digestable = TRUE
feeding = TRUE
/mob/living/simple_animal/parrot
devourable = TRUE
digestable = TRUE
//HOSTILE MOBS
/mob/living/simple_animal/hostile/retaliate/goat
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_stomach_flavor = "You find yourself squeezed into the hollow of the goat, the smell of oats and hay thick in the tight space, all of which grinds in on you. Harmless for now..."
vore_default_mode = DM_HOLD
/mob/living/simple_animal/hostile/lizard
devourable = TRUE
digestable = TRUE
/mob/living/simple_animal/hostile/alien
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/hostile/bear
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/hostile/poison/giant_spider
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/hostile/retaliate/poison/snake
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/hostile/gorilla
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/hostile/asteroid/goliath
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
/mob/living/simple_animal/hostile/carp
devourable = TRUE
digestable = TRUE
feeding = TRUE
vore_active = TRUE
isPredator = TRUE
vore_default_mode = DM_HOLD
@@ -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,292 @@
///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/examine(mob/user)
. = ..()
if(cell)
to_chat(user, "<span class='notice'>[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.</span>")
else
to_chat(user, "<span class='notice'>[src] doesn't seem to have a cell!</span>")
/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/examine(mob/user)
. = ..()
if(cell)
to_chat(user, "<span class='notice'>[src]'s cell is [round(cell.charge / cell.maxcharge, 0.1) * 100]% full.</span>")
else
to_chat(user, "<span class='notice'>[src] doesn't seem to have a cell!</span>")
/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")
@@ -36,11 +36,10 @@
/obj/effect/decal/cleanable/semen/New()
..()
dir = pick(1,2,4,8)
add_blood_DNA(list("Non-human DNA" = "A+"))
/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume)
if(!isspaceturf(T))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/semen(T)
reagentdecal.reagents.add_reagent("semen", reac_volume)
/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S)
S.add_blood_DNA(return_blood_DNA())
/datum/reagent/consumable/femcum
name = "Female Ejaculate"
@@ -98,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))
@@ -120,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))
@@ -152,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
@@ -15,7 +15,7 @@
desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels.
var/vore_sound = "Gulp" // Sound when ingesting someone
var/vore_verb = "ingest" // Verb for eating with this in messages
var/release_sound = "Splatter"
var/release_sound = "Splatter" // Sound for letting someone out.
var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else
var/emote_time = 60 SECONDS // How long between stomach emotes at prey
@@ -26,18 +26,18 @@
var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly
var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
var/escapechance = 100 // % Chance of prey beginning to escape if prey struggles.
var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
// var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
var/silent = FALSE
var/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
var/transferlocation // Location that the prey is released if they struggle and get dropped off.
var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
var/autotransferwait = 10 // Time between trying to transfer.
var/swallow_time = 10 SECONDS // for mob transfering automation
var/vore_capacity = 1 // simple animal nom capacity
var/is_wet = TRUE // Is this belly inside slimy parts?
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY,DM_ABSORB,DM_UNABSORB) // Possible digest modes
@@ -126,7 +126,6 @@
"escapechance",
"can_taste",
"bulge_size",
"silent",
"transferlocation",
"transferchance",
"autotransferchance",
@@ -138,7 +137,8 @@
"digest_messages_owner",
"digest_messages_prey",
"examine_messages",
"emote_lists"
"emote_lists",
"is_wet"
)
//ommitted list
@@ -167,10 +167,11 @@
to_chat(owner,"<span class='notice'>[thing] slides into your [lowertext(name)].</span>")
//Sound w/ antispam flag setting
if(!silent && !recent_sound)
for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
if(is_wet && !recent_sound)
for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
var/sound/devourments = GLOB.vore_sounds[vore_sound]
playsound(get_turf(owner),devourments,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
recent_sound = TRUE
//Messages if it's a mob
@@ -182,8 +183,12 @@
// Release all contents of this belly into the owning mob's location.
// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
// Returns the number of mobs so released.
/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE)
/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE)
var/atom/destination = drop_location()
//Don't bother if we don't have contents
if(!contents.len)
return 0
var/count = 0
for(var/thing in contents)
var/atom/movable/AM = thing
@@ -201,9 +206,16 @@
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "emptyprey", /datum/mood_event/emptyprey)
AM.forceMove(destination) // Move the belly contents into the same location as belly's owner.
count++
for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
var/sound/releasement = GLOB.release_sounds[release_sound]
playsound(get_turf(owner),releasement,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
//Clean up our own business
items_preserved.Cut()
if(isanimal(owner))
owner.update_icons()
if(!silent)
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
items_preserved.Cut()
@@ -214,16 +226,17 @@
// Release a specific atom from the contents of this belly into the owning mob's location.
// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
// Returns the number of atoms so released.
/obj/belly/proc/release_specific_contents(var/atom/movable/M)
/obj/belly/proc/release_specific_contents(var/atom/movable/M, var/silent = FALSE)
if (!(M in contents))
return FALSE // They weren't in this belly anyway
M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
items_preserved -= M
if(release_sound)
for(var/mob/H in get_hearers_in_view(5, get_turf(owner)))
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))
playsound(get_turf(owner),"[src.release_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
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
@@ -245,6 +258,11 @@
if(P.absorbed)
absorbed_count++
Pred.reagents.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
//Clean up our own business
if(isanimal(owner))
owner.update_icons()
if(!silent)
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
owner.update_icons()
@@ -268,8 +286,10 @@
prey.forceMove(src)
var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
if(!silent)
if(is_wet)
prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP)
owner.updateVRPanel()
for(var/mob/living/M in contents)
@@ -299,7 +319,8 @@
if(!silent)
for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
var/sound/devourments = GLOB.vore_sounds[vore_sound]
playsound(get_turf(owner),devourments,50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
owner.updateVRPanel()
for(var/mob/living/M in contents)
M.updateVRPanel()
@@ -461,6 +482,9 @@
//Yes, it's ""safe"" to drop items here
/obj/belly/AllowDrop()
return TRUE
/*
/obj/belly/onDropInto(var/atom/movable/AM)
return null */
//Handle a mob struggling
// Called from /mob/living/carbon/relaymove()
@@ -469,6 +493,23 @@
return // User is not in this belly
R.setClickCooldown(50)
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
to_chat(R,"<span class='warning'>You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)</span>")
to_chat(owner,"<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
if(do_after(R, owner, escapetime))
if((owner.stat || escapable) && (R.loc == src)) //Can still escape?
release_specific_contents(R)
return
else if(R.loc != src) //Aren't even in the belly. Quietly fail.
return
else //Belly became inescapable or mob revived
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed!</span>")
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
return
return
var/struggle_outer_message = pick(struggle_messages_outside)
var/struggle_user_message = pick(struggle_messages_inside)
@@ -483,41 +524,38 @@
struggle_outer_message = "<span class='alert'>" + struggle_outer_message + "</span>"
struggle_user_message = "<span class='alert'>" + struggle_user_message + "</span>"
if((owner.stat || !owner.client) && (R.a_intent != INTENT_HELP)) //If owner is stat (dead, KO) we can actually escape
to_chat(R,"<span class='warning'>You attempt to climb out of \the [lowertext(name)]. (This will take around 5 seconds.)</span>")
to_chat(owner,"<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
if(!do_mob(R,owner,50))
return
if(!(R in contents)) //Aren't even in the belly. Quietly fail.
return
if(R.a_intent != INTENT_HELP) //still want to?
release_specific_contents(R)
return
else //Belly became inescapable or mob revived
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed!</span>")
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
return
else if(R.a_intent != INTENT_HELP) //failsafe to make sure people are able to struggle out. friendly ERP should be on help intent.
to_chat(R,"<span class='warning'>You attempt to climb out of [lowertext(name)]. (This will take around [escapetime] seconds.)</span>")
to_chat(owner,"<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
if(!do_mob(R,owner,escapetime))
return
release_specific_contents(R)
return
else if (R.a_intent == INTENT_HELP)
for(var/mob/M in get_hearers_in_view(3, get_turf(owner)))
M.show_message(struggle_outer_message, 1) // visible
to_chat(R,struggle_user_message)
if(!silent)
for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
if(is_wet)
for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED)
R.stop_sound_channel(CHANNEL_PRED)
var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
R.playsound_local(get_turf(R),prey_struggle,45,0)
else
for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
playsound(get_turf(owner),"rustle",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED)
for(var/mob/M in get_hearers_in_view(3, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) //Might as well censor the normies here too.
M.show_message(struggle_outer_message, 1) // visible
to_chat(R,struggle_user_message)
if(escapable) //If the stomach has escapable enabled.
if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
to_chat(R,"<span class='warning'>You start to climb out of \the [lowertext(name)].</span>")
to_chat(owner,"<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
if(do_after(R, escapetime))
if((owner.stat || escapable) && (R.loc == src)) //Can still escape?
release_specific_contents(R)
return
else if(R.loc != src) //Aren't even in the belly. Quietly fail.
return
else //Belly became inescapable or mob revived
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed!</span>")
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
return
else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
var/obj/belly/dest_belly
for(var/belly in owner.vore_organs)
@@ -525,6 +563,7 @@
if(B.name == transferlocation)
dest_belly = B
break
if(!dest_belly)
to_chat(owner, "<span class='warning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had it's transfer chance and transfer location cleared as a precaution.</span>")
transferchance = 0
@@ -541,21 +580,10 @@
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] start to cling onto its contents...</span>")
digest_mode = DM_ABSORB
return
/*
else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
to_chat(R,"<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get more active...</span>")
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] beginning to become active!</span>")
digest_mode = DM_ITEMWEAK
return
else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice!
to_chat(R,"<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get even more active!</span>")
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] beginning to become even more active!</span>")
digest_mode = DM_DIGEST
return */
else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.)
to_chat(R, "<span class='warning'>In response to your struggling, \the [name] begins to get more active...</span>")
to_chat(owner, "<span class='warning'>You feel your [name] beginning to become active!</span>")
digest_mode = DM_DIGEST
return
@@ -602,13 +630,13 @@
dupe.escapechance = escapechance
dupe.can_taste = can_taste
dupe.bulge_size = bulge_size
dupe.silent = silent
dupe.transferlocation = transferlocation
dupe.transferchance = transferchance
dupe.autotransferchance = autotransferchance
dupe.autotransferwait = autotransferwait
dupe.swallow_time = swallow_time
dupe.vore_capacity = vore_capacity
dupe.is_wet = is_wet
//// Object-holding variables
//struggle_messages_outside - strings
@@ -25,7 +25,7 @@
for(var/mob/living/M in contents)
if(isbelly(M.loc))
if(world.time > M.next_preyloop)
if(!silent)
if(is_wet)
M.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case
var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
M.playsound_local(get_turf(src),preyloop,80,0, channel = CHANNEL_PREYLOOP)
@@ -1,16 +1,18 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = FALSE // Can the mob be digested inside a belly?
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/devourable = FALSE // Can the mob be vored at all?
// var/feeding = FALSE // Are we going to feed someone else?
var/vore_taste = null // What the character tastes like
var/feeding = FALSE // Are we going to feed someone else?
var/vore_taste = null // What the character tastes like
var/no_vore = FALSE // If the character/mob can vore.
var/openpanel = 0 // Is the vore panel open?
var/noisy = FALSE // tummies are rumbly?
var/absorbed = FALSE //are we absorbed?
var/openpanel = 0 // Is the vore panel open?
var/absorbed = FALSE //are we absorbed?
var/next_preyloop
var/vore_init = FALSE //Has this mob's vore been initialized yet?
var/vorepref_init = FALSE //Has this mob's voreprefs been initialized?
//
// Hook for generic creation of stuff on new creatures
@@ -26,12 +28,14 @@
//Tries to load prefs if a client is present otherwise gives freebie stomach
spawn(10 SECONDS) // long delay because the server delays in its startup. just on the safe side.
M.init_vore()
if(M)
M.init_vore()
//Return 1 to hook-caller
return 1
/mob/living/proc/init_vore()
vore_init = TRUE
//Something else made organs, meanwhile.
if(LAZYLEN(vore_organs))
return TRUE
@@ -75,31 +79,42 @@
// Critical adjustments due to TG grab changes - Poojawa
/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey)
if(!user || !prey)
/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
if(!user || !prey || !pred)
return
if(prey == src && user.zone_selected == "mouth") //you click your target
// if(!feeding(src))
// return
if(!is_vore_predator(prey))
if(!isliving(pred)) //no badmin, you can't feed people to ghosts or objects.
return
if(pred == prey) //you click your target
if(!pred.feeding)
to_chat(user, "<span class='notice'>They aren't able to be fed.</span>")
to_chat(pred, "<span class='notice'>[user] tried to feed you themselves, but you aren't voracious enough to be fed.</span>")
return
if(!is_vore_predator(pred))
to_chat(user, "<span class='notice'>They aren't voracious enough.</span>")
return
feed_self_to_grabbed(user, src)
feed_self_to_grabbed(user, pred)
if(user == src) //you click yourself
if(pred == user) //you click yourself
if(!is_vore_predator(src))
to_chat(user, "<span class='notice'>You aren't voracious enough.</span>")
return
user.feed_grabbed_to_self(src, prey)
feed_grabbed_to_self(user, prey)
else // click someone other than you/prey
// if(!feeding(src))
// return
if(!is_vore_predator(src))
if(!pred.feeding)
to_chat(user, "<span class='notice'>They aren't voracious enough to be fed.</span>")
to_chat(pred, "<span class='notice'>[user] tried to feed you [prey], but you aren't voracious enough to be fed.</span>")
return
if(!prey.feeding)
to_chat(user, "<span class='notice'>They aren't able to be fed to someone.</span>")
to_chat(prey, "<span class='notice'>[user] tried to feed you to [pred], but you aren't able to be fed to them.</span>")
return
if(!is_vore_predator(pred))
to_chat(user, "<span class='notice'>They aren't voracious enough.</span>")
return
feed_grabbed_to_other(user, prey, src)
feed_grabbed_to_other(user, prey, pred)
//
// Eating procs depending on who clicked what
//
@@ -120,55 +135,10 @@
return perform_the_nom(user, user, pred, belly)
/mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
return//disabled until I can make that toggle work
// return//disabled until I can make that toggle work
var/belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, prey, pred, belly)
//Dragon noms need to be faster
/mob/living/proc/dragon_feeding(var/mob/living/user, var/mob/living/prey)
var/belly = user.vore_selected
return perform_dragon(user, prey, user, belly)
/mob/living/proc/perform_dragon(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, swallow_time = 20)
//Sanity
if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
testing("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
return FALSE
if(istype(pred, /mob/living/simple_animal/hostile/megafauna/dragon))
if(isliving(prey) && !prey.Adjacent(pred))
return FALSE
// The belly selected at the time of noms
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
// Prepare messages
if(user == pred) //Feeding someone to yourself
attempt_msg = text("<span class='warning'>[] starts to [] [] into their []!</span>",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
success_msg = text("<span class='warning'>[] manages to [] [] into their []!</span>",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
if(!prey.Adjacent(user)) // let's doublecheck for sanity's sake.
return FALSE
// Announce that we start the attempt!
user.visible_message(attempt_msg)
if(!do_mob(src, user, swallow_time))
return FALSE // Prey escaped (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
user.visible_message(success_msg)
playsound(get_turf(user), "[belly.vore_sound]",75,0,-6,0)
// Actually shove prey into the belly.
belly.nom_mob(prey, user)
if (pred == user)
message_admins("[key_name(pred)] ate [key_name(prey)].")
pred.log_message("[key_name(pred)] ate [key_name(prey)].", LOG_ATTACK)
prey.log_message("[key_name(prey)] was eaten by [key_name(pred)].", LOG_ATTACK)
return TRUE
//
// Master vore proc that actually does vore procedures
//
@@ -281,7 +251,7 @@
*/
//
// Custom resist catches for /mob/living
// Our custom resist catches for /mob/living
//
/mob/living/proc/vore_process_resist()
@@ -293,7 +263,7 @@
//Other overridden resists go here
return FALSE
return 0
// internal slimy button in case the loop stops playing but the player wants to hear it
/mob/living/proc/preyloop_refresh()
@@ -319,10 +289,9 @@
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.
if(is_blind(src) && !has_trait(TRAIT_BLIND))
src.adjust_blindness(-1)
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))
SA.prey_excludes[src] = world.time
@@ -374,6 +343,7 @@
P.digestable = src.digestable
P.devourable = src.devourable
P.feeding = src.feeding
P.vore_taste = src.vore_taste
var/list/serialized = list()
@@ -392,11 +362,13 @@
if(!client || !client.prefs_vr)
to_chat(src,"<span class='warning'>You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>")
return 0
vorepref_init = TRUE
var/datum/vore_preferences/P = client.prefs_vr
digestable = P.digestable
devourable = P.devourable
feeding = P.feeding
vore_taste = P.vore_taste
release_vore_contents(silent = TRUE)
@@ -1,44 +0,0 @@
///////////////////// Simple Animal /////////////////////
/mob/living/simple_animal
var/isPredator = FALSE //Are they capable of performing and pre-defined vore actions for their species?
var/swallowTime = 5 SECONDS //How long it takes to eat its prey in 1/10 of a second. The default is 5 seconds.
var/list/prey_excludes = list() //For excluding people from being eaten.
//
// Simple proc for animals to have their digestion toggled on/off externally
//
/mob/living/simple_animal/verb/toggle_digestion()
set name = "Toggle Animal's Digestion"
set desc = "Enables digestion on this mob for 20 minutes."
set category = "Object"
set src in oview(1)
var/datum/belly/B = vore_organs[vore_selected]
if(faction != usr.faction)
to_chat(usr,"<span class='warning'>This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.</span>")
return
if(B.digest_mode == "Hold")
var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel")
if(confirm == "Enable")
B.digest_mode = "Digest"
sleep(20 MINUTES) //12000=20 minutes
B.digest_mode = "Hold"
else
var/confirm = alert(usr, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel")
if(confirm == "Disable")
B.digest_mode = "Hold"
//
// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs.
//
/mob/living/simple_animal/proc/animal_nom(var/mob/living/T in oview(1))
set name = "Animal Nom"
set category = "Vore"
set desc = "Since you can't grab, you get a verb!"
if (stat != CONSCIOUS)
return
if (T.devourable == FALSE)
to_chat(usr, "<span class='warning'>You can't eat this!</span>")
return
return feed_grabbed_to_self(src,T)
@@ -28,7 +28,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
// The datum type bolted onto normal preferences datums for storing Vore stuff
//
#define VORE_VERSION 2
#define VORE_VERSION 4
GLOBAL_LIST_EMPTY(vore_preferences_datums)
@@ -39,6 +39,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums)
//Actual preferences
var/digestable = FALSE
var/devourable = FALSE
var/feeding = FALSE
// var/allowmobvore = TRUE
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
@@ -105,6 +106,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums)
digestable = json_from_file["digestable"]
devourable = json_from_file["devourable"]
feeding = json_from_file["feeding"]
vore_taste = json_from_file["vore_taste"]
belly_prefs = json_from_file["belly_prefs"]
@@ -113,6 +115,8 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums)
digestable = FALSE
if(isnull(devourable))
devourable = FALSE
if(isnull(feeding))
feeding = FALSE
if(isnull(belly_prefs))
belly_prefs = list()
@@ -127,6 +131,7 @@ GLOBAL_LIST_EMPTY(vore_preferences_datums)
"version" = version,
"digestable" = digestable,
"devourable" = devourable,
"feeding" = feeding,
"vore_taste" = vore_taste,
"belly_prefs" = belly_prefs,
)
@@ -18,9 +18,10 @@
var/dat = picker_holder.gen_vui(src)
picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder)
picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
src.openpanel = 1
/mob/living/proc/updateVRPanel() //Panel popup update call from belly events.
if(src.openpanel == 1)
@@ -30,7 +31,7 @@
var/dat = picker_holder.gen_vui(src)
picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder)
picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder)
picker_holder.popup.set_content(dat)
picker_holder.popup.open()
@@ -39,7 +40,7 @@
//
/datum/vore_look
var/obj/belly/selected
var/show_interacts = TRUE
var/show_interacts = 0
var/datum/browser/popup
var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action.
@@ -55,13 +56,14 @@
/datum/vore_look/proc/gen_vui(var/mob/living/user)
var/dat
dat += "Remember to toggle the vore mode, it's to the left of your combat toggle. Open mouth means you're voracious!<br>"
dat += "<HR>"
var/atom/userloc = user.loc
if (isbelly(userloc))
var/obj/belly/inside_belly = userloc
var/mob/living/eater = inside_belly.owner
//Don't display this part if we couldn't find the belly since could be held in hand.
//Don't display this part if we couldn't find the belly since could be held in hand.
if(inside_belly)
dat += "<font color = 'green'>You are currently [user.absorbed ? "absorbed into " : "inside "]</font> <font color = 'yellow'>[eater]'s</font> <font color = 'red'>[inside_belly]</font>!<br><br>"
@@ -102,7 +104,6 @@
dat += "<li style='float: left'><a href='?src=\ref[src];bellypick=\ref[B]'><b>[B.name]</b>"
else
dat += "<li style='float: left'><a href='?src=\ref[src];bellypick=\ref[B]'>[B.name]"
var/spanstyle
switch(B.digest_mode)
if(DM_HOLD)
@@ -110,11 +111,13 @@
if(DM_DIGEST)
spanstyle = "color:red;"
if(DM_HEAL)
spanstyle = "color:green;"
spanstyle = "color:darkgreen;"
if(DM_NOISY)
spanstyle = "color:purple;"
if(DM_ABSORB)
spanstyle = "color:purple;"
if(DM_DRAGON)
spanstyle = "color:blue;"
dat += "<span style='[spanstyle]'> ([B.contents.len])</span></a></li>"
@@ -156,6 +159,10 @@
dat += "<a href='?src=\ref[src];b_name=\ref[selected]'>Name:</a>"
dat += " '[selected.name]'"
//Belly Type button
dat += "<br><a href='?src=\ref[src];b_wetness=\ref[selected]'>Is Fleshy:</a>"
dat += "[selected.is_wet ? "Yes" : "No"]"
//Digest Mode Button
dat += "<br><a href='?src=\ref[src];b_mode=\ref[selected]'>Belly Mode:</a>"
dat += " [selected.digest_mode]"
@@ -169,11 +176,11 @@
dat += " '[selected.desc]'"
//Belly sound
dat += "<br><a href='?src=\ref[src];b_sound=\ref[selected]'>Set Vore Sound</a>"
dat += "<br><a href='?src=\ref[src];b_sound=\ref[selected]'>Vore Sound: [selected.vore_sound]</a>"
dat += "<a href='?src=\ref[src];b_soundtest=\ref[selected]'>Test</a>"
//Release sound
dat += "<br><a href='?src=\ref[src];b_release=\ref[selected]'>Set Release Sound</a>"
dat += "<br><a href='?src=\ref[src];b_release=\ref[selected]'>Release Sound: [selected.release_sound]</a>"
dat += "<a href='?src=\ref[src];b_releasesoundtest=\ref[selected]'>Test</a>"
//Belly messages
@@ -201,10 +208,6 @@
dat += "<br><a href='?src=\ref[src];b_escapetime=\ref[selected]'>Set Belly Escape Time</a>"
dat += " [selected.escapetime/10]s"
dat += "<br style='line-height:5px;'>"
dat += "<br><a href='?src=\ref[src];b_absorbchance=\ref[selected]'>Set Belly Absorb Chance</a>"
dat += " [selected.absorbchance]%"
//Special <br> here to add a gap
dat += "<br style='line-height:5px;'>"
dat += "<br><a href='?src=\ref[src];b_transferchance=\ref[selected]'>Set Belly Transfer Chance</a>"
@@ -215,19 +218,17 @@
//Special <br> here to add a gap
dat += "<br style='line-height:5px;'>"
dat += "<br><a href='?src=\ref[src];b_absorbchance=\ref[selected]'>Set Belly Absorb Chance</a>"
dat += " [selected.absorbchance]%"
dat += "<br><a href='?src=\ref[src];b_digestchance=\ref[selected]'>Set Belly Digest Chance</a>"
dat += " [selected.digestchance]%"
dat += "<HR>"
// Belly Silence
dat += "<br><a href='?src=\ref[src];b_silent=\ref[selected]'>Belly Silence (for not belly bellies):</a>"
dat += " [selected.silent ? "Yes" : "No"]"
//Delete button
dat += "<br><a style='background:#990000;' href='?src=\ref[src];b_del=\ref[selected]'>Delete Belly</a>"
dat += "<a href='?src=\ref[src];setflavor=1'>Set Flavor</a>"
dat += "<a href='?src=\ref[src];togglenoisy=1'>Toggle Hunger Noises</a>"
dat += "<HR>"
@@ -239,15 +240,21 @@
dat += "<HR>"
switch(user.digestable)
if(TRUE)
dat += "<a href='?src=\ref[src];toggledg=1'>Toggle Digestable (Currently: ON)</a>"
dat += "<a href='?src=\ref[src];toggledg=1'>Toggle Digestable <font color='darkgreen'>(Currently: ON)</font></a>"
if(FALSE)
dat += "<a href='?src=\ref[src];toggledg=1'>Toggle Digestable (Currently: OFF)</a>"
dat += "<a href='?src=\ref[src];toggledg=1'>Toggle Digestable <font color='red'>(Currently: OFF)</font></a>"
switch(user.devourable)
if(TRUE)
dat += "<a href='?src=\ref[src];toggledvor=1'>Toggle Devourable (Currently: ON)</a>"
dat += "<br><a href='?src=\ref[src];toggledvor=1'>Toggle Devourable <font color='darkgreen'>(Currently: ON)</font></a>"
if(FALSE)
dat += "<a href='?src=\ref[src];toggledvor=1'>Toggle Devourable (Currently: OFF)</a>"
dat += "<br><a href='?src=\ref[src];toggledvor=1'>Toggle Devourable <font color='red'>(Currently: OFF)</font></a>"
switch(user.feeding)
if(TRUE)
dat += "<br><a href='?src=\ref[src];toggledfeed=1'>Toggle Feeding <font color='darkgreen'>(Currently: ON)</font></a>"
if(FALSE)
dat += "<br><a href='?src=\ref[src];toggledfeed=1'>Toggle Feeding <font color='red'>(Currently: OFF)</font></a>"
//Returns the dat html to the vore_look
return dat
@@ -258,25 +265,26 @@
if(href_list["close"])
qdel(src) // Cleanup
user.openpanel = 0
return
if(href_list["show_int"])
show_interacts = !show_interacts
return TRUE //Force update
return 1 //Force update
if(href_list["int_help"])
to_chat(usr,"These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \
alert("These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \
and you can change them to whatever you see fit. Setting them to 0% will disable the possibility of that interaction. \
These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest) \
will affect all prey in that belly, if one resists and triggers digestion. If multiple trigger at the same time, \
only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.")
return TRUE //Force update
These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest/absorb) \
will affect all prey in that belly, if one resists and triggers digestion/absorption. If multiple trigger at the same time, \
only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.","Interactions Help")
return 0 //Force update
if(href_list["outsidepick"])
var/atom/movable/tgt = locate(href_list["outsidepick"])
var/obj/belly/OB = locate(href_list["outsidebelly"])
if(!(tgt in OB)) //Aren't here anymore, need to update menu.
return TRUE
return 1
var/intent = "Examine"
if(istype(tgt,/mob/living))
@@ -289,11 +297,11 @@
if("Help Out") //Help the inside-mob out
if(user.stat || user.absorbed || M.absorbed)
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
return
return 1
to_chat(user,"<font color='green'>You begin to push [M] to freedom!</font>")
to_chat(M,"[usr] begins to push you to freedom!")
to_chat(OB.owner,"<span class='warning'>Someone is trying to escape from inside you!</span>")
to_chat(M.loc,"<span class='warning'>Someone is trying to escape from inside you!</span>")
sleep(50)
if(prob(33))
OB.release_specific_contents(M)
@@ -305,15 +313,14 @@
to_chat(M,"<span class='alert'> Even with [user]'s help, you slip back inside again.</span>")
to_chat(OB.owner,"<font color='green'>Your body efficiently shoves [M] back where they belong.</font>")
if("Devour") //Eat the inside mob
if(user.absorbed || user.stat)
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
return
return 1
if(!user.vore_selected)
to_chat(user,"<span class='warning'>Pick a belly on yourself first!</span>")
return
return 1
var/obj/belly/TB = user.vore_selected
to_chat(user,"<span class='warning'>You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!</span>")
@@ -329,9 +336,9 @@
else if(istype(tgt,/obj/item))
var/obj/item/T = tgt
if(!(tgt in OB.contents))
if(!(tgt in OB))
//Doesn't exist anymore, update.
return TRUE
return 1
intent = alert("What do you want to do to that?","Query","Examine","Use Hand")
switch(intent)
if("Examine")
@@ -339,8 +346,8 @@
if("Use Hand")
if(user.stat)
to_chat(user, "<span class='warning'>You can't do that in your state!</span>")
return
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
return 1
user.ClickOn(T)
sleep(5) //Seems to exit too fast for the panel to update
@@ -353,32 +360,31 @@
intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all")
switch(intent)
if("Cancel")
return
return 0
if("Eject all")
if(user.stat)
to_chat(user, "<span class='warning'>You can't do that in your state!</span>")
return
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
return 0
selected.release_all_contents()
to_chat(user.loc,"<span class='danger'>Everything is released from [user]!</span>")
if("Move all")
if(user.stat)
to_chat(user, "<span class='warning'>You can't do that in your state!</span>")
return FALSE
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
return 0
var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs
if(!choice)
return FALSE
return 0
for(var/atom/movable/tgt in selected)
selected.transfer_contents(tgt, choice, 1)
to_chat(tgt,"<span class='warning'>You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!</span>")
selected.transfer_contents(tgt, choice, 1)
var/atom/movable/tgt = locate(href_list["insidepick"])
if(!(tgt in selected)) //Old menu, needs updating because they aren't really there.
return TRUE//Forces update
return 1 //Forces update
intent = "Examine"
intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move")
switch(intent)
@@ -387,11 +393,10 @@
if("Eject")
if(user.stat)
to_chat(user, "<span class='warning'>You can't do that in your state!</span>")
return FALSE
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
return 0
selected.release_specific_contents(tgt)
user.loc << "<span class='danger'>[tgt] is released from [user]!</span>"
if("Move")
if(user.stat)
@@ -457,6 +462,9 @@
selected.name = new_name
if(href_list["b_wetness"])
selected.is_wet = !selected.is_wet
if(href_list["b_mode"])
var/list/menu_list = selected.digest_modes
@@ -540,12 +548,12 @@
if(!choice)
return
selected.release_sound = GLOB.release_sounds[choice]
selected.release_sound = choice
if(href_list["b_releasesoundtest"])
var/soundfile = selected.release_sound
if(soundfile)
user << soundfile
var/sound/releasetest = GLOB.release_sounds[selected.release_sound]
if(releasetest)
user << releasetest
if(href_list["b_sound"])
var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.vore_sounds
@@ -553,12 +561,12 @@
if(!choice)
return
selected.vore_sound = GLOB.vore_sounds[choice]
selected.vore_sound = choice
if(href_list["b_soundtest"])
var/soundfile = selected.vore_sound
if(soundfile)
user << soundfile
var/sound/voretest = GLOB.vore_sounds[selected.vore_sound]
if(voretest)
user << voretest
if(href_list["b_tastes"])
selected.can_taste = !selected.can_taste
@@ -577,17 +585,17 @@
selected.bulge_size = (new_bulge/100)
if(href_list["b_escapable"])
if(selected.escapable == FALSE) //Possibly escapable and special interactions.
selected.escapable = TRUE
to_chat(usr,"<span class='warning'>Prey now have special interactions with your [selected.name] depending on your settings.</span>")
else if(selected.escapable == TRUE) //Never escapable.
selected.escapable = FALSE
to_chat(usr,"<span class='warning'>Prey will not be able to have special interactions with your [selected.name].</span>")
show_interacts = FALSE //Force the hiding of the panel
if(selected.escapable == 0) //Possibly escapable and special interactions.
selected.escapable = 1
to_chat(usr,"<span class='warning'>Prey now have special interactions with your [lowertext(selected.name)] depending on your settings.</span>")
else if(selected.escapable == 1) //Never escapable.
selected.escapable = 0
to_chat(usr,"<span class='warning'>Prey will not be able to have special interactions with your [lowertext(selected.name)].</span>")
show_interacts = 0 //Force the hiding of the panel
else
to_chat(usr,"<span class='warning'>Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.") //If they somehow have a varable that's not 0 or 1
selected.escapable = TRUE
show_interacts = FALSE //Force the hiding of the panel
alert("Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.","Error") //If they somehow have a varable that's not 0 or 1
selected.escapable = 0
show_interacts = 0 //Force the hiding of the panel
if(href_list["b_escapechance"])
var/escape_chance_input = input(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance") as num|null
@@ -605,14 +613,14 @@
selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(selected.transferchance))
if(href_list["b_transferlocation"])
var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name)
var/obj/belly/choice = input("Where do you want your [lowertext(selected.name)] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected)
if(!choice) //They cancelled, no changes
return FALSE
return 0
else if(choice == "None - Remove")
selected.transferlocation = null
else
selected.transferlocation = user.vore_organs[choice]
selected.transferlocation = choice.name
if(href_list["b_absorbchance"])
var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null
@@ -624,13 +632,10 @@
if(!isnull(digest_chance_input))
selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance))
if(href_list["b_silent"])
selected.silent = !selected.silent
if(href_list["b_del"])
var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel")
if(!alert == "Delete")
return FALSE
return 0
var/failure_msg = ""
@@ -651,7 +656,7 @@
if(failure_msg)
alert(user,failure_msg,"Error!")
return FALSE
return 0
qdel(selected)
selected = user.vore_organs[1]
@@ -689,7 +694,7 @@
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
switch(choice)
if("Cancel")
return
return 0
if("Allow Digestion")
user.digestable = TRUE
if("Prevent Digestion")
@@ -702,7 +707,7 @@
var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment")
switch(choice)
if("Cancel")
return
return 0
if("Allow Devourment")
user.devourable = TRUE
if("Prevent Devourment")
@@ -711,5 +716,18 @@
if(user.client.prefs_vr)
user.client.prefs_vr.devourable = user.devourable
if(href_list["toggledfeed"])
var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [user.feeding ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding")
switch(choice)
if("Cancel")
return 0
if("Allow Feeding")
user.feeding = TRUE
if("Prevent Feeding")
user.feeding = FALSE
if(user.client.prefs_vr)
user.client.prefs_vr.feeding = user.feeding
//Refresh when interacted with, returning 1 makes vore_look.Topic update
return 1