mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-15 01:46:41 +01:00
Merge remote-tracking branch 'upstream/master' into Jods-Gudgement
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,221 @@
|
||||
// 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/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/tesharisneeze.ogg', 'GainStation13/sound/voice/teshari/tesharisneezeb.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/tesharicougha.ogg', 'GainStation13/sound/voice/teshari/tesharicoughb.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_multiplier >= 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'
|
||||
bigsound = list('GainStation13/sound/voice/teppi/rumble.ogg')
|
||||
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.
|
||||
@@ -0,0 +1,592 @@
|
||||
///////////////////// Mob Living /////////////////////
|
||||
/mob/living
|
||||
var/digestable = FALSE // Can the mob be digested inside a belly?
|
||||
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/no_vore = FALSE // If the character/mob can vore.
|
||||
var/openpanel = 0 // Is the vore panel open?
|
||||
var/absorbed = FALSE //are we absorbed?
|
||||
var/next_preyloop
|
||||
var/adminbus_trash = FALSE // For abusing trash eater for event shenanigans.
|
||||
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
|
||||
//
|
||||
/hook/living_new/proc/vore_setup(mob/living/M)
|
||||
M.verbs += /mob/living/proc/preyloop_refresh
|
||||
M.verbs += /mob/living/proc/lick
|
||||
M.verbs += /mob/living/proc/escapeOOC
|
||||
|
||||
if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
|
||||
return 1
|
||||
M.verbs += /mob/living/proc/insidePanel
|
||||
|
||||
//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.
|
||||
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
|
||||
|
||||
//We'll load our client's organs if we have one
|
||||
if(client && client.prefs_vr)
|
||||
if(!copy_from_prefs_vr())
|
||||
to_chat(src,"<span class='warning'>ERROR: You seem to have saved vore prefs, but they couldn't be loaded.</span>")
|
||||
return FALSE
|
||||
if(LAZYLEN(vore_organs))
|
||||
vore_selected = vore_organs[1]
|
||||
return TRUE
|
||||
|
||||
//Or, we can create a basic one for them
|
||||
if(!LAZYLEN(vore_organs))
|
||||
LAZYINITLIST(vore_organs)
|
||||
var/obj/belly/B = new /obj/belly(src)
|
||||
vore_selected = B
|
||||
B.immutable = 1
|
||||
B.name = "Stomach"
|
||||
B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside [name]."
|
||||
B.can_taste = 1
|
||||
return TRUE
|
||||
|
||||
// Handle being clicked, perhaps with something to devour
|
||||
//
|
||||
|
||||
// Refactored to use centralized vore code system - Leshana
|
||||
|
||||
// Critical adjustments due to TG grab changes - Poojawa
|
||||
|
||||
/mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
|
||||
if(!user || !prey || !pred)
|
||||
return
|
||||
|
||||
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, pred)
|
||||
|
||||
if(pred == user) //you click yourself
|
||||
if(!is_vore_predator(src))
|
||||
to_chat(user, "<span class='notice'>You aren't voracious enough.</span>")
|
||||
return
|
||||
feed_grabbed_to_self(user, prey)
|
||||
|
||||
else // click someone other than you/prey
|
||||
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, pred)
|
||||
//
|
||||
// Eating procs depending on who clicked what
|
||||
//
|
||||
/mob/living/proc/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey)
|
||||
var/belly = user.vore_selected
|
||||
return perform_the_nom(user, prey, user, belly)
|
||||
|
||||
/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred)
|
||||
var/belly = input("Choose Belly") in pred.vore_organs
|
||||
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)
|
||||
var/belly = input("Choose Belly") in pred.vore_organs
|
||||
return perform_the_nom(user, prey, pred, belly)
|
||||
|
||||
//
|
||||
// Master vore proc that actually does vore procedures
|
||||
//
|
||||
|
||||
/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay)
|
||||
//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 (!prey.devourable)
|
||||
to_chat(user, "This can't be eaten!")
|
||||
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'>[] is attemping 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))
|
||||
else //Feeding someone to another person
|
||||
attempt_msg = text("<span class='warning'>[] is attempting to make [] [] [] into their []!</span>",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
|
||||
success_msg = text("<span class='warning'>[] manages to make [] [] [] into their []!</span>",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
|
||||
|
||||
if(!prey.Adjacent(user)) // let's not even bother attempting it yet if they aren't next to us.
|
||||
return FALSE
|
||||
|
||||
// Announce that we start the attempt!
|
||||
user.visible_message(attempt_msg)
|
||||
|
||||
// Now give the prey time to escape... return if they did
|
||||
var/swallow_time = delay || ishuman(prey) ? belly.human_prey_swallow_time : belly.nonhuman_prey_swallow_time
|
||||
|
||||
if(!do_mob(src, user, swallow_time))
|
||||
return FALSE // Prey escaped (or user disabled) before timer expired.
|
||||
|
||||
if(!prey.Adjacent(user)) //double check'd just in case they moved during the timer and the do_mob didn't fail for whatever reason
|
||||
return FALSE
|
||||
|
||||
// If we got this far, nom successful! Announce it!
|
||||
user.visible_message(success_msg)
|
||||
|
||||
// Actually shove prey into the belly.
|
||||
belly.nom_mob(prey, user)
|
||||
stop_pulling()
|
||||
|
||||
// Flavor handling
|
||||
if(belly.can_taste && prey.get_taste_message(FALSE))
|
||||
to_chat(belly.owner, "<span class='notice'>[prey] tastes of [prey.get_taste_message(FALSE)].</span>")
|
||||
|
||||
// Inform Admins
|
||||
var/prey_braindead
|
||||
var/prey_stat
|
||||
if(prey.ckey)
|
||||
prey_stat = prey.stat//only return this if they're not an unmonkey or whatever
|
||||
if(!prey.client)//if they disconnected, tell us
|
||||
prey_braindead = 1
|
||||
if (pred == user)
|
||||
message_admins("[ADMIN_LOOKUPFLW(pred)] ate [ADMIN_LOOKUPFLW(prey)][!prey_braindead ? "" : " (BRAINDEAD)"][prey_stat ? " (DEAD/UNCONSCIOUS)" : ""].")
|
||||
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)
|
||||
else
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] forced [ADMIN_LOOKUPFLW(pred)] to eat [ADMIN_LOOKUPFLW(prey)].")
|
||||
user.log_message("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)].", LOG_ATTACK)
|
||||
pred.log_message("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)].", LOG_ATTACK)
|
||||
prey.log_message("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)].", LOG_ATTACK)
|
||||
return TRUE
|
||||
|
||||
//
|
||||
//End vore code.
|
||||
|
||||
|
||||
//
|
||||
// Our custom resist catches for /mob/living
|
||||
//
|
||||
/mob/living/proc/vore_process_resist()
|
||||
|
||||
//Are we resisting from inside a belly?
|
||||
if(isbelly(loc))
|
||||
var/obj/belly/B = loc
|
||||
B.relay_resist(src)
|
||||
return TRUE //resist() on living does this TRUE thing.
|
||||
|
||||
//Other overridden resists go here
|
||||
|
||||
return 0
|
||||
|
||||
// internal slimy button in case the loop stops playing but the player wants to hear it
|
||||
/mob/living/proc/preyloop_refresh()
|
||||
set name = "Internal loop refresh"
|
||||
set category = "Vore"
|
||||
if(isbelly(loc))
|
||||
src.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case
|
||||
var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
|
||||
SEND_SOUND(src, preyloop)
|
||||
else
|
||||
to_chat(src, "<span class='alert'>You aren't inside anything, you clod.</span>")
|
||||
|
||||
// OOC Escape code for pref-breaking or AFK preds
|
||||
//
|
||||
/mob/living/proc/escapeOOC()
|
||||
set name = "OOC Escape"
|
||||
set category = "Vore"
|
||||
|
||||
//You're in a belly!
|
||||
if(isbelly(loc))
|
||||
var/obj/belly/B = loc
|
||||
var/confirm = alert(src, "You're in a mob. If you're otherwise unable to escape from a pred AFK for a long time, use this.", "Confirmation", "Okay", "Cancel")
|
||||
if(!confirm == "Okay" || loc != B)
|
||||
return
|
||||
//Actual escaping
|
||||
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
|
||||
|
||||
if(isanimal(B.owner))
|
||||
var/mob/living/simple_animal/SA = B.owner
|
||||
SA.update_icons()
|
||||
|
||||
//You're in a dogborg!
|
||||
else if(istype(loc, /obj/item/dogborg/sleeper))
|
||||
var/obj/item/dogborg/sleeper/belly = loc //The belly!
|
||||
|
||||
var/confirm = alert(src, "You're in a dogborg sleeper. This is for escaping from preference-breaking or if your predator disconnects/AFKs. You can also resist out naturally too.", "Confirmation", "Okay", "Cancel")
|
||||
if(!confirm == "Okay" || loc != belly)
|
||||
return
|
||||
//Actual escaping
|
||||
belly.go_out(src) //Just force-ejects from the borg as if they'd clicked the eject button.
|
||||
else
|
||||
to_chat(src,"<span class='alert'>You aren't inside anyone, though, is the thing.</span>")
|
||||
|
||||
//
|
||||
// Verb for saving vore preferences to save file
|
||||
//
|
||||
/mob/living/proc/save_vore_prefs()
|
||||
if(!client || !client.prefs_vr)
|
||||
return 0
|
||||
if(!copy_to_prefs_vr())
|
||||
return 0
|
||||
if(!client.prefs_vr.save_vore())
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/proc/apply_vore_prefs()
|
||||
if(!client || !client.prefs_vr)
|
||||
return 0
|
||||
if(!client.prefs_vr.load_vore())
|
||||
return 0
|
||||
if(!copy_from_prefs_vr())
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/proc/copy_to_prefs_vr()
|
||||
if(!client || !client.prefs_vr)
|
||||
to_chat(src,"<span class='warning'>You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>")
|
||||
return 0
|
||||
|
||||
var/datum/vore_preferences/P = client.prefs_vr
|
||||
|
||||
P.digestable = src.digestable
|
||||
P.devourable = src.devourable
|
||||
P.feeding = src.feeding
|
||||
P.vore_taste = src.vore_taste
|
||||
|
||||
var/list/serialized = list()
|
||||
for(var/belly in src.vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
|
||||
|
||||
P.belly_prefs = serialized
|
||||
|
||||
return 1
|
||||
|
||||
//
|
||||
// Proc for applying vore preferences, given bellies
|
||||
//
|
||||
/mob/living/proc/copy_from_prefs_vr()
|
||||
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)
|
||||
vore_organs.Cut()
|
||||
for(var/entry in P.belly_prefs)
|
||||
list_to_object(entry,src)
|
||||
|
||||
return 1
|
||||
|
||||
//
|
||||
// Release everything in every vore organ
|
||||
//
|
||||
/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE, var/silent = FALSE)
|
||||
for(var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
B.release_all_contents(include_absorbed, silent)
|
||||
|
||||
//
|
||||
// Returns examine messages for bellies
|
||||
//
|
||||
/mob/living/proc/examine_bellies()
|
||||
if(!show_pudge()) //Some clothing or equipment can hide this.
|
||||
return ""
|
||||
|
||||
var/message = ""
|
||||
for (var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
message += B.get_examine_msg()
|
||||
|
||||
return message
|
||||
|
||||
//
|
||||
// Whether or not people can see our belly messages
|
||||
//
|
||||
/mob/living/proc/show_pudge()
|
||||
return TRUE //Can override if you want.
|
||||
|
||||
/mob/living/carbon/human/show_pudge()
|
||||
//A uniform could hide it.
|
||||
if(istype(w_uniform,/obj/item/clothing))
|
||||
var/obj/item/clothing/under = w_uniform
|
||||
if(under.hides_bulges)
|
||||
return FALSE
|
||||
|
||||
//We return as soon as we find one, no need for 'else' really.
|
||||
if(istype(wear_suit,/obj/item/clothing))
|
||||
var/obj/item/clothing/suit = wear_suit
|
||||
if(suit.hides_bulges)
|
||||
return FALSE
|
||||
|
||||
|
||||
return ..()
|
||||
|
||||
//
|
||||
// Clearly super important. Obviously.
|
||||
//
|
||||
/mob/living/proc/lick(var/mob/living/tasted in oview(1))
|
||||
set name = "Lick Someone"
|
||||
set category = "Vore"
|
||||
set desc = "Lick someone nearby!"
|
||||
|
||||
if(!istype(tasted))
|
||||
return
|
||||
|
||||
if(src == stat)
|
||||
return
|
||||
|
||||
src.setClickCooldown(100)
|
||||
|
||||
src.visible_message("<span class='warning'>[src] licks [tasted]!</span>","<span class='notice'>You lick [tasted]. They taste rather like [tasted.get_taste_message()].</span>","<b>Slurp!</b>")
|
||||
|
||||
|
||||
/mob/living/proc/get_taste_message(allow_generic = TRUE, datum/species/mrace)
|
||||
if(!vore_taste && !allow_generic)
|
||||
return FALSE
|
||||
|
||||
var/taste_message = ""
|
||||
if(vore_taste && (vore_taste != ""))
|
||||
taste_message += "[vore_taste]"
|
||||
else
|
||||
if(ishuman(src))
|
||||
taste_message += "they haven't bothered to set their flavor text"
|
||||
else
|
||||
taste_message += "a plain old normal [src]"
|
||||
|
||||
/* if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.touching.reagent_list.len) //Just the first one otherwise I'll go insane.
|
||||
var/datum/reagent/R = H.touching.reagent_list[1]
|
||||
taste_message += " You also get the flavor of [R.taste_description] from something on them"*/
|
||||
return taste_message
|
||||
|
||||
/obj/item
|
||||
var/trash_eatable = TRUE
|
||||
|
||||
/mob/living/proc/eat_trash()
|
||||
set name = "Eat Trash"
|
||||
set category = "Vore" //No Abilities?
|
||||
set desc = "Consume held garbage."
|
||||
|
||||
if(!vore_selected)
|
||||
to_chat(src,"<span class='warning'>You either don't have a belly selected, or don't have a belly!</span>")
|
||||
return
|
||||
|
||||
var/obj/item/I = get_active_held_item()
|
||||
if(!I)
|
||||
to_chat(src, "<span class='notice'>You are not holding anything.</span>")
|
||||
return
|
||||
|
||||
if(is_type_in_list(I,item_vore_blacklist) && !adminbus_trash) //If someone has adminbus, they can eat whatever they want.
|
||||
to_chat(src, "<span class='warning'>You are not allowed to eat this.</span>")
|
||||
return
|
||||
|
||||
if(!I.trash_eatable) //OOC pref. This /IS/ respected, even if adminbus_trash is enabled
|
||||
to_chat(src, "<span class='warning'>You can't eat that so casually!</span>")
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/paicard))
|
||||
var/obj/item/paicard/palcard = I
|
||||
var/mob/living/silicon/pai/pocketpal = palcard.pai
|
||||
if(pocketpal && (!pocketpal.devourable))
|
||||
to_chat(src, "<span class='warning'>\The [pocketpal] doesn't allow you to eat it.</span>")
|
||||
return
|
||||
|
||||
if(is_type_in_list(I,edible_trash) | adminbus_trash /*|| is_type_in_list(I,edible_tech) && isSynthetic()*/)
|
||||
/*
|
||||
if(I.hidden_uplink)
|
||||
to_chat(src, "<span class='warning'>You really should not be eating this.</span>")
|
||||
message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? ADMIN_JMP(src) : "null"])")
|
||||
return
|
||||
*/
|
||||
if(istype(I,/obj/item/pda))
|
||||
var/obj/item/pda/P = I
|
||||
if(P.owner)
|
||||
var/watching = FALSE
|
||||
for(var/mob/living/carbon/human/H in view(src))
|
||||
if(H.real_name == P.owner && H.client)
|
||||
watching = TRUE
|
||||
break
|
||||
if(!watching)
|
||||
return
|
||||
else
|
||||
visible_message("<span class='warning'>[src] is threatening to make [P] disappear!</span>")
|
||||
if(P.id)
|
||||
var/confirm = alert(src, "The PDA you're holding contains a vulnerable ID card. Will you risk it?", "Confirmation", "Definitely", "Cancel") //No tgui input?
|
||||
if(confirm != "Definitely")
|
||||
return
|
||||
if(!do_after(src, 100, P))
|
||||
return
|
||||
visible_message("<span class='warning'>[src] successfully makes [P] disappear!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the sweet flavor of delicious technology.</span>")
|
||||
dropItemToGround(I)
|
||||
I.forceMove(vore_selected)
|
||||
updateVRPanel()
|
||||
return
|
||||
/*
|
||||
if(istype(I,/obj/item/clothing/shoes))
|
||||
var/obj/item/clothing/shoes/S = I
|
||||
if(S.holding)
|
||||
to_chat(src, "<span class='warning'>There's something inside!</span>")
|
||||
return
|
||||
*/
|
||||
/*
|
||||
if(iscapturecrystal(I))
|
||||
var/obj/item/capture_crystal/C = I
|
||||
if(!C.bound_mob.devourable)
|
||||
to_chat(src, "<span class='warning'>That doesn't seem like a good idea. (\The [C.bound_mob]'s prefs don't allow it.)</span>")
|
||||
return
|
||||
*/
|
||||
dropItemToGround(I)
|
||||
I.forceMove(vore_selected)
|
||||
updateVRPanel()
|
||||
|
||||
log_admin("VORE: [src] used Eat Trash to swallow [I].")
|
||||
|
||||
if(istype(I,/obj/item/flashlight/flare) || istype(I,/obj/item/match) || istype(I,/obj/item/storage/box/matches))
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of spicy cardboard.</span>")
|
||||
else if(istype(I,/obj/item/flashlight/glowstick)) //Repath from /obj/item/device/flashlight/glowstick
|
||||
to_chat(src, "<span class='notice'>You found out the glowy juice only tastes like regret.</span>")
|
||||
else if(istype(I,/obj/item/cigbutt)) //Repath from /obj/item/trash/cigbutt
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of bitter ash. Classy.</span>")
|
||||
else if(istype(I,/obj/item/clothing/mask/cigarette)) //Repath from /obj/item/clothing/mask/smokable
|
||||
var/obj/item/clothing/mask/cigarette/C = I
|
||||
if(C.lit)
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of burning ash. Spicy!</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of aromatic rolling paper and funny looks.</span>")
|
||||
else if(istype(I,/obj/item/paper)) //Repath from /obj/item/weapon/paper
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of bureaucracy.</span>")
|
||||
else if(istype(I,/obj/item/dice)) //Repath from /obj/item/weapon/dice
|
||||
to_chat(src, "<span class='notice'>You can taste the bitter flavor of cheating.</span>")
|
||||
else if(istype(I,/obj/item/lipstick)) //Repath from /obj/item/weapon/lipstick
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of couture and style. Toddler at the make-up bag style.</span>")
|
||||
else if(istype(I,/obj/item/soap)) //Repath from /obj/item/weapon/soap
|
||||
to_chat(src, "<span class='notice'>You can taste the bitter flavor of verbal purification.</span>")
|
||||
else if(istype(I,/obj/item/stack/spacecash) || istype(I,/obj/item/storage/wallet)) //Repath from /obj/item/weapon/spacecash and /obj/item/weapon/storage/wallet
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of wealth and reckless waste.</span>")
|
||||
else if(istype(I,/obj/item/broken_bottle) || istype(I,/obj/item/shard)) //Repath from /obj/item/weapon/broken_bottle
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of pain. This can't possibly be healthy for your guts.</span>")
|
||||
else if(istype(I,/obj/item/light)) //Repath from /obj/item/weapon/light
|
||||
var/obj/item/light/L = I
|
||||
if(L.status == LIGHT_BROKEN)
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of pain. This can't possibly be healthy for your guts.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of really bad ideas.</span>")
|
||||
/*
|
||||
else if(istype(I,/obj/item/weapon/bikehorn/tinytether)) //Doenst exist
|
||||
to_chat(src, "<span class='notice'>You feel a rush of power swallowing such a large, err, tiny structure.</span>")
|
||||
*/
|
||||
else if(istype(I,/obj/item/mmi/posibrain) || istype(I,/obj/item/aicard)) //Repath from /obj/item/device/mmi/digital/posibrain and //Repath from /obj/item/device/aicard
|
||||
to_chat(src, "<span class='notice'>You can taste the sweet flavor of digital friendship. Or maybe it is something else.</span>")
|
||||
else if(istype(I,/obj/item/paicard)) //Repath from /obj/item/device/paicard
|
||||
to_chat(src, "<span class='notice'>You can taste the sweet flavor of digital friendship.</span>")
|
||||
var/obj/item/paicard/ourcard = I
|
||||
if(ourcard.pai && ourcard.pai.client && isbelly(ourcard.loc))
|
||||
var/obj/belly/B = ourcard.loc
|
||||
to_chat(ourcard.pai, "<span class= 'notice'><B>[B.desc]</B></span>")
|
||||
else if(istype(I,/obj/item/reagent_containers/food)) //Repath from /obj/item/weapon/reagent_containers/food
|
||||
var/obj/item/reagent_containers/food/F = I
|
||||
if(!F.reagents.total_volume)
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of garbage and leftovers. Delicious?</span>")
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of gluttonous waste of food.</span>")
|
||||
else if (istype(I,/obj/item/clothing/neck/petcollar))
|
||||
to_chat(src, "<span class='notice'>You can taste the submissiveness in the wearer of [I]!</span>")
|
||||
/*
|
||||
else if(iscapturecrystal(I))
|
||||
var/obj/item/capture_crystal/C = I
|
||||
if(C.bound_mob && (C.bound_mob in C.contents))
|
||||
if(isbelly(C.loc))
|
||||
//var/obj/belly/B = C.loc //CHOMPedit
|
||||
//to_chat(C.bound_mob, "<span class= 'notice'>Outside of your crystal, you can see; <B>[B.desc]</B></span>") //CHOMPedit: moved to modular_chomp capture_crystal.dm
|
||||
to_chat(src, "<span class='notice'>You can taste the the power of command.</span>")
|
||||
*/
|
||||
// CHOMPedit begin
|
||||
/*
|
||||
else if(istype(I,/obj/item/starcaster_news))
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of digital garbage, oh wait its just the news.</span>")
|
||||
*/
|
||||
else if(istype(I,/obj/item/newspaper))
|
||||
to_chat(src, "<span class='notice'>You can taste the dry flavor of garbage, oh wait its just the news.</span>")
|
||||
else if (istype(I,/obj/item/stock_parts/cell))
|
||||
visible_message("<span class='warning'>[src] sates their electric appetite with a [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the spicy flavor of electrolytes, yum.</span>")
|
||||
/*
|
||||
else if (istype(I,/obj/item/walkpod))
|
||||
visible_message("<span class='warning'>[src] sates their musical appetite with a [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the jazzy flavor of music.</span>")
|
||||
*/
|
||||
/*
|
||||
else if (istype(I,/obj/item/mail/junkmail))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of the galactic postal service.</span>")
|
||||
*/
|
||||
/*
|
||||
else if (istype(I,/obj/item/weapon/gun/energy/sizegun))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You didn't read the warning label, did you?</span>")
|
||||
*/
|
||||
/*
|
||||
else if (istype(I,/obj/item/device/slow_sizegun))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You taste the flavor of sunday driver bluespace.</span>")
|
||||
*/
|
||||
else if (istype(I,/obj/item/laser_pointer))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You taste the flavor of a laser.</span>")
|
||||
else if (istype(I,/obj/item/canvas))
|
||||
visible_message("<span class='warning'>[src] devours the [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You taste the flavor of priceless artwork.</span>")
|
||||
//CHOMPedit end
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You can taste the flavor of garbage. Delicious.</span>")
|
||||
visible_message("<span class='warning'>[src] demonstrates their voracious capabilities by swallowing [I] whole!</span>")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>This snack is too powerful to go down that easily.</span>") //CHOMPEdit
|
||||
return
|
||||
@@ -0,0 +1,94 @@
|
||||
// In vorecode, they're defined at code/_helpers/global_lists_vr.dm but we dont have that path at all, and I dont think it's a very good
|
||||
// path for a global lists file when there's code/_global_vars/lists as a directory. Im just putting this here for now. -Reo
|
||||
|
||||
//Blacklist to exclude items from object ingestion. Digestion blacklist located in digest_act_vr.dm
|
||||
var/global/list/item_vore_blacklist = list(
|
||||
/obj/item/hand_tele,
|
||||
//obj/item/weapon/card/id/gold/captain/spare, //Hugbox
|
||||
/obj/item/gun,
|
||||
/obj/item/pinpointer,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/areaeditor/blueprints,
|
||||
/obj/item/clothing/head/helmet/space,
|
||||
/obj/item/disk/nuclear
|
||||
//obj/item/clothing/suit/storage/hooded/wintercoat/roiz //You fluff decrease
|
||||
)
|
||||
|
||||
var/global/list/edible_trash = list(
|
||||
///obj/item/broken_device, //Doesnt exist
|
||||
/obj/item/clothing/neck/petcollar,
|
||||
///obj/item/device/communicator, // Doesnt exist
|
||||
/obj/item/clothing/mask,
|
||||
/obj/item/clothing/glasses,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/clothing/head,
|
||||
/obj/item/clothing/shoes,
|
||||
/obj/item/aicard, //Repathed from /obj/item/device/aicard
|
||||
/obj/item/flashlight,
|
||||
/obj/item/mmi/posibrain,
|
||||
/obj/item/paicard,
|
||||
/obj/item/pda,
|
||||
/obj/item/radio/headset,
|
||||
///obj/item/device/starcaster_news, //Doesnt exist
|
||||
///obj/item/inflatable/torn, //Doesnt exist
|
||||
/obj/item/organ,
|
||||
/obj/item/stack/sheet/cardboard,
|
||||
/obj/item/toy,
|
||||
/obj/item/trash,
|
||||
///obj/item/weapon/digestion_remains, // No former cuties (yet?)
|
||||
/obj/item/grown/bananapeel,
|
||||
///obj/item/weapon/bone, // Doesnt exist
|
||||
/obj/item/broken_bottle,
|
||||
/obj/item/card/emagfake,
|
||||
/obj/item/cigbutt,
|
||||
/obj/item/circuitboard,
|
||||
/obj/item/clipboard,
|
||||
/obj/item/grown/corncob,
|
||||
/obj/item/dice,
|
||||
/obj/item/match, //Repathed from /obj/item/weapon/flame
|
||||
/obj/item/lighter, //Added since they dont share a path of /flame anymore.
|
||||
/obj/item/light,
|
||||
/obj/item/lipstick,
|
||||
/obj/item/shard,
|
||||
/obj/item/newspaper,
|
||||
/obj/item/paper,
|
||||
/obj/item/paperplane,
|
||||
/obj/item/pen,
|
||||
/obj/item/photo,
|
||||
/obj/item/reagent_containers/food,
|
||||
/obj/item/reagent_containers/rag,
|
||||
/obj/item/soap,
|
||||
/obj/item/stack/spacecash,
|
||||
/obj/item/storage/box/matches,
|
||||
///obj/item/storage/box/wings, //Doesnt exist
|
||||
/obj/item/storage/fancy/candle_box,
|
||||
/obj/item/storage/fancy/cigarettes,
|
||||
/obj/item/storage/crayons,
|
||||
/obj/item/storage/fancy/egg_box,
|
||||
/obj/item/storage/wallet,
|
||||
///obj/item/weapon/storage/vore_egg, //Doesnt exist
|
||||
///obj/item/weapon/bikehorn/tinytether, //Doesnt exist
|
||||
///obj/item/capture_crystal, //Still doesnt exist.
|
||||
/obj/item/kitchen,
|
||||
/obj/item/storage/box/mre,
|
||||
///obj/item/storage/mrebag, //Doesnt exist
|
||||
///obj/item/weapon/storage/fancy/crackers, //Doesnt exist
|
||||
///obj/item/weapon/storage/fancy/heartbox, //Doesnt exist
|
||||
///obj/item/pizzavoucher, //Doesnt exist. Probably should, actually
|
||||
/obj/item/pizzabox,
|
||||
/obj/item/seeds,
|
||||
///obj/item/clothing/accessory/choker, //Doesnt exist
|
||||
/obj/item/clothing/accessory/medal,
|
||||
/obj/item/clothing/neck/tie,
|
||||
/obj/item/clothing/neck/scarf,
|
||||
///obj/item/clothing/accessory/bracelet, //Doesnt exist
|
||||
///obj/item/clothing/accessory/locket, //Doesnt exist
|
||||
/obj/item/storage/book/bible,
|
||||
/obj/item/bikehorn,
|
||||
//obj/item/inflatable/door/torn, //Doesnt exist
|
||||
/obj/item/reagent_containers/rag/towel, //Repath from /obj/item/towel
|
||||
/obj/item/folder,
|
||||
/obj/item/clipboard,
|
||||
/obj/item/coin,
|
||||
/obj/item/clothing/ears
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
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.
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
+10
-10
@@ -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)
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
|
||||
wheels.buckle_mob(quirk_holder)
|
||||
|
||||
/datum/quirk/trashcan //for when you are literally flint (Stolen from hyper)
|
||||
/datum/quirk/trashcan //for when you are literally flint (Stolen from hyper) //making this even betterer, because im biased
|
||||
name = "Trashcan"
|
||||
desc = "You are able to consume and digest trash."
|
||||
value = 0
|
||||
@@ -188,7 +188,13 @@
|
||||
lose_text = "<span class='notice'>You no longer feel like you should be eating trash.</span>"
|
||||
mob_trait = TRAIT_TRASHCAN
|
||||
category = CATEGORY_FOOD
|
||||
medical_record_text = "Patient has been observed eating inedable garbage."
|
||||
medical_record_text = "Patient has been observed eating inedible garbage."
|
||||
|
||||
/datum/quirk/trashcan/add()
|
||||
quirk_holder.verbs += /mob/living/proc/eat_trash
|
||||
|
||||
/datum/quirk/trashcan/remove()
|
||||
quirk_holder.verbs -= /mob/living/proc/eat_trash
|
||||
|
||||
/datum/quirk/universal_diet
|
||||
name = "Universal diet"
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -101,17 +101,7 @@
|
||||
if(!LAZYLEN(operation_order)) //The list is empty, so we're done here
|
||||
end_harvesting()
|
||||
return
|
||||
var/turf/target
|
||||
for(var/adir in list(EAST,NORTH,SOUTH,WEST))
|
||||
var/turf/T = get_step(src,adir)
|
||||
if(!T)
|
||||
continue
|
||||
if(istype(T, /turf/closed))
|
||||
continue
|
||||
target = T
|
||||
break
|
||||
if(!target)
|
||||
target = get_turf(src)
|
||||
var/turf/target = get_turf(src)
|
||||
for(var/obj/item/bodypart/BP in operation_order) //first we do non-essential limbs
|
||||
BP.drop_limb()
|
||||
C.emote("scream")
|
||||
@@ -146,6 +136,11 @@
|
||||
return
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/harvester/wrench_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(default_change_direction_wrench(user, I))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/harvester/crowbar_act(mob/living/user, obj/item/I)
|
||||
if(default_pry_open(I))
|
||||
return TRUE
|
||||
@@ -189,4 +184,6 @@
|
||||
if(state_open)
|
||||
. += "<span class='notice'>[src] must be closed before harvesting.</span>"
|
||||
else if(!harvesting)
|
||||
. += "<span class='notice'>Alt-click [src] to start harvesting.</span>"
|
||||
. += "<span class='notice'>Alt-click [src] to start harvesting.</span>"
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Harvest speed at <b>[interval*0.1]</b> seconds per organ.<span>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -10,6 +10,22 @@
|
||||
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 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.
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Binary file not shown.
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
// Gain Remove: Editing this file enough to make a new one in the modular folder
|
||||
// File is disabled in the DME, but will be left as a reference.
|
||||
// Please direct any further changes to GainStation13/code/modules/vore/eating/living_vr.dm
|
||||
|
||||
///////////////////// Mob Living /////////////////////
|
||||
/mob/living
|
||||
var/digestable = FALSE // Can the mob be digested inside a belly?
|
||||
|
||||
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.
+6
-1
@@ -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"
|
||||
@@ -3105,6 +3107,10 @@
|
||||
#include "GainStation13\code\modules\food_and_drinks\objects\candy_flora.dm"
|
||||
#include "GainStation13\code\modules\food_and_drinks\recipes\recipes_ported.dm"
|
||||
#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"
|
||||
@@ -3452,7 +3458,6 @@
|
||||
#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm"
|
||||
#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm"
|
||||
#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm"
|
||||
#include "modular_citadel\code\modules\vore\eating\living_vr.dm"
|
||||
#include "modular_citadel\code\modules\vore\eating\vore_vr.dm"
|
||||
#include "modular_citadel\code\modules\vore\eating\voreitems.dm"
|
||||
#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"
|
||||
|
||||
Reference in New Issue
Block a user