Reapply "Merge branch 'master' into trash-eat-Mk2"

This reverts commit d638582401.
This commit is contained in:
MrSky12
2024-05-15 23:28:30 +02:00
parent d638582401
commit 6ba955d90c
82 changed files with 1090 additions and 218 deletions

View File

@@ -8,6 +8,7 @@
power = /obj/effect/proc_holder/spell/targeted/touch/fatfang
instability = 10
energy_coeff = 1
power_coeff = 1
/obj/effect/proc_holder/spell/targeted/touch/fatfang
name = "The Nibble"
@@ -28,7 +29,8 @@
icon_state = "power_feed"
///How much weight is added?
var/chem_to_add = 5
///What verb is used for the spell?
var/starttime = 0
/obj/item/melee/touch_attack/fatfang/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || !iscarbon(target) || target == user)
@@ -36,10 +38,18 @@
if(!target || !chem_to_add)
return FALSE
target.reagents.add_reagent(/datum/reagent/consumable/lipoifier, chem_to_add)
target.visible_message("<span class='danger'>[user] nibbles [target]!</span>","<span class='userdanger'>[user] nibbles you!</span>")
if(target == user.pulling && ishuman(user.pulling))
starttime = world.time
user.dna.get_mutation(FATFANG).power.charge_max = 600 * GET_MUTATION_ENERGY(user.dna.get_mutation(FATFANG))
while(starttime + 300 > world.time && in_range(user, target))
if(do_mob(user, target, 10, 0, 1))
target.reagents.add_reagent(/datum/reagent/consumable/lipoifier, (chem_to_add * GET_MUTATION_POWER(user.dna.get_mutation(FATFANG))/2))
target.visible_message("<span class='danger'>[user] pumps some venom in [target]!</span>","<span class='userdanger'>[user] pumps some venom in you!</span>")
else
user.dna.get_mutation(FATFANG).power.charge_max = 50 * GET_MUTATION_ENERGY(user.dna.get_mutation(FATFANG))
target.reagents.add_reagent(/datum/reagent/consumable/lipoifier, chem_to_add * GET_MUTATION_POWER(user.dna.get_mutation(FATFANG)))
return ..()
/obj/item/dnainjector/antifang

View File

@@ -0,0 +1,149 @@
/obj/machinery/power/adipoelectric_generator
name = "adipoelectric generator"
desc = "This device uses calorite technology to transform excess blubber into power!"
icon = 'GainStation13/icons/obj/adipoelectric_transformer.dmi'
icon_state = "state_off"
density = FALSE
anchored = FALSE
use_power = NO_POWER_USE
state_open = TRUE
circuit = /obj/item/circuitboard/machine/power/adipoelectric_generator
occupant_typecache = list(/mob/living/carbon)
var/laser_modifier
var/max_fat
var/obj/structure/cable/attached
var/conversion_rate = 10000
var/emp_timer = 0
var/active = FALSE
var/datum/looping_sound/generator/soundloop
/obj/machinery/power/adipoelectric_generator/Initialize()
. = ..()
soundloop = new(list(src), active)
if(anchored)
connect_to_network()
update_icon()
/obj/machinery/power/adipoelectric_generator/RefreshParts()
laser_modifier = 0
max_fat = 0
for(var/obj/item/stock_parts/micro_laser/C in component_parts)
laser_modifier += C.rating
for(var/obj/item/stock_parts/matter_bin/C in component_parts)
max_fat += C.rating * 2
/obj/machinery/power/adipoelectric_generator/process()
if(occupant:fatness_real > 0 && powernet && anchored && (emp_timer < world.time))
active = TRUE
add_avail(conversion_rate * laser_modifier * max_fat)
occupant:adjust_fatness(-max_fat, FATTENING_TYPE_ITEM)
soundloop.start()
else
active = FALSE
soundloop.stop()
update_icon()
/obj/machinery/power/adipoelectric_generator/relaymove(mob/user)
if(user.stat)
return
open_machine()
soundloop.stop()
/obj/machinery/power/adipoelectric_generator/emp_act(severity)
. = ..()
if(!(stat & (BROKEN|NOPOWER)))
emp_timer = world.time + 600
if(occupant)
open_machine()
/obj/machinery/power/adipoelectric_generator/attackby(obj/item/P, mob/user, params)
if(state_open)
if(default_deconstruction_screwdriver(user, "state_open", "state_off", P))
return
if(default_pry_open(P))
return
if(default_deconstruction_crowbar(P))
return
if(istype(P, /obj/item/wrench) && !active)
if(!anchored && !isinspace())
connect_to_network()
to_chat(user, "<span class='notice'>You secure the generator to the floor.</span>")
anchored = TRUE
dir = SOUTH
else if(anchored)
disconnect_from_network()
to_chat(user, "<span class='notice'>You unsecure the generator from the floor.</span>")
anchored = FALSE
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
return
return ..()
/obj/machinery/power/adipoelectric_generator/interact(mob/user)
toggle_open()
return TRUE
/obj/machinery/power/adipoelectric_generator/proc/toggle_open()
if(state_open)
close_machine()
else
open_machine()
soundloop.stop()
update_icon()
/obj/machinery/power/adipoelectric_generator/open_machine()
. = ..()
/obj/machinery/power/adipoelectric_generator/close_machine()
. = ..()
if(occupant && anchored && !panel_open)
add_fingerprint(occupant)
else
open_machine()
/obj/machinery/power/adipoelectric_generator/update_icon()
cut_overlays()
if(panel_open)
icon_state = "state_open"
return
if(occupant)
var/image/occupant_overlay
occupant_overlay = image(occupant.icon, occupant.icon_state)
occupant_overlay.copy_overlays(occupant)
occupant_overlay.dir = SOUTH
occupant_overlay.pixel_y = 10
add_overlay(occupant_overlay)
if(!active)
icon_state = "state_off"
else
icon_state = "state_on"
else
icon_state = "state_off"
/obj/machinery/power/adipoelectric_generator/power_change()
..()
update_icon()
/obj/machinery/power/adipoelectric_generator/Destroy()
QDEL_NULL(soundloop)
. = ..()
/obj/item/circuitboard/machine/power/adipoelectric_generator
name = "Adipoelectric Generator (Machine Board)"
build_path = /obj/machinery/power/adipoelectric_generator
req_components = list(
/obj/item/stock_parts/micro_laser = 5,
/obj/item/stock_parts/matter_bin = 1,
/obj/item/stack/cable_coil = 2)
needs_anchored = FALSE
/datum/design/board/adipoelectric_generator
name = "Machine Design (Adipoelectric Generator Board)"
desc = "The circuit board for an Adipoelectric Generator."
id = "adipoelectric_generator"
build_path = /obj/item/circuitboard/machine/power/adipoelectric_generator
category = list("Engineering Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING

View File

@@ -0,0 +1,150 @@
GLOBAL_LIST_EMPTY(adipoelectric_transformer)
/obj/machinery/adipoelectric_transformer
name = "adipoelectric transformer"
desc = "This device uses calorite technology to store excess current in the wire it's placed on into whoever steps on!"
icon = 'GainStation13/icons/obj/adipoelectric_transformer.dmi'
icon_state = "state_off"
density = FALSE
use_power = NO_POWER_USE
state_open = TRUE
circuit = /obj/item/circuitboard/machine/adipoelectric_transformer
occupant_typecache = list(/mob/living/carbon)
var/recharge_speed
var/obj/structure/cable/attached
var/drain_rate = 1000000
var/lastprocessed = 0
var/power_avaliable = 0
var/conversion_rate = 0.000001
var/emp_timer = 0
var/emp_multiplier = 5
/obj/machinery/adipoelectric_transformer/Initialize()
. = ..()
update_icon()
/obj/machinery/adipoelectric_transformer/RefreshParts()
recharge_speed = 0
for(var/obj/item/stock_parts/capacitor/C in component_parts)
recharge_speed += C.rating
/obj/machinery/adipoelectric_transformer/process()
if(!is_operational())
return
if(!attached)
playsound(src, 'sound/machines/buzz-two.ogg', 50)
return PROCESS_KILL
var/datum/powernet/PN = attached.powernet
if(PN)
power_avaliable = PN.netexcess
update_icon()
if(power_avaliable <= 0)
return
if(occupant)
if(power_avaliable > drain_rate)
lastprocessed = ((power_avaliable - drain_rate) * (conversion_rate / 10)) + 1
else
lastprocessed = power_avaliable * conversion_rate
if(!(world.time >= emp_timer + 600))
lastprocessed = lastprocessed * emp_multiplier
occupant:adjust_fatness(lastprocessed * recharge_speed, FATTENING_TYPE_ITEM)
return 1
/obj/machinery/adipoelectric_transformer/relaymove(mob/user)
if(user.stat)
return
open_machine()
/obj/machinery/adipoelectric_transformer/emp_act(severity)
. = ..()
if(!(stat & (BROKEN|NOPOWER)))
if(occupant)
emp_timer = world.time //stuck in for 600 ticks, about 60 seconds
/obj/machinery/adipoelectric_transformer/attackby(obj/item/P, mob/user, params)
if(state_open)
if(default_deconstruction_screwdriver(user, "state_open", "state_off", P))
return
if(default_pry_open(P))
return
if(default_deconstruction_crowbar(P))
return
return ..()
/obj/machinery/adipoelectric_transformer/interact(mob/user)
toggle_open()
return TRUE
/obj/machinery/adipoelectric_transformer/proc/toggle_open()
if(state_open)
close_machine()
else
open_machine()
update_icon()
/obj/machinery/adipoelectric_transformer/open_machine()
if(!(world.time >= emp_timer + 600))
return
. = ..()
GLOB.adipoelectric_transformer -= src
STOP_PROCESSING(SSobj, src)
/obj/machinery/adipoelectric_transformer/close_machine()
. = ..()
if(LAZYLEN(GLOB.adipoelectric_transformer) < 1 && occupant)
var/turf/T = loc
if(isturf(T) && !T.intact)
attached = locate() in T
add_fingerprint(occupant)
GLOB.adipoelectric_transformer += src
START_PROCESSING(SSobj, src)
else
playsound(src, 'sound/machines/buzz-two.ogg', 50)
open_machine()
/obj/machinery/adipoelectric_transformer/update_icon()
cut_overlays()
if(occupant)
var/image/occupant_overlay
occupant_overlay = image(occupant.icon, occupant.icon_state)
occupant_overlay.copy_overlays(occupant)
occupant_overlay.dir = SOUTH
occupant_overlay.pixel_y = 10
add_overlay(occupant_overlay)
if(power_avaliable <= 0)
icon_state = "state_off"
else
if(!(world.time >= emp_timer + 600))
icon_state = "state_overdrive"
add_overlay("particles_overdrive")
else
icon_state = "state_on"
add_overlay("particles_on")
else
icon_state = "state_off"
/obj/machinery/adipoelectric_transformer/power_change()
..()
update_icon()
/obj/machinery/adipoelectric_transformer/Destroy()
. = ..()
GLOB.adipoelectric_transformer -= src
/obj/item/circuitboard/machine/adipoelectric_transformer
name = "Adipoelectric Transformer (Machine Board)"
build_path = /obj/machinery/adipoelectric_transformer
req_components = list(
/obj/item/stock_parts/capacitor = 5,
/obj/item/stack/sheet/glass = 1,
/obj/item/stack/sheet/mineral/calorite = 1)
/datum/design/board/adipoelectric_transformer
name = "Machine Design (Adipoelectric Transformer Board)"
desc = "The circuit board for an Adipoelectric Transformer."
id = "adipoelectric_transformer"
build_path = /obj/item/circuitboard/machine/adipoelectric_transformer
category = list("Research Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING

View File

@@ -52,6 +52,9 @@
else //If it's not being hidden
fatness = fatness_real //Make their current fatness their real fatness
if(client?.prefs?.weight_gain_extreme)
xwg_resize()
return TRUE
@@ -102,11 +105,21 @@
fatness_hidden = TRUE
fatness_over = hide_amount
fatness = fatness_over //To update a mob's fatness with the new amount to be shown immediately
if(client?.prefs?.weight_gain_extreme)
xwg_resize()
return TRUE
/mob/living/carbon/proc/fat_show() //If something that hides fatness is removed or expires, it'll call this method
fatness_hidden = FALSE
fatness = fatness_real //To update a mob's fatness with their real one immediately
if(client?.prefs?.weight_gain_extreme)
xwg_resize()
return TRUE
/mob/living/carbon/proc/xwg_resize()
var/xwg_size = sqrt(fatness/FATNESS_LEVEL_BLOB)
xwg_size = min(xwg_size, RESIZE_MACRO)
xwg_size = max(xwg_size, custom_body_size*0.01)
resize(xwg_size)

View File

@@ -5,15 +5,20 @@
gain_text = "<span class='notice'>You find yourself able to weave webs.</span>"
lose_text = "<span class='notice'>You are no longer able to weave webs.</span>"
category = CATEGORY_SEXUAL
mob_trait = TRAIT_WEB_WEAVER
///What action is linked with this quirk?
var/datum/action/innate/wrap_target/linked_action
var/datum/action/innate/wrap_target/linked_action1
var/datum/action/innate/make_web/linked_action2
/datum/quirk/web_weaving/post_add()
linked_action = new
linked_action.Grant(quirk_holder)
linked_action1 = new
linked_action1.Grant(quirk_holder)
linked_action2 = new
linked_action2.Grant(quirk_holder)
/datum/quirk/web_weaving/remove()
linked_action.Remove(quirk_holder)
linked_action1.Remove(quirk_holder)
linked_action2.Remove(quirk_holder)
return ..()
/datum/action/innate/wrap_target
@@ -83,3 +88,20 @@
/obj/structure/spider/cocoon/quirk
max_integrity = 20
/datum/action/innate/make_web
name = "weave"
desc = "spins a sticky web."
icon_icon = 'icons/effects/effects.dmi'
button_icon_state = "stickyweb1"
background_icon_state = "bg_alien"
/datum/action/innate/make_web/Activate()
var/turf/T = get_turf(owner)
owner.visible_message("<span class='warning'>[owner] begins spinning a web!</span>", "<span class='warning'>You begin spinning a web.</span>")
if(!do_after(owner, 10 SECONDS, 1, null, 1))
owner.visible_message("<span class='warning'>[owner] fails to spin a web!</span>", "<span class='warning'>You fail to spin web.</span>")
return FALSE
T.ChangeTurf(/obj/structure/spider/stickyweb)
owner.visible_message("<span class='warning'>[owner] spin a sticky web!</span>", "<span class='warning'>You spin a sticky web.</span>")
return TRUE

View File

@@ -13,6 +13,8 @@
var/weight_gain_magic = FALSE
///Weight gain from viruses
var/weight_gain_viruses = FALSE
///Extreme weight gain
var/weight_gain_extreme = FALSE
///Does the person wish to be involved with non-con weight gain events?
var/noncon_weight_gain = FALSE

View File

@@ -0,0 +1,4 @@
// This is a file for emotes that have been rewritten to be more modular. Such as varying based on species or whathave you. May move this later or something.
//I was going to put screams in here but I overhauled it in a different more austistic way

View File

@@ -0,0 +1,230 @@
// This is an emote file for random shit we've ported. Im just copying the style recipes_ported.dm did, yell at me if im wrong later.
// It said it was lazy but personally I think this might be a better way of organizing otherwise unique content that we're porting
// for ourselves. -Reo
// I found this tacked onto the bottom of code/modules/mob/living/emote.dm. No //code add: notice or anything. Moving it here,
// since it seems to all be ported emotes. -Reo
/*
//Carl wuz here
//FUCK YOU CARL SUCK MY BALLS YOU WHORE
/datum/emote/living/tesh_sneeze
key = "tesh_sneeze"
key_third_person = "sneezes"
message = "sneezes."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/tesh_sneeze/can_run_emote(mob/living/user, status_check = TRUE)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
return !C.silent
/datum/emote/living/tesh_sneeze/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
if(!C.mind || C.mind.miming)//no cute sneezing for you.
return
if(ishumanbasic(C))
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
if(is_species(user, /datum/species/avian))//This is required(related to subtypes), otherwise it doesn't play the noises. Sometimes. Always sometimes. Just how it be.
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
if(is_species(user, /datum/species/mammal))//Just because the avian subspecies doesn't have proper sprites. Some people can't use it.
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
/datum/emote/living/racc
key = "racc_chitter"
key_third_person = "chitters"
message = "chitters."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/racc/can_run_emote(mob/living/user, status_check = TRUE)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
return !C.silent
/datum/emote/living/racc/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
if(!C.mind || C.mind.miming)
return
if(ishumanbasic(C))
playsound(C, pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_5.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_6.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg'), 50, 1)
if(is_species(user, /datum/species/mammal))
playsound(C, pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_5.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_6.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg'), 50, 1)
/datum/emote/living/bat
key = "bat_chitter"
key_third_person = "chitters"
message = "chitters."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/bat/can_run_emote(mob/living/user, status_check = TRUE)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
return !C.silent
/datum/emote/living/bat/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
if(!C.mind || C.mind.miming)
return
if(ishumanbasic(C))
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
if(is_species(user, /datum/species/mammal))
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
if(is_species(user, /datum/species/avian))//this and mammal should be considered the same AAAAAAAAAAAA
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
*/
//End of the random emotes I found in mob/living
//Rewrites of the above start.
/datum/emote/living/carbon/teshsneeze
key = "teshsneeze"
key_third_person = "sneezes"
message = "sneezes."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/teshsneeze/get_sound()
return pick('GainStation13/sound/voice/teshari/teshsneeze.ogg', 'GainStation13/sound/voice/teshari/teshsneezeb.ogg')
/datum/emote/living/carbon/racc
key = "racc_chitter"
key_third_person = "raccchitters"
message = "chitters."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/racc/get_sound()
return pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', \
'hyperstation/sound/voice/emotes/racc_chitter_5.ogg','hyperstation/sound/voice/emotes/racc_chitter_6.ogg', \
'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg')
/datum/emote/living/carbon/bat
key = "bat_chitter"
key_third_person = "bat_chitters"
message = "chitters."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/bat/get_sound()
return pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', \
'hyperstation/sound/voice/emotes/bat_c3.ogg', 'hyperstation/sound/voice/emotes/bat_c4.ogg', \
'hyperstation/sound/voice/emotes/bat_c5.ogg','hyperstation/sound/voice/emotes/bat_c6.ogg', \
'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
'hyperstation/sound/voice/emotes/bat_c9.ogg')
//Rewrites of the above end.
//Ported from Vorestation
/datum/emote/living/carbon/teshsqueak
key = "teshsurprise" //Originally, It was just "surprised" but I dont think that's very telling of a teshari emote.
key_third_person = "teshsurprised"
message = "chirps in surprise!"
message_param = "chirps in surprise at %t!"
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/teshari/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
/datum/emote/living/carbon/teshchirp
key = "tchirp"
key_third_person = "tchirps"
message = "chirps!"
message_param = "chirps at %t!"
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/teshari/teshchirp.ogg' // Copyright Sampling+ 1.0 Incarnidine (freesound.org) for the source audio.
/datum/emote/living/carbon/teshtrill
key = "trill"
key_third_person = "trills"
message = "trills."
message_param = "trills at %t."
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/teshari/teshtrill.ogg' // Copyright CC BY-NC 3.0 Arnaud Coutancier (freesound.org) for the source audio.
/datum/emote/living/sneeze/teshsneeze //Replace this with a modular species/tongue based sneeze system later. Also piggybacking on normal sneezes
key = "teshsneeze"
key_third_person = "teshsneezes"
message = "sneezes."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/sneeze/teshsneeze/get_sound()
return pick('GainStation13/sound/voice/teshari/teshsneeze.ogg', 'GainStation13/sound/voice/teshari/teshsneezeb.ogg')
/datum/emote/living/cough/teshcough //Same as above. Replace with a modular system later.
key = "teshcough"
key_third_person = "teshcoughs"
message = "coughs."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/cough/teshcough/get_sound()
return pick('GainStation13/sound/voice/teshari/teshcougha.ogg', 'GainStation13/sound/voice/teshari/teshcoughb.ogg')
/datum/emote/living/carbon/teshscream
key = "teshscream"
key_third_person = "teshscreams"
message = "screams!"
message_param = "screams at %t!"
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/teshari/teshscream.ogg'
/datum/emote/living/teppi
key = "gyoh"
key_third_person = "gyohs"
message = "gyohs"
var/bigsound = list('GainStation13/sound/voice/teppi/gyooh1.ogg', 'GainStation13/sound/voice/teppi/gyooh2.ogg', \
'GainStation13/sound/voice/teppi/gyooh3.ogg', 'GainStation13/sound/voice/teppi/gyooh4.ogg', \
'GainStation13/sound/voice/teppi/gyooh5.ogg', 'GainStation13/sound/voice/teppi/gyooh6.ogg')
var/smolsound = list('GainStation13/sound/voice/teppi/whine1.ogg', 'GainStation13/sound/voice/teppi/whine2.ogg')
/datum/emote/living/teppi/run_emote(mob/living/user, params)
/* //If we port teppi later, Enable this.
if(istype(user, /mob/living/simple_mob/vore/alienanimals/teppi))
if(istype(user, /mob/living/simple_mob/vore/alienanimals/teppi/baby))
sound = pick(smolsound)
else
sound = pick(bigsound)
return ..()
*/
if(user.size_multipler >= 1.5)
sound = pick(bigsound)
else
sound = pick(smolsound)
. = ..()
/datum/emote/living/teppi/rumble
key = "rumble"
key_third_person = "rumbles"
message = "rumbles contentedly."
sound = 'GainStation13/sound/voice/teppi/cute_rumble.ogg'
var/bigsound = list('GainStation13/sound/voice/teppi/rumble.ogg')
var/smolsound = list('GainStation13/sound/voice/teppi/cute_rumble.ogg')
//Vorestation ports end.
//Ported from Chompstation
/datum/emote/living/wawa
key = "wawa"
key_third_person = "wawas"
message = "wawas."
message_param = "wawas at %t."
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/emotes/wawa.ogg'
//Chompstation ports end.

View File

@@ -11,6 +11,7 @@
actions_types = list(/datum/action/item_action/toggle_tube)
var/mob/living/carbon/U = null
var/transfer_amount = 1
amount_per_transfer_from_this = 0
possible_transfer_amounts = list(0)
@@ -60,7 +61,7 @@
if(reagents.total_volume)
var/fraction = min(1/reagents.total_volume, 1)
reagents.reaction(U, INGEST, fraction, FALSE)
reagents.trans_to(U, 1, 2)
reagents.trans_to(U, transfer_amount, 2)
else
to_chat(U, "<span class='warning'>The barrel is empty!</span>")
U = null

View File

@@ -5,7 +5,7 @@
display_name = "Nutri-Tech Tools"
description = "Ending world hunger was never made easier!"
prereq_ids = list("biotech", "adv_engi") // add "engineering" if the designs get complicated later on
design_ids = list("calorite_collar", "ci-nutrimentturbo", "bluespace_belt")
design_ids = list("calorite_collar", "ci-nutrimentturbo", "bluespace_belt", "adipoelectric_transformer")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
boost_item_paths = list(/obj/item/gun/energy/fatoray, /obj/item/gun/energy/fatoray/cannon, /obj/item/trash/fatoray_scrap1, /obj/item/trash/fatoray_scrap2)
export_price = 5000

View File

@@ -143,3 +143,17 @@
icon_state = "ballgag"
item_state = "ballgag"
flags_inv = HIDEFACE
/obj/item/service_sign
name = "service sign"
desc = "A sign that reads 'closed'"
icon = 'GainStation13/icons/obj/service_sign.dmi'
icon_state = "sign_closed"
/obj/item/service_sign/attack_self()
if(icon_state == "sign_closed")
icon_state = "sign_open"
desc = "A sign that reads 'open'"
else
icon_state = "sign_closed"
desc = "A sign that reads 'closed'"

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -203,6 +203,7 @@
#define TRAIT_LIPOLICIDE_TOLERANCE "lipolicide_tolerance"
#define TRAIT_WEAKLEGS "weak_legs"
#define TRAIT_STRONGLEGS "strong_legs"
#define TRAIT_WEB_WEAVER "web_weaving"
//Hyper
#define TRAIT_MACROPHILE "macrophile" //likes the big

View File

@@ -55,7 +55,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
GLOB.genital_fluids_list = list ("Milk", "Water", "Semen", "Femcum", "Honey", "Strawberry Milk")
GLOB.genital_fluids_list = list ("Milk", "Water", "Semen", "Femcum", "Honey", "Strawberry Milk", "Nutriment")
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")
for(var/K in GLOB.breasts_shapes_list)
var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]

View File

@@ -20,6 +20,9 @@
var/list/mob_type_blacklist_typecache //Types that are NOT allowed to use that emote
var/list/mob_type_ignore_stat_typecache
var/stat_allowed = CONSCIOUS
var/sound //Sound to play when emote is called
var/vary = FALSE
var/only_forced_audio = FALSE //can only code call this event instead of the player.
var/static/list/emote_list = list()
var/static/regex/stop_bad_mime = regex(@"says|exclaims|yells|asks")
@@ -60,6 +63,10 @@
user.log_message(msg, LOG_EMOTE)
msg = "<b>[user]</b> " + msg
var/tmp_sound = get_sound(user)
if(tmp_sound && (!only_forced_audio || !intentional))
playsound(user, tmp_sound, 50, vary)
for(var/mob/M in GLOB.dead_mob_list)
if(!M.client || isnewplayer(M))
continue
@@ -72,6 +79,9 @@
else
user.visible_message(msg)
/datum/emote/proc/get_sound(mob/living/user)
return sound //by default just return this var.
/datum/emote/proc/replace_pronoun(mob/user, message)
if(findtext(message, "their"))
message = replacetext(message, "their", user.p_their())
@@ -136,13 +146,3 @@
var/mob/living/L = user
if(HAS_TRAIT(L, TRAIT_EMOTEMUTE))
return FALSE
/datum/emote/sound
var/sound //Sound to play when emote is called
var/vary = FALSE //used for the honk borg emote
mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon)
/datum/emote/sound/run_emote(mob/user, params)
. = ..()
if(.)
playsound(user.loc, sound, 50, vary)

View File

@@ -19,6 +19,7 @@
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
sleep(100)
L.doorstuck = 0
L.Knockdown(1)
return ..()
else if(L.fatness > 3000)
@@ -28,6 +29,7 @@
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
sleep(55)
L.doorstuck = 0
L.Knockdown(1)
return ..()
if(rand(1, 5) == 5)
to_chat(L, "<span class='danger'>With great effort, you manage to squeeze your massive form through \the [src]. It's a tight fit, but you successfully navigate the narrow opening, barely avoiding getting stuck.</span>")

View File

@@ -36,11 +36,14 @@
. = ..()
/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider))
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider) || HAS_TRAIT(mover, TRAIT_WEB_WEAVER))
return TRUE
else if(isliving(mover))
if(istype(mover.pulledby, /mob/living/simple_animal/hostile/poison/giant_spider))
return TRUE
if(mover.pulledby)
if(HAS_TRAIT(mover.pulledby, TRAIT_WEB_WEAVER))
return TRUE
if(prob(50))
to_chat(mover, "<span class='danger'>You get stuck in \the [src] for a moment.</span>")
return FALSE

View File

@@ -483,6 +483,8 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
new/datum/stack_recipe("colored yellow", /obj/item/storage/box/yellow), \
new/datum/stack_recipe("colored pink", /obj/item/storage/box/pink), \
new/datum/stack_recipe("colored purple", /obj/item/storage/box/purple), \
null, \
new/datum/stack_recipe("open/closed sign", /obj/item/service_sign), \
))
/obj/item/stack/sheet/cardboard //BubbleWrap //it's cardboard you fuck

View File

@@ -893,6 +893,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Femcum</a>"
if(/datum/reagent/consumable/alienhoney)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Honey</a>"
if(/datum/reagent/consumable/nutriment)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Nutriment</a>"
else
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=balls_fluid;task=input'>Nothing?</a>"
//This else is a safeguard for errors, and if it happened, they wouldn't be able to change this pref,
@@ -940,6 +942,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Honey</a>"
if(/datum/reagent/consumable/pinkmilk)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Strawberry Milk</a>"
if(/datum/reagent/consumable/nutriment)
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Nutriment</a>"
else
dat += "<a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>Nothing?</a>"
//This else is a safeguard for errors, and if it happened, they wouldn't be able to change this pref,
@@ -1055,6 +1059,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Weight Gain - Weapons:</b><a href='?_src_=prefs;preference=weight_gain_weapons'>[weight_gain_weapons == TRUE ? "Enabled" : "Disabled"]</a><BR>"
dat += "<b>Weight Gain - Magic:</b><a href='?_src_=prefs;preference=weight_gain_magic'>[weight_gain_magic == TRUE ? "Enabled" : "Disabled"]</a><BR>"
dat += "<b>Weight Gain - Viruses:</b><a href='?_src_=prefs;preference=weight_gain_viruses'>[weight_gain_viruses == TRUE ? "Enabled" : "Disabled"]</a><BR>"
dat += "<b>Extreme Weight Gain:</b><a href='?_src_=prefs;preference=weight_gain_extreme'>[weight_gain_extreme == TRUE ? "Enabled" : "Disabled"]</a><BR>"
//Add the Hyper stuff below here
dat += "<h2>Hyper Preferences</h2>"
@@ -2381,6 +2386,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["balls_fluid"] = /datum/reagent/consumable/alienhoney
if("Strawberry Milk")
features["balls_fluid"] = /datum/reagent/consumable/pinkmilk
if("Nutriment")
features["balls_fluid"] = /datum/reagent/consumable/nutriment
if("egg_size")
var/new_size
@@ -2426,6 +2433,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["breasts_fluid"] = /datum/reagent/consumable/alienhoney
if("Strawberry Milk")
features["breasts_fluid"] = /datum/reagent/consumable/pinkmilk
if("Nutriment")
features["breasts_fluid"] = /datum/reagent/consumable/nutriment
if("breasts_color")
var/new_breasts_color = input(user, "Breast Color:", "Character Preference", "#"+features["breasts_color"]) as color|null
@@ -2615,6 +2624,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
weight_gain_magic = !weight_gain_magic
if("weight_gain_viruses")
weight_gain_viruses = !weight_gain_viruses
if("weight_gain_extreme")
weight_gain_extreme = !weight_gain_extreme
if("noncon_weight_gain")
noncon_weight_gain = !noncon_weight_gain
if("max_fatness")

View File

@@ -153,6 +153,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["weight_gain_magic"] >> weight_gain_magic
S["weight_gain_viruses"] >> weight_gain_viruses
S["weight_gain_weapons"] >> weight_gain_weapons
S["weight_gain_extreme"] >> weight_gain_extreme
S["wg_rate"] >> wg_rate
S["wl_rate"] >> wl_rate
S["noncon_weight_gain"] >> noncon_weight_gain
@@ -292,6 +293,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["weight_gain_viruses"], weight_gain_viruses)
WRITE_FILE(S["weight_gain_chems"], weight_gain_chems)
WRITE_FILE(S["weight_gain_weapons"], weight_gain_weapons)
WRITE_FILE(S["weight_gain_extreme"], weight_gain_extreme)
WRITE_FILE(S["wg_rate"], wg_rate)
WRITE_FILE(S["wl_rate"], wl_rate)
WRITE_FILE(S["noncon_weight_gain"], noncon_weight_gain)

View File

@@ -58,6 +58,23 @@
message = "mumbles!"
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/human/scream
key = "scream"
key_third_person = "screams"
message = "screams!"
emote_type = EMOTE_AUDIBLE
//cooldown = 10 SECONDS
vary = TRUE
/datum/emote/living/carbon/human/scream/get_sound(mob/living/user)
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(H.mind?.miming)
return
if(H.dna?.species) //Stealing yog's implementation, lol
return H.dna.species.get_scream_sound(H)
/datum/emote/living/carbon/human/pale
key = "pale"
message = "goes pale for a second."
@@ -159,36 +176,44 @@
var/turf/T = loc
T.Entered(src)
/datum/emote/sound/human
mob_type_allowed_typecache = list(/mob/living/carbon/human)
emote_type = EMOTE_AUDIBLE
/datum/emote/living/carbon/human/robot_tongue/can_run_emote(mob/user, status_check, intentional)
//var/obj/item/organ/tongue/T = user.getorganslot("tongue")
//return T?.status == ORGAN_ROBOTIC && ..()
return ..() //Remove this if we do want to restrict this to synthetic tongues.
/datum/emote/sound/human/buzz
/datum/emote/living/carbon/human/robot_tongue/beep
key = "beep"
key_third_person = "beeps"
message = "beeps."
message_param = "beeps at %t."
sound = 'sound/machines/twobeep.ogg'
/datum/emote/living/carbon/human/robot_tongue/buzz
key = "buzz"
key_third_person = "buzzes"
message = "buzzes."
message_param = "buzzes at %t."
sound = 'sound/machines/buzz-sigh.ogg'
/datum/emote/sound/human/buzz2
/datum/emote/living/carbon/human/robot_tongue/buzz2
key = "buzz2"
message = "buzzes twice."
sound = 'sound/machines/buzz-two.ogg'
/datum/emote/sound/human/ping
/datum/emote/living/carbon/human/robot_tongue/ping
key = "ping"
key_third_person = "pings"
message = "pings."
message_param = "pings at %t."
sound = 'sound/machines/ping.ogg'
/datum/emote/sound/human/chime
/datum/emote/living/carbon/human/robot_tongue/chime
key = "chime"
key_third_person = "chimes"
message = "chimes."
sound = 'sound/machines/chime.ogg'
/datum/emote/sound/human/squeak
/datum/emote/living/carbon/human/robot_tongue/squeak
key = "squeak"
key_third_person = "squeaks"
message = "lets out a squeak."

View File

@@ -3,91 +3,150 @@
GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species
var/id // if the game needs to manually check your race to do something not included in a proc here, it will use this
var/limbs_id //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans.
var/name // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever
var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race
var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows
/// if the game needs to manually check your race to do something not included in a proc here, it will use this
var/id
///this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans.
var/limbs_id
/// this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever
var/name
/// if alien colors are disabled, this is the color that will be used by that race
var/default_color = "#FFF"
/// whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows
var/sexes = 1
///A list that contains pixel offsets for various clothing features, if your species is a different shape
var/list/offset_features = list(OFFSET_UNIFORM = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), OFFSET_GLASSES = list(0,0), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), OFFSET_S_STORE = list(0,0), OFFSET_FACEMASK = list(0,0), OFFSET_HEAD = list(0,0), OFFSET_FACE = list(0,0), OFFSET_BELT = list(0,0), OFFSET_BACK = list(0,0), OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0))
var/hair_color // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color
var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent.
/// this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color
var/hair_color
/// the alpha used by the hair. 255 is completely solid, 0 is transparent.
var/hair_alpha = 255
var/wing_color
// GS13: Hair gradients from Skyrat
var/grad_style // The gradient style used for the mob's hair.
var/grad_color // The gradient color used to color the gradient.
/// The gradient style used for the mob's hair.
var/grad_style
/// The gradient color used to color the gradient.
var/grad_color
var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans)
var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id.
var/exotic_bloodtype = "" //If your race uses a non standard bloodtype (A+, O-, AB-, etc)
var/meat = /obj/item/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing
/// does it use skintones or not? (spoiler alert this is only used by humans)
var/use_skintones = FALSE
/// If your race wants to bleed something other than bog standard blood, change this to reagent id.
var/exotic_blood = ""
///If your race uses a non standard bloodtype (A+, O-, AB-, etc)
var/exotic_bloodtype = ""
///What the species drops on gibbing
var/meat = /obj/item/reagent_containers/food/snacks/meat/slab/human
var/list/gib_types = list(/obj/effect/gibspawner/human, /obj/effect/gibspawner/human/bodypartless)
///What, if any, leather will be droppe
var/skinned_type
///What kind of foods the species loves
var/liked_food = NONE
///What kind of foods the species dislikes!
var/disliked_food = GROSS
///What kind of foods cause harm to the species
var/toxic_food = TOXIC
var/list/no_equip = list() // slots the race can't equip stuff to
var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids
var/blacklisted = 0 //Flag to exclude from green slime core species.
var/dangerous_existence //A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!"
var/say_mod = "says" // affects the speech message
var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have.
var/list/mutant_bodyparts = list() // Visible CURRENT bodyparts that are unique to a species. DO NOT USE THIS AS A LIST OF ALL POSSIBLE BODYPARTS AS IT WILL FUCK SHIT UP! Changes to this list for non-species specific bodyparts (ie cat ears and tails) should be assigned at organ level if possible. Layer hiding is handled by handle_mutant_bodyparts() below.
var/list/mutant_organs = list() //Internal organs that are unique to this race.
var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster
var/armor = 0 // overall defense for the race... or less defense, if it's negative.
var/brutemod = 1 // multiplier for brute damage
var/burnmod = 1 // multiplier for burn damage
var/coldmod = 1 // multiplier for cold damage
var/heatmod = 1 // multiplier for heat damage
var/stunmod = 1 // multiplier for stun duration
var/punchdamagelow = 0 //lowest possible punch damage
var/punchdamagehigh = 9 //highest possible punch damage
var/punchstunthreshold = 9//damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical
var/siemens_coeff = 1 //base electrocution coefficient
var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded?
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
var/inert_mutation = DWARFISM //special mutation that can be found in the genepool. Dont leave empty or changing species will be a headache
var/list/special_step_sounds //Sounds to override barefeet walkng
var/grab_sound //Special sound for grabbing
/// slots the race can't equip stuff to
var/list/no_equip = list()
// this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids
var/nojumpsuit = 0
///Flag to exclude from green slime core species.
var/blacklisted = 0
///A flag for transformation spells that tells them "hey if you turn a person into one of these without preperation, they'll probably die!"
var/dangerous_existence
/// affects the speech message
var/say_mod = "says"
/// Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have.
var/list/default_features = list()
/// Visible CURRENT bodyparts that are unique to a species. DO NOT USE THIS AS A LIST OF ALL POSSIBLE BODYPARTS AS IT WILL FUCK SHIT UP! Changes to this list for non-species specific bodyparts (ie cat ears and tails) should be assigned at organ level if possible. Layer hiding is handled by handle_mutant_bodyparts() below.
var/list/mutant_bodyparts = list()
///Internal organs that are unique to this race.
var/list/mutant_organs = list()
/// this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster
var/speedmod = 0
/// overall defense for the race... or less defense, if it's negative.
var/armor = 0
/// multiplier for brute damage
var/brutemod = 1
/// multiplier for burn damage
var/burnmod = 1
/// multiplier for cold damage
var/coldmod = 1
/// multiplier for heat damage
var/heatmod = 1
/// multiplier for stun duration
var/stunmod = 1
///lowest possible punch damage
var/punchdamagelow = 0
///highest possible punch damage
var/punchdamagehigh = 9
///damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical
var/punchstunthreshold = 9
///base electrocution coefficient
var/siemens_coeff = 1
///what kind of damage overlays (if any) appear on our species when wounded?
var/damage_overlay_type = "human"
///to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
var/fixed_mut_color = ""
///special mutation that can be found in the genepool. Dont leave empty or changing species will be a headache
var/inert_mutation = DWARFISM
///Sounds to override barefeet walkng
var/list/special_step_sounds
///Special sound for grabbing
var/grab_sound
/// audio of a species' scream //Stolen from yogs lol
var/screamsound
// species-only traits. Can be found in DNA.dm
/// species-only traits. Can be found in DNA.dm
var/list/species_traits = list()
// generic traits tied to having the species
/// generic traits tied to having the species
var/list/inherent_traits = list()
///biotypes, used for viruses and the like
var/list/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
var/attack_verb = "punch" // punch-specific attack verb
/// punch-specific attack verb
var/attack_verb = "punch"
///the melee attack sound
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
///the swing and miss sound
var/sound/miss_sound = 'sound/weapons/punchmiss.ogg'
var/mob/living/list/ignored_by = list() // list of mobs that will ignore this species
/// list of mobs that will ignore this species
var/mob/living/list/ignored_by = list()
//Breathing!
var/obj/item/organ/lungs/mutantlungs = null
///what type of gas is breathed
var/breathid = "o2"
///Replaces default brain with a different organ
var/obj/item/organ/brain/mutant_brain = /obj/item/organ/brain
///Replaces default heart with a different organ
var/obj/item/organ/heart/mutant_heart = /obj/item/organ/heart
///Replaces default lungs with a different organ
var/obj/item/organ/lungs/mutantlungs = null
///Replaces default eyes with a different organ
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
///Replaces default ears with a different organ
var/obj/item/organ/ears/mutantears = /obj/item/organ/ears
var/obj/item/mutanthands
///Replaces default tongue with a different organ
var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue
var/obj/item/organ/tail/mutanttail = null
///Replaces default liver with a different organ
var/obj/item/organ/liver/mutantliver
///Replaces default stomach with a different organ
var/obj/item/organ/stomach/mutantstomach
///Forces a species tail
var/obj/item/organ/tail/mutanttail = null
///Forces an item into this species' hands. Only an honorary mutantthing because this is not an organ and not loaded in the same way, you've been warned to do your research.
var/obj/item/mutanthands
var/override_float = FALSE
//Citadel snowflake
var/fixed_mut_color2 = ""
var/fixed_mut_color3 = ""
var/whitelisted = 0 //Is this species restricted to certain players?
var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
///Is this species restricted to certain players?
var/whitelisted = 0
///List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666") Spaces & capitalization can be included or ignored entirely for each key as it checks for both.
var/whitelist = list()
var/icon_limbs //Overrides the icon used for the limbs of this species. Mainly for downstream, and also because hardcoded icons disgust me. Implemented and maintained as a favor in return for a downstream's implementation of synths.
///Overrides the icon used for the limbs of this species. Mainly for downstream, and also because hardcoded icons disgust me. Implemented and maintained as a favor in return for a downstream's implementation of synths.
var/icon_limbs
/// Our default override for typing indicator state
var/typing_indicator_state
@@ -2451,3 +2510,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/start_wagging_tail(mob/living/carbon/human/H)
/datum/species/proc/stop_wagging_tail(mob/living/carbon/human/H)
//Gainstation add: Screamcode I stole from yogs
/datum/species/proc/get_scream_sound(mob/living/carbon/human/H)
if(islist(screamsound))
return pick(screamsound)
return screamsound
//Gainstation add End

View File

@@ -13,6 +13,8 @@
liked_food = MEAT | RAW | DAIRY
disliked_food = FRIED | FRUIT
screamsound = list('sound/voice/catpeople/scream1.ogg', 'sound/voice/catpeople/scream2.ogg', 'sound/voice/catpeople/scream3.ogg')
/datum/species/human/felinid/qualifies_for_rank(rank, list/features)
return TRUE

View File

@@ -12,6 +12,8 @@
liked_food = GROSS
exotic_bloodtype = "BUG"
screamsound = 'modular_citadel/sound/voice/scream_moth.ogg'
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.type == /datum/reagent/toxin/pestkiller)
H.adjustToxLoss(3)

View File

@@ -10,6 +10,18 @@
disliked_food = GROSS | RAW
liked_food = JUNKFOOD | FRIED
var/list/female_screams = list('sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg')
var/list/male_screams = list('sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg')
/datum/species/human/get_scream_sound(mob/living/carbon/human/H)
if(H.gender == FEMALE)
return pick(female_screams)
else
if(prob(1))
return sound = pick('modular_citadel/sound/voice/scream_m1.ogg', 'modular_citadel/sound/voice/scream_m2.ogg', \
'sound/voice/human/wilhelm_scream.ogg')
return pick(male_screams)
/datum/species/human/qualifies_for_rank(rank, list/features)
return TRUE //Pure humans are always allowed in all roles.

View File

@@ -23,6 +23,8 @@
liked_food = GROSS | MEAT
inert_mutation = FIREBREATH
screamsound = 'modular_citadel/sound/voice/scream_lizard.ogg'
/datum/species/lizard/after_equip_job(datum/job/J, mob/living/carbon/human/H)
H.grant_language(/datum/language/draconic)

View File

@@ -15,6 +15,8 @@
disliked_food = FRUIT | GROSS
toxic_food = MEAT | RAW
exotic_bloodtype = "BUG"
screamsound = 'sound/voice/moth/scream_moth.ogg'
/datum/species/moth/on_species_gain(mob/living/carbon/C)
. = ..()

View File

@@ -13,6 +13,8 @@
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
disliked_food = NONE
liked_food = GROSS | MEAT | RAW | DAIRY
screamsound = 'modular_citadel/sound/voice/scream_skeleton.ogg'
/datum/species/skeleton/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])

View File

@@ -16,6 +16,8 @@
var/list/initial_inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOTHIRST,TRAIT_NOLIMBDISABLE,TRAIT_NOBREATH)
var/disguise_fail_health = 75 //When their health gets to this level their synthflesh partially falls off
var/datum/species/fake_species = null //a species to do most of our work for us, unless we're damaged
screamsound = list('goon/sound/robot_scream.ogg', 'modular_citadel/sound/voice/scream_silicon.ogg')
/datum/species/synth/military
name = "Military Synth"

View File

@@ -277,6 +277,12 @@
message = "screams."
message_mime = "acts out a scream!"
emote_type = EMOTE_AUDIBLE
mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized scream.
/datum/emote/living/scream/select_message_type(mob/user, intentional)
. = ..()
if(!intentional && isanimal(user))
return "makes a loud and pained whimper."
/datum/emote/living/scowl
key = "scowl"
@@ -525,13 +531,13 @@
to_chat(user, message)
/datum/emote/sound/beep
/datum/emote/beep
key = "beep"
key_third_person = "beeps"
message = "beeps."
message_param = "beeps at %t."
sound = 'sound/machines/twobeep.ogg'
mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon, /mob/living/carbon/human)
mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon)
/datum/emote/living/circle
key = "circle"
@@ -561,91 +567,3 @@
to_chat(user, "<span class='notice'>You ready your slapping hand.</span>")
else
to_chat(user, "<span class='warning'>You're incapable of slapping in your current state.</span>")
//Carl wuz here
//FUCK YOU CARL SUCK MY BALLS YOU WHORE
/datum/emote/living/tesh_sneeze
key = "tesh_sneeze"
key_third_person = "sneezes"
message = "sneezes."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/tesh_sneeze/can_run_emote(mob/living/user, status_check = TRUE)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
return !C.silent
/datum/emote/living/tesh_sneeze/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
if(!C.mind || C.mind.miming)//no cute sneezing for you.
return
if(ishumanbasic(C))
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
if(is_species(user, /datum/species/avian))//This is required(related to subtypes), otherwise it doesn't play the noises. Sometimes. Always sometimes. Just how it be.
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
if(is_species(user, /datum/species/mammal))//Just because the avian subspecies doesn't have proper sprites. Some people can't use it.
playsound(C, pick('hyperstation/sound/voice/emotes/tesh_sneeze1.ogg', 'hyperstation/sound/voice/emotes/tesh_sneeze1b.ogg'), 50, 1)
/datum/emote/living/racc
key = "racc_chitter"
key_third_person = "chitters"
message = "chitters."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/racc/can_run_emote(mob/living/user, status_check = TRUE)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
return !C.silent
/datum/emote/living/racc/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
if(!C.mind || C.mind.miming)
return
if(ishumanbasic(C))
playsound(C, pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_5.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_6.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg'), 50, 1)
if(is_species(user, /datum/species/mammal))
playsound(C, pick('hyperstation/sound/voice/emotes/racc_chitter_1.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_2.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_3.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_4.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_5.ogg',\
'hyperstation/sound/voice/emotes/racc_chitter_6.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_7.ogg', 'hyperstation/sound/voice/emotes/racc_chitter_8.ogg'), 50, 1)
/datum/emote/living/bat
key = "bat_chitter"
key_third_person = "chitters"
message = "chitters."
emote_type = EMOTE_AUDIBLE
/datum/emote/living/bat/can_run_emote(mob/living/user, status_check = TRUE)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
return !C.silent
/datum/emote/living/bat/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user))
var/mob/living/carbon/C = user
if(!C.mind || C.mind.miming)
return
if(ishumanbasic(C))
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
if(is_species(user, /datum/species/mammal))
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)
if(is_species(user, /datum/species/avian))//this and mammal should be considered the same AAAAAAAAAAAA
playsound(C, pick('hyperstation/sound/voice/emotes/bat_c1.ogg', 'hyperstation/sound/voice/emotes/bat_c2.ogg', 'hyperstation/sound/voice/emotes/bat_c3.ogg',\
'hyperstation/sound/voice/emotes/bat_c4.ogg', 'hyperstation/sound/voice/emotes/bat_c5.ogg',\
'hyperstation/sound/voice/emotes/bat_c6.ogg', 'hyperstation/sound/voice/emotes/bat_c7.ogg', 'hyperstation/sound/voice/emotes/bat_c8.ogg',\
'hyperstation/sound/voice/emotes/bat_c9.ogg'), 50, 1)

View File

@@ -2,59 +2,55 @@
mob_type_allowed_typecache = list(/mob/living/silicon)
emote_type = EMOTE_AUDIBLE
/datum/emote/sound/silicon
mob_type_allowed_typecache = list(/mob/living/silicon)
emote_type = EMOTE_AUDIBLE
/datum/emote/silicon/boop
key = "boop"
key_third_person = "boops"
message = "boops."
/datum/emote/sound/silicon/buzz
/datum/emote/silicon/buzz
key = "buzz"
key_third_person = "buzzes"
message = "buzzes."
message_param = "buzzes at %t."
sound = 'sound/machines/buzz-sigh.ogg'
/datum/emote/sound/silicon/buzz2
/datum/emote/silicon/buzz2
key = "buzz2"
message = "buzzes twice."
sound = 'sound/machines/buzz-two.ogg'
/datum/emote/sound/silicon/chime
/datum/emote/silicon/chime
key = "chime"
key_third_person = "chimes"
message = "chimes."
sound = 'sound/machines/chime.ogg'
/datum/emote/sound/silicon/honk
/datum/emote/silicon/honk
key = "honk"
key_third_person = "honks"
message = "honks."
vary = TRUE
sound = 'sound/items/bikehorn.ogg'
/datum/emote/sound/silicon/ping
/datum/emote/silicon/ping
key = "ping"
key_third_person = "pings"
message = "pings."
message_param = "pings at %t."
sound = 'sound/machines/ping.ogg'
/datum/emote/sound/silicon/chime
/datum/emote/silicon/chime
key = "chime"
key_third_person = "chimes"
message = "chimes."
sound = 'sound/machines/chime.ogg'
/datum/emote/sound/silicon/sad
/datum/emote/silicon/sad
key = "sad"
message = "plays a sad trombone..."
sound = 'sound/misc/sadtrombone.ogg'
/datum/emote/sound/silicon/warn
/datum/emote/silicon/warn
key = "warn"
message = "blares an alarm!"
sound = 'sound/machines/warning-buzzer.ogg'

View File

@@ -1,8 +1,8 @@
/datum/emote/sound/gorilla
/datum/emote/gorilla
mob_type_allowed_typecache = /mob/living/simple_animal/hostile/gorilla
mob_type_blacklist_typecache = list()
/datum/emote/sound/gorilla/ooga
/datum/emote/gorilla/ooga
key = "ooga"
key_third_person = "oogas"
message = "oogas."

View File

@@ -222,6 +222,7 @@
glass_desc = "White and nutritious goodness!"
pH = 6.5
hydration = 3
nutriment_factor = 15 * REAGENTS_METABOLISM
/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M)
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))

View File

@@ -12,7 +12,7 @@
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
"space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass","chem_pack","medkit_cabinet",
"disposable_hypospray","plastic_knife","plastic_fork","plastic_spoon","large_beaker")
"disposable_hypospray","plastic_knife","plastic_fork","plastic_spoon","large_beaker", "adipoelectric_generator")
/datum/techweb_node/mmi
id = "mmi"

View File

@@ -1,9 +1,27 @@
/**
* Get the organ object from the mob matching the passed in typepath
*
* Arguments:
* * typepath The typepath of the organ to get
*/
/mob/proc/getorgan(typepath)
return
/**
* Get organ objects by zone
*
* This will return a list of all the organs that are relevant to the zone that is passedin
*
* Arguments:
* * zone [a BODY_ZONE_X define](https://github.com/tgstation/tgstation/blob/master/code/__DEFINES/combat.dm#L187-L200)
*/
/mob/proc/getorganszone(zone)
return
/**
* Get an organ relating to a specific slot
*
* Arguments:
* * slot Slot to get the organ from
*/
/mob/proc/getorganslot(slot)
return

BIN
goon/sound/robot_scream.ogg Normal file

Binary file not shown.

View File

@@ -205,34 +205,36 @@ GLOBAL_LIST_INIT(hyper_special_roles, list(
/datum/objective/noncon/find_target()
//..()
//to_chat(world, "<span class='boldannounce'>TEST: noncon/find_target() called</span>")
var/list/datum/mind/targets = list()
var/list/datum/mind/owners = get_owners()
for(var/datum/mind/candidate in SSticker.minds)
if (!(candidate in owners) && ishuman(candidate.current) && (candidate.current.client))
if(candidate.current.client?.prefs?.noncon == 1)
targets += candidate
if(targets.len > 0)
target = pick(targets)
else
target = null
update_explanation_text()
return target
//GS13 - this shit's just fucking weird lol, gtfo
// /datum/objective/noncon/find_target()
// //..()
// //to_chat(world, "<span class='boldannounce'>TEST: noncon/find_target() called</span>")
// var/list/datum/mind/targets = list()
// var/list/datum/mind/owners = get_owners()
// for(var/datum/mind/candidate in SSticker.minds)
// if (!(candidate in owners) && ishuman(candidate.current) && (candidate.current.client))
// if(candidate.current.client?.prefs?.noncon == 1)
// targets += candidate
// if(targets.len > 0)
// target = pick(targets)
// else
// target = null
// update_explanation_text()
// return target
/datum/objective/noncon/check_completion()
if(!target)
return TRUE
else
return target.sexed
// /datum/objective/noncon/check_completion()
// if(!target)
// return TRUE
// else
// return target.sexed
/datum/objective/noncon/update_explanation_text()
if(target)
explanation_text = "Locate [target.name], and sate your lust."
else
explanation_text = "Free Lewd Objective"
// /datum/objective/noncon/update_explanation_text()
// if(target)
// explanation_text = "Locate [target.name], and sate your lust."
// else
// explanation_text = "Free Lewd Objective"
/datum/antagonist/traitor/lewd/roundend_report()
var/list/result = list()

View File

@@ -34,9 +34,19 @@
if(user.pulling)
dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>"
dat += "(Kiss a partner, or object.)<BR>"
dat += "<a href='byond://?src=[REF(src)];feed=1'>Feed [user.pulling]</A>"
dat += "(Feed a partner.)<BR>"
dat += "<a href='byond://?src=[REF(src)];feedfrom=1'>Feed from [user.pulling]</A>"
dat += "(Feed a partner.)<BR>"
else
dat += "<span class='linkOff'>Kiss</span></A>"
dat += "(Requires a partner)<BR>"
dat += "<span class='linkOff'>Feed others</span></A>"
dat += "(Requires a partner)<BR>"
dat += "<span class='linkOff'>Feed from others</span></A>"
dat += "(Requires a partner)<BR>"
dat += "<a href='byond://?src=[REF(src)];feedyourself=1'>Feed yourself</A>"
dat += "(Feed yourself with your own genitals)<BR>"
var/obj/item/organ/genital/belly/Belly = user.getorganslot("belly")
if(Belly)
@@ -202,6 +212,24 @@
to_chat(usr, "<span class='warning'>You cannot do this alone!</span>")
return
if(href_list["feed"])
if(usr.pulling)
feed()
else
to_chat(usr, "<span class='warning'>You cannot do this alone!</span>")
return
if(href_list["feedfrom"])
if(usr.pulling)
feedfrom()
else
to_chat(usr, "<span class='warning'>You cannot do this alone!</span>")
return
if(href_list["feedyourself"])
feedyourself()
return
if(href_list["shrink_belly"])
var/obj/item/organ/genital/belly/E = usr.getorganslot("belly")
if(E.size > 0)
@@ -282,6 +310,30 @@ obj/screen/arousal/proc/kiss()
if (H)
H.kisstarget(H.pulling)
obj/screen/arousal/proc/feed()
if(usr.restrained(TRUE))
to_chat(usr, "<span class='warning'>You can't do that while restrained!</span>")
return
var/mob/living/carbon/human/H = usr
if (H)
H.genitalfeed(H.pulling)
obj/screen/arousal/proc/feedfrom()
if(usr.restrained(TRUE))
to_chat(usr, "<span class='warning'>You can't do that while restrained!</span>")
return
var/mob/living/carbon/human/H = usr
if (H)
H.genitalfeedfrom(H.pulling)
obj/screen/arousal/proc/feedyourself()
if(usr.restrained(TRUE))
to_chat(usr, "<span class='warning'>You can't do that while restrained!</span>")
return
var/mob/living/carbon/human/H = usr
if (H)
H.genitalfeedyourself()
/mob/living/carbon/human/proc/menuremovecondom()
@@ -517,3 +569,136 @@ obj/screen/arousal/proc/kiss()
if(cum_splatter_icon)
cut_overlay(cum_splatter_icon)
return TRUE
/mob/living/carbon/human/proc/genitalfeed(mob/living/L, mb_time = 30)
if(isliving(L)) //is your target living? Living people can resist your advances if they want to via moving.
if(iscarbon(L))
var/obj/item/organ/genital/picked_organ
var/total_fluids = 0
var/datum/reagents/fluid_source = null
src << browse(null, "window=arousal")
picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids.
if(picked_organ)
//Good, got an organ, time to pick a container
if(picked_organ.name == "penis")//if the select organ is a penis
var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
if(P.condom) //if the penis is condomed
to_chat(src, "<span class='warning'>You cannot feed someone when there is a condom over your [picked_organ.name].</span>")
return
if(P.sounding) //if the penis is sounded
to_chat(src, "<span class='warning'>You cannot feed someone when there is a rod inside your [picked_organ.name].</span>")
return
if(picked_organ.producing) //Can it produce its own fluids, such as breasts?
fluid_source = picked_organ.reagents
else
if(!picked_organ.linked_organ)
to_chat(src, "<span class='warning'>Your [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.</span>")
return
fluid_source = picked_organ.linked_organ.reagents
total_fluids = fluid_source.total_volume
src.visible_message("<span class='love'>[src] starts to feed [L.name] with their [picked_organ.name].</span>", \
"<span class='userlove'>You feed [L.name] with your [picked_organ.name].</span>")
if(do_after(src, mb_time, target = src) && in_range(src, L))
fluid_source.trans_to(L, total_fluids)
src.visible_message("<span class='love'>[src] uses [p_their()] [picked_organ.name] to feed [L.name]!</span>", \
"<span class='userlove'>You used your [picked_organ.name] to feed [L.name] a total of [total_fluids]u's.</span>")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(picked_organ.can_climax)
setArousalLoss(min_arousal)
else //They either lack organs that can climax, or they didn't pick one.
to_chat(src, "<span class='warning'>You cannot fill anything without choosing exposed genitals.</span>")
return
/mob/living/carbon/human/proc/genitalfeedfrom(mob/living/target, mb_time = 30)
var/mob/living/carbon/human/L = target
var/obj/item/organ/genital/picked_organ
var/total_fluids = 0
var/datum/reagents/fluid_source = null
src << browse(null, "window=arousal")
var/list/genitals_list = list()
var/list/worn_stuff = L.get_equipped_items()
for(var/obj/item/organ/genital/G in L.internal_organs)
if(G.can_climax) //filter out what you can't masturbate with
if(G.is_exposed(worn_stuff)) //Nude or through_clothing
if(!G.dontlist)
genitals_list += G
if(genitals_list.len)
picked_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list
else
return
if(picked_organ)
//Good, got an organ, time to pick a container
if(picked_organ.name == "penis")//if the select organ is a penis
var/obj/item/organ/genital/penis/P = L.getorganslot("penis")
if(P.condom) //if the penis is condomed
to_chat(src, "<span class='warning'>You cannot feed from [picked_organ.name] when there is a condom over it.</span>")
return
if(P.sounding) //if the penis is sounded
to_chat(src, "<span class='warning'>You cannot feed from [picked_organ.name] when there is a rod inside it.</span>")
return
if(picked_organ.producing) //Can it produce its own fluids, such as breasts?
fluid_source = picked_organ.reagents
else
if(!picked_organ.linked_organ)
to_chat(src, "<span class='warning'>The [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.</span>")
return
fluid_source = picked_organ.linked_organ.reagents
total_fluids = fluid_source.total_volume
src.visible_message("<span class='love'>[src] starts to feed from [L.name]'s [picked_organ.name].</span>", \
"<span class='userlove'>You feed from [L.name]'s '[picked_organ.name].</span>")
if(do_after(src, mb_time, target = src) && in_range(src, L))
fluid_source.trans_to(src, total_fluids)
src.visible_message("<span class='love'>[src] feeds from [L.name]'s [picked_organ.name]!</span>", \
"<span class='userlove'>You used [L.name]'s [picked_organ.name] to feed with a total of [total_fluids]u's.</span>")
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(picked_organ.can_climax)
L.setArousalLoss(min_arousal)
else //They either lack organs that can climax, or they didn't pick one.
to_chat(src, "<span class='warning'>You cannot fill anything without choosing exposed genitals.</span>")
return
/mob/living/carbon/human/proc/genitalfeedyourself(mb_time = 30)
var/obj/item/organ/genital/picked_organ
var/total_fluids = 0
var/datum/reagents/fluid_source = null
src << browse(null, "window=arousal")
picked_organ = pick_climax_genitals() //Gotta be climaxable, not just masturbation, to fill with fluids.
if(picked_organ)
//Good, got an organ, time to pick a container
if(picked_organ.name == "penis")//if the select organ is a penis
var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
if(P.condom) //if the penis is condomed
to_chat(src, "<span class='warning'>You cannot feed yourself when there is a condom over your [picked_organ.name].</span>")
return
if(P.sounding) //if the penis is sounded
to_chat(src, "<span class='warning'>You cannot feed yourself when there is a rod inside your [picked_organ.name].</span>")
return
if(picked_organ.producing) //Can it produce its own fluids, such as breasts?
fluid_source = picked_organ.reagents
else
if(!picked_organ.linked_organ)
to_chat(src, "<span class='warning'>Your [picked_organ.name] is unable to produce it's own fluids, it's missing the organs for it.</span>")
return
fluid_source = picked_organ.linked_organ.reagents
total_fluids = fluid_source.total_volume
src.visible_message("<span class='love'>[src] starts to feed themselves with their [picked_organ.name].</span>", \
"<span class='userlove'>You feed yourself with your [picked_organ.name].</span>")
if(do_after(src, mb_time))
fluid_source.trans_to(src, total_fluids)
src.visible_message("<span class='love'>[src] uses [p_their()] [picked_organ.name] to feed themselves!</span>", \
"<span class='userlove'>You used your [picked_organ.name] to feed yourself a total of [total_fluids]u's.</span>")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(picked_organ.can_climax)
setArousalLoss(min_arousal)
else //They either lack organs that can climax, or they didn't pick one.
to_chat(src, "<span class='warning'>You cannot fill anything without choosing exposed genitals.</span>")
return

View File

@@ -83,6 +83,7 @@
icon = 'hyperstation/icons/obj/clothing/sizeaccessories.dmi'
icon_state = "pendant"
item_state = "pendant"
w_class = WEIGHT_CLASS_SMALL //Gainstation Edit: Small, not normal sized.
//For neck items
/obj/item/clothing/neck/syntech/equipped(mob/living/user, slot)

View File

@@ -182,7 +182,7 @@ datum/gear/lyricalpawsring
name = "GATO Badge - Correspondent"
category = SLOT_IN_BACKPACK
path = /obj/item/clothing/accessory/medal/gato_badge/middleman
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny")
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny", "not number")
/datum/gear/halsey_overcoat
name = "Halsey's Commander Overcoat"
category = SLOT_IN_BACKPACK
@@ -259,16 +259,16 @@ datum/gear/lyricalpawsring
name = "Weight Gain Spellbook"
category = SLOT_IN_BACKPACK
path = /obj/item/book/granter/spell/fattening
ckeywhitelist = list("sonoida", "themrsky")
ckeywhitelist = list("sonoida", "themrsky", "not number")
/datum/gear/wgspell_transfer
name = "Weight Transfer Spellbook"
category = SLOT_IN_BACKPACK
path = /obj/item/book/granter/spell/fattening/transfer
ckeywhitelist = list("sonoida", "themrsky")
ckeywhitelist = list("sonoida", "themrsky", "not number")
/datum/gear/wgspell_take
name = "Weight Steal Spellbook"
category = SLOT_IN_BACKPACK
path = /obj/item/book/granter/spell/fattening/steal
ckeywhitelist = list("sonoida", "themrsky")
ckeywhitelist = list("sonoida", "themrsky", "not number")

View File

@@ -44,6 +44,7 @@
sound = 'modular_citadel/sound/voice/scream_monkey.ogg'
if(istype(user, /mob/living/simple_animal/hostile/gorilla))
sound = 'sound/creatures/gorilla.ogg'
/* //Gainstation Remove: Human species scream overhaul oops
if(ishuman(user))
user.adjustOxyLoss(5)
sound = pick('modular_citadel/sound/voice/scream_m1.ogg', 'modular_citadel/sound/voice/scream_m2.ogg')
@@ -57,6 +58,7 @@
sound = 'modular_citadel/sound/voice/scream_skeleton.ogg'
if (is_species(user, /datum/species/fly) || is_species(user, /datum/species/insect))
sound = 'modular_citadel/sound/voice/scream_moth.ogg'
*/
if(isalien(user))
sound = 'sound/voice/hiss6.ogg'
LAZYINITLIST(user.alternate_screams)
@@ -70,7 +72,7 @@
message = "makes a very loud noise."
. = ..()
/datum/emote/sound/carbon/snap
/datum/emote/carbon/snap
key = "snap"
key_third_person = "snaps"
muzzle_ignore = TRUE

View File

@@ -13,6 +13,18 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
liked_food = MEAT | FRIED
disliked_food = TOXIC
//Same as humans
var/list/female_screams = list('sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg')
var/list/male_screams = list('sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg')
/datum/species/human/get_scream_sound(mob/living/carbon/human/H)
if(H.gender == FEMALE)
return pick(female_screams)
else
if(prob(1))
return sound = pick('modular_citadel/sound/voice/scream_m1.ogg', 'modular_citadel/sound/voice/scream_m2.ogg', \
'sound/voice/human/wilhelm_scream.ogg')
return pick(male_screams)
//Curiosity killed the cat's wagging tail.
/datum/species/mammal/spec_death(gibbed, mob/living/carbon/human/H)

View File

@@ -19,6 +19,8 @@
mutantstomach = /obj/item/organ/stomach/ipc
mutanteyes = /obj/item/organ/eyes/ipc
screamsound = list('goon/sound/robot_scream.ogg', 'modular_citadel/sound/voice/scream_silicon.ogg')
exotic_bloodtype = "HF"
var/datum/action/innate/monitor_change/screen

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sound/voice/teppi/roar.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3085,6 +3085,8 @@
#include "GainStation13\code\game\objects\effects\spawners\choco_slime_delivery.dm"
#include "GainStation13\code\game\turfs\closed.dm"
#include "GainStation13\code\game\turfs\open.dm"
#include "GainStation13\code\machinery\adipoelectric_generator.dm"
#include "GainStation13\code\machinery\adipoelectric_transformer.dm"
#include "GainStation13\code\machinery\fattening_turret.dm"
#include "GainStation13\code\machinery\feeding_tube.dm"
#include "GainStation13\code\mechanics\fatness.dm"
@@ -3107,6 +3109,8 @@
#include "GainStation13\code\modules\mob\living\emote.dm"
#include "GainStation13\code\modules\mob\living\vore\eating\living_vr.dm"
#include "GainStation13\code\modules\mob\living\vore\eating\trasheat_lists.dm"
#include "GainStation13\code\modules\mob\living\emote_modular.dm"
#include "GainStation13\code\modules\mob\living\emote_ported.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\consumable_reagents.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\dwarverndrinks.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\fatty_drinks.dm"