whole lotta stuff

This commit is contained in:
Metis
2024-09-12 23:53:35 -04:00
parent f268e5655f
commit 8fd779ef02
232 changed files with 8793 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
/obj/item/clothing/accessory/medal/gato_badge
name = "GATO Badge"
desc = "You shouldn't see this."
icon = 'GainStation13/icons/mob/accessories.dmi'
icon_state = "gato_middleman"
item_color = "gato" //btw I had to move the sprite for this to 'icons/mob/accessories.dmi', the shitty code made me do it!! GS13 will just have a backup but it's not referenced here
above_suit = TRUE
/obj/item/clothing/accessory/medal/gato_badge/middleman
name = "GATO Correspondent Badge"
desc = "Badge given to GATO employees who work as info relay, middlemen or negotiators between station and Central Command. Commonly given to HR-related positions."
/obj/item/clothing/accessory/medal/gato_badge/employee
name = "GATO Employee Badge"
desc = "Badge given to certified GATO employees who have a full-time position in GATO Central Command."
icon_state = "gato_employee"
@@ -0,0 +1,53 @@
/obj/item/clothing/neck
///How much faster does the wearer gain weight? 1 = 100% faster
var/weight_gain_rate_modifier = 0
/obj/item/clothing/neck/equipped(mob/user, slot)
. = ..()
var/mob/living/carbon/wearer = user
if(!weight_gain_rate_modifier)
return FALSE
if(!iscarbon(wearer) || slot != SLOT_NECK || !wearer?.client?.prefs?.weight_gain_items)
return FALSE
wearer.weight_gain_rate = wearer.weight_gain_rate * weight_gain_rate_modifier
/obj/item/clothing/neck/dropped(mob/user)
. = ..()
var/mob/living/carbon/wearer = user
if(!weight_gain_rate_modifier)
return FALSE
if(!iscarbon(wearer) || !(wearer.get_item_by_slot(SLOT_NECK) == src) || !wearer?.client?.prefs?.weight_gain_items)
return FALSE
wearer.weight_gain_rate = (wearer.weight_gain_rate / weight_gain_rate_modifier)
/obj/item/clothing/neck/petcollar/calorite
name = "calorite collar"
desc = "A modified pet collar infused with calorite, magnifying the caloric impact of any food the wearer eats"
weight_gain_rate_modifier = 1.5
/obj/item/clothing/neck/petcollar/locked/calorite
name = "locked calorite collar"
desc = "A modified locked collar infused with calorite, magnifying the caloric impact of any food the wearer eats"
weight_gain_rate_modifier = 1.5
/datum/crafting_recipe/calorite_collar
name = "Calorite Collar"
result = /obj/item/clothing/neck/petcollar/calorite
time = 25
reqs = list(/obj/item/clothing/neck/petcollar = 1,
/obj/item/stack/sheet/mineral/calorite = 3)
category = CAT_CLOTHING
/datum/crafting_recipe/locked_calorite_collar
name = "Locked Calorite Collar"
result = /obj/item/clothing/neck/petcollar/locked/calorite
time = 25
reqs = list(/obj/item/clothing/neck/petcollar/locked = 1,
/obj/item/stack/sheet/mineral/calorite = 3)
category = CAT_CLOTHING
+29
View File
@@ -0,0 +1,29 @@
/obj/item/clothing/mask/gas/fattening
name = "drone mask"
desc = "A mask that can be connected to an air supply. When seen from certain angles, an orange light is reflected by it."
icon = 'GainStation13/icons/obj/clothing/fat_mask.dmi'
icon_state = "fat_mask"
item_state = "fat_mask"
var/mob/living/carbon/C
/obj/item/clothing/mask/gas/fattening/equipped(mob/M, slot)
. = ..()
if (slot == SLOT_WEAR_MASK)
if(iscarbon(M))
C = M
START_PROCESSING(SSobj, src)
else
C = null
return PROCESS_KILL
/obj/item/clothing/mask/gas/fattening/process()
if(C != null)
C.adjust_fatness(5, FATTENING_TYPE_ITEM)
else
return PROCESS_KILL
/datum/crafting_recipe/fat_mask
name = "Drone Mask"
result = /obj/item/clothing/mask/gas/fattening
reqs = list(/obj/item/stack/sheet/mineral/calorite = 1, /obj/item/clothing/mask/gas = 1)
category = CAT_CLOTHING
@@ -0,0 +1,68 @@
/obj/item/clothing/head/helmet/space/hardsuit/engine/haydee
name = "Haydee Helmet"
desc = "A strange helmet. Offers little to no protection."
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
alternate_worn_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
icon_state = "haydee_helmet"
item_state = "item_haydee_helmet"
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
item_color = "white"
slowdown = 0
mutantrace_variation = NO_MUTANTRACE_VARIATION
actions_types = list()
/obj/item/clothing/suit/space/hardsuit/engine/haydee
name = "Haydee Suit"
desc = "A strangely voluptous suit. Offers little to no protection. It also appears to have minor flab-compressing properties."
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
alternate_worn_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
icon_state = "haydee_suit1"
item_state = "item_haydee"
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
actions_types = list(/datum/action/item_action/toggle_helmet)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/haydee
slowdown = 0
mutantrace_variation = NO_MUTANTRACE_VARIATION
var/icon_location = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
var/mob/living/carbon/U
//haydee gun
/obj/item/gun/ballistic/automatic/pistol/haydee
name = "Simplistic Pistol"
desc = "10mm handgun. It seems to be clad in overly simplistic white shell."
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
icon_state = "pistol"
can_suppress = FALSE
/obj/item/gun/ballistic/automatic/toy/pistol/haydee
name = "Simplistic Toy Pistol"
desc = "A small, easily concealable toy handgun."
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
icon_state = "pistol"
/obj/item/clothing/suit/space/hardsuit/engine/haydee/equipped(mob/user, slot) //whenever the clothes are in someone's inventory the clothes keep track of who that user is
..()
U = user
/obj/item/clothing/suit/space/hardsuit/engine/haydee/dropped() //whenever the clothes leave a person's inventory, they forget who held them
..()
U = null
/obj/item/clothing/suit/space/hardsuit/engine/haydee/worn_overlays(isinhands = FALSE)
if(U)
if(!isinhands)
. = list()
if(U.fatness <= 439)
. += mutable_appearance(icon_location, "haydee_suit1", GENITALS_UNDER_LAYER)
if(U.fatness >= 440)
. += mutable_appearance(icon_location, "haydee_suit2", GENITALS_UNDER_LAYER)
if(U.fatness >= 1240)
. += mutable_appearance(icon_location, "haydee_suit3", GENITALS_UNDER_LAYER)
if(U.fatness >= 3440)
. += mutable_appearance(icon_location, "haydee_suit4", GENITALS_UNDER_LAYER)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
+28
View File
@@ -0,0 +1,28 @@
//most of those are probably recolors, but this is just generally GATO / GS13 stuff
/obj/item/clothing/head/helmet/space/hardsuit/ert/alert/gato
name = "GATO Hardsuit Helmet"
desc = "Exclusive version of a hardsuit helmet, usually reserved for GATO CC personnel."
icon = 'GainStation13/icons/mob/head.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/head.dmi'
icon_state = "hardsuit0-gato"
item_state = "hardsuit0-gato"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/head/HoS/beret/gato
name = "GT-CC Beret"
desc = "A robust beret for the CC personnel, for looking stylish while not sacrificing protection."
icon = 'GainStation13/icons/mob/head.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/head.dmi'
icon_state = "gato_beret"
item_state = "gato_beret"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/head/HoS/gato
name = "GT-CC Cap"
desc = "The robust standard-issue cap of the CC personnel."
icon = 'GainStation13/icons/mob/head.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/head.dmi'
icon_state = "gato_cap"
item_state = "gato_cap"
mutantrace_variation = NO_MUTANTRACE_VARIATION
+66
View File
@@ -0,0 +1,66 @@
//most of those are probably recolors, but this is just generally GATO / GS13 stuff
/obj/item/clothing/suit/jacket/letterman_gato
name = "GATO letterman jacket"
desc = "A GATO themed letterman jacket. Perfect for repping your pride in the company as you violently murder russian mobsters"
icon = 'GainStation13/icons/mob/suits.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/suits.dmi'
icon_state = "letterman_gato"
item_state = "letterman_gato"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/armor/vest/capcarapace/cc
name = "Elegant Carapace"
desc = "A fireproof armored chestpiece reinforced with ceramic plates and plasteel pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
icon = 'GainStation13/icons/mob/suits.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/suits.dmi'
icon_state = "cc_carapace"
item_state = "cc_carapace"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/armor/vest/capcarapace/gato
name = "CC-GT Carapace"
desc = "A fireproof armored chestpiece reinforced with ceramic plates and plasteel pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples."
icon = 'GainStation13/icons/mob/suits.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/suits.dmi'
icon_state = "gato_carapace"
item_state = "gato_carapace"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/armor/vest/capcarapace/moka
name = "Hellcat Overcoat"
desc = "Badass. Seems to be specifically made for some CentComm Commander."
icon = 'GainStation13/icons/mob/suits.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/suits.dmi'
icon_state = "hellcat_overcoat"
item_state = "hellcat_overcoat"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/armor/vest/capcarapace/paradeblack
name = "CC Parade Jacket"
desc = "This elegant and highly protective parade jacket seems to have been made into color purple."
icon = 'GainStation13/icons/mob/suits.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/suits.dmi'
icon_state = "paradejacket_black"
item_state = "paradejacket_black"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/armor/vest/capcarapace/paradepurple
name = "CC Parade Jacket"
desc = "This elegant and highly protective parade jacket seems to have been made into color purple."
icon = 'GainStation13/icons/mob/suits.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/suits.dmi'
icon_state = "paradejacket_purple"
item_state = "paradejacket_purple"
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/hardsuit/ert/alert/gato
name = "GATO Hardsuit"
desc = "Exclusive variant of a hardsuit, primarily reserved for CC GATO personnel."
icon = 'GainStation13/icons/mob/suits.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/suits.dmi'
icon_state = "gato_hardsuit"
item_state = "gato_hardsuit"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/alert/gato
mutantrace_variation = NO_MUTANTRACE_VARIATION
@@ -0,0 +1,44 @@
/datum/component/fattening_door
var/fatten = FALSE // whether player will be fattened
var/fat_to_add = 2 // fatness per tick stunned
/datum/component/fattening_door/Initialize()
if(!istype(parent, /obj/structure/mineral_door)) // if the attached object isn't a door, return incompatible!
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED),PROC_REF(Fatten))
/datum/component/fattening_door/proc/Fatten() //GS13
var/stuck_delay = 0
var/turf/T = get_turf(parent)
for(var/mob/living/carbon/M in T)
var/vis_message_self = ""
var/vis_message_others = ""
// determine if mob should get stuck and be fattened
if(M.fatness >= FATNESS_LEVEL_FAT)
if(!M.AmountFatStunned())
fatten = TRUE
stuck_delay = 5
vis_message_self = "You feel your sides briefly brush against the doorway!"
vis_message_others = "[M]'s sides briefly brush against the doorway."
// Scales depending on this switch.
switch(M.fatness)
if(FATNESS_LEVEL_BARELYMOBILE to INFINITY)
stuck_delay = 120
vis_message_self = "You feel yourself get stuck in the doorway!"
vis_message_others = "[M] gets stuck in the doorway!"
if((FATNESS_LEVEL_FATTER+1) to FATNESS_LEVEL_MORBIDLY_OBESE)
stuck_delay = 50
vis_message_self ="You feel your sides barely squeeze through the doorway!"
vis_message_others = "[M] barely squeezes through the doorway!"
if((FATNESS_LEVEL_FAT+1) to FATNESS_LEVEL_FATTER)
stuck_delay = 15
vis_message_self = "You feel your sides smush against the doorway!."
vis_message_others = "[M]'s sides briefly smush against the doorway."
// Apply the fatstun
if(fatten)
M.visible_message("<span class='boldnotice'>[vis_message_others]</span>", "<span class='boldwarning'>[vis_message_self]</span>")
M.FatStun(stuck_delay, fatAmount = fat_to_add) // DOOR STUCK
@@ -0,0 +1,71 @@
/datum/symptom/berry
name = "Berrification"
desc = "The virus causes the host's biology to overflow with a blue substance. Infection ends if the substance is completely removed from their body, besides ordinary cures."
stealth = -5
resistance = -4
stage_speed = 1
transmittable = 6
level = 7
severity = 5
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 45
threshold_desc = list(
"Stage Speed" = "Increases the rate of liquid production.",
)
var/datum/reagent/infection_reagent = /datum/reagent/blueberry_juice
/datum/symptom/berry/Start(datum/disease/advance/A)
if(!..())
return
if(A.affected_mob?.client?.prefs?.blueberry_inflation)
A.affected_mob.reagents.add_reagent(infection_reagent, max(1, A.totalStageSpeed()) * 10)
..()
/datum/symptom/berry/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
if(!(M?.client?.prefs?.blueberry_inflation))
return
if(M.reagents.get_reagent_amount(infection_reagent) <= 0)
A.remove_disease()
switch(A.stage)
if(1, 2, 3, 4)
if(prob(base_message_chance))
to_chat(M, "<span class='warning'>[pick("You feel oddly full...", "Your stomach churns...", "You hear a gurgle...", "You taste berries...")]</span>")
else
to_chat(M, "<span class='warning'><i>[pick("A deep slosh comes from inside you...", "Your mind feels light...", "You think blue really suits you...", "Your skin feels so tight...")]</i></span>")
M.reagents.add_reagent(infection_reagent, max(A.totalStageSpeed(), 1))
/obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target)
if(M.reagents.get_reagent_amount(/datum/reagent/blueberry_juice) > 0 && (reagents.total_volume + min(amount_per_transfer_from_this, 10)) <= volume)
reagents.add_reagent(/datum/reagent/blueberry_juice, min(10, amount_per_transfer_from_this))
M.reagents.remove_reagent(/datum/reagent/blueberry_juice, min(10, amount_per_transfer_from_this))
if(M != user)
to_chat(user, "<span class='warning'>You juice [M.name]...</span>")
to_chat(M, "<span class='warning'>[user.name] juices you...</span>")
else
to_chat(user, "<span class='warning'>You get some juice out of you...</span>")
if(prob(5))
new /obj/effect/decal/cleanable/juice(M.loc)
playsound(M.loc, 'sound/effects/splat.ogg',rand(10,50), 1)
return
..()
/obj/effect/decal/cleanable/juice
name = "berry juice"
desc = "It's blue and smells enticingly sweet."
icon = 'GainStation13/icons/turf/berry_decal.dmi'
icon_state = "floor1"
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
blood_state = BLOOD_STATE_JUICE
bloodiness = BLOOD_AMOUNT_PER_DECAL
/obj/effect/decal/cleanable/juice/Initialize(mapload)
. = ..()
reagents.add_reagent(/datum/reagent/blueberry_juice = 5)
/obj/effect/decal/cleanable/juice/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
@@ -0,0 +1,63 @@
/datum/mutation/human/fatfang
name = "The Nibble"
desc = "A rare mutation that grows a pair of fangs in the user's mouth that inject a chemical that develops the target's adipose tissue."
quality = POSITIVE
text_gain_indication = "<span class='notice'>You feel something growing in your mouth!</span>"
text_lose_indication = "<span class='notice'>You feel your fangs shrink away.</span>"
difficulty = 8
power = /obj/effect/proc_holder/spell/targeted/touch/fatfang
instability = 10
energy_coeff = 1
power_coeff = 1
///Which chem is added (lipo default) and how much?
var/chem_to_add = /datum/reagent/consumable/lipoifier
var/chem_amount = 5
/obj/effect/proc_holder/spell/targeted/touch/fatfang
name = "The Nibble"
desc = "Draw out fangs that inject fattening venom"
drawmessage = "You draw out your fangs."
dropmessage = "You retract your fangs."
hand_path = /obj/item/melee/touch_attack/fatfang
action_icon = 'icons/mob/actions/bloodsucker.dmi'
action_icon_state = "power_feed"
charge_max = 50
clothes_req = FALSE
/obj/item/melee/touch_attack/fatfang
name = "\improper fattening fangs"
desc = "Fangs armed with a venom most ample."
catchphrase = null
icon = 'icons/mob/actions/bloodsucker.dmi'
icon_state = "power_feed"
var/starttime = 0
/obj/item/melee/touch_attack/fatfang/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || !iscarbon(target))
return FALSE
if(!target || !user.dna.get_mutation(FATFANG).chem_to_add || !user.dna.get_mutation(FATFANG).chem_amount)
return FALSE
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(user.dna.get_mutation(FATFANG).chem_to_add, (user.dna.get_mutation(FATFANG).chem_amount * 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(user.dna.get_mutation(FATFANG).chem_to_add, user.dna.get_mutation(FATFANG).chem_amount * GET_MUTATION_POWER(user.dna.get_mutation(FATFANG)))
user.changeNext_move(50)
/obj/item/dnainjector/antifang
name = "\improper DNA injector (Anti-The Nibble)"
desc = "By the power of sugar, their fangs shall fall."
remove_mutations = list(FATFANG)
/obj/item/dnainjector/fatfang
name = "\improper DNA injector (The Nibble)"
desc = "Give 'em just a teeny tiny bite."
add_mutations = list(FATFANG)
@@ -0,0 +1,42 @@
/datum/mutation/human/radfat
name = "Radiotrophic Metabolism"
desc = "A mutation that causes the user to be immune to the adverse effects of radiations, but causes sudden cell multiplication with increased strength under irradiation."
quality = POSITIVE
text_gain_indication = "<span class='notice'>You crave the taste of... radiation?</span>"
text_lose_indication = "<span class='notice'>You no longer desire the taste of radiation...</span>"
difficulty = 14
instability = 30
power_coeff = 1
var/FATCAP = 100
/datum/mutation/human/radfat/on_life()
. = ..()
var/fat_add = 1
var/pwr = GET_MUTATION_POWER(src)
if(owner.radiation > 0)
fat_add += round(owner.radiation * (0.10 * pwr))
owner.radiation -= round(owner.radiation * 0.05) + 1
if(fat_add > (FATCAP * pwr))
fat_add = (FATCAP * pwr)
owner.adjust_fatness(fat_add, FATTENING_TYPE_RADIATIONS)
/datum/mutation/human/radfat/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
ADD_TRAIT(owner, TRAIT_RADRESONANCE, src)
/datum/mutation/human/radfat/on_losing(mob/living/carbon/human/owner)
if(..())
return
REMOVE_TRAIT(owner, TRAIT_RADRESONANCE, src)
/obj/item/dnainjector/antiradfat
name = "\improper DNA injector (Anti-Radiotrophic Metabolism)"
desc = "The green kills."
remove_mutations = list(RADFAT)
/obj/item/dnainjector/radfat
name = "\improper DNA injector (Radiotrophic Metabolism)"
desc = "Nuclear fallout protection at an heavy price."
add_mutations = list(RADFAT)
@@ -0,0 +1,64 @@
// Cba making a define file just for status effects so all the helper stuff goes here!~
#define STATUS_EFFECT_FATSTUN /datum/status_effect/incapacitating/stun/fat //the affected is knocked down
////
// Makes it so player is stunned and while stunned, fatness level grows.
////
/datum/status_effect/incapacitating/stun/fat
var/fatAmount = 1
/datum/status_effect/incapacitating/stun/fat/on_creation(mob/living/new_owner, set_duration, updating_canmove, fatnessAmount)
fatAmount = fatnessAmount
..()
/datum/status_effect/incapacitating/stun/fat/tick()
var/mob/living/carbon/C = owner
if(C)
C.adjust_fatness(fatAmount, FATTENING_TYPE_ITEM) // simply adds/removes the fat overtime.
// to_chat(owner, "You feel larger...") // debugging to see if the stun works.
////
// Helpers so it applies to the mob. (I cannot be bothered making a new file for this AUGH)
////
/mob/proc/IsFatStunned() //non-living mobs shouldn't be stunned
return FALSE
/mob/living/IsFatStunned() //If we're knocked down
return has_status_effect(STATUS_EFFECT_FATSTUN)
/mob/living/proc/AmountFatStunned() //How many deciseconds remain in our knockdown
var/datum/status_effect/incapacitating/stun/fat/F = IsFatStunned()
if(F)
return F.duration - world.time
return FALSE
/mob/living/proc/FatStun(amount, updating = TRUE, ignore_canstun = FALSE, fatAmount)
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
var/datum/status_effect/incapacitating/stun/fat/F = IsFatStunned()
if(F)
F.duration = max(world.time + amount, F.duration)
else if(amount > 0)
F = apply_status_effect(STATUS_EFFECT_FATSTUN, amount, updating, fatAmount)
return F
/mob/living/proc/SetFatStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
var/datum/status_effect/incapacitating/stun/fat/F = IsFatStunned()
if(amount <= 0)
if(F)
qdel(F)
else
if(F)
F.duration = world.time + amount
else
F = apply_status_effect(STATUS_EFFECT_FATSTUN, amount, updating)
return F
/mob/living/proc/AdjustFatStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
var/datum/status_effect/incapacitating/stun/fat/F = IsFatStunned()
if(F)
F.duration += amount
else if(amount > 0)
F = apply_status_effect(STATUS_EFFECT_FATSTUN, amount, updating)
return F
+38
View File
@@ -0,0 +1,38 @@
//Stuff for the quantum hub
/area/ruin/space/has_grav/powered/quantum_hub
name = "Quantum Pad Hub"
icon_state = "purple"
/obj/item/storage/box/quantum_pad_parts
name = "box of quantum pad parts"
desc = "Contains a all the parts you'd need to make a quantum pad."
icon_state = "syndiebox"
/obj/item/storage/box/quantum_pad_parts/PopulateContents()
new /obj/item/circuitboard/machine/quantumpad(src)
new /obj/item/stack/ore/bluespace_crystal(src)
new /obj/item/stock_parts/capacitor/quadratic(src)
new /obj/item/stock_parts/manipulator/femto(src)
new /obj/item/stack/cable_coil(src, 15)
new /obj/item/stack/sheet/metal/twenty(src)
/area/ruin/unpowered/caloriteshrine
name = "Calorite Shrine"
icon_state = "away"
/area/ruin/powered/snackstore
name = "Snack Store"
icon_state = "away"
/area/ruin/powered/candyland/inside
name = "Candy Land"
icon_state = "away"
/area/ruin/powered/candyland/outside
name = "Candy Land"
icon_state = "away"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
/area/ruin/powered/candycaveLower/inside
name = "Candy Cave"
icon_state = "away"
+547
View File
@@ -0,0 +1,547 @@
//////// feeder den, GS13
/obj/item/paper/fluff/ruins/feeder_den/hidden
name = "hastily scribbled note"
info = "It took so long for me to make this hideout, but it might all be in vain. In the short breaks when I'm not observed, I'm trying to fix this radio I managed to sneak by... but judging by how I can barely squeeze my ass past this stupid hole less and less each day, I might not fix it in time..."
/obj/item/paper/fluff/ruins/feeder_den/report1
name = "Captive report No 1"
info = "We've managed to obtain two captives - one woman, and one lizard. They seem promising so far... already quite chunky and eager to scarf down whatever we give them. It might be even easier to turn them into proper beds once we're past the chemical treatment."
/obj/item/paper/fluff/ruins/feeder_den/report2
name = "Captive report No 2"
info = "The woman seems to be showing great progress, we'll be moving her into the larger cell soon. The lizard guy is still a bit reluctant about eating himself into immobility... but no matter, we'll just double his portions. Perhaps a painfully overstuffed stomach will change his mind."
/obj/item/paper/fluff/ruins/feeder_den/report3
name = "Captive report No 3"
info = "We've captured another one! A curious space explorer, snooping around near our entrance. Fierce bastard, even managed to cut my arm open! A short treatment of a room full of lipoifier smoke ensured that they won't be able to fit back into their hardsuit."
/obj/item/paper/fluff/ruins/feeder_den/report4
name = "Captive report No 4"
info = "(the page seems to be full of food stains, making the writing unreadable.)"
/obj/item/paper/fluff/ruins/feeder_den/augment_note
name = "READ ME!"
info = "Don't use this auto-surgeon on yourself, dumbass!"
/obj/item/paper/fluff/ruins/feeder_den/tool_warning
name = "READ ME BEFORE USING!"
info = "For those interested in grabbing more victims, make sure to read this first<br><br>\n\n\
OOC: Your goal here is to capture people to fatten up. Avoid intentionally killing and causing chaos on the station if you can at all help it. <br>\
Before capturing someone, be sure to check their preferences and make sure that they are not already occupied. A discord message or LOOC never hurts if you aren't sure. OOC communication is very important. <br>\
You have the power to send people back to the station, make sure that you talk with them before sending them back. Especially if they are someone that wasn't on the station in the first place, like a Den Victim. \
<br>\
It is heavily advised that you find a target before you teleport onto the station as some crew members are not good canidates.<br>\
With the camera console you have access to the entire camera network of the station, use this to your advantage to formulate a plan. \
<br><br>\
Right before heading onto the station, make sure that you grab a science tool and sync it with the feeder console. \
Syncing it will allow you to beam both yourself and captives back to the den. \
To do this, mark the person you want to mark by touching them with the tool. Once someone is marked you can use the tool on them again to beam them up.<br>\
Additionally, if you have someone to help you, they can beam up anyone that is marked, by using the camera console.\
<br><br>\
Credits can be gained by having someone you fattened up use the tracking scale. Keep in mind that credits can only be gained when someone surpasses their previous max weight.\
Additionally, you are only able to get 900 credits from a person.\
<br><br>\
You are able to use the console and pad to send victims back to the station after you are done with them. Avoid sending them anywhere dangerous or obvious unless you want to risk the ire of GATO. "
// calorite research facility
/obj/item/paper/fluff/ruins/calorite_facility/note1
name = "Research Department - Report #1"
info = "The facility appears to be ready for usage. We've already imported a couple willing subjects, currently waiting in their designated areas. The testing shall begin according to the schedule."
/obj/item/paper/fluff/ruins/calorite_facility/note4
name = "Research Department - Report #4"
info = "I'm aware of the fact that we're pioneers in this field of science, but this facility seems a little... oddly designed? In the next designs or iterations, instruct the architects to provide larger, more secluded labs. Why do we even need those three conveyor belts?"
/obj/item/paper/fluff/ruins/calorite_facility/note18
name = "Research Department - Report #18"
info = "The research is going excellently, though the miners have reported strange figures seemingly observing them within the mining shafts. I've suggested that it's just fauna, but they insist that it's unlike anything they've ever seen before... and yet they can never describe those things. Just to keep morale high, please send more security supplies."
/obj/item/paper/fluff/ruins/calorite_facility/note37
name = "Research Department - Report #37"
info = "I'm not sure who I'm writing this paper for. The connection with HQ has been severed days ago and since then, half of our personnel has gone missing. I swear someone's sabotaging this fucking place too... Until someone fixes the telecomms relay, I'll probably hide myself in the medbay. Seems like the safest place."
/obj/item/paper/fluff/ruins/calorite_facility/security_note
name = "Scribbled note"
info = "Funny work so far, but admittedly pretty easy. I'm only supposed to not touch the orange junk and rally up some lardasses and-- let's be real, how much harm can someone like that do?"
/obj/item/paper/fluff/ruins/calorite_facility/engineer_note
name = "Oil-stained note"
info = "Please tell those fucking deadbrained amoebas at HQ that a full facility needs a PROPER engine, not a bunch of fucking PACMANs. Even a damned SM shard would suffice..."
/obj/item/paper/fluff/ruins/calorite_facility/charred
name = "Charred note"
info = "They've g-- -all, -- s--en. Cloak-d fig----, ---...(the rest of the note seems unreadable)"
//GS13 Datapads and Books
/obj/item/book/manual/blubbery_bartender
name = "The Blubbery Bartender"
icon = 'GainStation13/icons/obj/library.dmi'
icon_state ="bookblubberybartender"
author = "Anonymous" // Whoever wrote the paper or book, can be changed by pen or PC. It is not automatically assigned.
title = "The Blubbery Bartender"
//book contents below
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
</style>
</head>
<body>
<h3>Drinks for Growing Guts</h3>
Been a bartender for Gato quite a while now. In my time here, I've taken notice of how certain mixes produced...
Certain effects, that the same mixtures don't produce elsewhere. I'm writing down my findings here.
<ol>
<li><b>Belly Bloats:</b> equal parts gibb floats and beer. Really bulks up a belly. Some folks got real bloated with air after drinking this one.</li>
<li><b>Blobby Mary:</b> equal parts tomato juice, vodka and lipoifier. If you want to get back at some rich folks, this is your drink.</li>
<li><b>Heavy Cafe:</b> equal parts latte, either cafe or soy, sugar and cream. One hell of a bomb to start a shift with.</li>
<li><b>Fruits Tea:</b> equal parts berry juice, lemon juice and tea. Even teetotal folks aren't safe from growing. Some folks become... Real sloshy. Note: I once mixed it with blueberry juice from a vendor. Be ready to juice if you do too.</li>
<li><b>Snakebite:</b> equal parts toxins, lime juice and lipoifier. Feels like a snake biting your throat when it goes down. Sure "paralyzes" like some real snake bites.</li>
<li><b>Beltbuster Mead:</b> equal parts mead, ethanol, cream and lipoifier. Very alcoholic and immensely fattening. Clothes won't hold after this one.</li>
</ol>
<p>
Remember, this stuff is quite something. Don't serve these to folks that don't want it.
</body>
</html>
"}
/obj/item/book/manual/fatty_chems
name = "The Strange Chems of GATO's Sector"
icon = 'GainStation13/icons/obj/library.dmi'
icon_state ="bookblubberybartender"
author = "Unknown"
title = "The Strange Chems of GATO's Sector"
//book contents below
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
</style>
</head>
<body>
<h3>The Strange Chems of GATO-Controlled Sectors</h3>
Peculiar reactions not found anywhere else taken within the sector of GATO's control, especially within the station of GS13.
To ensure that the knowledge isn't lost to time, I've decided some of the simpler reactions here.
<ol>
<li><b>Lipoifier:</b> The opposite of Lipolicide. Seems to multiply fat cells in one's body. Equal parts corn oil, sugar and synthflesh.</li>
<li><b>Fizulphite:</b> Seems to stir up a strange reaction in stomachs, making them all bubbly. 1u of nitrogen, 1u sugar and 3u of oxygen.</li>
<li><b>Extilphite:</b> Very useful chem! Helps soothe stomach bloat and relieves fullness. 1u sugar, 2u hydrogen, 2u carbon.</li>
<li><b>Flatulose:</b> This chemical is similar to Fizulphite, but results in uncontrolled release of rear gasses. 1u sugar, 1u of Bad Food, 1u of Cream.</li>
</ol>
<p>
Remember to be responsible with those chems. They aren't lethal or toxic, but they can be undesired by locals.
</body>
</html>
"}
//fastfood
/obj/item/paper/fluff/ruins/fastfood/general_info
name = "Welcome to GATO!"
info = "We are glad to have you be a part of our galaxy-wide GATO franchise locations! As a restaurant worker / manager, you are a part of the GATO Corp and for security purposes, you may be treated as a part of the General Station 13's crew. Make sure to keep your restaurant clean and well-stocked. Good luck!"
//space law - we still keep the old updated version, but might as well use this one too
/obj/item/book/manual/gato_spacelaw
name = "GATO Space Law"
desc = "A set of GATO-Station guidelines for keeping law and order on their space stations."
icon_state = "bookSpaceLaw"
author = "GATO PMC"
title = "Space Law"
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
</style>
</head>
<body>
<h3>The Strange Chems of GATO-Controlled Sectors</h3>
<p><br></p>
<p style="text-align: center;"><strong><span style="font-size:20pt;">GATO Corp Guide to Station Laws</span></strong></p>
<p><br></p>
<p style="text-align: justify;"><span style="color:#990000;font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><span style="color:#990000;font-size:12pt;">OOC: (Remember use everything in this document to try and create or enhance possible roleplay scenarios and how characters can be roleplayed in relation to respect, or lack thereof, of laws. If you believe it is instead taking away from a scenario, talk it out in OOC/LOOC. If you find an issue with these, you are encouraged to start or participate in discussion over them.)</span></p>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><span style="font-size:12pt;">This document contains information pertaining to workplace laws, their application and standard procedures on GATO Corp owned space stations. Employees are expected to follow these laws and respect the Chain of Command. Security and Command also hold the additional responsibility of making sure they are being followed.</span></p>
<p><br></p>
<p><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><strong><span style="font-size:16pt;">Chain of Command</span></strong></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">The Captain holds responsibility for a station&apos;s operations during a shift, while the responsibility for the individual departments and their members is given to the other members of Command, also referred to as Heads. These are the Head of Security for Security, Head of Personnel for Service, Chief Medical Officer for Medical, Chief Engineer for Engineering, the Quartermaster for Cargo and the Research Director for Science.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Command members besides the Captain do not hold authority over other Heads or crew from departments outside their own. The same goes for any Security member over departments that are not Security.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Departments hold authority over their own activities, no department has to comply with the request of other departments that do not fall under the scope of one&apos;s duties, that are considered potentially harmful to others and to their discretion.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Should no Captain be on duty during a shift but someone is required to fill in the position, an Acting Captain can be assigned from between the present members of Command. This position gives them the same authority as a Captain, but the position is relinquished as soon as someone is assigned to the position proper. Democratic vote can be used, if need be, to decide who should hold the position and to revoke it should the majority of Command deem one unfit for the role.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">CenterCom Commanders, while not part of the standard crew present on station, hold authority over the Captain. All station personnel must follow their orders.</span></p>
</li>
</ul>
<p><br></p>
<p><br></p>
<p><br></p>
<p><br></p>
<p style="text-align: center;"><strong><span style="font-size:16pt;">Standard Operating Procedures</span></strong></p>
<p style="text-align: justify;"><strong><span style="font-size:13.999999999999998pt;">Alert Levels</span></strong></p>
<p style="text-align: justify;"><span style="font-size:12pt;"><br></span><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><strong><span style="color:#38761d;font-size:13.999999999999998pt;">Code Green</span></strong><span style="color:#38761d;font-size:12pt;">&nbsp;</span></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All Clear Standard operating levels.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">No immediate or clear threat to the station.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All departments may carry out work as normal.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Suit sensors are not required to be on.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Weapons worn by security are to be hidden except when in the case of an emergency.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Crew members may freely walk in the hallways.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">AI/Cyborgs have no need to bolt down any secure areas.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Security must respect the privacy of crew members and no unauthorized searches are allowed.</span><br><br><span style="font-size:12pt;"><br><br></span><strong><span style="color:#1155cc;font-size:13.999999999999998pt;">Code Blue</span></strong></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Confirmed Threat Elevated alert level.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">There are reports or other proof available to indicate that there is a threat to the station.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">When a Centcom threat summary is received and printed at communication consoles), the blue alert level is applied.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Suit sensors are mandatory, but coordinate positions are not required.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Security may have weapons visible.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Crew members may be searched by security with probable cause.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">AI/Cyborgs may bolt down high secure areas.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Energy guns, laser guns and riot gear are allowed to be given out to security personnel if the HoS or Warden agree.</span><span style="font-size:12pt;"><br></span><br><strong><span style="font-size:12pt;"><br></span></strong><strong><span style="color:#cc0000;font-size:13.999999999999998pt;">Code Red</span></strong></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Immediate Threat Maximum alert level.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">There is an immediate threat to the station or severe damage.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Martial Law is in effect.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Suit sensors are to be turned fully on at all times.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Security can raid departments and arrest any crew member deemed a threat to the station.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All crew members must remain in their departments.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">AI/Cyborgs may bolt down maintenance and airlocks leading to space.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;"><br></span><span style="font-size:12pt;"><br></span><span style="font-size:12pt;"><br></span><strong><span style="font-size:13.999999999999998pt;">Code Delta</span></strong><br><br></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Imminent Destruction</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">The station&apos;s self destruct mechanism has been engaged due to overwhelming threat to the station.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Martial Law is in effect.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Suit sensors are to be turned fully on at all times.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All orders from Heads of Staff and Security must be followed, any disobedience is punishable by death.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All crew members are to evacuate immediately, if possible.</span></p>
</li>
</ul>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:12pt;"><br></span></p>
<p><br></p>
<p style="text-align: center;"><strong><span style="font-size:16pt;">Emergencies</span></strong></p>
<p><br></p>
<p style="text-align: justify;"><strong><span style="font-size:13.999999999999998pt;">Evacuation Or Transfer</span></strong></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">In case of a crew transfer or due to an emergency, a shuttle can be called to transport personnel back to Central Command through the shuttle or escape pods located on the station.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All personnel are required to assist with reaching the shuttle or pods.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All crew should be brought on board of either, regardless of their consciousness.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Prisoners are to be brought to the secure area of the escape shuttle, except for prisoners who pose a severe threat.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">AI units may be brought to Central Command on portable card devices (InteliCards) if structural failure is likely or AI units wish to leave. Mechs and Cyborg units are to be hauled to the escape shuttle for Central Command to inspect.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Authorizing early shuttle launches is not allowed unless there is an immediate threat to shuttle integrity.</span><span style="font-size:12pt;"><br><br></span></p>
</li>
</ul>
<p style="text-align: justify;"><strong><span style="font-size:13.999999999999998pt;">Fire and Other Environmental Hazards</span></strong></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Immediate evacuation of all untrained personnel.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Fire alarms to be used to control the hazard.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Atmospheric Technicians and Station Engineers are to remove the hazard.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Pump air back into the area when fixed. Ensure the damage is repaired.</span></p>
</li>
</ul>
<p><br></p>
<p style="text-align: justify;"><strong><span style="font-size:13.999999999999998pt;">Viral Outbreak</span></strong></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">If severe viral strain is on board the station, the Chief Medical Officer is required to quarantine infected parts of the station with the help of security.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All infected crew are to be isolated in Virology or Medbay.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Sterile masks/Internals and gloves are mandatory for medical personnel and recommended for crew.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Quarantine must be maintained until the outbreak is contained and resolved.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">If the Emergency Shuttle is called, medical and security are to ensure no infected crew board the shuttle.</span><span style="font-size:12pt;"><br></span><span style="font-size:12pt;"><br></span><strong><span style="font-size:13.999999999999998pt;">Meteor Storm</span></strong></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">All crew to move to central parts of the station.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Engineers must employ, if available, either anti-meteor turrets or shields to protect the station and its personnel; along with repairs of any salvageable damage to the station.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Shuttle must be called if the station becomes unsalvageable.</span></p>
</li>
</ul>
<p><br></p>
<p><br></p>
<p><br></p>
<p style="text-align: center;"><strong><span style="font-size:16pt;">On Security Activities</span></strong></p>
<p><br></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Arrest and actions are only to be taken if they are in active transgression of any laws, other actions require authorization from relevant authority (Captain or Heads). Suspicion without probable cause, as in there is no legitimate reason to take any action, is not, usually, reason enough to search or detain crew members.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">An officer should apply a sentence to arrested people proportionate to the severity of the crime, the intent behind them, their number and it should be influenced by any applicable modifiers. Sentences reported here are suggestions, not hard rules.</span></p>
</li>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Use of force should be applied carefully and proportionately to the threat law transgressions represent and unlawful applications can represent Abuse of Power. Always avoid force and taking a life whenever circumstances allow.</span></p>
</li>
</ul>
<p><br></p>
<p style="text-align: justify;"><strong><span style="font-size:13.999999999999998pt;">Minor Crimes</span></strong></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">101</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Resisting Arrest, to not cooperate with an officer who attempts a proper arrest.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">102</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Minor Contraband, to be in unauthorized possession of not dangerous contraband</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">(drugs, chemicals, ect...).</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">103</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Indecent Exposure, to be intentionally and publicly unclothed.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">104</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Trespass, to be in in non-dangerous areas that one does not have access to without&nbsp;</span><span style="font-size:12pt;">permission.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">105</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Petty Theft, to take insignificant items belonging to another crew member or other&nbsp;</span><span style="font-size:12pt;">departments.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">106</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Battery, to use physical force against someone without intent to injure and that does not&nbsp;</span><span style="font-size:12pt;">result in serious, but not critical, physical harm.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">107</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Harassment, to persistently insult, stalk, ridicule, or otherwise intentionally be obnoxious to&nbsp;</span><span style="font-size:12pt;">another crew member in a not harmful way.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">108</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Disruptive Behavior, to behave in a way that may lead to harm to workers or damage to the&nbsp;</span><span style="font-size:12pt;">station (littering, vandalism, taking items from public places with no reason, leaving airlocks&nbsp;</span><span style="font-size:12pt;">open...) , to disrupt the activities of a department (ignoring minor orders without cause,&nbsp;</span><span style="font-size:12pt;">excessively repeated requests, abuse of radio...).</span></p>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:12pt;">For Minor Crimes, consider verbal reprimands. If certain items, areas or actions were involved, also consider a ban from said item, area or action. Discuss bans with Heads.</span></p>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:16pt;"><br></span><strong><span style="font-size:13.999999999999998pt;">Medium Crimes</span></strong></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">201</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Obstruction of Authority, to willfully interfere with Security ongoing activities or to go&nbsp;</span><span style="font-size:12pt;">against a superior&apos;s authority without proper cause, that would cause damage to the crew or&nbsp;</span><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><span style="font-size:12pt;">station.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">202</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Contraband, to distribute contraband without authorization (drugs, dangerous chemicals,&nbsp;</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">items that would need an Head&apos;s or Command&apos;s approval. The Head of a different&nbsp;</span><span style="font-size:12pt;">department can&apos;t approve in place of a relevant Head.).</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">203</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Creating Workplace Hazards, to endanger the crew or station through negligent but not&nbsp;</span><span style="font-size:12pt;">malicious behavior.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">204</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Major Trespass, to be in a restricted area that one does not have access to without</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">permission.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">205</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Theft, to take significant items from a department or crew member without permission</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">(includes using items from evidence).</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">206</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Assault, to use physical force against someone without the intent to kill that results in&nbsp;</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">serious harm.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">207</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Major Harassment, to harmfully and repeatedly harass a crew member. To threaten crew</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">members into performing any activity.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">208</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Fraud &amp; Sabotage, to willfully misrepresent one&apos;s action or intentions to abuse of other crew&nbsp;</span><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><span style="font-size:12pt;">members or departments (tricking someone into having their genes messed with, receiving a&nbsp;</span><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><span style="font-size:12pt;">virus that was not as described, asking for items that will not be used for what stated).</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">209</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Abuse of Power, to use one&apos;s position (Security or Command) to exploit or cause undue&nbsp;</span><span style="font-size:12pt;">harm to other crew members. To issue orders that interfere or compromise a department&apos;s</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">activities.</span></p>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:12pt;">For Medium Crimes, consider small amounts of brig time, labor or community service. Discuss labor with Heads and generally keep to tasks that do not involve in-depth job knowledge- Especially if they&apos;d be without supervision from someone who is already doing that job or a Head.&nbsp;</span></p>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:16pt;"><br></span><strong><span style="font-size:13.999999999999998pt;">Major Crimes</span></strong></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">301</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Dereliction of Duty, to willfully abandon obligations critical to the station.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">302</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Weapons Possession &amp; Major Contraband, to possess or distribute harmful weaponry or&nbsp;</span><span style="font-size:12pt;">items that can cause damage to crew members or the station without authorization.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">303</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Kidnapping &amp; Spiking, to illegally abduct or hold a crew member without their will. &nbsp;</span><span style="font-size:12pt;">To have other crew non-willfully members consume chemicals or substances.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">304</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Strong-arm, to threaten crew members into performing any activity under the threat of&nbsp;</span><span style="font-size:12pt;">serious harm or through usage of harmful items.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">305</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Major Theft, to take dangerous or restricted items or weapons from a department or crew&nbsp;</span><span style="font-size:12pt;">member without permission.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">306</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Major Assault, to use physical force against someone without the intent to kill that results in&nbsp;</span><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span><span style="font-size:12pt;">life-threatening situations. To use physical force through deadly weapons.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">307</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Sexual Assault, to perform unwanted and forced sexual advances (rape and other non-con IC&nbsp;</span><span style="font-size:12pt;">things)</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">308</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Major Sabotage, to willfully disrupt station activities by causing damage to it or a crew&nbsp;</span><span style="font-size:12pt;">member, or by manipulating critical equipment.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">309</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Conspiracy, to aid an enemy of the corporation, to incite riots against authority without&nbsp;</span><span style="font-size:12pt;">cause, to use false or someone else&apos;s identity.</span></p>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:12pt;">For Major Crimes, consider harsher times in brig, labor or for community service. Additionally consider demotions or return of their ID- Though try and not leave them with nothing to do if that is the case. Only in very, very severe cases, consider leaving them jobless (or a return to CC?)</span></p>
<p><br></p>
<p><br></p>
<p style="text-align: justify;"><strong><span style="font-size:13.999999999999998pt;">Capital Crimes</span></strong></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">401</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Enemy of the Corporation, to be part of enemies of the corporation. To represent an</span><span style="font-size:12pt;">&nbsp;</span><span style="font-size:12pt;">immediate and dangerous threat to the station and its crew.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">402</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Manslaughter, to willfully kill or attempt to kill a crew member through any means or&nbsp;</span><span style="font-size:12pt;">through negligence.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">403</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Mutiny, to unlawfully and without cause overthrow or attempt to overthrow the Chain of&nbsp;</span><span style="font-size:12pt;">Command.</span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">404</span></strong><strong><span style="font-size:12pt;">&nbsp; &nbsp;&nbsp;</span></strong><span style="font-size:12pt;">Terrorism, to willfully perform or attempt to perform activities that are destructive to the&nbsp;</span><span style="font-size:12pt;">station and its crew (bombs, virus outbreaks, engine/atmos manipulation, brainwashing...).</span></p>
<p style="text-align: justify;"><br></p>
<p style="text-align: justify;"><span style="font-size:12pt;">Capital Crimes apply to active threats to the station. Enemies should be put in brig or labor permanently, sent to CC or outright executed if they are believed to be too dangerous. Executions can only be sentenced by the Captain or, if no Captain is present, the Head of Security.</span></p>
<p><br></p>
<p style="text-align: justify;"><strong><span style="font-size:16pt;">Crime Modifiers</span></strong></p>
<p style="text-align: justify;"><span style="font-size:12pt;">-&nbsp;</span><strong><span style="font-size:12pt;">Dire Need,&nbsp;</span></strong><span style="font-size:12pt;">to perform unlawful activities due to the threat inaction would cause to the</span></p>
<p style="text-align: justify;"><span style="font-size:12pt;">station, its activities or its members.&nbsp;</span><span style="font-size:12pt;">Immediate release, removal from area and return of items if needed.</span></p>
<p><br></p>
<p style="text-align: justify;"><span style="font-size:12pt;">-&nbsp;</span><strong><span style="font-size:12pt;">Brainwashed,&nbsp;</span></strong><span style="font-size:12pt;">prisoners found to have been brainwashed or converted by illegal means.</span></p>
<p style="text-align: justify;"><span style="font-size:12pt;">Prisoner is to be held until they can be returned to normal state.&nbsp;</span><span style="font-size:12pt;">Immediate release following deconversion.</span></p>
<p style="text-align: justify;"><br></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">- Self Defense,</span></strong><span style="font-size:12pt;">&nbsp;defined as &quot;The protection of oneself, the protection of thy colleagues, and the</span></p>
<p style="text-align: justify;"><span style="font-size:12pt;">protection of thine workplace&quot;. Vigilantism does not fall under this.&nbsp;</span><span style="font-size:12pt;">Immediate release.</span><span style="font-size:12pt;"><br><br></span></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">- Cooperation &amp; Surrender,&nbsp;</span></strong><span style="font-size:12pt;">to help re-establishing a secure environment through&nbsp;</span><span style="font-size:12pt;">information or actions. To surrender oneself to authority and admitting to being guilty.&nbsp;</span><span style="font-size:12pt;">Less severe sentence.</span></p>
<p style="text-align: justify;"><br></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">- Immediate Threat,</span></strong><span style="font-size:12pt;">&nbsp;for something to threaten the life of a prisoner.&nbsp;</span><span style="font-size:12pt;">Relocate or release.</span></p>
<p style="text-align: justify;"><span style="font-size:12pt;"><br></span><strong><span style="font-size:12pt;">- Medical Reasons,</span></strong><span style="font-size:12pt;">&nbsp;prisoners have the right to receive medical attention.&nbsp;</span><span style="font-size:12pt;">Timers still run during medical personnel activities or relocation to medbay.</span></p>
<p style="text-align: justify;"><br></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">- Sparking a Manhunt,&nbsp;</span></strong><span style="font-size:12pt;">to escape from an attempted arrest, causing a chase.&nbsp;</span><span style="font-size:12pt;">Harsher sentences.</span></p>
<p style="text-align: justify;"><br></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">- Repeated Offense,&nbsp;</span></strong><span style="font-size:12pt;">to repeatedly commit crimes even after previous corrective actions.&nbsp;</span><span style="font-size:12pt;">Harsher sentences.</span></p>
<p><br></p>
<p style="text-align: justify;"><strong><span style="font-size:12pt;">- Escape &amp; Dereliction,&nbsp;</span></strong><span style="font-size:12pt;">to flee from confinement or to ignore a previous sentence.&nbsp;</span><span style="font-size:12pt;">Reset timer.</span></p>
<p><br></p>
<p style="text-align: justify;"><strong><span style="font-size:13.999999999999998pt;">Additional notes (tied to GS13)</span></strong></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Disruptive Behavior may contain many sorts of minor infractions, enforcement should be applied with reason. Taking a pen for a minute to write down something does not cause an actual disruption, neither does leaving a single O2 closet open or ignoring orders that would clearly cause harm to others or the station. Do not use this as an umbrella law to arrest or act against crew members who are doing no actual wrong, especially if the behavior is not being repeated or has caused no actual disruption.</span></p>
</li>
</ul>
<p><br></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">Dereliction of Duty implies that, through willful inaction, damage was inflicted on the station or its personnel. Simply not doing anything can be considered, AT WORST, Disruptive Behavior. A doctor hanging by the bar is not Dereliction nor Disruption- It is Dereliction if they decide to not do their job when a medical emergency is happening.</span></p>
</li>
</ul>
<p><br></p>
<ul>
<li style="list-style-type:disc;font-size:12pt;">
<p style="text-align: justify;"><span style="font-size:12pt;">In case of &ldquo;skeleton crew&rdquo;, as in there are very few people present and many of the roles are not covered, apply Dire Need generously. If, for example, someone really needs a chemical from Chemistry to do something related to their job, give them a pass for sneaking in to get it when no Medical Staff is present. This is all to favor roleplay after all.</span></p>
</li>
</ul>
</body>
</html>
"}
//gato pamphlets
/obj/item/book/lorebooks/welcome_to_gato
name = "Welcome to GATO Industrial Concern!"
icon_state = "bookwelcometogato"
desc = "A book stamped with GATO's feline logo. It serves the purpose of introducing employees to their current accommodations"
author = "A. Tenebrae"
title = "Welcome to Gato Industrial Concern!"
dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {list-style: none; margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
i {color: red; font-weight: bold;}
</style>
</head>
<body>
<h3 style="text-align: center;">Welcome to GATO Industrial Concern!</h3>
<hr>
Thank you, valued employee, for signing up to do work for GATO Industrial Concern. Whether you are working full-time or as a contractor for us, the contents within this little guide will help you get started on what you need to know!
<p>
<h2>Table of Contents...</h2>
<ol>
<li>What is GATO?
<li>The origin of GATO
<li>The current state of GATO
<li>GS13: Current development projects
</ol>
<p>
<hr>
<h1><u>Chapter 1</u></h1>
<h2>What is GATO? </h2>
<p>
GATO Industrial Concern is a corporation that operates in every sector known to all sapients. Agriculture, luxurious goods, R&D, pharmaceuticals- if it exists, we make it! Your current employment is upon a....: <p>
GENERAL STATION
<p>
Lucky you! A General Station is one that does not specialize in any particular type of production, and profits off of whatever it can manage to export. You've heard us! So long as the crew can attain profitable goods and ship it off to Central Command, you're doing your job! Here at Gato, we understand how autonomy for stations can improve both the conditions of workers and stimulate both creativity and innovation. As a result, we have permitted you to have nearly free reign over your activities, far from bureaucracy and regulation. That's much better than Nanotrasen, right?
<p>
<hr>
<h1><u>Chapter 2</u></h1>
<h2>The origin of GATO</h2>
<p>
Gato's story begins around the beginning of the 22nd century. It was a truly hard time, indeed! Between the troublesome and expensive startup process of making a small business, and the crushing weight of bigger corporations, one would think that setting up a business was financial suicide. But our founder,
<i>~~-`11@#\[ERROR\]</i>
, thought otherwise! So, GatoMart was founded, and we were instantly known for our creativity. Cute designs and friendly service built us the profit and recognition we needed to expand! And expand we did, taking on more and more corporations under our wing until we became the way we are today. Now, you can find Gato products all across the galaxy, ranging from simple things like cheese slices to more complex heavy artillery platforms! Isn't it grand to participate in maintaining such an awesome corporation like ours?
<p>
<hr>
<h1><u>Chapter 3</u></h1>
<h2>The current state of Gato</h2>
<p>
Many people have begun to circulate bad rumors that Gato is beginning to decline. Dear employees, as honest, loving, and trustworthy employers, we must deny those claims! The Syndicate does not pose much of a threat, and we have continued to profit despite the odds! So do not fear, neither your wages nor your employment are currently at risk. We would never think of doing something that would cause such anguish to the members of our beloved company! Perhaps it is time to go onto a more pleasant topic... how the corporate hierarchy works! At the bottom, we have common workers, above that are your Department Heads, and above that is your Captain! And your Captain answers to our Central Command teams, who are subordinate to the Head of Central Command, who reports to the Branch Manager, who answers to the Executive Officers, who answer to the CEO(Chief Executive Officer!), who answers to the Board of Directors. The Board of Directors equally listens to the input of our most trusted shareholders, and the Head of the Board!
<p>
<h1><u>Chapter 4</u></h1>
<h2>GS13: Current development projects</h2>
<p>
(GS13 SECTOR PRINT EXCLUSIVE SECTION) As an employee of our thirteenth General Station, you've chosen (or have been chosen) to become a pioneer in some of our R&D projects! GS13 has been located in a relatively peaceful area of one of the rim-systems, home to immensely rare mineral known as "Calorite", exclusive to this sector! You'll get a chance to make your name in history by helping us furthen our knowledge of this strange material. Additionally, please be aware of employee shortages: GS13's location makes it a challenge to properly deliver supplies, but GATO assures you - you have nothing to worry about!
<p>
Got it? Good! Now you understand all that you might need to know about Gato Industrial Concern!
<p>
<hr>
</body>
</html>
"}
@@ -0,0 +1,29 @@
/obj/effect/spawner/chocoslime_delivery
name = "choco slime delivery"
icon = 'GainStation13/icons/mob/candymonster.dmi'
icon_state = "a_c_slime"
var/announcement_time = 2
/obj/effect/spawner/chocoslime_delivery/Initialize(mapload)
..()
var/turf/T = get_turf(src)
new /mob/living/simple_animal/hostile/feed/chocolate_slime(T)
new /obj/effect/temp_visual/gravpush(T)
playsound(T, 'sound/items/party_horn.ogg', 50, 1, -1)
message_admins("A choco slime has been delivered to [ADMIN_VERBOSEJMP(T)].")
log_game("A choco slime has been delivered to [AREACOORD(T)]")
var/message = "Attention [station_name()], we have entrusted you with a research specimen in [get_area_name(T, TRUE)]. Remember to follow all safety precautions when dealing with the specimen."
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(addtimer), CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(print_command_report), message), announcement_time))
return INITIALIZE_HINT_QDEL
// spawner object used for mapping
/obj/effect/spawner/lootdrop/fiftypercent_chocoslimespawn
name = "50% Chocolate Slime Spawn"
loot = list(
/obj/item/reagent_containers/food/snacks/chocolatebar = 70,
/obj/effect/spawner/chocoslime_delivery = 30)
@@ -0,0 +1,47 @@
/datum/design/arcd
name = "Advanced Rapid Construction Device (ARCD)"
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly. This model works at a distance."
id = "arcd_design"
build_type = PROTOLATHE
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT, MAT_DIAMOND = 500, MAT_BLUESPACE = 500) // costs more than what it did in the autolathe, this one comes loaded.
build_path = /obj/item/construction/rcd/arcd
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/techweb_node/blue_construct
id = "blue_construct"
display_name = "Bluespace Construction"
description = "Augument rapid construction designs using bluespace tech for ranged operations"
prereq_ids = list("adv_engi", "adv_bluespace")
design_ids = list("arcd_design")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7000)
export_price = 7000
/obj/item/borg/upgrade/arcd
name = "cyborg ARCD"
desc = "A cybord RCG upgrade module to an ARCD model."
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = /obj/item/robot_module/engineering
/obj/item/borg/upgrade/arcd/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/construction/rcd/arcd/S = new(R.module)
R.module.basic_modules += S
R.module.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/arcd/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
var/obj/item/construction/rcd/arcd/S = locate() in R.module
R.module.remove_module(S, TRUE)
/datum/design/borg_arcd
name = "Cyborg ARCD"
id = "borg_arcd"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/arcd
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT, MAT_DIAMOND = 500, MAT_BLUESPACE = 500)
construction_time = 100
category = list("Cyborg Upgrade Modules")
@@ -0,0 +1,134 @@
/obj/item/implant/docile
name = "docility implant"
activated = FALSE
/// What fatness level does the target need to be for the implant to work?
var/required_fatness = FATNESS_LEVEL_BLOB
/// What traits do we want to give the implanted mob?
var/list/traits_list = list(
TRAIT_WEIGHT_LOSS_IMMUNE,
TRAIT_PACIFISM,
TRAIT_CLUMSY,
TRAIT_FAT_GOOD,
TRAIT_HEAVY_SLEEPER,
TRAIT_DOCILE,
)
/obj/item/implant/docile/can_be_implanted_in(mob/living/target)
var/mob/living/carbon/human/target_human = target
if(!istype(target_human) || (target_human.fatness_real < required_fatness))
return FALSE
if(HAS_TRAIT(target_human, TRAIT_DOCILE))
return FALSE //They probably already have an implant, they likely don't need this.
return target?.client?.prefs?.fatness_vulnerable
/obj/item/implant/docile/implant(mob/living/target, mob/user, silent = FALSE)
. = ..()
if(!.)
return
var/mob/living/carbon/human/target_human = target
if(!istype(target_human))
return
for(var/trait in traits_list)
ADD_TRAIT(target, trait, src)
target_human.nutri_mult += 1
return TRUE
/obj/item/implant/docile/removed(mob/living/source, silent = FALSE, special = 0)
. = ..()
if(!.)
return
var/mob/living/carbon/human/target_human = source
if(!istype(target_human))
return
for(var/trait in traits_list)
REMOVE_TRAIT(target_human, trait, src)
target_human.nutri_mult -= 1
return TRUE
/obj/item/implant/docile/livestock
name = "livestock implant"
traits_list = list(
TRAIT_WEIGHT_LOSS_IMMUNE,
TRAIT_PACIFISM,
TRAIT_CLUMSY,
TRAIT_FAT_GOOD,
TRAIT_HEAVY_SLEEPER,
TRAIT_DOCILE,
TRAIT_LIVESTOCK,
TRAIT_NO_MISC,
TRAIT_NORUNNING,
)
/// What is the name of the mob before we change it?
var/stored_name = ""
/// What name do we want to give the mob before adding the randomized number
var/name_to_give = "Livestock"
/// How much do we want to modifiy the productivity stats of the mob's current sex organs by?
var/productivity_mult = 4
/obj/item/implant/docile/livestock/can_be_implanted_in(mob/living/target)
. = ..()
if(!.)
return FALSE
return target?.client?.prefs?.extreme_fatness_vulnerable
/obj/item/implant/docile/livestock/implant(mob/living/target, mob/user, silent)
. = ..()
if(!.)
return
var/mob/living/carbon/human/target_human = target
stored_name = target_human.real_name
var/new_name = "[name_to_give] ([rand(0,999)])"
target_human.real_name = new_name
target_human.name = new_name
if(target_human?.getorganslot("testicles"))
var/obj/item/organ/genital/testicles/balls = target_human?.getorganslot("testicles")
balls.fluid_mult = balls.fluid_mult * productivity_mult
balls.fluid_max_volume = balls.fluid_max_volume * productivity_mult
if(target_human?.getorganslot("breasts"))
var/obj/item/organ/genital/breasts/boobs = target_human?.getorganslot("breasts")
boobs.fluid_mult = boobs.fluid_mult * productivity_mult
boobs.fluid_max_volume = boobs.fluid_max_volume * productivity_mult
/obj/item/implant/docile/livestock/removed(mob/living/source, silent, special)
. = ..()
if(!.)
return FALSE
var/mob/living/carbon/human/target_human = source
target_human.real_name = stored_name
target_human.name = stored_name
if(target_human?.getorganslot("testicles"))
var/obj/item/organ/genital/testicles/balls = target_human?.getorganslot("testicles")
balls.fluid_mult = balls.fluid_mult / productivity_mult
balls.fluid_max_volume = balls.fluid_max_volume / productivity_mult
if(target_human?.getorganslot("breasts"))
var/obj/item/organ/genital/breasts/boobs = target_human?.getorganslot("breasts")
boobs.fluid_mult = boobs.fluid_mult / productivity_mult
boobs.fluid_max_volume = boobs.fluid_max_volume / productivity_mult
/obj/item/implantcase/docile
name = "implant case - 'Docility'"
desc = "A glass case containing a docility implant. Used to make those at high weights docile."
imp_type = /obj/item/implant/docile
/obj/item/implantcase/docile/livestock
name = "implant case - 'Livestock'"
desc = "A glass case containing a livestock implant. Functions similar to the docility implant, but changes the implantee's name and makes them even more helpless. cannot be combined with the docility implant."
imp_type = /obj/item/implant/docile/livestock
@@ -0,0 +1,48 @@
/obj/item/storage/bag/tray/holding
name = "serving tray of holding"
desc = "A tray for food, now featuring bluesapce technology. Don't ask."
/obj/item/storage/bag/tray/holding/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.max_combined_w_class = INFINITY
STR.max_items = 50
/datum/design/tray_holding
name = "Serving Tray of Holding"
desc = "A serving tray for food, now somehow using bluespace to hold more stuff."
id = "tray_holding"
build_type = PROTOLATHE
materials = list(MAT_GOLD = 250, MAT_URANIUM = 500)
build_path =/obj/item/storage/bag/tray/holding
category = list("Bluespace Designs")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/obj/item/borg/upgrade/tray_hold
name = "cyborg tray of holding"
desc = "A tray of holding replacement for service borg's tray."
icon_state = "cyborg_upgrade3"
require_module = 1
module_type = /obj/item/robot_module/butler
/obj/item/borg/upgrade/tray_hold/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/storage/bag/tray/holding/S = new(R.module)
R.module.basic_modules += S
R.module.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/tray_hold/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
var/obj/item/storage/bag/tray/holding/S = locate() in R.module
R.module.remove_module(S, TRUE)
/datum/design/borg_tray_hold
name = "Cyborg Tray of Holding"
id = "borg_tray_hold"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/tray_hold
materials = list(MAT_GOLD = 250, MAT_URANIUM = 500)
construction_time = 100
category = list("Cyborg Upgrade Modules")
+37
View File
@@ -0,0 +1,37 @@
/proc/playsound_prefed(atom/source, soundin, pref, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, soundenvwet = -10000, soundenvdry = 0)
if(isarea(source))
throw EXCEPTION("playsound(): source is an area")
return
var/turf/turf_source = get_turf(source)
if (!turf_source)
return
//allocate a channel if necessary now so its the same for everyone
channel = channel || open_sound_channel()
// Looping through the player list has the added bonus of working for mobs inside containers
var/sound/S = sound(get_sfx(soundin))
var/maxdistance = (world.view + extrarange)
var/z = turf_source.z
var/list/listeners = SSmobs.clients_by_zlevel[z]
if(!ignore_walls) //these sounds don't carry through walls
listeners = listeners & hearers(maxdistance,turf_source)
for(var/P in listeners)
var/mob/M = P
if(!M.client)
continue
if((!M.client?.prefs.cit_toggles & pref))
continue
if(get_dist(M, turf_source) <= maxdistance)
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
for(var/P in SSmobs.dead_players_by_zlevel[z])
var/mob/M = P
if(!M.client)
continue
if((!M.client?.prefs.cit_toggles & pref))
continue
if(get_dist(M, turf_source) <= maxdistance)
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
+27
View File
@@ -0,0 +1,27 @@
// /turf/closed
// layer = CLOSED_TURF_LAYER
// opacity = 1
// density = TRUE
// blocks_air = 1
// rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
// rad_insulation = RAD_MEDIUM_INSULATION
// leaving this helper for remembering vars - Sono
///////////////////////////////// GS13 CLOSED TURFS ///////////////////////////////
/turf/closed/indestructible/candy
name = "Candy wall"
desc = "Despite being made out of mere candy, this wall is harder than stone!"
icon = 'Gainstation13/icons/turf/wall_candy.dmi'
icon_state = "candywall"
/turf/closed/indestructible/chocolate
name = "Chocolate wall"
desc = "Somehow, it doesn't melt at all..."
icon = 'Gainstation13/icons/turf/wall_candy.dmi'
icon_state = "choco_wall1"
+50
View File
@@ -0,0 +1,50 @@
// /turf/open
// plane = FLOOR_PLANE
// var/slowdown = 0 //negative for faster, positive for slower
// var/postdig_icon_change = FALSE
// var/postdig_icon
// var/wet
// var/footstep = null
// var/barefootstep = null
// var/clawfootstep = null
// var/heavyfootstep = null
// leaving this helper for remembering vars - Sono
///////////////////////////////// GS13 OPEN TURFS ///////////////////////////////
/turf/open/indestructible/chocolate
name = "chocolate floor"
desc = "A rather tasty floor, hopefully it does not ruin your shoes."
icon = 'Gainstation13/icons/turf/floor_candy.dmi'
icon_state = "choclit_2"
/turf/open/indestructible/bubblegum
name = "bubblegum floor"
desc = "A rather tasty floor, hopefully it does not ruin your shoes."
icon = 'Gainstation13/icons/turf/floor_candy.dmi'
icon_state = "floor_pinkgum"
/turf/open/candyfloor
name = "candy grass"
desc = "This weird grass smells of cinnamon and liquorice."
icon = 'Gainstation13/icons/turf/floor_candy.dmi'
icon_state = "candyfloor"
/turf/open/chocolateriver
gender = PLURAL
name = "liquid chocolate"
desc = "This is probably used for some kind of huge fountain."
icon = 'Gainstation13/icons/turf/floor_candy.dmi'
icon_state = "chocwater"
slowdown = 1
bullet_sizzle = TRUE
bullet_bounce_sound = null //needs a splashing sound one day.
footstep = FOOTSTEP_WATER
barefootstep = FOOTSTEP_WATER
clawfootstep = FOOTSTEP_WATER
heavyfootstep = FOOTSTEP_WATER
@@ -0,0 +1,164 @@
/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(mapload)
. = ..()
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)
src.visible_message("<span class='alert'>The [src] buzzes. It needs someone inside.</span>")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
return PROCESS_KILL
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)
src.visible_message("<span class='alert'>The [src] buzzes and expels anyone inside!.</span>")
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(P.tool_behaviour == TOOL_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()
. = ..()
STOP_PROCESSING(SSobj, src)
/obj/machinery/power/adipoelectric_generator/close_machine()
. = ..()
if(occupant && anchored && !panel_open)
add_fingerprint(occupant)
START_PROCESSING(SSobj, src)
else
src.visible_message("<span class='alert'>[src] needs to be anchored to a working wire and have a person going inside!</span>")
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/machinery/power/adipoelectric_generator/examine(mob/user)
. = ..()
if(is_operational())
. += "<span class='notice'>[src]'s show it can produce <b>[conversion_rate * laser_modifier]W</b> per adipose unit, taking in <b>[max_fat]</b> max each time.</span>"
else
. += "<span class='notice'><b>[src]'s display is currently offline.</b></span>"
/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,167 @@
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
var/datum/powernet/PN
/obj/machinery/adipoelectric_transformer/Initialize(mapload)
. = ..()
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)
src.visible_message("<span class='alert'>[src] buzzes. Seems like it's not attached to a working power net.</span>")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
return PROCESS_KILL
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 TRUE
/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)
src.visible_message("<span class='alert'>[src] emits ominous cracking noises!</span>")
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
src.visible_message("<span class='alert'>[src] buzzes. There must be another a person going in an no other transformer active in the area.</span>")
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/machinery/adipoelectric_transformer/examine(mob/user)
. = ..()
if(is_operational() && attached)
if(PN)
if(lastprocessed)
. += "<span class='notice'>[src]'s last reading on display was <b>[lastprocessed * recharge_speed]</b> adipose units.</span>"
else
. += "<span class='notice'>[src] has no last reading.</span>"
else
. += "<span class='notice'>[src]'s display states 'ERROR'. There must be something wrong with the power.</b></span>"
else
. += "<span class='notice'><b>[src]'s display is currently offline.</b></span>"
/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
@@ -0,0 +1,31 @@
/obj/machinery/porta_turret/fattening
name = "Fatoray Turret"
installation = null
always_up = 1
use_power = NO_POWER_USE
has_cover = 0
scan_range = 9
req_access = list(ACCESS_SYNDICATE)
mode = TURRET_LETHAL
lethal_projectile = /obj/item/projectile/beam/fattening
lethal_projectile_sound = 'sound/weapons/laser.ogg'
icon_state = "turretCover"
base_icon_state = "standard"
faction = list(ROLE_SYNDICATE)
desc = "A laser turret with calorite focusing lens."
/obj/machinery/porta_turret/fattening/heavy
name = "Heavy Fatoray Turret"
lethal_projectile = /obj/item/projectile/beam/fattening/cannon
shot_delay = 30
/obj/machinery/porta_turret/fattening/ComponentInitialize()
. = ..()
AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
/obj/machinery/porta_turret/fattening/setup()
return
/obj/machinery/porta_turret/fattening/assess_perp(mob/living/carbon/human/perp)
return 10 //fattening turrets shoot everything except the syndicate
@@ -0,0 +1,94 @@
/obj/machinery/iv_drip/feeding_tube
name = "\improper Feeding tube"
desc = "Originally meant to automatically feed cattle and farm animals, this model was repurposed for more... personal usage."
icon = 'GainStation13/icons/obj/feeding_tube.dmi'
icon_state = "feeding_tube"
var/static/list/food_containers = typecacheof(list(/obj/item/reagent_containers/food,
/obj/item/reagent_containers/glass,))
attachment_point = "tube"
/obj/machinery/iv_drip/feeding_tube/update_icon()
if(attached)
if(mode)
icon_state = "injecting"
else
if(mode)
icon_state = "injectidle"
cut_overlays()
if(beaker)
if(attached)
add_overlay("beakeractive")
else
add_overlay("beakeridle")
if(beaker.reagents.total_volume)
var/mutable_appearance/filling_overlay = mutable_appearance('GainStation13/icons/obj/feeding_tube.dmi', "reagent")
var/percent = round((beaker.reagents.total_volume / beaker.volume) * 100)
switch(percent)
if(0 to 9)
filling_overlay.icon_state = "reagent0"
if(10 to 24)
filling_overlay.icon_state = "reagent10"
if(25 to 49)
filling_overlay.icon_state = "reagent25"
if(50 to 74)
filling_overlay.icon_state = "reagent50"
if(75 to 79)
filling_overlay.icon_state = "reagent75"
if(80 to 90)
filling_overlay.icon_state = "reagent80"
if(91 to INFINITY)
filling_overlay.icon_state = "reagent100"
filling_overlay.color = mix_color_from_reagents(beaker.reagents.reagent_list)
add_overlay(filling_overlay)
/obj/machinery/iv_drip/feeding_tube/process()
if(!attached)
return PROCESS_KILL
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
to_chat(attached, "<span class='userdanger'>The feeding hose is yanked out of you!</span>")
update_icon()
return PROCESS_KILL
if(beaker)
if(mode)
if(beaker.reagents.total_volume)
var/transfer_amount = 5
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
update_icon()
else if(!beaker.reagents.total_volume && istype(beaker, /obj/item/reagent_containers/food))
qdel(beaker)
beaker = null
if(attached)
attached = null
update_icon()
return PROCESS_KILL
/obj/machinery/iv_drip/feeding_tube/attackby(obj/item/W, mob/user, params)
if(is_type_in_typecache(W, food_containers))
if(beaker)
to_chat(user, "<span class='warning'>There is already a reagent container loaded!</span>")
return
if(!user.transferItemToLoc(W, src))
return
beaker = W
to_chat(user, "<span class='notice'>You attach [W] to [src].</span>")
user.log_message("attached a [W] to [src] at [AREACOORD(src)] containing ([beaker.reagents.log_list()])", LOG_ATTACK)
add_fingerprint(user)
update_icon()
return
else
return FALSE
//it sure is a solution.
/obj/machinery/iv_drip/feeding_tube/toggle_mode()
return FALSE
@@ -0,0 +1,15 @@
/obj/machinery/quantumpad/supply_only
name = "supply pad"
desc = "A modified version of the quantum pad, only able to teleport supplies and livestock."
circuit = /obj/item/circuitboard/machine/quantumpad/supply_only
/obj/machinery/quantumpad/supply_only/check_mob_teleportability(mob/living/mob_to_check)
if(istype(mob_to_check, /mob/living/simple_animal))
return TRUE
return HAS_TRAIT(mob_to_check, TRAIT_LIVESTOCK)
/obj/item/circuitboard/machine/quantumpad/supply_only
name = "Supply Pad (Machine Board)"
build_path = /obj/machinery/quantumpad/supply_only
@@ -0,0 +1,248 @@
/obj/machinery/abductor/feeder_console
name = "feeder console"
desc = "You were into feeding enough that you managed to reverse-engineer alien technology to suit your goals, Amazing."
icon = 'icons/obj/abductor.dmi'
icon_state = "console"
density = TRUE
team_number = 27 // 6(F) + 1(A) + 20(T) :3
/// What pad is linked with the console?
var/obj/machinery/abductor/pad/pad
/// What camera console is linked with the console?
var/obj/machinery/computer/camera_advanced/abductor/camera
/// What abductor gizmo is linked with the console?
var/obj/item/abductor/gizmo/gizmo
/// The current scale linked with the console
var/obj/structure/scale/credits/linked_scale
/// How much of each goodie have we purchased?
var/list/buy_counts = list()
/obj/machinery/abductor/feeder_console/attack_hand(mob/user)
. = ..()
if(.)
return
user.set_machine(src)
var/dat = ""
dat += "<H3> FeederSoft 3000 </H3>"
var/credits = linked_scale?.credits
dat += "Gear Credits: [credits] <br>"
dat += "<b>Transfer credits in exchange for supplies:</b><br>"
for(var/goodie in subtypesof(/datum/feeders_den_goodie))
var/datum/feeders_den_goodie/temp_goodie = new goodie()
dat += "<a href='?src=[REF(src)];dispense=[goodie]'>[temp_goodie.name] (Cost: [temp_goodie.credit_cost])</A><br>"
qdel(temp_goodie)
if(pad)
dat += "<span class='bad'>Emergency Teleporter System.</span>"
dat += "<span class='bad'>Consider using primary observation console first.</span>"
dat += "<a href='?src=[REF(src)];teleporter_send=1'>Activate Teleporter</A><br>"
if(gizmo && gizmo.marked)
dat += "<a href='?src=[REF(src)];teleporter_retrieve=1'>Retrieve Mark</A><br>"
else
dat += "<span class='linkOff'>Retrieve Mark</span><br>"
else
dat += "<span class='bad'>NO TELEPAD DETECTED</span></br>"
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
popup.set_content(dat)
popup.open()
/obj/machinery/abductor/feeder_console/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
if(href_list["teleporter_send"])
TeleporterSend()
if(href_list["dispense"])
var/datum_path = href_list["dispense"]
var/datum/feeders_den_goodie/goodie_datum = new datum_path()
var/price = goodie_datum.credit_cost
var/item_path = goodie_datum.item_to_dispense
if(!isnull(goodie_datum.initial_stock) && buy_counts[goodie_datum.name] && (buy_counts[goodie_datum.name] >= goodie_datum.initial_stock))
say("Unable to purchase more!")
return FALSE
if(!Dispense(item_path, price))
return FALSE
if(buy_counts[goodie_datum.name] == null)
buy_counts[goodie_datum.name] = 0
buy_counts[goodie_datum.name] += 1
qdel(goodie_datum)
updateUsrDialog()
/obj/machinery/abductor/feeder_console/proc/TeleporterRetrieve()
if(pad && gizmo && gizmo.marked)
pad.Retrieve(gizmo.marked)
/obj/machinery/abductor/feeder_console/proc/TeleporterSend()
if(pad)
pad.Send()
/obj/machinery/abductor/feeder_console/proc/SetDroppoint(turf/open/location,user)
if(!istype(location))
to_chat(user, "<span class='warning'>That place is not safe for the specimen.</span>")
return
if(pad)
pad.teleport_target = location
to_chat(user, "<span class='notice'>Location marked as test subject release point.</span>")
/obj/machinery/abductor/feeder_console/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD
/obj/machinery/abductor/feeder_console/LateInitialize()
if(!team_number)
return
for(var/obj/machinery/abductor/pad/found_pad in GLOB.machines)
if(found_pad.team_number == team_number)
pad = found_pad
break
for(var/obj/machinery/computer/camera_advanced/abductor/found_console in GLOB.machines)
if(found_console.team_number == team_number)
camera = found_console
found_console.console = src
/obj/machinery/abductor/feeder_console/proc/AddGizmo(obj/item/abductor/gizmo/G)
if(G == gizmo && G.console == src)
return FALSE
if(G.console)
G.console.gizmo = null
gizmo = G
G.console = src
return TRUE
/obj/machinery/abductor/feeder_console/proc/Dispense(obj/item/new_item, cost = 1)
if(!ispath(new_item))
return FALSE
if(!linked_scale?.credits || linked_scale.credits < cost)
say("Insufficent credits!")
return FALSE
linked_scale.credits -= cost
say("Incoming supply!")
var/drop_location = loc
if(pad)
flick("alien-pad", pad)
drop_location = pad.loc
new new_item(drop_location)
return TRUE
/obj/machinery/abductor/feeder_console/attackby(obj/item/used_tool, mob/user, params)
if(istype(used_tool, /obj/item/abductor/gizmo) && AddGizmo(used_tool))
to_chat(user, "<span class='notice'>You link the tool to the console.</span>")
return TRUE
return ..()
/obj/structure/scale/credits
name = "tracking scale"
desc = "A upgraded scale that tracks to weight of all of those that have stepped on it. Using this will add credits to the feeder console"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags_1 = NODECONSTRUCT_1
/// How much credits do we currently have?
var/credits = 0
/// How many credits are we going to reward per pound gained?
var/credits_per_fatness = 0.25
/// A list containing all of the people we've scanned and their maximum weight.
var/list/scanned_people = list()
/// What is the current team number?
var/team_number = 27
/// What is the maximum ammount of credits that can be gained per person?
var/maximum_credits = 1000 // A little bit over the fattness for blob.
/obj/structure/scale/credits/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD
/obj/structure/scale/credits/attackby(obj/item/used_tool, mob/user, params)
if(!used_tool.tool_behaviour == TOOL_WRENCH)
return ..()
anchored = !anchored
to_chat(user, "<span class='notice'>You [anchored ? "secure" : "unsecure"] \the [src].</span>")
used_tool.play_tool_sound(src)
return TRUE
/obj/structure/scale/credits/LateInitialize()
for(var/obj/machinery/abductor/feeder_console/found_console in GLOB.machines)
if(found_console.team_number != team_number)
continue
found_console.linked_scale = src
/obj/structure/scale/credits/weighperson(mob/living/carbon/human/fatty)
. = ..()
if(!istype(fatty))
return FALSE
var/credits_to_add = min((fatty.fatness * credits_per_fatness), maximum_credits)
var/credits_to_remove = 0
if(scanned_people[fatty])
if(scanned_people[fatty] >= maximum_credits)
return TRUE
credits_to_remove = scanned_people[fatty]
else
scanned_people[fatty] = 0
var/credit_total = max((credits_to_add - credits_to_remove), 0)
if(credit_total > 0)
say("[credit_total] credits have been deposited into the console.")
credits += credit_total
scanned_people[fatty] += credit_total
return TRUE
/obj/machinery/abductor/pad/feeder
team_number = 27
/obj/machinery/computer/camera_advanced/abductor/feeder
team_number = 27
vest_mode_action = null
vest_disguise_action = null
/obj/machinery/computer/camera_advanced/abductor/feeder/IsScientist(mob/living/carbon/human/H)
return TRUE
/obj/item/abductor/gizmo/feeder
mode = GIZMO_MARK
/obj/item/abductor/gizmo/feeder/ScientistCheck(mob/user)
return TRUE
/obj/item/abductor/gizmo/attack_self(mob/user)
return
/obj/item/abductor/gizmo/feeder/mark(atom/target, mob/living/user)
if(!ishuman(target))
return FALSE
if(target == marked)
to_chat(user, "<span class='notice'>You begin to teleport [target]...</span>")
if(!do_after(user, 45 SECONDS, target = target)) // You have to be standing still for a while
return FALSE
console?.pad.Retrieve(marked)
return TRUE
if(target == user)
marked = user
return TRUE
prepare(target,user)
return TRUE
@@ -0,0 +1,88 @@
/datum/feeders_den_goodie
/// What is the name of the goodie we want to buy?
var/name
/// How much credits does this cost to buy?
var/credit_cost = 0
/// How much stock of this can be bought? If this is null, infinite can be bought
var/initial_stock
/// What is the path of the item to dispense?
var/item_to_dispense
/datum/feeders_den_goodie/food_vendor_refill
name = "Food Vendor Refill"
credit_cost = 100
item_to_dispense = /obj/item/vending_refill/mealdor
/datum/feeders_den_goodie/gizmo
name = "Science Tool"
credit_cost = 120
item_to_dispense = /obj/item/abductor/gizmo/feeder
/datum/feeders_den_goodie/nutripump_turbo
name = "Nutri-Pump TURBO Autosurgeon"
credit_cost = 150
item_to_dispense = /obj/item/autosurgeon/nutripump_turbo
/datum/feeders_den_goodie/nutripump_turbo
name = "Mobility Nanite Core Autosurgeon"
credit_cost = 400
item_to_dispense = /obj/item/autosurgeon/fat_mobility
/datum/feeders_den_goodie/fatbeam_gun
name = "Fatbeam gun"
credit_cost = 400
item_to_dispense = /obj/item/gun/fatbeam
initial_stock = 2
/datum/feeders_den_goodie/grenade_weak
name = "Lipofier Grenade (Weak)"
credit_cost = 120
item_to_dispense = /obj/item/grenade/chem_grenade/lipoifier_weak
initial_stock = 6
/datum/feeders_den_goodie/grenade_strong
name = "Lipofier Grenade (Strong)"
credit_cost = 360
item_to_dispense = /obj/item/grenade/chem_grenade/lipoifier_strong
initial_stock = 3
/datum/feeders_den_goodie/chameleon
name = "Chameleon Kit"
credit_cost = 300
item_to_dispense = /obj/item/storage/box/syndie_kit/chameleon
initial_stock = 2
/datum/feeders_den_goodie/pie_cannon
name = "Banana Cream Pie Cannon"
credit_cost = 500
item_to_dispense = /obj/item/pneumatic_cannon/pie/selfcharge
initial_stock = 2
/datum/feeders_den_goodie/thermals
name = "Thermal Imaging Glasses"
credit_cost = 400
item_to_dispense = /obj/item/clothing/glasses/thermal/syndi
initial_stock = 2
/datum/feeders_den_goodie/reagent_gun
name = "Reagent Gun"
credit_cost = 500
item_to_dispense = /obj/item/gun/chem
/datum/feeders_den_goodie/protolathe
name = "R&D Kit"
credit_cost = 1500
item_to_dispense = /obj/item/storage/box/rndboards
initial_stock = 2
/datum/feeders_den_goodie/docility_implant
name = "Docility Implant"
credit_cost = 100
item_to_dispense = /obj/item/implantcase/docile
initial_stock = 5
/datum/feeders_den_goodie/docility_implant/livestock
name = "Livestock Implant"
credit_cost = 250
item_to_dispense = /obj/item/implantcase/docile/livestock
initial_stock = 5
+247
View File
@@ -0,0 +1,247 @@
GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/bridge, /area/crew_quarters, /area/maintenance, /area/security/prison, /area/holodeck, /area/security/vacantoffice, /area/space, /area/ruin, /area/lavaland, /area/awaymission, /area/centcom, /area/fatlab))
/mob/living/carbon
//Due to the changes needed to create the system to hide fatness, here's some notes:
// -If you are making a mob simply gain or lose weight, use adjust_fatness. Try to not touch the variables directly unless you know 'em well
// -fatness is the value a mob is being displayed and calculated as by most things. Changes to fatness are not permanent
// -fatness_real is the value a mob is actually at, even if it's being hidden. For permanent changes, use this one
//What level of fatness is the parent mob currently at?
var/fatness = 0
//The list of items/effects that are being added/subtracted from our real fatness
var/fat_hiders = list()
//The actual value a mob is at. Is equal to fatness if fat_hider is FALSE.
var/fatness_real = 0
//Permanent fatness, which sticks around between rounds
var/fatness_perma = 0
///At what rate does the parent mob gain weight? 1 = 100%
var/weight_gain_rate = 1
//At what rate does the parent mob lose weight? 1 = 100%
var/weight_loss_rate = 1
//Variable related to door stuckage code
var/doorstuck = 0
var/fullness = FULLNESS_LEVEL_HALF_FULL
var/fullness_reduction_timer = 0
var/burpslurring = 0
/**
* Adjusts the fatness level of the parent mob.
*
* * adjustment_amount - adjusts how much weight is gained or loss. Positive numbers add weight.
* * type_of_fattening - what type of fattening is being used. Look at the traits in fatness.dm for valid options.
* * ignore_rate - do we want to ignore the mob's weight gain/loss rate? This is only here for niche uses.
*/
/mob/living/carbon/proc/adjust_fatness(adjustment_amount, type_of_fattening = FATTENING_TYPE_ITEM, ignore_rate = FALSE)
if(!adjustment_amount || !type_of_fattening)
return FALSE
if(!HAS_TRAIT(src, TRAIT_UNIVERSAL_GAINER) && client?.prefs)
if(!check_weight_prefs(type_of_fattening))
return FALSE
var/amount_to_change = adjustment_amount
if(!ignore_rate)
if(adjustment_amount > 0)
amount_to_change = amount_to_change * weight_gain_rate
else
amount_to_change = amount_to_change * weight_loss_rate
fatness_real += amount_to_change
fatness_real = max(fatness_real, MINIMUM_FATNESS_LEVEL) //It would be a little silly if someone got negative fat.
if(client?.prefs?.max_weight) // GS13
fatness_real = min(fatness_real, (client?.prefs?.max_weight - 1))
fatness = fatness_real //Make their current fatness their real fatness
hiders_apply() //Check and apply hiders
perma_apply() //Check and apply for permanent fat
xwg_resize() //Apply XWG
return TRUE
/mob/living/carbon/fully_heal(admin_revive)
fatness = 0
fatness_real = 0
. = ..()
///Checks the parent mob's prefs to see if they can be fattened by the fattening_type
/mob/living/carbon/proc/check_weight_prefs(type_of_fattening = FATTENING_TYPE_ITEM)
if(HAS_TRAIT(src, TRAIT_UNIVERSAL_GAINER) && !client.prefs) //Comment this second part out
return TRUE
if(!client?.prefs || !type_of_fattening)
return FALSE
switch(type_of_fattening)
if(FATTENING_TYPE_ITEM)
if(!client?.prefs?.weight_gain_items)
return FALSE
if(FATTENING_TYPE_FOOD)
if(!client?.prefs?.weight_gain_food)
return FALSE
if(FATTENING_TYPE_CHEM)
if(!client?.prefs?.weight_gain_chems)
return FALSE
if(FATTENING_TYPE_WEAPON)
if(!client?.prefs?.weight_gain_weapons)
return FALSE
if(FATTENING_TYPE_MAGIC)
if(!client?.prefs?.weight_gain_magic)
return FALSE
if(FATTENING_TYPE_VIRUS)
if(!client?.prefs?.weight_gain_viruses)
return FALSE
if(FATTENING_TYPE_NANITES)
if(!client?.prefs?.weight_gain_nanites)
return FALSE
if(FATTENING_TYPE_WEIGHT_LOSS)
if(HAS_TRAIT(src, TRAIT_WEIGHT_LOSS_IMMUNE))
return FALSE
return TRUE
// THE FATNESS HIDING GUIDE!!!
// HOW 2 FATNESS HIDE
//Step 1) Grab a thing that will add or reduce fatness!
//Step 2) Give it a character.hider_add(src) and a character.hider_remove(src) depending on the conditions you want it to meet for which it will add or remove itself from messing with a character's fatness!
//Step 3) Give it a proc/fat_hide([character argument]), with a return that will give the amount to shift that character's fatness by!
//Step 4) There is no step 4, you did it bucko!
//Wanna see an example? Search for /obj/item/bluespace_belt !!!
/mob/living/carbon/proc/hider_add(hide_source)
if(!(hide_source in fat_hiders))
fat_hiders += hide_source
return TRUE
/mob/living/carbon/proc/hider_remove(hide_source)
if(hide_source in fat_hiders)
fat_hiders -= hide_source
return TRUE
/mob/living/carbon/proc/hiders_calc()
var/hiders_value = 0
for(var/hider in fat_hiders)
var/hide_values = hider:fat_hide(src)
if(!islist(hide_values))
hiders_value += hide_values
else
for(var/hide_value in hide_values)
hiders_value += hide_value
return hiders_value
/mob/living/carbon/proc/hiders_apply()
if(fat_hiders) //do we have any hiders active?
var/fatness_over = hiders_calc() //calculate the sum of all hiders
fatness = fatness + fatness_over //Then, make their current fatness the sum of their real plus/minus the calculated amount
if(client?.prefs?.max_weight) //Check their prefs
fatness = min(fatness, (client?.prefs?.max_weight - 1)) //And make sure it's not above their preferred max
/mob/living/carbon/proc/perma_apply()
if(fatness_perma > 0) //Check if we need to make calcs at all
fatness = fatness + fatness_perma //Add permanent fat to fatness
if(client?.prefs?.max_weight) //Check for max weight prefs
fatness = min(fatness, (client?.prefs?.max_weight - 1)) //Apply max weight prefs
/mob/living/carbon/proc/adjust_perma(adjustment_amount, type_of_fattening = FATTENING_TYPE_ITEM)
if(!client)
return FALSE
if(!client.prefs.weight_gain_permanent)
return FALSE
if(!adjustment_amount || !type_of_fattening)
return FALSE
if(!HAS_TRAIT(src, TRAIT_UNIVERSAL_GAINER) && client?.prefs)
if(!check_weight_prefs(type_of_fattening))
return FALSE
var/amount_to_change = adjustment_amount
if(adjustment_amount > 0)
amount_to_change = amount_to_change * weight_gain_rate
else
amount_to_change = amount_to_change * weight_loss_rate
fatness_perma += amount_to_change
fatness_perma = max(fatness_perma, MINIMUM_FATNESS_LEVEL)
if(client?.prefs?.max_weight) // GS13
fatness_perma = min(fatness_perma, (client?.prefs?.max_weight - 1))
/mob/living/carbon/human/handle_breathing(times_fired)
. = ..()
fatness = fatness_real
hiders_apply()
perma_apply()
xwg_resize()
/mob/living/carbon/proc/xwg_resize()
if(client?.prefs?.weight_gain_extreme && !normalized)
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)
if(xwg_size > RESIZE_BIG) //check if the size needs capping otherwise don't bother searching the list
if(!is_type_in_list(get_area(src), GLOB.uncapped_resize_areas)) //if the area is not int the uncapped whitelist and new size is over the cap
xwg_size = RESIZE_BIG
resize(xwg_size)
/proc/get_fatness_level_name(fatness_amount)
if(fatness_amount < FATNESS_LEVEL_FAT)
return "Normal"
if(fatness_amount < FATNESS_LEVEL_FATTER)
return "Fat"
if(fatness_amount < FATNESS_LEVEL_VERYFAT)
return "Fatter"
if(fatness_amount < FATNESS_LEVEL_OBESE)
return "Very Fat"
if(fatness_amount < FATNESS_LEVEL_MORBIDLY_OBESE)
return "Obese"
if(fatness_amount < FATNESS_LEVEL_EXTREMELY_OBESE)
return "Morbidly Obese"
if(fatness_amount < FATNESS_LEVEL_BARELYMOBILE)
return "Extremely Obese"
if(fatness_amount < FATNESS_LEVEL_IMMOBILE)
return "Barely Mobile"
if(fatness_amount < FATNESS_LEVEL_BLOB)
return "Immobile"
return "Blob"
/// Finds what the next fatness level for the parent mob would be based off of fatness_real.
/mob/living/carbon/proc/get_next_fatness_level()
if(fatness_real < FATNESS_LEVEL_FAT)
return FATNESS_LEVEL_FAT
if(fatness_real < FATNESS_LEVEL_FATTER)
return FATNESS_LEVEL_FATTER
if(fatness_real < FATNESS_LEVEL_VERYFAT)
return FATNESS_LEVEL_VERYFAT
if(fatness_real < FATNESS_LEVEL_OBESE)
return FATNESS_LEVEL_OBESE
if(fatness_real < FATNESS_LEVEL_MORBIDLY_OBESE)
return FATNESS_LEVEL_MORBIDLY_OBESE
if(fatness_real < FATNESS_LEVEL_EXTREMELY_OBESE)
return FATNESS_LEVEL_EXTREMELY_OBESE
if(fatness_real < FATNESS_LEVEL_BARELYMOBILE)
return FATNESS_LEVEL_BARELYMOBILE
if(fatness_real < FATNESS_LEVEL_IMMOBILE)
return FATNESS_LEVEL_IMMOBILE
if(fatness_real < FATNESS_LEVEL_BLOB)
return FATNESS_LEVEL_BLOB
return FATNESS_LEVEL_BLOB
/// How much real fatness does the current mob have to gain until they reach the next level? Return FALSE if they are maxed out.
/mob/living/carbon/proc/fatness_until_next_level()
var/needed_fatness = get_next_fatness_level() - fatness_real
needed_fatness = max(needed_fatness, 0)
return needed_fatness
+30
View File
@@ -0,0 +1,30 @@
/datum/quirk/fatrousal
name = "Adiposexual Response"
desc = "Your adipose tissue develops and shrinks depending on your arousal."
value = 0 //ERP quirk
gain_text = "<span class='notice'>Your body feels like it could grow at any moment.</span>"
lose_text = "<span class='notice'>The feeling of impending growth is gone...</span>"
category = CATEGORY_SEXUAL
mob_trait = TRAIT_FATROUSAL
/datum/quirk/fatrousal/add()
if(iscarbon(quirk_holder))
var/mob/living/carbon/C = quirk_holder
C.hider_add(src)
/datum/quirk/fatrousal/remove()
if(iscarbon(quirk_holder))
var/mob/living/carbon/C = quirk_holder
C.hider_remove(src)
/datum/quirk/fatrousal/proc/fat_hide(var/mob/living/carbon/user)
if(iscarbon(quirk_holder))
var/mob/living/carbon/C = quirk_holder
return C.getArousalLoss()*35
return FALSE
///mob/living/adjustArousalLoss(amount, updating_arousal=1)
// if(HAS_TRAIT(src, TRAIT_FATROUSAL))
// amount = amount * 0.2
// ..()
//
@@ -0,0 +1,27 @@
/obj/structure/trap/fattening
name = "fattening trap"
desc = "A trap that ensures you won't be stepping around for much longer."
icon = 'GainStation13/icons/obj/structure/traps.dmi'
icon_state = "trap-fattening"
var/fattening_amount = 250 // Using a variable incase we want to have a stronger version.
// This is at half of the power of the singe-use cannonshot fatray.
/obj/structure/trap/fattening/trap_effect(mob/living/carbon/crosser)
if(ishuman(crosser))
to_chat(crosser, "<span class='danger'><B>You feel heavier!</B></span>")
crosser.adjust_fatness(fattening_amount, FATTENING_TYPE_MAGIC)
/obj/structure/trap/belch
name = "belch trap"
desc = "A trap that forcefully releases all the air in your stomach."
icon = 'GainStation13/icons/obj/structure/traps.dmi'
icon_state = "trap-belching"
/obj/structure/trap/belch/trap_effect(mob/living/crosser)
if(crosser?.client?.prefs.weight_gain_chems)
to_chat(crosser, "<span class='danger'><B>You feel all of the air leave your stomach!</B></span>")
crosser.emote(pick("belch","burp"))
crosser.Knockdown(500)
@@ -0,0 +1,20 @@
/mob/living/carbon/can_buckle()
if(HAS_TRAIT(src, TRAIT_NO_BUCKLE))
return FALSE
return ..()
/datum/species/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self)
if(HAS_TRAIT(H, TRAIT_NO_BACKPACK) && slot == SLOT_BACK)
to_chat(H, "<span class='warning'>You are too fat to wear anything on your back.</span>")
return FALSE
if(!istype(I, /obj/item/clothing/under/color/grey/modular) && HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && slot == SLOT_W_UNIFORM)
to_chat(H, "<span class='warning'>You are too fat to wear [I].</span>")
return FALSE
if(HAS_TRAIT(H, TRAIT_NO_MISC) && (slot == SLOT_SHOES || slot == SLOT_GLOVES || slot == SLOT_WEAR_SUIT))
to_chat(H, "<span class='warning'>You are too fat to wear [I].</span>")
return FALSE
return ..()
+30
View File
@@ -0,0 +1,30 @@
///I'm trying my best allright
/mob/living/carbon/human
icon = 'GainStation13/icons/mob/fat.dmi'
var/hunger = 0
/mob/living/carbon/human/Life()
. = ..()
hunger = hunger + 1
switch(hunger)
if(0 to 10)
icon_state = "fat_m_body"
update_body()
//chubby
if(11 to 20)
icon_state = "obese_m_body"
update_body()
//fed
if(21 to 30)
icon_state = "mobese_m_body"
update_body()
//full
if(31 to 40)
icon_state = "imm_m_body"
update_body()
//fat
else
icon_state = "blob_m_body"
update_body()
//chungus
+100
View File
@@ -0,0 +1,100 @@
/datum/round_event_control/dessert_infestation
name = "Dessert Infestation"
typepath = /datum/round_event/dessert_infestation
weight = 6
max_occurrences = 3
min_players = 6
/datum/round_event/dessert_infestation
announceWhen = 100
var/static/list/dessert_station_areas_blacklist = typecacheof(/area/space,
/area/shuttle,
/area/mine,
/area/holodeck,
/area/ruin,
/area/hallway,
/area/hallway/primary,
/area/hallway/secondary,
/area/hallway/secondary/entry,
/area/engine/supermatter,
/area/engine/atmospherics_engine,
/area/engine/engineering/reactor_core,
/area/engine/engineering/reactor_control,
/area/ai_monitored/turret_protected,
/area/layenia/cloudlayer,
/area/asteroid/nearstation,
/area/science/server,
/area/science/explab,
/area/science/xenobiology,
/area/security/processing)
var/spawncount = 1
fakeable = FALSE
/datum/round_event/dessert_infestation/setup()
announceWhen = rand(announceWhen, announceWhen + 50)
spawncount = rand(4, 7)
/datum/round_event/dessert_infestation/announce(fake)
priority_announce("Unidentified lifesigns detected aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg')
/datum/round_event/dessert_infestation/start()
var/list/area/stationAreas = list()
var/list/area/eligible_areas = list()
for(var/area/A in world) // Get the areas in the Z level
if(A.z == SSmapping.station_start)
stationAreas += A
for(var/area/place in stationAreas) // first we check if it's a valid area
if(place.outdoors)
continue
if(place.areasize < 16)
continue
if(is_type_in_typecache(place, dessert_station_areas_blacklist))
continue
eligible_areas += place
for(var/area/place in eligible_areas) // now we check if there are people in that area
var/numOfPeople
for(var/mob/living/carbon/H in place)
numOfPeople++
break
if(numOfPeople > 0)
eligible_areas -= place
var/validFound = FALSE
var/list/turf/validTurfs = list()
var/area/pickedArea
while(!validFound || !eligible_areas.len)
pickedArea = pick_n_take(eligible_areas)
var/list/turf/t = get_area_turfs(pickedArea, SSmapping.station_start)
for(var/turf/thisTurf in t) // now we check if it's a closed turf, cold turf or occupied turf and yeet it
if(isopenturf(thisTurf))
var/turf/open/tempGet = thisTurf
if(tempGet.air.temperature <= T0C)
t -= thisTurf
continue
if(isclosedturf(thisTurf))
t -= thisTurf
else
for(var/obj/O in thisTurf)
if(O.density && !(istype(O, /obj/structure/table)))
t -= thisTurf
break
if(t.len >= spawncount) //Is the number of available turfs equal or bigger than spawncount?
validFound = TRUE
validTurfs = t
if(!eligible_areas.len)
message_admins("No eligible areas for spawning dessert mobs.")
return WAITING_FOR_SOMETHING
notify_ghosts("A group of feeder mobs has spawned in [pickedArea]!", source=pickedArea, action=NOTIFY_ATTACK, flashwindow = FALSE)
while(spawncount > 0 && validTurfs.len)
spawncount--
var/turf/pickedTurf = pick_n_take(validTurfs)
if(spawncount != 0)
var/spawn_type = /mob/living/simple_animal/hostile/feed/chocolate_slime
spawn_atom_to_turf(spawn_type, pickedTurf, 1, FALSE)
else
var/spawn_type = /mob/living/simple_animal/hostile/feed/chocolate_slime/creambeast
spawn_atom_to_turf(spawn_type, pickedTurf, 1, FALSE)
return SUCCESSFUL_SPAWN
@@ -0,0 +1,87 @@
/datum/quirk/metal_cruncher
name = "Metal Cruncher"
desc = "You can eat most minerals. Brush your teeth."
value = 0 //ERP quirk
gain_text = "<span class='notice'>You feel like you could eat steel.</span>"
lose_text = "<span class='notice'>Your teeth hurt too much...</span>"
category = CATEGORY_FOOD
mob_trait = TRAIT_METAL_CRUNCHER
/obj/item/stack
var/crunch_value = 0
/obj/item/stack/attack(mob/living/M, mob/living/user)
if(HAS_TRAIT(M, TRAIT_METAL_CRUNCHER))
if(crunch_value > 0)
if(M == user)
user.visible_message("<span class='notice'>[user] crunches on some of [src].</span>", "<span class='notice'>You crunch on some of [src].</span>")
else
M.visible_message("<span class='danger'>[user] attempts to feed some of [src] to [M].</span>", "<span class='userdanger'>[user] attempts to feed some of [src] to [M].</span>")
playsound(M,'sound/items/eatfood.ogg', rand(10,50), 1)
use(1)
M.nutrition += crunch_value
if(HAS_TRAIT(M, TRAIT_VORACIOUS))
M.changeNext_move(CLICK_CD_MELEE * 0.5)
return
. = ..()
/obj/item/stack/cable_coil
crunch_value = 2
/obj/item/stack/sheet/metal
crunch_value = 4
/obj/item/stack/rods
crunch_value = 2
/obj/item/stack/sheet/glass
crunch_value = 2
/obj/item/stack/sheet/rglass
crunch_value = 4
/obj/item/stack/sheet/plasmaglass
crunch_value = 12
/obj/item/stack/sheet/plasmarglass
crunch_value = 14
/obj/item/stack/sheet/titaniumglass
crunch_value = 27
/obj/item/stack/sheet/plastitaniumglass
crunch_value = 37
/obj/item/stack/sheet/plasteel
crunch_value = 14
/obj/item/stack/sheet/durathread
crunch_value = 10
/obj/item/stack/sheet/plastic
crunch_value = 2
/obj/item/stack/sheet/micro_bricks
crunch_value = 1
/obj/item/stack/sheet/cardboard
crunch_value = 1
/obj/item/stack/sheet/mineral/calorite
crunch_value = 100
/obj/item/stack/sheet/mineral/sandstone
crunch_value = 1
/obj/item/stack/sheet/mineral/uranium
crunch_value = 50
/obj/item/stack/sheet/mineral/plasma
crunch_value = 10
/obj/item/stack/sheet/mineral/gold
crunch_value = 20
/obj/item/stack/sheet/mineral/silver
crunch_value = 15
/obj/item/stack/sheet/mineral/titanium
crunch_value = 25
/obj/item/stack/sheet/mineral/plastitanium
crunch_value = 35
/obj/item/stack/sheet/mineral/adamantine
crunch_value = 75
/obj/item/stack/sheet/mineral/mythril
crunch_value = 75
/obj/item/stack/sheet/mineral/coal
crunch_value = 50
/obj/item/stack/sheet/mineral/wood
crunch_value = 4
/obj/item/stack/sheet/mineral/bamboo
crunch_value = 10
/obj/item/stack/sheet/mineral/shadoww
crunch_value = 15
/obj/item/stack/sheet/mineral/gmushroom
crunch_value = 15
/obj/item/stack/sheet/mineral/plaswood
crunch_value = 15
@@ -0,0 +1,53 @@
/mob/living/carbon
var/savekey
var/ckeyslot
/mob/living/carbon/proc/perma_fat_save(mob/living/carbon/character)
var/key = savekey
if(!key)
return FALSE
var/filename = "preferences.sav"
var/path = "data/player_saves/[key[1]]/[key]/[filename]"
var/savefile/S = new /savefile(path)
if(!path)
return FALSE
if(character.ckeyslot)
var/slot = character.ckeyslot
S.cd = "/character[slot]"
var/persi
S["weight_gain_persistent"] >> persi
if(persi)
WRITE_FILE(S["starting_weight"] , character.fatness_real)
var/perma
S["weight_gain_permanent"] >> perma
if(S["weight_gain_permanent"])
WRITE_FILE(S["permanent_fat"] , character.fatness_perma)
/*
/datum/preferences/proc/perma_fat_save(character)
if(iscarbon(character))
var/mob/living/carbon/C = character
if(!C.client.prefs.weight_gain_permanent && !C.client.prefs.weight_gain_persistent)
return FALSE
if(!path)
return FALSE
if(world.time < savecharcooldown)
if(istype(parent))
to_chat(parent, "<span class='warning'>You're attempting to save your character a little too fast. Wait half a second, then try again.</span>")
return FALSE
savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
var/savefile/S = new /savefile(path)
if(!S)
return FALSE
S.cd = "/character[default_slot]"
if(C.client.prefs.weight_gain_persistent)
WRITE_FILE(S["starting_weight"] , C.fatness_real)
if(C.client.prefs.weight_gain_permanent)
WRITE_FILE(S["permanent_fat"] , C.fatness_perma)
*/
+141
View File
@@ -0,0 +1,141 @@
/obj/effect/proc_holder/spell/targeted/touch/add_weight
name = "Fattening"
desc = "Channel fattening energy to your hand to fatten people with."
drawmessage = "You channel fattening energy into your hand."
dropmessage = "You let the fattening energy from your hand dissipate."
hand_path = /obj/item/melee/touch_attack/fattening
action_icon_state = "spell_default"
charge_max = 200
clothes_req = FALSE
/obj/effect/proc_holder/spell/targeted/touch/add_weight/transfer
name = "Weight transfer"
hand_path = /obj/item/melee/touch_attack/fattening/transfer
charge_max = 100
/obj/effect/proc_holder/spell/targeted/touch/add_weight/steal
name = "Weight steal"
hand_path = /obj/item/melee/touch_attack/fattening/steal
charge_max = 100
/obj/item/melee/touch_attack/fattening
name = "\improper fattening touch"
desc = "The calories from multiple donuts compressed into pure energy."
catchphrase = null
on_use_sound = 'sound/weapons/pulse.ogg'
icon = 'GainStation13/icons/obj/spells/spell_items.dmi'
icon_state = "add-hand"
///How much weight is added?
var/weight_to_add = 300
///What verb is used for the spell?
var/fattening_verb = "fattens"
///Is weight being transfered from the user to another mob?
/obj/item/melee/touch_attack/fattening/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || !iscarbon(target) || target == user)
return FALSE
var/mob/living/carbon/gainer = target
if(!gainer || !weight_to_add)
return FALSE
if(!gainer.adjust_fatness(weight_to_add, FATTENING_TYPE_MAGIC))
to_chat(user,"<span class='warning'[target] seems unaffected by [src]</span>")
return FALSE
gainer.visible_message("<span class='danger'>[user] [fattening_verb] [target]!</span>","<span class='userdanger'>[user] [fattening_verb] you!</span>")
return ..()
/obj/item/melee/touch_attack/fattening/transfer
name = "\improper weight transfer touch"
desc = "Your weight compressed into a fattening energy."
fattening_verb = "transfers weight to"
icon_state = "transfer-hand"
/obj/item/melee/touch_attack/fattening/transfer/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || !target || target == user)
return FALSE
if(weight_to_add > user.fatness_real || !user.adjust_fatness(-weight_to_add, FATTENING_TYPE_MAGIC))
to_chat(user, "<span class='warning'You don't have enough spare weight to transfer</span>")
return FALSE
return ..()
/obj/item/melee/touch_attack/fattening/steal
name = "\improper weight theft touch"
desc = "Energy that is eager to take weight."
fattening_verb = "steals weight from"
weight_to_add = -300
icon_state = "steal-hand"
/obj/item/melee/touch_attack/fattening/steal/afterattack(atom/target, mob/living/carbon/user, proximity)
var/mob/living/carbon/loser = target
if(!proximity || !iscarbon(target) || target == user)
return FALSE
if(loser.fatness < -weight_to_add)
to_chat(user, "<span class='warning'[loser] doesn't have enough spare weight to transfer</span>")
return FALSE
. = ..()
if(. != null && !.)
return FALSE
user.adjust_fatness(-weight_to_add, FATTENING_TYPE_MAGIC)
/obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps/fat
name = "Fat Traps!"
desc = "Summon a number of traps to fatten your enemies."
action_icon = 'GainStation13/icons/obj/structure/traps.dmi'
action_icon_state = "trap-fattening"
clothes_req = FALSE
summon_type = list(
/obj/structure/trap/fattening
)
summon_amt = 4
/obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps/fat/belch
name = "Belch Traps!"
desc = "Summon a number of traps to force your enemies to belch."
action_icon_state = "trap-belching"
summon_type = list(
/obj/structure/trap/belch
)
///Spellbooks
/obj/item/book/granter/spell/fattening
name = "fattening tome"
spell = /obj/effect/proc_holder/spell/targeted/touch/add_weight
spellname = "fattening"
icon = 'GainStation13/icons/obj/spells/spellbooks.dmi'
icon_state = "add_weight"
desc = "This book feels warm to the touch."
page_time = 10
/obj/item/book/granter/spell/fattening/transfer
name = "weight transfer tome"
spell = /obj/effect/proc_holder/spell/targeted/touch/add_weight/transfer
spellname = "weight transfer"
icon_state = "transfer_weight"
desc = "This book feels warm to the touch."
/obj/item/book/granter/spell/fattening/steal
name = "weight steal tome"
spell = /obj/effect/proc_holder/spell/targeted/touch/add_weight/steal
spellname = "weight steal"
icon_state = "steal_weight"
desc = "This book feels warm to the touch."
/obj/item/book/granter/spell/fattening/traps
name = "fattening trap tome"
spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps/fat
spellname = "fattening traps"
/obj/item/book/granter/spell/fattening/belch
name = "belch trap tome"
spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/the_traps/fat/belch
spellname = "belch traps"
+57
View File
@@ -0,0 +1,57 @@
/obj/item/gun/magic/wand/food
name = "Wand of Gluttony"
desc = "Summons delicious fattening foods"
icon = 'GainStation13/icons/obj/magic.dmi'
icon_state = "food_wand"
max_charges = 15
ammo_type = /obj/item/ammo_casing/magic/food
/obj/item/gun/magic/wand/food/overpowered //This is a more overpowered version of the item
name = "Strong wand of Gluttony"
max_charges = 100
ammo_type = /obj/item/ammo_casing/magic/food/strong
/obj/item/ammo_casing/magic/food
projectile_type = /obj/item/projectile/magic/food
/obj/item/ammo_casing/magic/food/strong
projectile_type = /obj/item/projectile/magic/food/strong
/obj/item/projectile/magic/food
name = "bolt of food"
pass_flags = PASSGLASS|PASSDOOR|PASSGRILLE
///What foods are able to be spawned by the wand?
var/list/spawnable_foods = list(
/obj/item/reagent_containers/food/snacks/burger/bigbite,
/obj/item/reagent_containers/food/snacks/donut/plain,
/obj/item/reagent_containers/food/snacks/donut/glaze,
/obj/item/reagent_containers/food/snacks/store/cake/cheese,
/obj/item/reagent_containers/food/snacks/store/cake/bscc,
/obj/item/reagent_containers/food/snacks/store/cake/bsvc,
/obj/item/reagent_containers/food/snacks/store/cake/chocolate,
/obj/item/reagent_containers/food/snacks/hotdog,
/obj/item/reagent_containers/food/snacks/pizza/margherita,
/obj/item/reagent_containers/food/snacks/pizza/meat,
)
///How much Lipoifier should be added to the spawned in food? Keep this at 10 maximum.
var/lipoifier_to_add = 5
/obj/item/projectile/magic/food/on_hit(atom/target, blocked)
. = ..()
var/turf/floor = get_turf(target)
if(!floor || iswallturf(floor))
return FALSE
var/food_to_spawn = pick(spawnable_foods)
var/obj/item/reagent_containers/food/snacks/spawned_food = new food_to_spawn(floor)
if(!spawned_food)
return FALSE
spawned_food.reagents.add_reagent(/datum/reagent/consumable/lipoifier, lipoifier_to_add)
return TRUE
/obj/item/projectile/magic/food/strong
name = "strong bolt of food"
lipoifier_to_add = 10
@@ -0,0 +1,93 @@
/datum/quirk/water_sponge
name = "Water Sponge"
desc = "You can hold lots of water in you! Careful with showers!"
value = 0 //ERP quirk
gain_text = "<span class='notice'>You feel absorbant.</span>"
lose_text = "<span class='notice'>You don't feel absorbant anymore.</span>"
category = CATEGORY_FOOD
mob_trait = TRAIT_WATER_SPONGE
/datum/reagent/water/on_mob_add(mob/living/L, amount)
if(HAS_TRAIT(L, TRAIT_WATER_SPONGE))
if(iscarbon(L))
var/mob/living/carbon/C = L
C.hider_add(src)
. = ..()
/datum/reagent/water/on_mob_delete(mob/living/L)
if(HAS_TRAIT(L, TRAIT_WATER_SPONGE))
if(iscarbon(L))
var/mob/living/carbon/C = L
C.hider_remove(src)
. = ..()
/datum/reagent/water/reaction_mob(mob/living/M, method, reac_volume)
. = ..()
if(HAS_TRAIT(M, TRAIT_WATER_SPONGE))
if(method == TOUCH)
M.reagents.add_reagent(/datum/reagent/water, reac_volume/2)
if(method == VAPOR)
M.reagents.add_reagent(/datum/reagent/water, reac_volume/3)
/datum/reagent/water/proc/fat_hide(mob/living/carbon/user)
return volume * 3.5
/obj/machinery/shower/process()
..()
for(var/atom/movable/AM in loc)
if(iscarbon(AM))
if(HAS_TRAIT(AM, TRAIT_WATER_SPONGE))
var/mob/living/carbon/L = AM
L.reagents.add_reagent(/datum/reagent/water, 3)
/mob/living/carbon/proc/water_check(datum/gas_mixture/breath)
if(HAS_TRAIT(src, TRAIT_WATER_SPONGE))
if(breath)
if(breath.gases)
var/breath_gases = breath.gases
if(breath_gases[/datum/gas/water_vapor])
var/H2O_pp = breath.get_breath_partial_pressure(breath_gases[/datum/gas/water_vapor])
reagents.add_reagent(/datum/reagent/water, H2O_pp/10)
breath_gases[/datum/gas/water_vapor] -= H2O_pp
/obj/structure/sink
var/mob/living/attached
/obj/structure/sink/MouseDrop(mob/living/target)
. = ..()
if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE) || !isliving(target))
return
if(attached)
visible_message("<span class='warning'>[attached] is detached from [src].</span>")
attached = null
return
if(Adjacent(target) && usr.Adjacent(target))
usr.visible_message("<span class='warning'>[usr] attaches [target] to [src].</span>", "<span class='notice'>You attach [target] to [src].</span>")
add_fingerprint(usr)
attached = target
START_PROCESSING(SSobj, src)
/obj/structure/sink/process()
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
to_chat(attached, "<span class='userdanger'>[attached] is ripped from the sink!</span>") // GS13
attached = null
return PROCESS_KILL
if(attached)
playsound(attached, 'sound/vore/pred/swallow_02.ogg', rand(10,50), 1)
attached.reagents.add_reagent(/datum/reagent/water, 5)
else
return PROCESS_KILL
/obj/structure/sink/attack_hand(mob/living/user)
if(attached)
visible_message("[attached] is detached from [src]")
attached = null
return
/obj/machinery/pool/controller/process_reagents()
for(var/turf/open/pool/W in linked_turfs)
for(var/mob/living/carbon/human/swimee in W)
if(HAS_TRAIT(swimee, TRAIT_WATER_SPONGE))
swimee.reagents.add_reagent(/datum/reagent/water, 5)
..()
+114
View File
@@ -0,0 +1,114 @@
/datum/quirk/web_weaving
name = "Web Weaver"
desc = "for whatever reason, you are able to weave silk webs, albeit to a limited extent"
value = 0 //ERP quirk
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_action1
var/datum/action/innate/make_web/linked_action2
/datum/quirk/web_weaving/post_add()
linked_action1 = new
linked_action1.Grant(quirk_holder)
linked_action2 = new
linked_action2.Grant(quirk_holder)
/datum/quirk/web_weaving/remove()
linked_action1.Remove(quirk_holder)
linked_action2.Remove(quirk_holder)
return ..()
/datum/action/innate/wrap_target
name = "wrap"
desc = "encases a humanoid in a web cocoon."
icon_icon = 'GainStation13/icons/obj/clothing/web.dmi'
button_icon_state = "web_bindings"
background_icon_state = "bg_alien"
/datum/action/innate/wrap_target/Activate()
var/mob/living/carbon/user = owner
if(!user || !ishuman(user))
return FALSE
var/mob/living/carbon/human/target = user.pulling
if(!target || !ishuman(target) || user.grab_state < GRAB_AGGRESSIVE) //Add a check for a bondage pref whenever that gets added in.
to_chat(user, "<span class='warning'>You need to aggressively grab a humanoid to use this.</span>")
return FALSE
if(target.wear_suit)
var/obj/item/clothing/suit = target.wear_suit
if(istype(suit, /obj/item/clothing/suit/straight_jacket/web))
user.visible_message("<span class='warning'>[user] begins to fully encase [target] in a cocoon!</span>", "<span class='warning'>You begin to fully encase [target] in a cocoon.</span>")
if(!do_after_mob(user, target, 30 SECONDS))
return FALSE
var/obj/structure/spider/cocoon/quirk/spawned_cocoon = new(target.loc)
if(!target.forceMove(spawned_cocoon))
qdel(spawned_cocoon)
return FALSE
spawned_cocoon.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
var/cocoon_size = target.size_multiplier
var/matrix/new_matrix = new
new_matrix.Scale(cocoon_size)
new_matrix.Translate(0,16 * (cocoon_size-1))
spawned_cocoon.transform = new_matrix
return TRUE
user.visible_message("<span class='warning'>[user] attempts to remove [target]'s [target.wear_suit]!</span>", "<span class='warning'>You attempt to remove [target]'s [target.wear_suit].</span>")
if(!do_after_mob(user, target, 10 SECONDS) || !target.dropItemToGround(suit))
return FALSE
var/obj/item/clothing/suit/straight_jacket/web/wrapping = new
if(!wrapping)
return FALSE
user.visible_message("<span class='warning'>[user] attempts to wrap [target] inside of [wrapping]!</span>", "<span class='warning'>You attempt to wrap [target] inside of [wrapping].</span>")
if(!do_after_mob(user, target, 20 SECONDS) || !target.equip_to_slot_if_possible(wrapping, SLOT_WEAR_SUIT, TRUE, TRUE))
user.visible_message("<span class='warning'>[user] fails to wrap [target] inside of [wrapping]!</span>", "<span class='warning'>You fail to wrap [target] inside of [wrapping].</span>")
return FALSE
user.visible_message("<span class='warning'>[user] successfully [target] inside of [wrapping]!</span>", "<span class='warning'>You successfully wrap [target] inside of [wrapping].</span>")
return TRUE
/obj/item/clothing/suit/straight_jacket/web
name = "web bindings"
desc = "A mesh of sticky web that binds whoever is stuck inside of it"
icon = 'GainStation13/icons/obj/clothing/web.dmi'
alternate_worn_icon = 'GainStation13/icons/mob/web.dmi'
icon_state = "web_bindings"
item_state = "web_bindings"
breakouttime = 600 //1 minute is reasonable.
equip_delay_other = 0
equip_delay_self = 0
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/straight_jacket/web/equipped(mob/user, slot)
. = ..()
if((user.get_item_by_slot(SLOT_WEAR_SUIT)) != src && !QDELETED(src))
qdel(src)
/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
+51
View File
@@ -0,0 +1,51 @@
/mob/living/simple_animal/friendly/cakegolem //I told you I'd do it, Remie //sorry Remie -Eye
name = "Puffball"
desc = "It's a person made out of cake."
icon = 'GainStation13/icons/mob/cakegolem.dmi'
icon_state = "cakegolem"
icon_living = "cakegolem"
icon_dead = "cakegolem_dead"
health = 200
maxHealth = 200 //health buffed because you all know how people get here -Eye
gender = FEMALE
harm_intent_damage = 10
butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/reagent_containers/food/snacks/cakeslice/birthday = 9, \
/obj/item/reagent_containers/food/snacks/meat/slab = 2)
response_harm = "takes a bite out of"
attacked_sound = 'sound/items/eatfood.ogg'
deathmessage = "loses its false life and collapses!"
death_sound = "bodyfall"
//held_icon = "cakegolem"
/mob/living/simple_animal/friendly/cakegolem/CheckParts(list/parts)
..()
var/obj/item/organ/brain/B = locate(/obj/item/organ/brain) in contents
if(!B || !B.brainmob || !B.brainmob.mind)
return
B.brainmob.mind.transfer_to(src)
to_chat(src, "<span class='big bold'>You are a cake person!</span><b> You're a harmless cake/person hybrid that everyone loves. People can take bites out of you if they're hungry, but there is plenty of you to go around, and you regenerate health \
so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \
free cake to the station!</b>")
var/new_name = stripped_input(src, "Enter your name, or press \"Cancel\" to stick with Puffball.", "Name Change")
if(new_name)
to_chat(src, "<span class='notice'>Your name is now <b>\"new_name\"</b>!</span>")
name = new_name
/mob/living/simple_animal/friendly/cakegolem/Life()
..()
if(stat)
return
if(health < maxHealth)
adjustBruteLoss(-5) //Fast life regen
for(var/obj/item/reagent_containers/food/snacks/donut/D in range(1, src)) //Frosts nearby donuts!
if(!D.is_decorated)
D.decorate_donut()
/mob/living/simple_animal/friendly/cakegolem/attack_hand(mob/living/L)
. = ..()
//if(.) //the attack was blocked
//return
if(L.a_intent == INTENT_HARM && L.reagents && !stat)
L.reagents.add_reagent(/datum/reagent/consumable/nutriment, 0.4)
L.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.4)
+95
View File
@@ -0,0 +1,95 @@
/mob/living/simple_animal/hostile/feed
var/food_per_feeding = 5
var/food_fed = /datum/reagent/consumable/nutriment
/mob/living/simple_animal/hostile/feed/AttackingTarget()
. = ..()
var/mob/living/carbon/L = target
if(L.client?.prefs?.weight_gain_weapons)
if(L.reagents)
if(!L.is_mouth_covered(head_only = 1))
L.reagents.add_reagent(food_fed, food_per_feeding)
/mob/living/simple_animal/hostile/feed/chocolate_slime
name = "Chocolate slime"
desc = "It's a living blob of tasty chocolate!"
icon = 'GainStation13/icons/mob/candymonster.dmi'
icon_state = "a_c_slime"
icon_living = "a_c_slime"
icon_dead = "a_c_slime_dead"
speak_emote = list("blorbles")
emote_hear = list("blorbles")
speak_chance = 5
turns_per_move = 5
see_in_dark = 10
butcher_results = list(/obj/item/reagent_containers/food/snacks/chocolatebar = 4)
maxHealth = 100
health = 100
obj_damage = 0
melee_damage_lower = 0.001
melee_damage_upper = 0.001
faction = list("slime")
pass_flags = PASSTABLE
move_to_delay = 7
attack_sound = 'sound/items/eatfood.ogg'
unique_name = 1
gold_core_spawnable = HOSTILE_SPAWN
see_in_dark = 3
blood_volume = 0
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
initial_language_holder = /datum/language_holder/slime
// // You are not immune to vore.
// devourable = 1
// digestable = 1
// feeding = 1
//Creambeast - basically a bit tougher mob that has feeding ranged attacks
/mob/living/simple_animal/hostile/feed/chocolate_slime/creambeast
name = "Creambeast"
desc = "A strange mass of thick, creamy ice cream given some sense of instinct."
icon_state = "icecream_monster"
icon_living = "icecream_monster"
icon_dead = "icecream_monster_dead"
icon_gib = "icecream_monster_dead"
move_to_delay = 10
projectiletype = /obj/item/projectile/beam/fattening/icecream
projectilesound = 'sound/weapons/pierce.ogg'
ranged = 1
ranged_message = "schlorps"
ranged_cooldown_time = 30
vision_range = 2
speed = 3
maxHealth = 100
health = 100
obj_damage = 0
vision_range = 2
aggro_vision_range = 9
turns_per_move = 5
blood_volume = 0
gold_core_spawnable = HOSTILE_SPAWN
butcher_results = list(/obj/item/reagent_containers/food/snacks/icecream = 4)
/obj/item/projectile/beam/fattening/icecream //might as well make use of this thing to not make ton of different variants of the same thing
name = "ice cream blob"
icon = 'GainStation13/icons/mob/candymonster.dmi'
icon_state = "icecream_projectile"
ricochets_max = 0
ricochet_chance = 0
hitsound = 'sound/weapons/tap.ogg'
hitsound_wall = 'sound/weapons/tap.ogg'
is_reflectable = FALSE
light_range = 0
var/food_per_feeding = 5
var/food_fed = /datum/reagent/consumable/nutriment
var/fullness_add = 30
/obj/item/projectile/beam/fattening/icecream/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/L = target
if(L.client?.prefs?.weight_gain_weapons)
if(L.reagents)
if(!L.is_mouth_covered(head_only = 1))
L.reagents.add_reagent(food_fed, food_per_feeding)
if(HAS_TRAIT(L, TRAIT_VORACIOUS))
fullness_add = fullness_add * 0.67
L.fullness += (fullness_add)
@@ -0,0 +1,139 @@
var/charges = 3
/datum/species/golem/calorite //golems that heal people around them, and cook groovy food. essentially the support class of golems
name = "Calorite Golem"
id = "calorite golem"
prefix = "Calorite"
special_names = list("Callie Wright")
info_text = "As a <span class='danger'>Calorite Golem</span>, you have all kinds of cool magical abilities that allow you to heal the wounded, make food more nourishing and boost people's speed! Unfortunately, you are also very flimsy, and can't dish out much damage with your hands."
fixed_mut_color = "ffffff"
limbs_id = "cal_golem" //special sprites
attack_verb = "bop" //they don't hit too hard, so their attack verb is fittingly pretty soft
armor = 25
punchdamagelow = 5
punchstunthreshold = 0 //no chance to stun
punchdamagehigh = 5
var/datum/action/innate/aura/heal
var/datum/action/innate/bless/boost
var/datum/action/innate/unburden/speed
var/datum/action/innate/recharge/power
/datum/species/golem/calorite/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
if(ishuman(C))
heal = new
heal.Grant(C)
boost = new
boost.Grant(C)
speed = new
speed.Grant(C)
power = new
power.Grant(C)
/datum/species/golem/calorite/on_species_loss(mob/living/carbon/C)
if(heal)
heal.Remove(C)
if(boost)
boost.Remove(C)
if(speed)
speed.Remove(C)
if(power)
power.Remove(C)
..()
/datum/action/innate/aura
name = "Healing Pulse"
desc = "Emit a healing pulse around yourself, curing the wounds of all around you."
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'GainStation13/icons/mob/action_icons.dmi'
button_icon_state = "healing"
/datum/action/innate/unburden
name = "Lift Burdens"
desc = "Vitalise all those around you, giving them a boost of speed for a moment. The effects of this charm are more effective on those whom are heavily burdened"
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'GainStation13/icons/mob/action_icons.dmi'
button_icon_state = "boost"
/datum/action/innate/bless
name = "Bless Food"
desc = "infuse food near you with a fraction of your power to make it more nourishing"
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'GainStation13/icons/mob/action_icons.dmi'
button_icon_state = "cal_bless"
/datum/action/innate/recharge
name = "Recharge"
desc = "refresh and recharge your magical abilities"
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'GainStation13/icons/mob/action_icons.dmi'
button_icon_state = "cal_golem_sleepies"
/datum/action/innate/recharge/Activate()
charges = 3
if(ishuman(owner))
to_chat(owner, "<span class='notice'>You recharge yourself with magical energy!</span>")
/datum/action/innate/bless/Activate()
if(charges != 0)
charges -= 1
if(ishuman(owner))
to_chat(owner, "<span class='notice'>You bless the food around you!</span>")
for(var/obj/item/reagent_containers/food/O in view(1, owner))
if(!O.blessed)
O.reagents.add_reagent(/datum/reagent/consumable/nutriment, 10)
O.desc += " It faintly glows with warm, orange energy..."
O.blessed = 1
else
to_chat(owner, "<span class='notice'>You need to recharge...</span>")
/datum/action/innate/unburden/Activate()
if(charges != 0)
charges -= 1
if(ishuman(owner))
to_chat(owner, "<span class='notice'>You lift the burdens of those around you!</span>")
for(var/mob/living/L in view(3, owner))
if(iscarbon(L))
if(!HAS_TRAIT(L, TRAIT_GOTTAGOFAST))
L.reagents.add_reagent(/datum/reagent/consumable/caloriteblessing, 5)
else
to_chat(owner, "<span class='notice'>You need to recharge...</span>")
/datum/action/innate/aura/Activate()
if(charges != 0)
charges -= 1
if(ishuman(owner))
to_chat(owner, "<span class='notice'>You heal those around you!</span>")
for(var/mob/living/L in view(3, owner))
if(L.health < L.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(L), "#375637")
if(iscarbon(L))
L.adjustBruteLoss(-3)
L.adjustFireLoss(-3)
L.adjustToxLoss(-3, forced = TRUE) //Because Slime People are people too
L.adjustOxyLoss(-3)
// L.adjustStaminaLoss(-3)
// L.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3)
L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health
// else if(issilicon(L))
// L.adjustBruteLoss(-3)
// L.adjustFireLoss(-3)
else if(isanimal(L))
var/mob/living/simple_animal/SM = L
SM.adjustHealth(-3, forced = TRUE)
+119
View File
@@ -0,0 +1,119 @@
/mob/living/simple_animal/pet/slugcat
name = "slugcat"
desc = "It's a cat . . . Thing from another planet, maybe from another world. You think it's not dangerous, but you can't be sure. "
icon = 'GainStation13/icons/mob/pets.dmi'
icon_state = "slugcat"
icon_living = "slugcat"
icon_dead = "slugcat_dead"
emote_see = list("stares at the ceiling.", "shivers.")
speak_chance = 1
turns_per_move = 20
can_be_held = TRUE
see_in_dark = 6
ventcrawler = VENTCRAWLER_ALWAYS
pass_flags = PASSTABLE
mob_size = MOB_SIZE_SMALL
mob_biotypes = MOB_ORGANIC|MOB_BEAST
minbodytemp = 200
maxbodytemp = 400
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
unsuitable_atmos_damage = 0.5
animal_species = /mob/living/simple_animal/pet/slugcat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
gold_core_spawnable = FRIENDLY_SPAWN
attack_sound = 'sound/effects/attackblob.ogg'
do_footstep = TRUE
gold_core_spawnable = FRIENDLY_SPAWN
size_multiplier = 0.5
obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
var/held_icon = "slugcat"
do_footstep = TRUE
//lizard food
devourable = 1
digestable = 1
feeding = 1
var/obj/item/twohanded/spear/weapon
/mob/living/simple_animal/pet/slugcat/Initialize(mapload)
. = ..()
add_verb(src, /mob/living/proc/lay_down)
/mob/living/simple_animal/pet/slugcat/ComponentInitialize()
. = ..()
AddElement(/datum/element/wuv, "purrs!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "hisses!", EMOTE_AUDIBLE)
AddElement(/datum/element/mob_holder, held_icon)
/mob/living/simple_animal/pet/slugcat/update_canmove()
..()
if(client && stat != DEAD)
if (resting)
icon_state = "[icon_living]_rest"
else
icon_state = "[icon_living]"
regenerate_icons()
/mob/living/simple_animal/pet/slugcat/UnarmedAttack(atom/A)
. = ..()
if(!isitem(A))
return
if(!weapon && istype(A, /obj/item/twohanded/spear))
visible_message("<span class='notice'>[src] pick up the [A].</span>", "<span class='notice'>You pick up the [A].</span>")
weapon = A
weapon.forceMove(src)
melee_damage_lower = weapon.force + weapon.force_wielded
melee_damage_upper = weapon.force + weapon.force_wielded
armour_penetration = weapon.armour_penetration
melee_damage_type = weapon.damtype
attack_sound = weapon.hitsound
update_icons()
else if(!weapon && !istype(A, /obj/item/twohanded/spear))
to_chat(src, "<span class='warning'>You do not know how to wield the [A]!</span>")
/mob/living/simple_animal/pet/slugcat/RangedAttack(atom/A, params)
. = ..()
if(!weapon)
return
visible_message("<span class='warning'>[src] throws the [weapon] at [A]!</span>","<span class='warning'>You throw the [weapon] at [A]!</span>")
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
armour_penetration = initial(armour_penetration)
melee_damage_type = initial(melee_damage_type)
attack_sound = initial(attack_sound)
weapon.forceMove(get_turf(src))
weapon.throw_at(A, weapon.throw_range, weapon.throw_speed, src)
weapon = null
update_icons()
/mob/living/simple_animal/pet/slugcat/update_icons()
. = ..()
if(stat == DEAD || resting)
return
icon_state = weapon ? initial(icon_state) + "_spear" : initial(icon_state)
/mob/living/simple_animal/pet/slugcat/death(gibbed)
if(weapon)
weapon.forceMove(get_turf(src))
weapon = null
update_icons()
. = ..()
/mob/living/simple_animal/pet/slugcat/attack_ghost(mob/user)
if(key)
return
if(CONFIG_GET(flag/use_age_restriction_for_jobs))
if(!isnum(user.client.player_age))
return
if(!SSticker.mode)
to_chat(user, "Can't become a slugcat before the game has started.")
return
var/be_scug = alert("Become a slugcat? (Warning, You can no longer be cloned!)",,"Yes","No")
if(be_scug == "No" || QDELETED(src) || !isobserver(user))
return
sentience_act()
key = user.key
@@ -0,0 +1,5 @@
/obj/code/game/mobs/unusualtentical
name = "unusualtentical"
desc = "Whats this doing here?"
icon = "Gainstation13/icons/mob/unusualtentical.dmi"
icon_state = "tenticalidle"
@@ -0,0 +1,101 @@
//GS13 Preferences
/datum/preferences
//Weight Gain Sources
///Weight gain from food
var/weight_gain_food = FALSE
///Weight gain from chems
var/weight_gain_chems = FALSE
///Weight gain from items
var/weight_gain_items = FALSE
///Weight gain from weapons
var/weight_gain_weapons = FALSE
///Weight gain from magic
var/weight_gain_magic = FALSE
///Weight gain from viruses
var/weight_gain_viruses = FALSE
///Weight gain from nanites
var/weight_gain_nanites = FALSE
///Blueberry Inflation
var/blueberry_inflation = FALSE
///Extreme weight gain
var/weight_gain_extreme = FALSE
///Persistant fatness
var/weight_gain_persistent = FALSE
///Permanent weight gain
var/weight_gain_permanent = FALSE
/// At what weight will you start to get stuck in airlocks?
var/stuckage = FALSE
/// At what weight will you start to break chairs?
var/chair_breakage = FALSE
/// Are items that only affect those at high weights able to affect the player?
var/fatness_vulnerable = FALSE
/// Similar to fatness_vulnerable, but with more extreme effects such as transformation/hypno.
var/extreme_fatness_vulnerable = FALSE
// Helplessness, a set of prefs that make things extra tough at higher weights. If set to FALSE, they won't do anything.
///What fatness level disables movement?
var/helplessness_no_movement = FALSE
///What fatness level makes the user clumsy?
var/helplessness_clumsy = FALSE
///What fatness level makes the user nearsighted
var/helplessness_nearsighted = FALSE
///What fatness level makes the user's face unrecognizable.
var/helplessness_hidden_face = FALSE
///What fatness level makes the user unable to speak?
var/helplessness_mute = FALSE
///What fatness level, makes the user unable to use their arms?
var/helplessness_immobile_arms = FALSE
///What fatness level prevents the user from wearing jumpsuits
var/helplessness_clothing_jumpsuit = FALSE
///What fatness level prevents the user from wearing non-jumpsuit clothing
var/helplessness_clothing_misc = FALSE
///What fatness level prevents the user from wearing anything on their back
var/helplessness_clothing_back = FALSE
///What fatness level prevents the user from being buckled to anything?
var/helplessness_no_buckle = FALSE
///Does the person wish to be involved with non-con weight gain events?
var/noncon_weight_gain = FALSE
//Does the person wish to be fed from bots?
var/bot_feeding = FALSE
///What is the max weight that the person wishes to be? If set to FALSE, there will be no max weight
var/max_weight = FALSE
/// Prompts the user to choose a weight and returns said weight.
/datum/preferences/proc/chose_weight(input_text = "Choose a weight.", mob/user)
var/chosen_weight = FALSE
var/picked_weight_class = input(user,
input_text,
"Character Preference", "None") as null|anything in list(
"None", "Fat", "Fatter", "Very Fat", "Obese", "Morbidly Obese", "Extremely Obese", "Barely Mobile", "Immobile", "Other")
switch(picked_weight_class)
if("Fat")
chosen_weight = FATNESS_LEVEL_FATTER
if("Fatter")
chosen_weight = FATNESS_LEVEL_VERYFAT
if("Very Fat")
chosen_weight = FATNESS_LEVEL_OBESE
if("Obese")
chosen_weight = FATNESS_LEVEL_MORBIDLY_OBESE
if("Morbidly Obese")
chosen_weight = FATNESS_LEVEL_EXTREMELY_OBESE
if("Extremely Obese")
chosen_weight = FATNESS_LEVEL_BARELYMOBILE
if("Barely Mobile")
chosen_weight = FATNESS_LEVEL_IMMOBILE
if("Immobile")
chosen_weight = FATNESS_LEVEL_BLOB
if(picked_weight_class != "Other")
return chosen_weight
var/custom_fatness = input(user, "What fatness level (BFI) would you like to use?", "Character Preference") as null|num
if(isnull(custom_fatness))
custom_fatness = FALSE
return custom_fatness
@@ -0,0 +1,156 @@
/obj/item/clothing/under/rank/chef/modular
name = "cook's modular suit"
desc = "A suit which is given only to the most <b>hardcore</b> cooks in space. Now adjusts to the match the wearer's size!"
var/mob/living/carbon/U
/obj/item/clothing/under/rank/chef/modular/equipped(mob/user, slot)
..()
U = user
/obj/item/clothing/under/rank/chef/modular/dropped()
..()
U = null
/obj/item/clothing/under/rank/chef/modular/jumpsuit_adjust()
..()
worn_overlays()
/obj/item/clothing/under/rank/chef/modular/worn_overlays(isinhands = FALSE)
if(!isinhands)
. = list()
var/obj/item/organ/O
var/obj/item/organ/genital/G
for(O in U.internal_organs)
if(istype(O, /obj/item/organ/genital/belly))
G = O
if(!adjusted)
if(G.size <= 9) //These need to be removed later, better to cap organ sizes to begin with
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_[G.size]", GENITALS_UNDER_LAYER)
else
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_9", GENITALS_UNDER_LAYER)
else
if(G.size <= 9)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_[G.size]_d", GENITALS_UNDER_LAYER)
else
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "belly_9_d", GENITALS_UNDER_LAYER)
if(istype(O, /obj/item/organ/genital/anus))
G = O
if(suit_style == DIGITIGRADE_SUIT_STYLE)
if(G.size <= 10)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l", GENITALS_FRONT_LAYER)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER)
else
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_l", GENITALS_FRONT_LAYER)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_l_NORTH", GENITALS_FRONT_LAYER)
else
if(G.size <= 10)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]", GENITALS_FRONT_LAYER)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_[G.size]_NORTH", GENITALS_FRONT_LAYER)
else
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10", GENITALS_FRONT_LAYER)
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "butt_10_NORTH", GENITALS_FRONT_LAYER)
if(istype(O, /obj/item/organ/genital/breasts))
G = O
if(G.size <= "impossible")
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_[G.size]", GENITALS_BEHIND_LAYER) //nearest
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_[G.size]_NORTH", BODY_FRONT_LAYER) //farthest
else
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_impossible", GENITALS_BEHIND_LAYER) //nearest
. += mutable_appearance('GainStation13/icons/mob/modclothes/chefmodular.dmi', "breasts_impossible_NORTH", BODY_FRONT_LAYER) //farthest
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
if(accessory_overlay)
. += accessory_overlay
/obj/item/clothing/under/color/grey/modular
name = "grey modular jumpsuit" //change name from base clothes to distinguish them
desc = "A tasteful grey jumpsuit that reminds you of the good old days. Now adjusts to the match the wearer's size!" //description same as above
var/icon_location = 'GainStation13/icons/mob/modclothes/graymodular.dmi' //specify the file path where the modular overlays for those clothes are located
var/mob/living/carbon/U //instance a variable for keeping track of the user
/obj/item/clothing/under/color/grey/modular/equipped(mob/user, slot) //whenever the clothes are in someone's inventory the clothes keep track of who that user is
..()
U = user
/obj/item/clothing/under/color/grey/modular/dropped() //whenever the clothes leave a person's inventory, they forget who held them
..()
U = null
/obj/item/clothing/under/color/grey/modular/jumpsuit_adjust() //when the user adjusts the clothes' style, rebuild the overlays
..()
worn_overlays()
/obj/item/clothing/under/color/grey/modular/worn_overlays(isinhands = FALSE)
if(U)
if(!isinhands) //make sure the clothes are being worn and aren't in someone's hands
. = list()
var/obj/item/organ/O
var/obj/item/organ/genital/G
for(O in U.internal_organs) //check the user for the organs they have
if(istype(O, /obj/item/organ/genital/belly)) //if that organ is a belly
G = O //treat that organ as a genital
if(!adjusted) //check the style, if it needs to be the adjusted variants
if(G.size <= 9) //check that the size is within accepted values, NOTE: these need to be removed later, better to cap organ sizes to begin with
. += mutable_appearance(icon_location, "belly_[G.size]", GENITALS_UNDER_LAYER) //add, from the clothes' icon file the overlay corresponding to that genital at that size and draw it onto the layer
else //if not an expected size value, bigger than the max, default to max size
. += mutable_appearance(icon_location, "belly_9", GENITALS_UNDER_LAYER)
else //use the alternative adjusted sprites
if(G.size <= 9)
. += mutable_appearance(icon_location, "belly_[G.size]_d", GENITALS_UNDER_LAYER)
else
. += mutable_appearance(icon_location, "belly_9_d", GENITALS_UNDER_LAYER)
if(istype(O, /obj/item/organ/genital/anus)) //if that organ is the butt
G = O
if(suit_style == DIGITIGRADE_SUIT_STYLE) //check if the suit needs to use sprites for digitigrade characters
if(G.size <= 10)
. += mutable_appearance(icon_location, "butt_[G.size]_l", GENITALS_FRONT_LAYER)
. += mutable_appearance(icon_location, "butt_[G.size]_l_NORTH", GENITALS_FRONT_LAYER) //to not adjust overlays every time a character turns, north-facing breasts and bellies are drawn separately, with individual icons
else //they'll have blank north-facing sprites in the main icon state and the north-facing will be blank on all other sides, and are drawn on different layers
. += mutable_appearance(icon_location, "butt_10_l", GENITALS_FRONT_LAYER)
. += mutable_appearance(icon_location, "butt_10_l_NORTH", GENITALS_FRONT_LAYER)
else //if the character is not digitigrade
if(G.size <= 10)
. += mutable_appearance(icon_location, "butt_[G.size]", GENITALS_FRONT_LAYER)
. += mutable_appearance(icon_location, "butt_[G.size]_NORTH", GENITALS_FRONT_LAYER)
else
. += mutable_appearance(icon_location, "butt_10", GENITALS_FRONT_LAYER)
. += mutable_appearance(icon_location, "butt_10_NORTH", GENITALS_FRONT_LAYER)
if(istype(O, /obj/item/organ/genital/breasts)) //if the organ is the breasts
G = O
if(G.size <= "o")
. += mutable_appearance(icon_location, "breasts_[G.size]", GENITALS_BEHIND_LAYER)
. += mutable_appearance(icon_location, "breasts_[G.size]_NORTH", BODY_FRONT_LAYER)
else
if(G.size == "huge")
. += mutable_appearance(icon_location, "breasts_huge", GENITALS_BEHIND_LAYER)
. += mutable_appearance(icon_location, "breasts_huge_NORTH", BODY_FRONT_LAYER)
else
if(G.size == "massive")
. += mutable_appearance(icon_location, "breasts_massive", GENITALS_BEHIND_LAYER)
. += mutable_appearance(icon_location, "breasts_massive_NORTH", BODY_FRONT_LAYER)
else
if(G.size == "giga")
. += mutable_appearance(icon_location, "breasts_giga", GENITALS_BEHIND_LAYER)
. += mutable_appearance(icon_location, "breasts_giga_NORTH", BODY_FRONT_LAYER)
else
. += mutable_appearance(icon_location, "breasts_impossible", GENITALS_BEHIND_LAYER)
. += mutable_appearance(icon_location, "breasts_impossible_NORTH", BODY_FRONT_LAYER)
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
if(accessory_overlay)
. += accessory_overlay
/obj/item/clothing/under/color/grey/modular/bra
name = "grey modular bra"
desc = "A tasteful grey bra that reminds you of the good old days. Now adjusts to the match the wearer's size!"
icon_location = 'GainStation13/icons/mob/modclothes/graymodular_bra.dmi'
icon_state = "grey"
item_state = "grey_bra"
item_color = "grey_bra"
@@ -0,0 +1,26 @@
////////////////////////////////////////////////////////////////////////////////
/// GS13 Drinks
////////////////////////////////////////////////////////////////////////////////
/obj/item/reagent_containers/food/drinks/soda_cans/fizzwiz
name = "Fizz Wiz"
desc = "Unleash your inner magic!"
icon = 'GainStation13/icons/obj/drinks.dmi'
lefthand_file = 'GainStation13/icons/obj/food_lefthand.dmi'
righthand_file = 'GainStation13/icons/obj/food_righthand.dmi'
icon_state = "fizzwiz"
list_reagents = list(/datum/reagent/consumable/space_cola = 25, /datum/reagent/consumable/fizulphite = 15)
foodtype = SUGAR
price = 3
/obj/item/reagent_containers/food/drinks/soda_cans/soothseltz
name = "Soothing Seltzer"
desc = "A useful drink that helps relieve a bloated stomach."
icon = 'GainStation13/icons/obj/drinks.dmi'
lefthand_file = 'GainStation13/icons/obj/food_lefthand.dmi'
righthand_file = 'GainStation13/icons/obj/food_righthand.dmi'
icon_state = "soothseltz"
list_reagents = list(/datum/reagent/consumable/space_cola = 25, /datum/reagent/consumable/extilphite = 15)
foodtype = SUGAR
price = 3
@@ -0,0 +1,139 @@
/obj/item/reagent_containers/food/snacks/gbburrito
name = "\improper GATO Gas Giant Burrito"
icon_state = "gbburrito"
desc = "More than three pounds of beans, meat, and cheese wrapped in a greasy tortilla. It's piping hot."
trash = null
list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/flatulose = 4, /datum/reagent/consumable/sodiumchloride = 0.5)
filling_color = "#74291b"
tastes = list("refried beans","grease" = 1)
foodtype = MEAT
price = 3
//these have been ported from CHOMPstation / Virgo
/obj/item/reagent_containers/food/snacks/doner_kebab
name = "doner kebab"
icon = 'icons/obj/food/ported_meals.dmi'
desc = "A delicious sandwich-like food from ancient Earth. The meat is typically cooked on a vertical rotisserie."
icon_state = "doner_kebab"
trash = null
list_reagents = list(/datum/reagent/consumable/nutriment = 10)
filling_color = "#93684d"
tastes = list("thinly sliced meat","meat" = 1)
foodtype = GRAIN | VEGETABLES | MEAT | JUNKFOOD
/obj/item/reagent_containers/food/snacks/lasagna
name = "lasagna"
desc = "Meaty, tomato-y, and ready to eat-y. Favorite of cats."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "lasagna"
list_reagents = list(/datum/reagent/consumable/nutriment = 10)
filling_color = "#872020"
tastes = list("italian cuisine" = 1)
foodtype = GRAIN | VEGETABLES | MEAT
/obj/item/reagent_containers/food/snacks/corndog
name = "corn dog"
desc = "A cornbread covered sausage deepfried in oil."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "corndog"
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
filling_color = "#df9745"
tastes = list("corn batter", "sausage" = 1)
foodtype = GRAIN | MEAT | JUNKFOOD
/obj/item/reagent_containers/food/snacks/turkey
name = "turkey"
desc = "Tastes like chicken. It can be sliced!"
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "turkey"
slice_path = /obj/item/reagent_containers/food/snacks/turkey_leg
slices_num = 4
list_reagents = list(/datum/reagent/consumable/nutriment = 15)
filling_color = "#d4864b"
tastes = list("turkey" = 1)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/turkey_leg
name = "turkey leg"
desc = "Tastes like chicken."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "turkey_slice"
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
filling_color = "#ae6941"
tastes = list("turkey" = 1)
foodtype = MEAT
/obj/item/reagent_containers/food/snacks/brownies
name = "brownies"
desc = "Halfway to fudge, or halfway to cake? Who cares!"
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "brownies"
slice_path = /obj/item/reagent_containers/food/snacks/brownies_slice
slices_num = 6
list_reagents = list(/datum/reagent/consumable/nutriment = 30)
filling_color = "#392f27"
tastes = list("chocolate" = 1)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/brownies_slice
name = "brownie"
desc = "a dense, decadent chocolate brownie."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "browniesslice"
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
filling_color = "#392f27"
tastes = list("chocolate" = 1)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/brownies_cosmic
name = "cosmic brownies"
desc = "The power of cosmos likes within your hand."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "cosmicbrownies"
slice_path = /obj/item/reagent_containers/food/snacks/brownies_slice_cosmic
slices_num = 6
list_reagents = list(/datum/reagent/consumable/nutriment = 25, /datum/reagent/medicine/omnizine = 5)
filling_color = "#392f27"
tastes = list("chocolate" = 1)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/brownies_slice_cosmic
name = "cosmic brownie"
desc = "a dense, decadent and fun-looking chocolate brownie."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "cosmicbrownieslice"
list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/omnizine = 1)
filling_color = "#392f27"
tastes = list("chocolate" = 1)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/bacon_and_eggs
name = "bacon and eggs"
desc = "A staple of every breakfast."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "bacon_and_eggs"
list_reagents = list(/datum/reagent/consumable/nutriment = 8)
filling_color = "#e9e6e3"
tastes = list("eggs", "bacon" = 1)
foodtype = BREAKFAST | MEAT
/obj/item/reagent_containers/food/snacks/eggmuffin
name = "egg muffin"
desc = "A staple of every breakfast."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "eggmuffin"
list_reagents = list(/datum/reagent/consumable/nutriment = 8)
filling_color = "#e9e6e3"
tastes = list("eggs", "breakfast" = 1)
foodtype = BREAKFAST | MEAT
/obj/item/reagent_containers/food/snacks/cinammonbun
name = "cinammon bun"
desc = "Careful not to have it stolen."
icon = 'icons/obj/food/ported_meals.dmi'
icon_state = "cinammonbun"
list_reagents = list(/datum/reagent/consumable/nutriment = 5)
filling_color = "#e9e6e3"
tastes = list("eggs", "breakfast" = 1)
foodtype = GRAIN | SUGAR
@@ -0,0 +1,47 @@
//GS13 decals - candyland related!
//would be cool if we could use ash flora code to make these harvestable in the future - Lew
/obj/effect/turf_decal/candy //used for baseline
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = ""
/obj/effect/turf_decal/candy/redwhite
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = "candy_decal1"
/obj/effect/turf_decal/candy/redwhite2
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = "candy_decal2"
/obj/effect/turf_decal/candy/redwhite3
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = "candy_decal3"
/obj/effect/turf_decal/candy/greenwhite1
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = "candy_decal_g1"
/obj/effect/turf_decal/candy/greenwhite2
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = "candy_decal_g2"
/obj/effect/turf_decal/candy/bluewhite1
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = "candy_decal_b1"
/obj/effect/turf_decal/candy/purplewhite1
icon = 'GainStation13/icons/turf/decals_candy.dmi'
icon_state = "candy_decal_p1"
/obj/structure/lollipop //ik it's not necessarily a decal but I'm lazy rn and will (hopefully) move it later
name = "Lollipop tree"
desc = "A mere snack for people larger than life."
max_integrity = 80
density = TRUE
pixel_x = -16
layer = FLY_LAYER
anchored = TRUE
icon = 'GainStation13/icons/turf/decals_large_candy.dmi'
icon_state = "lollipop_tree_blue"
@@ -0,0 +1,126 @@
//this is a recipe file for just random shit we've ported from other servers
//you can call me lazy if you'd like but I didn't really feel like making 10 different folders and files just to port a couple simple meals
//writing down recipe categories, should be handy
//CAT_FOOD,CAT_BREAD,CAT_BURGER,CAT_CAKE,CAT_EGG,CAT_MEAT,CAT_MISCFOOD,CAT_PASTRY,CAT_PIE,CAT_PIZZ,CAT_SALAD,CAT_SANDWICH,CAT_SOUP,CAT_SPAGHETTI,CAT_FISH,CAT_ICE
/datum/crafting_recipe/food/doner
name = "Doner Kebab"
reqs = list(
/obj/item/reagent_containers/food/snacks/bun = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
/obj/item/reagent_containers/food/snacks/grown/tomato = 1
)
result = /obj/item/reagent_containers/food/snacks/doner_kebab
subcategory = CAT_BURGER
/datum/crafting_recipe/food/lasagna
name = "Lasagna"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledspaghetti = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
/obj/item/reagent_containers/food/snacks/grown/tomato = 1,
/obj/item/reagent_containers/food/snacks/cheesewedge = 1
)
result = /obj/item/reagent_containers/food/snacks/lasagna
subcategory = CAT_SPAGHETTI
/datum/crafting_recipe/food/corndog
name = "Corndog"
reqs = list(
/datum/reagent/consumable/flour = 5,
/obj/item/reagent_containers/food/snacks/sausage = 1,
/datum/reagent/consumable/cooking_oil = 5
)
result = /obj/item/reagent_containers/food/snacks/corndog
subcategory = CAT_MEAT
/datum/crafting_recipe/food/turkey
name = "Whole Turkey"
reqs = list(
/obj/item/reagent_containers/food/snacks/meat/slab/chicken = 2,
/obj/item/reagent_containers/food/snacks/sausage = 1,
/obj/item/reagent_containers/food/snacks/grown/potato = 2,
)
result = /obj/item/reagent_containers/food/snacks/turkey
subcategory = CAT_MEAT
/datum/crafting_recipe/food/brownies
name = "Brownies"
reqs = list(
/datum/reagent/consumable/flour = 5,
/datum/reagent/consumable/ethanol/creme_de_cacao = 10,
/datum/reagent/consumable/sugar = 5,
/obj/item/reagent_containers/food/snacks/butter = 2
)
result = /obj/item/reagent_containers/food/snacks/brownies
subcategory = CAT_CAKE
/datum/crafting_recipe/food/cosmic_brownies
name = "Cosmic Brownies"
reqs = list(
/obj/item/reagent_containers/food/snacks/brownies = 1,
/datum/reagent/consumable/sprinkles = 10
)
result = /obj/item/reagent_containers/food/snacks/brownies_cosmic
subcategory = CAT_CAKE
/datum/crafting_recipe/food/cosmic_brownies
name = "Cosmic Brownies"
reqs = list(
/obj/item/reagent_containers/food/snacks/brownies = 1,
/datum/reagent/consumable/sprinkles = 10
)
result = /obj/item/reagent_containers/food/snacks/brownies_cosmic
subcategory = CAT_CAKE
/datum/crafting_recipe/food/bacon_and_eggs
name = "Bacon and Eggs"
reqs = list(
/obj/item/reagent_containers/food/snacks/friedegg = 2,
/obj/item/reagent_containers/food/snacks/meat/bacon = 1
)
result = /obj/item/reagent_containers/food/snacks/bacon_and_eggs
subcategory = CAT_EGG
/datum/crafting_recipe/food/egg_muffin
name = "Egg muffin"
reqs = list(
/obj/item/reagent_containers/food/snacks/friedegg = 1,
/obj/item/reagent_containers/food/snacks/muffin = 1
)
result = /obj/item/reagent_containers/food/snacks/eggmuffin
subcategory = CAT_EGG
/datum/crafting_recipe/food/cinnamon_roll
name = "Cinnamon roll"
reqs = list(
/datum/reagent/consumable/sugar = 3,
/datum/reagent/consumable/vanilla = 2,
/obj/item/reagent_containers/food/snacks/pastrybase = 1
)
result = /obj/item/reagent_containers/food/snacks/cinammonbun
subcategory = CAT_PASTRY
//GS Food
/datum/crafting_recipe/food/lavaland_stew
name = "Lavaland Stew"
reqs = list(
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf = 1,
/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem = 1,
/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit = 2,
/obj/item/reagent_containers/glass/bowl/mushroom_bowl = 1
)
result = /obj/item/reagent_containers/food/snacks/soup/lavaland_stew
subcategory = CAT_SOUP
@@ -0,0 +1,93 @@
// see code/module/crafting/table.dm
////////////////////////////////////////////////PIZZA!!!////////////////////////////////////////////////
//GS13 - this has been ported from CHOMP/Virgo, but I've decided to adjust the recipe a bit
// there's both the recipe and the defines for the pizza itself here
/obj/item/reagent_containers/food/snacks/pizza/framewrecker
name = "Framewrecker Pizza"
desc = "You feel your arteries clogging just by merely looking at this monster. Is this even real, or a mere hallucination?"
icon = 'icons/obj/food/food64x64.dmi'
icon_state = "theonepizza"
pixel_x = -16
pixel_y = -16
inhand_x_dimension = 64
inhand_y_dimension = 64
bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5)
list_reagents = list(/datum/reagent/consumable/nutriment = 200, /datum/reagent/consumable/tomatojuice = 6, /datum/reagent/consumable/nutriment/vitamin = 20)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "overwhelming surge of calories" = 10)
foodtype = GRAIN | VEGETABLES | DAIRY | MEAT | JUNKFOOD | ANTITOXIC
var/slicelist = list(/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/mushroom,
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/veggie,
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/cheese,
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/pineapple,
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/meat)
//slices
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker
name = "Framewrecker Pizza Slice"
desc = "This mere slice is the size of pizza on its own!"
icon = 'icons/obj/food/ported_meals.dmi'
list_reagents = list(/datum/reagent/consumable/nutriment = 60)
icon_state = "big_mushroom_slice"
filling_color = "#FFA500"
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/mushroom
name = "Giant mushroom pizza slice"
icon_state = "big_mushroom_slice"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "mushrooms" = 1, "delight" = 5)
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/veggie
name = "Giant veggie pizza slice"
icon_state = "big_veggie_slice"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "veggies" = 1, "delight" = 5)
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/pineapple
name = "Giant pineapple pizza slice"
icon_state = "big_pineapple_slice"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "ham" = 1, "pineapple" = 5)
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD | FRUIT
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/meat
name = "Giant meat pizza slice"
icon_state = "big_veggie_slice"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "delight" = 5)
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD | MEAT
/obj/item/reagent_containers/food/snacks/pizzaslice/framewrecker/cheese
name = "Giant cheese pizza slice"
icon_state = "big_cheese_slice"
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "delight" = 5)
foodtype = GRAIN | VEGETABLES | DAIRY | JUNKFOOD
/obj/item/reagent_containers/food/snacks/pizza/framewrecker/attackby(var/obj/item/weapon/W, var/mob/living/user)
if(istype(W,/obj/item/kitchen/knife))
user.visible_message("<b>\The [user]</b> starts to slowly cut through The One Pizza.", "<span class='notice'>You start to slowly cut through The One Pizza.</span>")
if(!src)
return // We got disappeared already
user.visible_message("<b>\The [user]</b> successfully cuts The One Pizza.", "<span class='notice'>You successfully cut The One Pizza.</span>")
for(var/slicetype in slicelist)
new slicetype(src.loc)
qdel(src)
// recipe
/datum/crafting_recipe/food/framewrecker_pizza
name = "Framewrecker Pizza"
reqs = list(
/obj/item/reagent_containers/food/snacks/pizzabread = 4,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 4,
/obj/item/reagent_containers/food/snacks/cheesewedge = 8,
/obj/item/reagent_containers/food/snacks/grown/tomato = 8,
/obj/item/reagent_containers/food/snacks/pineappleslice = 2,
/obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 2
)
result = /obj/item/reagent_containers/food/snacks/pizza/framewrecker
subcategory = CAT_PIZZA
+113
View File
@@ -0,0 +1,113 @@
/obj/item/dumbbell
desc = "A weighty dumbbell, perfect for arm exercise!"
name = "dumbbell"
icon = 'GainStation13/icons/obj/dumbbell.dmi'
icon_state = "pen"
item_state = "pen"
throwforce = 20
w_class = WEIGHT_CLASS_BULKY
throw_speed = 2
throw_range = 3
materials = list(MAT_METAL=10)
pressure_resistance = 2
var/reps = 0
var/using = FALSE
/obj/item/dumbbell/dropped(mob/user, silent)
reps = 0
. = ..()
/obj/item/dumbbell/attack_self(mob/user)
. = ..()
if(!using)
using = TRUE
to_chat(user, "<span>You do a rep with the [src]. YEEEEEAH!!!</span>")
if(do_after(usr, CLICK_CD_RESIST-reps, 0, usr, 1))
if(iscarbon(user))
var/mob/living/carbon/U = user
U.adjust_fatness(-10, FATTENING_TYPE_WEIGHT_LOSS)
if(reps < 16)
reps += 0.4
else
to_chat(user, "<span>You couldn't complete the rep. YOU'LL GET IT NEXT TIME CHAMP!!!</span>")
using = FALSE
/obj/machinery/treadmill
name = "treadmill"
desc = "A treadmil, for losing weight!"
icon = 'icons/obj/recycling.dmi'
icon_state = "conveyor0"
circuit = /obj/item/circuitboard/machine/treadmill
var/fatloss = -10
/obj/machinery/treadmill/Uncross(atom/movable/AM, atom/newloc)
if(stat & BROKEN)
return ..()
if(!isliving(AM))
return ..()
var/mob/living/M = AM
if(M.throwing || M.floating || M.is_flying()) //Make sure they're not going over it
return ..()
if(AM.dir != dir) //Make sure they're going into the treadmill
return ..()
if(prob(25))
playsound(src, "sound/machines/tractor_running.ogg", 25, TRUE, -2) //Rumblin'
if(iscarbon(M))
var/mob/living/carbon/C = M
if(C.fatness > FATNESS_LEVEL_BARELYMOBILE)
if(prob(5))
visible_message(pick(list( //Really testing the poor thing, huh?
"\the [src] audibly strains under [C]'s weight...",
"\the [src] creeaaaaks under [C]'s strain..."
)))
C.adjust_fatness(fatloss, FATTENING_TYPE_WEIGHT_LOSS)
flick("conveyor-1", src)
return FALSE
/obj/machinery/treadmill/RefreshParts(obj/item/O, mob/user, params)
for(var/obj/item/stock_parts/manipulator/M in component_parts)
fatloss += M.rating * -10
/obj/machinery/treadmill/attackby(obj/item/O, mob/living/user, params)
if(default_deconstruction_screwdriver(user, "conveyor0", "conveyor0", O))
return TRUE
if(default_deconstruction_crowbar(O))
return TRUE
if(default_change_direction_wrench(O))
return TRUE
return ..()
/obj/item/circuitboard/machine/treadmill
name = "Treadmill (Machine Board)"
build_path = /obj/machinery/autolathe
req_components = list(/obj/item/stock_parts/manipulator = 1)
/datum/design/treadmill
name = "Treadmill Board"
id = "treadmill"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/circuitboard/machine/treadmill
category = list("inital", "Construction")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/dumbbell
name = "Dumbbell"
id = "dumbbell"
build_type = AUTOLATHE
materials = list(MAT_METAL = 2000)
build_path = /obj/item/dumbbell
category = list("initial", "Tools")
/*
/datum/design/treadmill
name = "Treadmill"
id = "treadmill"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000)
build_path = /obj/item/conveyor_construct/treadmill
category = list("initial", "Construction")
*/
@@ -0,0 +1,25 @@
/obj/item/seeds/berry/blueberry
name = "pack of blueberry seeds"
desc = "These seeds grow into blueberry bushes."
icon_state = "seed-blueberry"
species = "blueberry"
plantname = "Blueberry Bush"
product = /obj/item/reagent_containers/food/snacks/grown/berries/blueberry
mutatelist = list()
reagents_add = list(/datum/reagent/blueberry_juice = 0.1)
potency = 1
yield = 1
production = 10
rarity = 30
/obj/item/reagent_containers/food/snacks/grown/berries/blueberry
seed = /obj/item/seeds/berry/blueberry
name = "bunch of blueberries"
desc = "Taste so good, you might turn blue!"
icon_state = "blueberrypile"
filling_color = "#5d00c7"
foodtype = FRUIT
juice_results = list(/datum/reagent/blueberry_juice = 20)
tastes = list("blueberry" = 1)
distill_reagent = null
wine_power = 50
@@ -0,0 +1,127 @@
/obj/item/seeds/lipoplant
name = "pack of adipolipus"
desc = "These seeds grow into a foreign plant."
icon = 'GainStation13/icons/obj/hydroponics/lipo_seeds.dmi'
icon_state = "lipo_seed"
species = "adipolipus"
plantname = "Adipolipus"
product = /obj/item/reagent_containers/food/snacks/grown/lipofruit
lifespan = 30
potency = 20
maturation = 8
production = 5
yield = 1
growing_icon = 'GainStation13/icons/obj/hydroponics/lipo_growing.dmi'
icon_grow = "lipo-grow" // Uses one growth icons set for all the subtypes
icon_dead = "lipo-dead" // Same for the dead icon
icon_harvest = "lipo-harvest"
reagents_add = list(/datum/reagent/consumable/lipoifier = 0.05)
/obj/item/reagent_containers/food/snacks/grown/lipofruit
seed = /obj/item/seeds/lipoplant
name = "lipofruit"
desc = "A foreign fruit with an hard shell. Perhaps something sharp could open it?"
icon = 'GainStation13/icons/obj/hydroponics/lipo_harvest.dmi'
icon_state = "lipo_nut"
item_state = "lipo_nut"
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
spillable = FALSE
resistance_flags = ACID_PROOF
volume = 150 //so it won't cut reagents despite having the capacity for them
w_class = WEIGHT_CLASS_SMALL
force = 5
throwforce = 5
hitsound = 'sound/weapons/klonk.ogg'
attack_verb = list("klonked", "donked", "bonked")
distill_reagent = "creme_de_coconut"
var/opened = FALSE
sharpness = IS_BLUNT
/obj/item/reagent_containers/food/snacks/grown/lipofruit/attackby(obj/item/W, mob/user, params)
if(!opened && W.sharpness)
user.show_message("<span class='notice'>You slice the fruit open!</span>", 1)
opened = TRUE
spillable = TRUE
reagent_flags = OPENCONTAINER
ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER)
icon_state = "lipo_nutcut_full"
desc = "A foreign fruit with an hard shell, the liquid inside looks very inviting."
playsound(user, W.hitsound, 50, 1, -1)
return
return ..()
/obj/item/reagent_containers/food/snacks/grown/lipofruit/attack(mob/living/M, mob/user, obj/target)
if(!opened)
return
if(!canconsume(M, user))
return
if(!reagents || !reagents.total_volume)
to_chat(user, "<span class='warning'>[src] is empty!</span>")
return
if(user.a_intent == INTENT_HARM && spillable)
var/R
M.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [M]!</span>",
"<span class='userdanger'>[user] splashes the contents of [src] onto [M]!</span>")
if(reagents)
for(var/datum/reagent/A in reagents.reagent_list)
R += A.type + " ("
R += num2text(A.volume) + "),"
if(isturf(target) && reagents.reagent_list.len && thrownby)
log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]")
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].")
reagents.reaction(M, TOUCH)
log_combat(user, M, "splashed", R)
reagents.clear_reagents()
else
if(M != user)
M.visible_message("<span class='danger'>[user] attempts to feed something to [M].</span>",
"<span class='userdanger'>[user] attempts to feed something to you.</span>")
if(!do_mob(user, M))
return
if(!reagents || !reagents.total_volume)
return // The drink might be empty after the delay, such as by spam-feeding
M.visible_message("<span class='danger'>[user] feeds something to [M].</span>", "<span class='userdanger'>[user] feeds something to you.</span>")
log_combat(user, M, "fed", reagents.log_list())
else
to_chat(user, "<span class='notice'>You swallow a gulp of [src].</span>")
var/fraction = min(5/reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, 5), 5)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
if(!reagents || reagents.total_volume)
icon_state = "lipo_nutcut_empty"
desc = "A foreign fruit with an hard shell."
/obj/item/reagent_containers/food/snacks/grown/lipofruit/afterattack(obj/target, mob/user, proximity)
. = ..()
if((!proximity) || !check_allowed_items(target,target_self=1))
return
if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
to_chat(user, "<span class='warning'>[src] is empty!</span>")
return
if(target.reagents.holder_full())
to_chat(user, "<span class='warning'>[target] is full.</span>")
return
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "<span class='notice'>You transfer [trans] unit\s of the solution to [target].</span>")
else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us.
if(!target.reagents.total_volume)
to_chat(user, "<span class='warning'>[target] is empty and can't be refilled!</span>")
return
if(reagents.holder_full())
to_chat(user, "<span class='warning'>[src] is full.</span>")
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
to_chat(user, "<span class='notice'>You fill [src] with [trans] unit\s of the contents of [target].</span>")
else if(reagents.total_volume)
if(user.a_intent == INTENT_HARM && spillable == TRUE)
user.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [target]!</span>", \
"<span class='notice'>You splash the contents of [src] onto [target].</span>")
reagents.reaction(target, TOUCH)
reagents.clear_reagents()
if(reagents && reagents.total_volume && opened)
icon_state = "lipo_nutcut_full"
desc = "A foreign fruit with an hard shell, the liquid inside looks very inviting."
@@ -0,0 +1,53 @@
/mob/living/carbon
var/nutri_mult = 1
/obj/item/seeds/cannabis/munchies
name = "pack of munchies weed seeds"
desc = "These seeds grow into munchies weed."
icon_state = "seed-munchies"
species = "munchycannabis"
plantname = "Munchies Weed"
icon_grow = "munchycannabis-grow" // Uses one growth icons set for all the subtypes
icon_dead = "munchycannabis-dead" // Same for the dead icon
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/orange)
mutatelist = list()
reagents_add = list(/datum/reagent/drug/space_drugs = 0.05,
/datum/reagent/drug/munchies = 0.10)
rarity = 69
/obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
seed = /obj/item/seeds/cannabis/munchies
name = "munchies cannabis leaf"
desc = "You feel hungry just looking at it."
icon_state = "munchycannabis"
wine_power = 90
/datum/reagent/drug/munchies
name = "Appetite Stimulant"
value = 6
description = "A chemical compound that makes one mindlessly ravenous."
color = "#60A584"
pH = 9
metabolization_rate = REAGENTS_METABOLISM / 4
/datum/reagent/drug/munchies/on_mob_add(mob/living/L, amount)
. = ..()
if(iscarbon(L))
var/mob/living/carbon/C = L
C.nutri_mult += 0.5
/datum/reagent/drug/munchies/on_mob_delete(mob/living/L)
. = ..()
if(iscarbon(L))
var/mob/living/carbon/C = L
C.nutri_mult -= 0.5
/datum/reagent/drug/munchies/on_mob_life(mob/living/carbon/M)
. = ..()
if(prob(10))
to_chat(M, "<span class='warning'>[pick("You feel a little ravenous...", "You could really go for a snack right now...", "The taste of food seems really enticing right now...", "Your belly groans, demanding food...")]</span>")
if(M.fullness > 10)
M.fullness -= 1
if(M.nutrition > 150)
M.nutrition -= 1
@@ -0,0 +1,100 @@
/datum/emote/living/gurgle
key = "gurgle"
key_third_person = "gurgles"
message = "'s belly gurgles"
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/gurgle1.ogg'
/datum/emote/living/gurgle/get_sound()
return get_sfx("gurgle") // Lets get any of the gurgle sounds we have set.
/datum/emote/living/burp
key = "burp"
key_third_person = "burps"
message = "burps"
emote_type = EMOTE_AUDIBLE
var/reduction_min = 4
var/reduction_max = 8
var/noise_type = "burp"
var/noise_pref = BURPING_NOISES
/datum/emote/living/burp/run_emote(mob/living/user, params)
. = ..()
if(!.)
return FALSE
playsound_prefed(user, noise_type, noise_pref, 100, TRUE, -4)
user.reduce_fullness(rand(reduction_min,reduction_max))
/datum/emote/living/burp/fart //Butt burp.
key = "fart"
key_third_person = "farts"
message = "farts"
//god hates me for this -Metha
noise_type = "fart"
noise_pref = FARTING_NOISES
/datum/emote/living/burp/fart/run_emote(mob/living/user, params)
. = ..()
if(!.)
return FALSE
var/obj/item/storage/book/bible/b = locate(/obj/item/storage/book/bible) in get_turf(user) //Biblefart
if(b)//Devine Retribution
var/mob/living/heretic = user //Heresy.
heretic.visible_message(
"<span class='danger'>\The [heretic] farts on \the [b], causing a violent, otherworldly ripple to echo \
outwards before they explode in a gorey mess of divine retribution!</span>",
"<span class='userdanger'>You feel a deep sense of dread as you release pressure from your rear over \the [b], \
immediately realizing your mistake as Divine Retribution rends your form into a gorey mess.</span>")
heretic.emote("scream")
message_admins("[ADMIN_LOOKUPFLW(heretic)] farted on a bible at [ADMIN_VERBOSEJMP(heretic)] and was gibbed.")
log_game("[key_name(heretic)] farted on a bible at [AREACOORD(heretic)] and was gibbed")
heretic.gib()
return //Gassy is dead
/datum/emote/living/burp/belch
key = "belch"
key_third_person = "belches loudly"
message = "belches"
//god hates me for this -Metha
noise_type = "belch"
reduction_min = 6
reduction_max = 12
/datum/emote/living/burp/fart/brap
key = "brap"
key_third_person = "braps"
message = ""
reduction_min = 6
reduction_max = 12
/datum/emote/living/burp/fart/brap/select_message_type(var/mob/living/user)
return pick("farts loudly!", "cuts a fat one!", "rips absolute ass!")
/datum/emote/living/burp/fart/goon // Fart but it's funny !
key = "goonfart"
key_third_person = "goonfarts"
noise_type = 'goon/sound/voice/farts/fart4.ogg'
//Shhh... It's a secret! Don't tell or I'll steal your legs
/datum/emote/living/burunyu
key = "burunyu"
key_third_person = "burunyues"
message = "emits a strange feline sound"
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/funnycat.ogg'
/datum/emote/living/bellyrub
key = "bellyrub"
key_third_person = "bellyrubs"
message = "rubs their belly"
emote_type = EMOTE_VISIBLE
/datum/emote/living/bellyrub/run_emote(mob/living/user, params)
. = ..()
if(!.)
return FALSE
user.reduce_fullness(rand(4,16), 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,239 @@
// 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/prbt
key = "prbt"
key_third_person = "prbts"
message = "prbts."
message_param = "prbts at %t."
emote_type = EMOTE_AUDIBLE
sound = 'GainStation13/sound/voice/emotes/prbt.ogg'
/datum/emote/living/mlem
key = "mlem"
key_third_person = "mlems"
message = "mlems their tongue up over their nose. Mlem."
/datum/emote/living/blep
key = "blep"
key_third_person = "bleps"
message = "bleps their tongue out. Blep."
/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,16 @@
/mob/living/proc/reduce_fullness(amount, notify = TRUE) // fullness_amount should be between 5 and 20 for balance and below 80 for functionality
if(!ishuman(src))
return
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reducion_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
fullness -= amount // Remove Fullness
if(!notify)
return
if(amount <= 5)
to_chat(src, "You felt that make some space")
if(amount > 5)
to_chat(src, "You felt that make a lot of space")
@@ -0,0 +1,609 @@
//nutribot
//nutribot PATHFINDING
//nutribot ASSEMBLY
#define NUTRIBOT_PANIC_NONE 0
#define NUTRIBOT_PANIC_LOW 15
#define NUTRIBOT_PANIC_MED 35
#define NUTRIBOT_PANIC_HIGH 55
#define NUTRIBOT_PANIC_FUCK 70
#define NUTRIBOT_PANIC_ENDING 90
#define NUTRIBOT_PANIC_END 100
/mob/living/simple_animal/bot/nutribot
name = "\improper Nutribot"
desc = "A little nutritional robot. He looks somewhat underwhelmed."
icon = 'GainStation13/icons/mob/nutribot.dmi'
icon_state = "nutribot0"
density = FALSE
anchored = FALSE
health = 20
maxHealth = 20
pass_flags = PASSMOB
status_flags = (CANPUSH | CANSTUN)
radio_key = /obj/item/encryptionkey/headset_med
radio_channel = RADIO_CHANNEL_SERVICE
bot_type = MED_BOT
model = "Nutribot"
bot_core_type = /obj/machinery/bot_core/nutribot
window_id = "auto_nutrition"
window_name = "Automatic Nutritional Unit v1.1"
data_hud_type = DATA_HUD_MEDICAL_ADVANCED
path_image_color = "#DDDDFF"
var/obj/item/reagent_containers/glass/reagent_glass = null //Can be set to draw from this for reagents.
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
var/mob/living/carbon/patient = null
var/mob/living/carbon/oldpatient = null
var/oldloc = null
var/last_found = 0
var/last_newpatient_speak = 0 //Don't spam the "HEY I'M COMING" messages
var/injection_amount = 15 //How much reagent do we inject at a time?
var/feed_threshold = 200 // The weight that people should be fed to!
var/use_beaker = 0 //Use reagents in beaker instead of default treatment agents.
var/declare_cooldown = 0 //Prevents spam of critical patient alerts.
var/stationary_mode = 0 //If enabled, the Nutribot will not move automatically.
//Setting which reagents to use to treat what by default. By id.
var/treatment_thin = /datum/reagent/consumable/nutriment
var/treatment_thirsty = /datum/reagent/water
var/hunger_check = NUTRITION_LEVEL_HUNGRY
var/shut_up = 0 //self explanatory :)
//How panicked we are about being tipped over (why would you do this?)
var/tipped_status = NUTRIBOT_PANIC_NONE
//The name we got when we were tipped
var/tipper_name
//The last time we were tipped/righted and said a voice line, to avoid spam
var/last_tipping_action_voice = 0
/mob/living/simple_animal/bot/nutribot/update_icon()
cut_overlays()
if(!on)
icon_state = "nutribot0"
return
if(IsStun())
icon_state = "nutribota"
return
if(mode == BOT_HEALING)
icon_state = "nutribots[stationary_mode]"
return
else if(stationary_mode) //Bot has yellow light to indicate stationary mode.
icon_state = "nutribot2"
else
icon_state = "nutribot1"
/mob/living/simple_animal/bot/nutribot/Initialize(mapload, new_skin)
. = ..()
var/datum/job/cook/J = new /datum/job/cook
access_card.access += J.get_access()
prev_access = access_card.access
qdel(J)
skin = new_skin
update_icon()
/mob/living/simple_animal/bot/nutribot/update_canmove()
. = ..()
update_icon()
/mob/living/simple_animal/bot/nutribot/bot_reset()
..()
patient = null
oldpatient = null
oldloc = null
last_found = world.time
declare_cooldown = 0
update_icon()
/mob/living/simple_animal/bot/nutribot/proc/soft_reset() //Allows the Nutribot to still actively perform its medical duties without being completely halted as a hard reset does.
path = list()
patient = null
mode = BOT_IDLE
last_found = world.time
update_icon()
/mob/living/simple_animal/bot/nutribot/set_custom_texts()
text_hack = "You corrupt [name]'s reagent processor circuits."
text_dehack = "You reset [name]'s reagent processor circuits."
text_dehack_fail = "[name] seems damaged and does not respond to reprogramming!"
/mob/living/simple_animal/bot/nutribot/attack_paw(mob/user)
return attack_hand(user)
/mob/living/simple_animal/bot/nutribot/get_controls(mob/user)
var/dat
dat += hack(user)
dat += showpai(user)
dat += "<TT><B>Nutritional Unit Controls v1.1</B></TT><BR><BR>"
dat += "Status: <A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A><BR>"
dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>"
dat += "Beaker: "
if(reagent_glass)
dat += "<A href='?src=[REF(src)];eject=1'>Loaded \[[reagent_glass.reagents.total_volume]/[reagent_glass.reagents.maximum_volume]\]</a>"
else
dat += "None Loaded"
dat += "<br>Behaviour controls are [locked ? "locked" : "unlocked"]<hr>"
if(!locked || issilicon(user) || IsAdminGhost(user))
dat += "<TT>Feed Amount: "
dat += "<a href='?src=[REF(src)];adj_inject=-5'>-</a> "
dat += "[injection_amount] "
dat += "<a href='?src=[REF(src)];adj_inject=5'>+</a> "
dat += "</TT><br>"
dat += "Reagent Source: "
dat += "<a href='?src=[REF(src)];use_beaker=1'>[use_beaker ? "Loaded Beaker (When available)" : "Internal Synthesizer"]</a><br>"
dat += "Hunger Check: "
dat += "<a href='?src=[REF(src)];hunger_check=1'>[(hunger_check==NUTRITION_LEVEL_HUNGRY) ? "Yes" : "No"]</a><br>"
dat += "<TT>Maximum BFI: "
dat += "[feed_threshold ? feed_threshold : "???"] "
dat += "<br>"
dat += "Disable Maximum BFI: <a href='?src=[REF(src)];feed_threshold=1'>["Disable"]</a><br> "
dat += "<a href='?src=[REF(src)];feed_threshold=-100'>-</a> "
dat += "<a href='?src=[REF(src)];feed_threshold=100'>+</a> "
dat += "</TT><br>"
dat += "The speaker switch is [shut_up ? "off" : "on"]. <a href='?src=[REF(src)];togglevoice=[1]'>Toggle</a><br>"
dat += "Patrol Station: <a href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "Yes" : "No"]</a><br>"
dat += "Stationary Mode: <a href='?src=[REF(src)];stationary=1'>[stationary_mode ? "Yes" : "No"]</a><br>"
return dat
/mob/living/simple_animal/bot/nutribot/Topic(href, href_list)
if(..())
return TRUE
else if(href_list["adj_inject"])
var/adjust_num = text2num(href_list["adj_inject"])
injection_amount += adjust_num
if(injection_amount < 5)
injection_amount = 5
if(injection_amount > 15)
injection_amount = 15
else if(href_list["use_beaker"])
use_beaker = !use_beaker
else if(href_list["eject"] && (!isnull(reagent_glass)))
reagent_glass.forceMove(drop_location())
reagent_glass = null
else if(href_list["togglevoice"])
shut_up = !shut_up
else if(href_list["stationary"])
stationary_mode = !stationary_mode
path = list()
update_icon()
else if(href_list["hunger_check"])
hunger_check = ((hunger_check==NUTRITION_LEVEL_HUNGRY) ? NUTRITION_LEVEL_FULL : NUTRITION_LEVEL_HUNGRY)
else if(href_list["feed_threshold"])
var/adjust_num = text2num(href_list["feed_threshold"])
feed_threshold += adjust_num
if(adjust_num == 1)
feed_threshold = 0
if(feed_threshold < 0)
feed_threshold = 0
update_controls()
return
/mob/living/simple_animal/bot/nutribot/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/reagent_containers/glass))
. = 1 //no afterattack
if(locked)
to_chat(user, "<span class='warning'>You cannot insert a beaker because the panel is locked!</span>")
return
if(!isnull(reagent_glass))
to_chat(user, "<span class='warning'>There is already a beaker loaded!</span>")
return
if(!user.transferItemToLoc(W, src))
return
reagent_glass = W
to_chat(user, "<span class='notice'>You insert [W].</span>")
show_controls(user)
else
var/current_health = health
..()
if(health < current_health) //if nutribot took some damage
step_to(src, (get_step_away(src,user)))
/mob/living/simple_animal/bot/nutribot/emag_act(mob/user)
..()
if(emagged == 2)
if(user)
to_chat(user, "<span class='notice'>You short out [src]'s reagent synthesis circuits.</span>")
audible_message("<span class='danger'>[src] buzzes oddly!</span>")
flick("nutribot_spark", src)
playsound(src, "sparks", 75, 1)
if(user)
oldpatient = user
/mob/living/simple_animal/bot/nutribot/process_scan(mob/living/carbon/human/H)
if(H.stat == DEAD)
return
if((H == oldpatient) && (world.time < last_found + 200))
return
if(assess_patient(H))
last_found = world.time
if((last_newpatient_speak + 300) < world.time) //Don't spam these messages!
var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/coming.ogg',"Wait [H.name]! I want to help!" = 'sound/voice/medbot/help.ogg')
var/message = pick(messagevoice)
if(prob(2) && ISINRANGE_EX(H.getFireLoss(), 0, 20))
message = "Notices your minor burns*OwO what's this?"
messagevoice[message] = 'sound/voice/medbot/owo.ogg'
speak(message)
playsound(loc, messagevoice[message], 50, 0)
last_newpatient_speak = world.time
return H
else
return
/mob/living/simple_animal/bot/nutribot/proc/tip_over(mob/user)
canmove = 0
//mobility_flags &= ~MOBILITY_MOVE
playsound(src, 'sound/machines/warning-buzzer.ogg', 50)
user.visible_message("<span class='danger'>[user] tips over [src]!</span>", "<span class='danger'>You tip [src] over!</span>")
mode = BOT_TIPPED
var/matrix/mat = transform
transform = mat.Turn(180)
/mob/living/simple_animal/bot/nutribot/proc/set_right(mob/user)
canmove = 1
//mobility_flags &= MOBILITY_MOVE
var/list/messagevoice
if(user)
user.visible_message("<span class='notice'>[user] sets [src] right-side up!</span>", "<span class='green'>You set [src] right-side up!</span>")
if(user.name == tipper_name)
messagevoice = list("I forgive you." = 'sound/voice/medbot/forgive.ogg')
else
messagevoice = list("Thank you!" = 'sound/voice/medbot/thank_you.ogg', "You are a good person." = 'sound/voice/medbot/youre_good.ogg')
else
visible_message("<span class='notice'>[src] manages to writhe wiggle enough to right itself.</span>")
messagevoice = list("Fuck you." = 'sound/voice/medbot/fuck_you.ogg', "Your behavior has been reported, have a nice day." = 'sound/voice/medbot/reported.ogg')
tipper_name = null
if(world.time > last_tipping_action_voice + 15 SECONDS)
last_tipping_action_voice = world.time
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 70)
tipped_status = NUTRIBOT_PANIC_NONE
mode = BOT_IDLE
transform = matrix()
// if someone tipped us over, check whether we should ask for help or just right ourselves eventually
/mob/living/simple_animal/bot/nutribot/proc/handle_panic()
tipped_status++
var/list/messagevoice
switch(tipped_status)
if(NUTRIBOT_PANIC_LOW)
messagevoice = list("I require assistance." = 'sound/voice/medbot/i_require_asst.ogg')
if(NUTRIBOT_PANIC_MED)
messagevoice = list("Please put me back." = 'sound/voice/medbot/please_put_me_back.ogg')
if(NUTRIBOT_PANIC_HIGH)
messagevoice = list("Please, I am scared!" = 'sound/voice/medbot/please_im_scared.ogg')
if(NUTRIBOT_PANIC_FUCK)
messagevoice = list("I don't like this, I need help!" = 'sound/voice/medbot/dont_like.ogg', "This hurts, my pain is real!" = 'sound/voice/medbot/pain_is_real.ogg')
if(NUTRIBOT_PANIC_ENDING)
messagevoice = list("Is this the end?" = 'sound/voice/medbot/is_this_the_end.ogg', "Nooo!" = 'sound/voice/medbot/nooo.ogg')
if(NUTRIBOT_PANIC_END)
speak("PSYCH ALERT: Crewmember [tipper_name] recorded displaying antisocial tendencies torturing bots in [get_area(src)]. Please schedule psych evaluation.", radio_channel)
set_right() // strong independent nutribot
if(prob(tipped_status))
do_jitter_animation(tipped_status * 0.1)
if(messagevoice)
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 70)
else if(prob(tipped_status * 0.2))
playsound(src, 'sound/machines/warning-buzzer.ogg', 30, extrarange=-2)
/mob/living/simple_animal/bot/nutribot/examine(mob/user)
. = ..()
if(tipped_status == NUTRIBOT_PANIC_NONE)
return
switch(tipped_status)
if(NUTRIBOT_PANIC_NONE to NUTRIBOT_PANIC_LOW)
. += "It appears to be tipped over, and is quietly waiting for someone to set it right."
if(NUTRIBOT_PANIC_LOW to NUTRIBOT_PANIC_MED)
. += "It is tipped over and requesting help."
if(NUTRIBOT_PANIC_MED to NUTRIBOT_PANIC_HIGH)
. += "They are tipped over and appear visibly distressed." // now we humanize the nutribot as a they, not an it
if(NUTRIBOT_PANIC_HIGH to NUTRIBOT_PANIC_FUCK)
. += "<span class='warning'>They are tipped over and visibly panicking!</span>"
if(NUTRIBOT_PANIC_FUCK to INFINITY)
. += "<span class='warning'><b>They are freaking out from being tipped over!</b></span>"
/mob/living/simple_animal/bot/nutribot/handle_automated_action()
if(!..())
return
if(mode == BOT_TIPPED)
handle_panic()
return
if(mode == BOT_HEALING)
return
if(IsStun())
oldpatient = patient
patient = null
mode = BOT_IDLE
return
if(frustration > 8)
oldpatient = patient
soft_reset()
if(QDELETED(patient))
if(!shut_up && prob(1))
if(emagged && prob(30))
var/list/i_need_scissors = list('sound/voice/medbot/fuck_you.ogg', 'sound/voice/medbot/turn_off.ogg', 'sound/voice/medbot/im_different.ogg', 'sound/voice/medbot/close.ogg', 'sound/voice/medbot/shindemashou.ogg')
playsound(src, pick(i_need_scissors), 70)
else
var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/medbot/radar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/medbot/catch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg',"Delicious!" = 'sound/voice/medbot/delicious.ogg', "Why are we still here? Just to suffer?" = 'sound/voice/medbot/why.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 50)
var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE) //If in stationary mode, scan range is limited to adjacent patients.
patient = scan(/mob/living/carbon/human, oldpatient, scan_range)
oldpatient = patient
if(patient && (get_dist(src,patient) <= 1)) //Patient is next to us, begin treatment!
if(mode != BOT_HEALING)
mode = BOT_HEALING
update_icon()
frustration = 0
medicate_patient(patient)
return
//Patient has moved away from us!
else if(patient && path.len && (get_dist(patient,path[path.len]) > 2))
path = list()
mode = BOT_IDLE
last_found = world.time
else if(stationary_mode && patient) //Since we cannot move in this mode, ignore the patient and wait for another.
soft_reset()
return
if(patient && path.len == 0 && (get_dist(src,patient) > 1))
path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,id=access_card)
mode = BOT_MOVING
if(!path.len) //try to get closer if you can't reach the patient directly
path = get_path_to(src, get_turf(patient), /turf/proc/Distance_cardinal, 0, 30,1,id=access_card)
if(!path.len) //Do not chase a patient we cannot reach.
soft_reset()
if(path.len > 0 && patient)
if(!bot_move(path[path.len]))
oldpatient = patient
soft_reset()
return
if(path.len > 8 && patient)
frustration++
if(auto_patrol && !stationary_mode && !patient)
if(mode == BOT_IDLE || mode == BOT_START_PATROL)
start_patrol()
if(mode == BOT_PATROL)
bot_patrol()
return
/mob/living/simple_animal/bot/nutribot/proc/assess_patient(mob/living/carbon/C)
//Time to see if they need medical help!
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
return FALSE //welp too late for them!
if(!(loc == C.loc) && !(isturf(C.loc) && isturf(loc)))
return FALSE
if(C.suiciding)
return FALSE //Kevorkian school of robotic medical assistants.
if(!C?.client?.prefs.bot_feeding)
return FALSE
if(emagged == 2) //Everyone needs our medicine. (Our medicine is corn oil)
return TRUE
if(ishuman(C))
var/mob/living/carbon/human/H = C
if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing))
var/obj/item/clothing/CS = H.wear_suit
var/obj/item/clothing/CH = H.head
if (CS.clothing_flags & CH.clothing_flags & THICKMATERIAL)
return FALSE // Skip over them if they have no exposed flesh.
//if(declare_crit && C.health <= 0) //Critical condition! Call for help!
//declare(C)
//If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS.
if((reagent_glass) && (use_beaker) && (C.nutrition <= hunger_check) && ((C.fatness <= feed_threshold) || (feed_threshold == 0)))
for(var/A in reagent_glass.reagents.reagent_list)
var/datum/reagent/R = A
if(!C.reagents.has_reagent(R.type))
return TRUE
//They're injured enough for it!
//nutrition check
if((C.nutrition <= hunger_check) && ((C.fatness <= feed_threshold) || (feed_threshold == 0)) && (!C.reagents.has_reagent(treatment_thin)))
return TRUE //If they're already medicated don't bother!
return FALSE
/mob/living/simple_animal/bot/nutribot/attack_hand(mob/living/carbon/human/H)
if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED)
H.visible_message("<span class='danger'>[H] begins tipping over [src].</span>", "<span class='warning'>You begin tipping over [src]...</span>")
if(world.time > last_tipping_action_voice + 15 SECONDS)
last_tipping_action_voice = world.time // message for tipping happens when we start interacting, message for righting comes after finishing
var/list/messagevoice = list("Hey, wait..." = 'sound/voice/medbot/hey_wait.ogg',"Please don't..." = 'sound/voice/medbot/please_dont.ogg',"I trusted you..." = 'sound/voice/medbot/i_trusted_you.ogg', "Nooo..." = 'sound/voice/medbot/nooo.ogg', "Oh fuck-" = 'sound/voice/medbot/oh_fuck.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 70, FALSE)
if(do_after(H, 3 SECONDS, target=src))
tip_over(H)
else if(H.a_intent == INTENT_HELP && mode == BOT_TIPPED)
H.visible_message("<span class='notice'>[H] begins righting [src].</span>", "<span class='notice'>You begin righting [src]...</span>")
if(do_after(H, 3 SECONDS, target=src))
set_right(H)
else
..()
/mob/living/simple_animal/bot/nutribot/UnarmedAttack(atom/A)
if(iscarbon(A))
var/mob/living/carbon/C = A
patient = C
mode = BOT_HEALING
update_icon()
medicate_patient(C)
update_icon()
else
..()
/mob/living/simple_animal/bot/nutribot/examinate(atom/A as mob|obj|turf in view())
..()
if(!is_blind(src))
chemscan(src, A)
/mob/living/simple_animal/bot/nutribot/proc/medicate_patient(mob/living/carbon/C)
if(!on)
return
if(!istype(C))
oldpatient = patient
soft_reset()
return
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/medbot/no.ogg',"Live, damnit! LIVE!" = 'sound/voice/medbot/live.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/medbot/lost.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(loc, messagevoice[message], 50, 0)
oldpatient = patient
soft_reset()
return
var/reagent_id = null
if(emagged == 2) //Emagged! Time to poison everybody.
reagent_id = /datum/reagent/consumable/cornoil //evil fucking check for a string as a reagent this shit is evil. its supposed to inject corn oil AND filzulphite but ill handle that later
else
if(!reagent_id && ((feed_threshold == 0) || (C.fatness <= feed_threshold)) && (C.nutrition <= hunger_check))
if(!C.reagents.has_reagent(treatment_thin))
reagent_id = treatment_thin
//If the patient is injured but doesn't have our special reagent in them then we should give it to them first
if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
for(var/A in reagent_glass.reagents.reagent_list)
var/datum/reagent/R = A
if(!C.reagents.has_reagent(R.type))
reagent_id = "internal_beaker"
break
if(!reagent_id) //If they don't need any of that they're probably cured!
if((C.nutrition >= hunger_check) || (C.fatness >= feed_threshold))
to_chat(src, "<span class='notice'>[C] is full, or fat! Your programming prevents you from feeding anyone who is over the maximum weight, or doesn't need food!</span>")
var/list/messagevoice = list("All patched up!" = 'sound/voice/medbot/patchedup.ogg',"An apple a day keeps me away." = 'sound/voice/medbot/apple.ogg',"Feel better soon!" = 'sound/voice/medbot/feelbetter.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(loc, messagevoice[message], 50, 0)
bot_reset()
return
else
if(!emagged && check_overdose(patient,reagent_id,injection_amount))
soft_reset()
return
C.visible_message("<span class='danger'>[src] is trying to feed [patient]!</span>", \
"<span class='userdanger'>[src] is trying to feed you!</span>")
var/failed = FALSE
if(do_mob(src, patient, 30)) //Is C == patient? This is so confusing
if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient))
if(reagent_id == "internal_beaker")
if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1)
reagent_glass.reagents.reaction(patient, INJECT, fraction)
reagent_glass.reagents.trans_to(patient,injection_amount) //Inject from beaker instead.
else
patient.reagents.add_reagent(reagent_id,injection_amount)
C.visible_message("<span class='danger'>[src] feeds [patient] with its tube!</span>", \
"<span class='userdanger'>[src] feeds you with its tube!</span>")
else
failed = TRUE
else
failed = TRUE
if(failed)
visible_message("[src] retracts its tube.")
update_icon()
soft_reset()
return
reagent_id = null
return
/mob/living/simple_animal/bot/nutribot/proc/check_overdose(mob/living/carbon/patient,reagent_id,injection_amount)
var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_id]
if(!R.overdose_threshold) //Some chems do not have an OD threshold
return FALSE
var/current_volume = patient.reagents.get_reagent_amount(reagent_id)
if(current_volume + injection_amount > R.overdose_threshold)
return TRUE
return FALSE
/mob/living/simple_animal/bot/nutribot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/atom/Tsec = drop_location()
new /obj/item/stack/sheet/cardboard(Tsec)
new /obj/item/assembly/prox_sensor(Tsec)
new /obj/item/stack/sheet/mineral/calorite(Tsec)
if(reagent_glass)
drop_part(reagent_glass, Tsec)
if(prob(50))
drop_part(robot_arm, Tsec)
if(emagged && prob(25))
playsound(loc, 'sound/voice/medbot/insult.ogg', 50, 0)
do_sparks(3, TRUE, src)
..()
/obj/machinery/bot_core/nutribot
req_one_access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_ROBOTICS)
#undef NUTRIBOT_PANIC_NONE
#undef NUTRIBOT_PANIC_LOW
#undef NUTRIBOT_PANIC_MED
#undef NUTRIBOT_PANIC_HIGH
#undef NUTRIBOT_PANIC_FUCK
#undef NUTRIBOT_PANIC_ENDING
#undef NUTRIBOT_PANIC_END
@@ -0,0 +1,423 @@
/datum/species/proc/handle_fatness_trait(mob/living/carbon/human/H, trait, trait_lose, trait_gain, fatness_lose, fatness_gain, chat_lose, chat_gain)
if(H.fatness < fatness_lose)
if (chat_lose)
to_chat(H, chat_lose)
if (trait)
REMOVE_TRAIT(H, trait, OBESITY)
if (trait_lose)
ADD_TRAIT(H, trait_lose, OBESITY)
update_body_size(H, -1)
else if(H.fatness >= fatness_gain)
if (chat_gain)
to_chat(H, chat_gain)
if (trait)
REMOVE_TRAIT(H, trait, OBESITY)
if (trait_gain)
ADD_TRAIT(H, trait_gain, OBESITY)
update_body_size(H, 1)
/datum/species/proc/handle_helplessness(mob/living/carbon/human/fatty)
var/datum/preferences/preferences = fatty?.client?.prefs
if(!istype(preferences))
return FALSE
if(preferences.helplessness_no_movement)
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_no_movement)
to_chat(fatty, "<span class='warning'>You have become too fat to move anymore.</span>")
ADD_TRAIT(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
else if(fatty.fatness < preferences.helplessness_no_movement)
to_chat(fatty, "<span class='notice'>You have become thin enough to regain some of your mobility.</span>")
REMOVE_TRAIT(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
if(preferences.helplessness_clumsy)
if(!HAS_TRAIT_FROM(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_clumsy)
to_chat(fatty, "<span class='warning'>Your newfound weight has made it hard to manipulate objects.</span>")
ADD_TRAIT(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
else if(fatty.fatness < preferences.helplessness_clumsy)
to_chat(fatty, "<span class='notice'>You feel like you have lost enough weight to recover your dexterity.</span>")
REMOVE_TRAIT(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
if(preferences.helplessness_nearsighted)
if(!HAS_TRAIT_FROM(fatty, TRAIT_NEARSIGHT, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_nearsighted)
to_chat(fatty, "<span class='warning'>Your fat makes it difficult to see the world around you. </span>")
fatty.become_nearsighted(HELPLESSNESS_TRAIT)
else if(fatty.fatness < preferences.helplessness_nearsighted)
to_chat(fatty, "<span class='notice'>You are thin enough to see your enviornment again. </span>")
fatty.cure_nearsighted(HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_NEARSIGHT, HELPLESSNESS_TRAIT))
fatty.cure_nearsighted(HELPLESSNESS_TRAIT)
if(preferences.helplessness_hidden_face)
if(!HAS_TRAIT_FROM(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_hidden_face)
to_chat(fatty, "<span class='warning'>You have gotten fat enough that your face is now unrecognizable. </span>")
ADD_TRAIT(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
else if(fatty.fatness < preferences.helplessness_hidden_face)
to_chat(fatty, "<span class='notice'>You have lost enough weight to allow people to now recognize your face.</span>")
REMOVE_TRAIT(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
if(preferences.helplessness_mute)
if(!HAS_TRAIT_FROM(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_mute)
to_chat(fatty, "<span class='warning'>Your fat makes it impossible for you to speak.</span>")
ADD_TRAIT(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT)
else if(fatty.fatness < preferences.helplessness_mute)
to_chat(fatty, "<span class='notice'>You are thin enough now to be able to speak again. </span>")
REMOVE_TRAIT(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_MUTE, HELPLESSNESS_TRAIT)
if(preferences.helplessness_immobile_arms)
if(!HAS_TRAIT_FROM(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_immobile_arms)
to_chat(fatty, "<span class='warning'>Your arms are now engulfed in fat, making it impossible to move your arms. </span>")
ADD_TRAIT(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
ADD_TRAIT(fatty, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
fatty.update_disabled_bodyparts()
else if(fatty.fatness < preferences.helplessness_immobile_arms)
to_chat(fatty, "<span class='notice'>You are able to move your arms again. </span>")
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
fatty.update_disabled_bodyparts()
else
if(HAS_TRAIT_FROM(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
REMOVE_TRAIT(fatty, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
fatty.update_disabled_bodyparts()
if(preferences.helplessness_clothing_jumpsuit)
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_clothing_jumpsuit)
ADD_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
var/obj/item/clothing/under/jumpsuit = fatty.w_uniform
if(istype(jumpsuit) && !istype(jumpsuit, /obj/item/clothing/under/color/grey/modular))
to_chat(fatty, "<span class='warning'>[jumpsuit] can no longer contain your weight!</span>")
fatty.dropItemToGround(jumpsuit)
else if(fatty.fatness < preferences.helplessness_clothing_jumpsuit)
to_chat(fatty, "<span class='notice'>You feel thin enough to put on jumpsuits now. </span>")
REMOVE_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
if(preferences.helplessness_clothing_misc)
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_clothing_misc)
ADD_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
var/obj/item/clothing/suit/worn_suit = fatty.wear_suit
if(istype(worn_suit))
to_chat(fatty, "<span class='warning'>[worn_suit] can no longer contain your weight!</span>")
fatty.dropItemToGround(worn_suit)
var/obj/item/clothing/gloves/worn_gloves = fatty.gloves
if(istype(worn_gloves))
to_chat(fatty, "<span class='warning'>[worn_gloves] can no longer contain your weight!</span>")
fatty.dropItemToGround(worn_gloves)
var/obj/item/clothing/shoes/worn_shoes = fatty.shoes
if(istype(worn_shoes))
to_chat(fatty, "<span class='warning'>[worn_shoes] can no longer contain your weight!</span>")
fatty.dropItemToGround(worn_shoes)
else if(fatty.fatness < preferences.helplessness_clothing_misc)
to_chat(fatty, "<span class='notice'>You feel thin enough to put on suits, shoes, and gloves now. </span>")
REMOVE_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
if(preferences.helplessness_clothing_back)
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_clothing_back)
ADD_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
var/obj/item/back_item = fatty.back
if(istype(back_item))
to_chat(fatty, "<span class='warning'>Your weight makes it impossible for you to carry [back_item].</span>")
fatty.dropItemToGround(back_item)
else if(fatty.fatness < preferences.helplessness_clothing_back)
to_chat(fatty, "<span class='notice'>You feel thin enough to hold items on your back now. </span>")
REMOVE_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
if(preferences.helplessness_no_buckle)
if(!HAS_TRAIT_FROM(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
if(fatty.fatness >= preferences.helplessness_no_buckle)
to_chat(fatty, "<span class='warning'>You feel like you've gotten too big to fit on anything.</span>")
ADD_TRAIT(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
else if(fatty.fatness < preferences.helplessness_no_buckle)
to_chat(fatty, "<span class='notice'>You feel thin enough to sit on things again. </span>")
REMOVE_TRAIT(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
else
if(HAS_TRAIT_FROM(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(fatty, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
/datum/species/proc/handle_fatness(mob/living/carbon/human/H)
handle_helplessness(H)
if(HAS_TRAIT(H, TRAIT_BLOB))
handle_fatness_trait(
H,
TRAIT_BLOB,
TRAIT_IMMOBILE,
null,
FATNESS_LEVEL_BLOB,
INFINITY,
"<span class='notice'>You feel like you've regained some mobility!</span>",
null)
return
if(HAS_TRAIT(H, TRAIT_IMMOBILE))
handle_fatness_trait(
H,
TRAIT_IMMOBILE,
TRAIT_BARELYMOBILE,
TRAIT_BLOB,
FATNESS_LEVEL_IMMOBILE,
FATNESS_LEVEL_BLOB,
"<span class='notice'>You feel less restrained by your fat!</span>",
"<span class='danger'>You feel like you've become a mountain of fat!</span>")
return
if(HAS_TRAIT(H, TRAIT_BARELYMOBILE))
handle_fatness_trait(
H,
TRAIT_BARELYMOBILE,
TRAIT_EXTREMELYOBESE,
TRAIT_IMMOBILE,
FATNESS_LEVEL_BARELYMOBILE,
FATNESS_LEVEL_IMMOBILE,
"<span class='notice'>You feel less restrained by your fat!</span>",
"<span class='danger'>You feel belly smush against the floor!</span>")
return
if(HAS_TRAIT(H, TRAIT_EXTREMELYOBESE))
handle_fatness_trait(
H,
TRAIT_EXTREMELYOBESE,
TRAIT_MORBIDLYOBESE,
TRAIT_BARELYMOBILE,
FATNESS_LEVEL_EXTREMELY_OBESE,
FATNESS_LEVEL_BARELYMOBILE,
"<span class='notice'>You feel less restrained by your fat!</span>",
"<span class='danger'>You feel like you can barely move!</span>")
return
if(HAS_TRAIT(H, TRAIT_MORBIDLYOBESE))
handle_fatness_trait(
H,
TRAIT_MORBIDLYOBESE,
TRAIT_OBESE,
TRAIT_EXTREMELYOBESE,
FATNESS_LEVEL_MORBIDLY_OBESE,
FATNESS_LEVEL_EXTREMELY_OBESE,
"<span class='notice'>You feel a bit less fat!</span>",
"<span class='danger'>You feel your belly rest heavily on your lap!</span>")
return
if(HAS_TRAIT(H, TRAIT_OBESE))
handle_fatness_trait(
H,
TRAIT_OBESE,
TRAIT_VERYFAT,
TRAIT_MORBIDLYOBESE,
FATNESS_LEVEL_OBESE,
FATNESS_LEVEL_MORBIDLY_OBESE,
"<span class='notice'>You feel like you've lost weight!</span>",
"<span class='danger'>Your thighs begin to rub against each other.</span>")
return
if(HAS_TRAIT(H, TRAIT_VERYFAT))
handle_fatness_trait(
H,
TRAIT_VERYFAT,
TRAIT_FATTER,
TRAIT_OBESE,
FATNESS_LEVEL_VERYFAT,
FATNESS_LEVEL_OBESE,
"<span class='notice'>You feel like you've lost weight!</span>",
"<span class='danger'>You feel like you're starting to get really heavy.</span>")
return
if(HAS_TRAIT(H, TRAIT_FATTER))
handle_fatness_trait(
H,
TRAIT_FATTER,
TRAIT_FAT,
TRAIT_VERYFAT,
FATNESS_LEVEL_FATTER,
FATNESS_LEVEL_VERYFAT,
"<span class='notice'>You feel like you've lost weight!</span>",
"<span class='danger'>Your clothes creak quietly!</span>")
return
if(HAS_TRAIT(H, TRAIT_FAT))
handle_fatness_trait(
H,
TRAIT_FAT,
null,
TRAIT_FATTER,
FATNESS_LEVEL_FAT,
FATNESS_LEVEL_FATTER,
"<span class='notice'>You feel fit again!</span>",
"<span class='danger'>You feel even plumper!</span>")
else
handle_fatness_trait(
H,
null,
null,
TRAIT_FAT,
0,
FATNESS_LEVEL_FAT,
null,
"<span class='danger'>You suddenly feel blubbery!</span>")
/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
return //hunger is for BABIES
handle_fatness(H) // GS13
// nutrition decrease and satiety
if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
if(mood && mood.sanity > SANITY_DISTURBED)
hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
// Whether we cap off our satiety or move it towards 0
if(H.satiety > MAX_SATIETY)
H.satiety = MAX_SATIETY
else if(H.satiety > 0)
H.satiety--
else if(H.satiety < -MAX_SATIETY)
H.satiety = -MAX_SATIETY
else if(H.satiety < 0)
H.satiety++
if(prob(round(-H.satiety/40)))
H.Jitter(5)
hunger_rate = 3 * HUNGER_FACTOR
hunger_rate *= H.physiology.hunger_mod
H.nutrition = max(0, H.nutrition - hunger_rate)
if (H.nutrition > NUTRITION_LEVEL_FULL)
// fatConversionRate is functionally useless. It seems under normal curcumstances, each tick only processes, at most, 1 nutrition anyway. reducing the value has no effect.
var/fatConversionRate = 100 //GS13 what percentage of the excess nutrition should go to fat (total nutrition to transfer can't be under 1)
var/nutritionThatBecomesFat = max((H.nutrition - NUTRITION_LEVEL_FULL)*(fatConversionRate / 100),1)
H.nutrition -= nutritionThatBecomesFat
H.adjust_fatness(nutritionThatBecomesFat, FATTENING_TYPE_FOOD)
if(H.fullness > FULLNESS_LEVEL_EMPTY)//GS13 stomach-emptying routine
var/ticksToEmptyStomach = 20 // GS13 how many ticks it takes to decrease the fullness by 1
if(HAS_TRAIT(H, TRAIT_VORACIOUS))
ticksToEmptyStomach = ticksToEmptyStomach * 0.5
H.fullness -= 1/ticksToEmptyStomach
if (H.fullness > FULLNESS_LEVEL_BLOATED) //GS13 overeating depends on fullness now
if(H.overeatduration < 5000) //capped so people don't take forever to unfat
H.overeatduration++
else
if(H.overeatduration > 1)
H.overeatduration -= 1 //doubled the unfat rate -- GS13 Nah, put it back
//metabolism change
if(H.nutrition > NUTRITION_LEVEL_FULL +100)
H.metabolism_efficiency = 1
else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80)
if(H.metabolism_efficiency != 1.25 && !HAS_TRAIT(H, TRAIT_NOHUNGER))
to_chat(H, "<span class='notice'>You feel vigorous.</span>")
H.metabolism_efficiency = 1.25
else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
if(H.metabolism_efficiency != 0.8)
to_chat(H, "<span class='notice'>You feel sluggish.</span>")
H.metabolism_efficiency = 0.8
else
if(H.metabolism_efficiency == 1.25)
to_chat(H, "<span class='notice'>You no longer feel vigorous.</span>")
H.metabolism_efficiency = 1
switch(H.nutrition)
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL)
H.clear_alert("nutrition")
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
H.throw_alert("nutrition", /obj/screen/alert/hungry)
if(0 to NUTRITION_LEVEL_STARVING)
H.throw_alert("nutrition", /obj/screen/alert/starving)
switch(H.fullness)
if(0 to FULLNESS_LEVEL_BLOATED)
H.clear_alert("fullness")
if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG)
H.throw_alert("fullness", /obj/screen/alert/bloated)
if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ)
H.throw_alert("fullness", /obj/screen/alert/stuffed)
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)
H.throw_alert("fullness", /obj/screen/alert/beegbelly)
switch(H.fatness)
if(FATNESS_LEVEL_BLOB to INFINITY)
H.throw_alert("fatness", /obj/screen/alert/blob)
if(FATNESS_LEVEL_IMMOBILE to FATNESS_LEVEL_BLOB)
H.throw_alert("fatness", /obj/screen/alert/immobile)
if(FATNESS_LEVEL_BARELYMOBILE to FATNESS_LEVEL_IMMOBILE)
H.throw_alert("fatness", /obj/screen/alert/barelymobile)
if(FATNESS_LEVEL_EXTREMELY_OBESE to FATNESS_LEVEL_BARELYMOBILE)
H.throw_alert("fatness", /obj/screen/alert/extremelyobese)
if(FATNESS_LEVEL_MORBIDLY_OBESE to FATNESS_LEVEL_EXTREMELY_OBESE)
H.throw_alert("fatness", /obj/screen/alert/morbidlyobese)
if(FATNESS_LEVEL_OBESE to FATNESS_LEVEL_MORBIDLY_OBESE)
H.throw_alert("fatness", /obj/screen/alert/obese)
if(FATNESS_LEVEL_VERYFAT to FATNESS_LEVEL_OBESE)
H.throw_alert("fatness", /obj/screen/alert/veryfat)
if(FATNESS_LEVEL_FATTER to FATNESS_LEVEL_VERYFAT)
H.throw_alert("fatness", /obj/screen/alert/fatter)
if(FATNESS_LEVEL_FAT to FATNESS_LEVEL_FATTER)
H.throw_alert("fatness", /obj/screen/alert/fat)
if(0 to FATNESS_LEVEL_FAT)
H.clear_alert("fatness")
@@ -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
)
@@ -0,0 +1,149 @@
//we'll put funky non-toxic chems here
//fattening chem
/datum/reagent/consumable/lipoifier
name = "Lipoifier"
description = "A very potent chemical that causes those that ingest it to build up fat cells quickly."
taste_description = "lard"
reagent_state = LIQUID
color = "#e2e1b1"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/consumable/lipoifier/on_mob_life(mob/living/carbon/M)
M.adjust_fatness(15, FATTENING_TYPE_CHEM)
return ..()
//BURPY CHEM
/datum/reagent/consumable/fizulphite
name = "Fizulphite"
description = "A strange chemical that produces large amounts of gas when in contact with organic, typically fleshy environments."
color = "#4cffed" // rgb: 102, 99, 0
reagent_state = LIQUID
taste_description = "fizziness"
metabolization_rate = 2 * REAGENTS_METABOLISM
/datum/reagent/consumable/fizulphite/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_chems)
M.burpslurring = max(M.burpslurring,50)
M.burpslurring += 2
else
M.burpslurring += 0
..()
//ANTI-BURPY CHEM
/datum/reagent/consumable/extilphite
name = "Extilphite"
description = "A very useful chemical that helps soothe bloated stomachs."
color = "#2aed96"
reagent_state = LIQUID
taste_description = "smoothness"
metabolization_rate = 0.8 * REAGENTS_METABOLISM
/datum/reagent/consumable/extilphite/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_chems)
M.burpslurring -= 3
else
M.burpslurring -= 0
if(M.fullness>10)
M.fullness -= 6
else
M.fullness -= 0
..()
//FARTY CHEM
/datum/reagent/consumable/flatulose
name = "Flatulose"
description = "A sugar largely indigestible to most known organic organisms. Causes frequent flatulence."
color = "#634500"
reagent_state = LIQUID
taste_description = "sulfury sweetness"
metabolization_rate = 0.5 * REAGENTS_METABOLISM //Done by Zestyspy, Jan 2023
/datum/reagent/consumable/flatulose/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_chems)
if(M.reagents.get_reagent_amount(/datum/reagent/consumable/flatulose) < 1)
to_chat(M,"<span class='notice'>You feel substantially bloated...</span>")
if(M.reagents.get_reagent_amount(/datum/reagent/consumable/flatulose) > 3)
to_chat(M,"<span class='notice'>You feel pretty gassy...</span>")
M.emote(pick("brap","fart")) // we gotta categorize this into "slob" category or something later! - GDLW2
..()
else
return ..()
// calorite blessing chem, used in the golem ability
/datum/reagent/consumable/caloriteblessing
name = "Calorite blessing"
description = "A strange, viscous liquid derived from calorite. It is said to have physically enhancing properties surprisingly unrelated to weight gain when consumed"
color = "#eb6e00"
reagent_state = LIQUID
taste_description = "sweet salvation"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/consumable/caloriteblessing/on_mob_metabolize(mob/living/L)
..()
ADD_TRAIT(L, TRAIT_GOTTAGOFAST, type)
/datum/reagent/consumable/caloriteblessing/on_mob_end_metabolize(mob/living/L)
REMOVE_TRAIT(L, TRAIT_GOTTAGOFAST, type)
..()
//BLUEBERRY CHEM - ONLY CHANGES PLAYER'S COLOR AND NOTHING MORE
/datum/reagent/blueberry_juice
name = "Blueberry Juice"
description = "Totally infectious."
reagent_state = LIQUID
metabolization_rate = 0.25 * REAGENTS_METABOLISM
color = "#0004ff"
var/picked_color
var/list/random_color_list = list("#0058db","#5d00c7","#0004ff","#0057e7")
taste_description = "blueberry pie"
var/no_mob_color = FALSE
value = 10 //it sells. Make that berry factory
/datum/reagent/blueberry_juice/on_mob_life(mob/living/carbon/M)
if(M?.client)
if(!(M?.client?.prefs?.blueberry_inflation))
M.reagents.remove_reagent(/datum/reagent/blueberry_juice, volume)
return
if(!no_mob_color)
M.add_atom_colour(picked_color, WASHABLE_COLOUR_PRIORITY)
M.adjust_fatness(1, FATTENING_TYPE_CHEM)
..()
/datum/reagent/blueberry_juice/on_mob_add(mob/living/L, amount)
if(iscarbon(L))
var/mob/living/carbon/affected_mob = L
if(!affected_mob?.client || !(affected_mob?.client?.prefs?.blueberry_inflation))
affected_mob.reagents.remove_reagent(/datum/reagent/blueberry_juice, volume)
return
picked_color = pick(random_color_list)
affected_mob.hider_add(src)
else
L.reagents.remove_reagent(/datum/reagent/blueberry_juice, volume)
..()
/datum/reagent/blueberry_juice/on_mob_delete(mob/living/L)
if(!iscarbon(L))
return
var/mob/living/carbon/C = L
C.hider_remove(src)
/datum/reagent/blueberry_juice/proc/fat_hide()
return (124 * (volume * volume))/1000 //123'840 600% size, about 56'000 400% size, calc was: (3 * (volume * volume))/50
// /obj/item/reagent_containers/food/snacks/meat/steak/troll
// name = "Troll steak"
// desc = "In its sliced state it remains dormant, but once the troll meat comes in contact with stomach acids, it begins a perpetual cycle of constant regrowth and digestion. You probably shouldn't eat this."
// var/hunger_threshold = NUTRITION_LEVEL_FULL
// var/nutrition_amount = 20 // somewhere around 5 pounds
// var/fullness_to_add = 10
// var/message = "<span class='notice'>You feel fuller...</span>" // GS13
@@ -0,0 +1,28 @@
///GS13 drinks!
/datum/reagent/consumable/ethanol/oily_oafs
name = "Oily oafs"
description = "The oily oaf. while it isn't as strong as some of the other drinks on station, Its buttery aftertaste and affordability make it a staple of any good miner's diet."
color = "#ffc75f"
boozepwr = 30
taste_description = "rich butter and red sugar"
//quality = DRINK_NICE we need to get drink quality implemented in our drink files -Eye
glass_icon_state = "oily_oafs"
glass_name = "oily oafs"
glass_desc = "The oily oaf. A dwarvern classic beloved by miners around the cosmos."
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
/datum/reagent/consumable/ethanol/glyphid_slammer
name = "Glyphid slammer"
description = "A mixture of strong beer and energy drink. How it manages to be as strong as it is baffles scientists to this day"
color = "#FF8A33"
boozepwr = 60
taste_description = "Cheap booze and adventure"
glass_icon_state = "glyphid_slammer"
glass_name = "Glyphid slammer"
glass_desc = "A bold mixture of cheap energy drink, and even cheaper ale. Beloved by partygoers and daredevils across the galaxy. Beloathed by bugpeople"
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
@@ -0,0 +1,159 @@
//GS13 weight gain drinks
/datum/reagent/consumable/ethanol/belly_bloats
name = "Belly Bloats"
description = "A classic of this sector that bloats the waistline. Hard to stop chugging once you start."
color = "#FF3333"
boozepwr = 25
taste_description = "a heavy mix of cherry and beer"
quality = DRINK_GOOD
glass_icon_state = "belly_bloats"
glass_name = "belly bloats"
glass_desc = "The perfect mix to be big and merry with."
shot_glass_icon_state = "shotglassbrown"
hydration = 3
/datum/reagent/consumable/ethanol/belly_bloats/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
M.nutrition += 15 * REAGENTS_METABOLISM
else
M.nutrition += 1
..()
/datum/reagent/consumable/ethanol/blobby_mary
name = "Blobby Mary"
description = "A bloody mary that may make you immobile. Still wondering if it's blood or tomato juice?"
color = "#C2707E"
boozepwr = 55
taste_description = "tomateos and an anvil on your stomach"
quality = DRINK_FANTASTIC
glass_icon_state = "blobby_mary"
glass_name = "blobby mary"
glass_desc = "For the morbidly obese ladies and gentlemen."
shot_glass_icon_state = "shotglassred"
hydration = 4
/datum/reagent/consumable/ethanol/blobby_mary/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
M.nutrition += 25 * REAGENTS_METABOLISM
else
M.nutrition += 1
..()
/datum/reagent/consumable/ethanol/beltbuster_mead
name = "Beltbuster Mead"
description = "Kiss sobriety and clothes goodbye."
color = "#664300"
boozepwr = 85
taste_description = "honey, alcohol and immobility"
quality = DRINK_FANTASTIC
glass_icon_state = "beltbuster_mead"
glass_name = "beltbuster mead"
glass_desc = "The ambrosia of the blubbery gods."
shot_glass_icon_state = "shotglassgold"
hydration = 4
/datum/reagent/consumable/ethanol/beltbuster_mead/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
M.nutrition += 30 * REAGENTS_METABOLISM
else
M.nutrition += 1
..()
/datum/reagent/consumable/heavy_cafe
name = "Heavy Cafe"
description = "Coffee, milk, sugar and cream. For the days when you really don't want to work."
color = "#663300"
taste_description = "coffee, milk and sugar"
quality = DRINK_GOOD
glass_icon_state = "heavy_cafe"
glass_name = "heavy cafe"
glass_desc = "To enjoy slow mornings with."
shot_glass_icon_state = "shotglassbrown"
hydration = 3
/datum/reagent/consumable/heavy_cafe/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.SetSleeping(0, FALSE)
M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
M.Jitter(5)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
if(M && M?.client?.prefs.weight_gain_food) // GS13
M.nutrition += 15 * REAGENTS_METABOLISM
else
M.nutrition += 1
..()
/datum/reagent/consumable/fruits_tea
name = "Fruits Tea"
description = "Somehow this mix of fruits and tea can cause considerable bulking."
color = "#FFCC33"
taste_description = "a sweet and sour mix"
quality = DRINK_NICE
glass_icon_state = "fruits_tea"
glass_name = "fruits tea"
glass_desc = "Goes down really easy and stays there for a long time."
shot_glass_icon_state = "shotglassgold"
hydration = 4
/datum/reagent/consumable/fruits_tea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
M.drowsyness = max(0,M.drowsyness-1)
M.jitteriness = max(0,M.jitteriness-3)
M.AdjustSleeping(-20, FALSE)
if(M.getToxLoss() && prob(20))
M.adjustToxLoss(-1, 0)
M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL)
if(M && M?.client?.prefs.weight_gain_food) // GS13
M.nutrition += 15 * REAGENTS_METABOLISM
else
M.nutrition += 1
..()
. = 1
/datum/reagent/consumable/snakebite
name = "Snakebite"
description = "Guaranteed to stop 100% of all moving."
color = "#00CC33"
taste_description = "bitter immobility"
quality = DRINK_VERYGOOD
glass_icon_state = "snakebite"
glass_name = "snakebite"
glass_desc = "Won't hurt like a real bite, but you'll still regert drinking this."
shot_glass_icon_state = "shotglassgreen"
hydration = 4
/datum/reagent/consumable/snakebite/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
M.nutrition += 25 * REAGENTS_METABOLISM
else
M.nutrition += 1
..()
/datum/reagent/consumable/milkshake_vanilla
name = "Vanilla Milkshake"
description = "A plain vanilla milkshake. A classic."
color = "#DFDFDF"
taste_description = "creamy vanilla"
quality = DRINK_VERYGOOD
nutriment_factor = 6 * REAGENTS_METABOLISM
glass_icon_state = "milkshake_vanilla"
glass_name = "vanilla milkshake"
glass_desc = "Guess they fixed the milkshake machine after all, huh?"
shot_glass_icon_state = "shotglasscream"
hydration = 3
/datum/reagent/consumable/milkshake_chocolate
name = "Chocolate Milkshake"
description = "It's like chocolate milk, but for even cooler kids."
color = "#7D4E29"
taste_description = "creamy chocolate"
quality = DRINK_VERYGOOD
nutriment_factor = 8 * REAGENTS_METABOLISM
glass_icon_state = "milkshake_chocolate"
glass_name = "chocolate milkshake"
glass_desc = "Nothing better than cream AND cocoa!"
shot_glass_icon_state = "shotglassbrown"
hydration = 3
@@ -0,0 +1,196 @@
//Reagent
/datum/reagent/fermi_fat
name = "Galbanic Compound"
description = "A chemical compound derived from lipoifier. Massively increases adipose mass and parts of it become impossible to shed through normal means."
color = "#E70C0C"
taste_description = "hunger"
pH = 7
overdose_threshold = 50
metabolization_rate = REAGENTS_METABOLISM / 4
can_synth = FALSE //DO NOT MAKE THIS SNYTHESIZABLE, THESE CHEMS ARE SUPPOSED TO NOT BE USED COMMONLY
overdose_threshold = 50
addiction_threshold = 100
addiction_stage1_end = 10
addiction_stage2_end = 30
addiction_stage3_end = 60
addiction_stage4_end = 100
var/addiction_mults = 0
//Reaction
/datum/chemical_reaction/fermi_fat
name = "FermiFat"
id = /datum/reagent/fermi_fat
mix_message = "the reaction appears to swell!"
required_reagents = list(/datum/reagent/consumable/lipoifier = 0.1, /datum/reagent/medicine/pen_acid = 0.1, /datum/reagent/iron = 0.1)
results = list(/datum/reagent/fermi_fat = 0.2)
required_temp = 1
OptimalTempMin = 700 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 740 // Upper end for above
ExplodeTemp = 755 // Temperature at which reaction explodes
OptimalpHMin = 2 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
OptimalpHMax = 3.5 // Higest value for above
ReactpHLim = 1 // How far out pH wil react, giving impurity place (Exponential phase)
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = -10 // Temperature change per 1u produced
HIonRelease = 0.02 // pH change per 1u reaction (inverse for some reason)
RateUpLim = 2 // Optimal/max rate possible if all conditions are perfect
FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics
FermiExplode = FALSE // If the chemical explodes in a special way
PurityMin = 0.1
//When added
/datum/reagent/fermi_fat/on_mob_add(mob/living/carbon/M)
. = ..()
if(iscarbon(M))
log_game("[M] ckey: [M.key] has ingested fermifat.")
//Effects
/datum/reagent/fermi_fat/on_mob_life(mob/living/carbon/M)
if(!iscarbon(M))
return..()
M.adjust_fatness(30, FATTENING_TYPE_CHEM)
M.adjust_perma(1, FATTENING_TYPE_CHEM)
..()
. = 1
//While overdosed
/datum/reagent/fermi_fat/overdose_process(mob/living/M)
if(!iscarbon(M))
return..()
var/mob/living/carbon/C = M
C.adjust_fatness(20, FATTENING_TYPE_CHEM)
C.adjust_perma(1, FATTENING_TYPE_CHEM)
..()
/datum/reagent/fermi_fat/overdose_start(mob/living/M)
to_chat(M, "<span class='userdanger'>You took too much [name]! Your body is growing out of control!</span>")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name)
return
/datum/reagent/fermi_fat/addiction_act_stage1(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_light, name)
if(prob(30))
var/add_text = pick("You feel pretty hungry.", "You think of [name].", "Your look around for food.", "[name] wasn't so bad.")
to_chat(M, "<span class='notice'>[add_text]</span>")
if(iscarbon(M))
var/mob/living/carbon/C = M
C.adjust_fatness(1, FATTENING_TYPE_CHEM)
C.fullness = max(0, C.fullness-1)
C.nutrition = max(0, C.nutrition-1)
if(addiction_mults < 1)
C.nutri_mult += 0.5
C.weight_gain_rate += 0.25
addiction_mults = 1
return
/datum/reagent/fermi_fat/addiction_act_stage2(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_medium, name)
if(prob(30))
var/add_text = pick("You are very hungry.", "You could go for some [name].", "Your mouth waters.", "Is there any [name] around?")
to_chat(M, "<span class='notice'>[add_text]</span>")
if(iscarbon(M))
var/mob/living/carbon/C = M
C.adjust_fatness(2, FATTENING_TYPE_CHEM)
C.fullness = max(0, C.fullness-2)
C.nutrition = max(0, C.nutrition-2)
if(addiction_mults < 2)
C.nutri_mult += 0.5
C.weight_gain_rate += 0.25
addiction_mults = 2
return
/datum/reagent/fermi_fat/addiction_act_stage3(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_severe, name)
if(prob(30))
var/add_text = pick("You are starving!", "You need some [name]!", "Your stomach growls loudly!.", "You can't stop thinking about [name]")
to_chat(M, "<span class='danger'>[add_text]</span>")
if(iscarbon(M))
var/mob/living/carbon/C = M
C.adjust_fatness(3, FATTENING_TYPE_CHEM)
C.fullness = max(0, C.fullness-3)
C.nutrition = max(0, C.nutrition-3)
if(addiction_mults < 3)
C.nutri_mult += 0.5
C.weight_gain_rate += 0.25
addiction_mults = 3
return
/datum/reagent/fermi_fat/addiction_act_stage4(mob/living/M)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_critical, name)
if(prob(30))
var/add_text = pick("You are ravenous!!", "You need [name] NOW!!", "You'd eat ANYTHING!!", "Where is the [name]?!", "Hungry, hungry, so HUNGRY!!", "More, you need more!!")
to_chat(M, "<span class='boldannounce'>[add_text]</span>")
if(iscarbon(M))
var/mob/living/carbon/C = M
C.adjust_fatness(4, FATTENING_TYPE_CHEM)
C.fullness = max(0, C.fullness-4)
C.nutrition = max(0, C.nutrition-4)
if(addiction_mults < 4)
C.nutri_mult += 0.5
C.weight_gain_rate += 0.25
addiction_mults = 4
return
/datum/reagent/fermi_fat/proc/addiction_remove(mob/living/carbon/C)
if(addiction_mults > 0)
C.nutri_mult = max(1, 0.5 * addiction_mults)
C.weight_gain_rate = max(0,11, 0.25 * addiction_mults)
return
//Reagent
/datum/reagent/fermi_slim
name = "Macerinic Solution"
description = "A solution with unparalleled obesity-solving properties. One of the few things known to be capable of removing galbanic fat."
color = "#3b0ce7"
taste_description = "thinness"
pH = 7
metabolization_rate = REAGENTS_METABOLISM / 4
can_synth = FALSE
overdose_threshold = 50
//Reaction
/datum/chemical_reaction/fermi_slim
name = "FermiSlim"
id = /datum/reagent/fermi_slim
mix_message = "the reaction seems to become thinner!"
required_reagents = list(/datum/reagent/medicine/lipolicide = 0.1, /datum/reagent/ammonia = 0.1, /datum/reagent/oxygen = 0.1)
results = list(/datum/reagent/fermi_slim = 0.2)
required_temp = 1
OptimalTempMin = 600 // Lower area of bell curve for determining heat based rate reactions
OptimalTempMax = 650 // Upper end for above
ExplodeTemp = 700 // Temperature at which reaction explodes
OptimalpHMin = 10 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
OptimalpHMax = 11.5 // Higest value for above
ReactpHLim = 1 // How far out pH wil react, giving impurity place (Exponential phase)
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
CurveSharpT = 4 // How sharp the temperature exponential curve is (to the power of value)
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = -10 // Temperature change per 1u produced
HIonRelease = -0.02 // pH change per 1u reaction (inverse for some reason)
RateUpLim = 2 // Optimal/max rate possible if all conditions are perfect
FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics
FermiExplode = FALSE // If the chemical explodes in a special way
PurityMin = 0.1
//Effects
/datum/reagent/fermi_slim/on_mob_life(mob/living/carbon/M)
if(!iscarbon(M))
return..()
M.adjust_fatness(-50, FATTENING_TYPE_WEIGHT_LOSS)
M.adjust_perma(-5, FATTENING_TYPE_WEIGHT_LOSS)
..()
. = 1
/datum/reagent/fermi_slim/overdose_process(mob/living/M)
if(!iscarbon(M))
return..()
var/mob/living/carbon/C = M
C.fullness = max(0, C.fullness-5)
C.nutrition = max(0, C.nutrition-5)
C.weight_loss_rate = min(5, C.weight_loss_rate+0.01)
..()
@@ -0,0 +1,14 @@
//DRG drinks
/datum/chemical_reaction/oily_oafs
name = "Oily oafs"
id = /datum/reagent/consumable/ethanol/oily_oafs
results = list(/datum/reagent/consumable/ethanol/oily_oafs = 2)
required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/cream = 1)
/datum/chemical_reaction/glyphid_slammer
name = "Glyphid slammer"
id = /datum/reagent/consumable/ethanol/glyphid_slammer
results = list(/datum/reagent/consumable/ethanol/glyphid_slammer = 2)
required_reagents = list(/datum/reagent/consumable/pwr_game = 1, /datum/reagent/consumable/ethanol/beer = 1)
@@ -0,0 +1,29 @@
//GS13 - fat chems
//WG chem
/datum/chemical_reaction/lipoifier
name = "lipoifier"
id = /datum/reagent/consumable/lipoifier
results = list(/datum/reagent/consumable/lipoifier = 3)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cornoil = 1, /datum/reagent/medicine/synthflesh = 1)
//BURP CHEM
/datum/chemical_reaction/fizulphite
name = "fizulphite"
id = /datum/reagent/consumable/fizulphite
results = list(/datum/reagent/consumable/fizulphite = 5)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3)
//ANTI-BURP / ANTI-FULLNESS CHEM
/datum/chemical_reaction/extilphite
name = "extilphite"
id = /datum/reagent/consumable/extilphite
results = list(/datum/reagent/consumable/extilphite = 5)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 2, /datum/reagent/carbon = 2)
// brap chem
/datum/chemical_reaction/flatulose
name = "flatulose"
id = /datum/reagent/consumable/flatulose
results = list(/datum/reagent/consumable/flatulose = 3)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/toxin/bad_food = 1, /datum/reagent/consumable/cream = 1)
@@ -0,0 +1,55 @@
//GS13 drink recipes
/datum/chemical_reaction/belly_bloats
name = "Belly Bloats"
id = /datum/reagent/consumable/ethanol/belly_bloats
results = list(/datum/reagent/consumable/ethanol/belly_bloats = 2)
required_reagents = list(/datum/reagent/consumable/gibbfloats = 1, /datum/reagent/consumable/ethanol/beer = 1)
/datum/chemical_reaction/blobby_mary
name = "Blobby Mary"
id = /datum/reagent/consumable/ethanol/blobby_mary
results = list(/datum/reagent/consumable/ethanol/blobby_mary = 3)
required_reagents = list(/datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/lipoifier = 1)
/datum/chemical_reaction/beltbuster_mead
name = "Beltbuster Mead"
id = /datum/reagent/consumable/ethanol/beltbuster_mead
results = list(/datum/reagent/consumable/ethanol/beltbuster_mead = 4)
required_reagents = list(/datum/reagent/consumable/ethanol/mead = 1, /datum/reagent/consumable/ethanol = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/lipoifier = 1)
/datum/chemical_reaction/heavy_cafe1
name = "Heavy Cafe"
id = /datum/reagent/consumable/heavy_cafe
results = list(/datum/reagent/consumable/heavy_cafe = 3)
required_reagents = list(/datum/reagent/consumable/cafe_latte = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cream = 1)
/datum/chemical_reaction/heavy_cafe2
name = "Heavy Cafe"
id = /datum/reagent/consumable/heavy_cafe
results = list(/datum/reagent/consumable/heavy_cafe = 3)
required_reagents = list(/datum/reagent/consumable/soy_latte = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cream = 1)
/datum/chemical_reaction/fruits_tea
name = "Fruits Tea"
id = /datum/reagent/consumable/fruits_tea
results = list(/datum/reagent/consumable/fruits_tea = 3)
required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/tea = 1)
/datum/chemical_reaction/snakebite
name = "Snakebite"
id = /datum/reagent/consumable/snakebite
results = list(/datum/reagent/consumable/snakebite = 3)
required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/lipoifier = 1)
/datum/chemical_reaction/milkshake_vanilla
name = "Vanilla Milkshake"
id = /datum/reagent/consumable/milkshake_vanilla
results = list(/datum/reagent/consumable/milkshake_vanilla = 3)
required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/vanilla = 1)
/datum/chemical_reaction/milkshake_chocolate
name = "Chocolate Milkshake"
id = /datum/reagent/consumable/milkshake_chocolate
results = list(/datum/reagent/consumable/milkshake_chocolate = 3)
required_reagents = list(/datum/reagent/consumable/milk/chocolate_milk = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/coco = 1)
@@ -0,0 +1,79 @@
//chug tank
/obj/item/reagent_containers/barrel_tank
name = "barrel tank"
desc = "A wooden barrely with straps and a tube attached. One can only wonder what it's for."
icon = 'GainStation13/icons/obj/barrel_tank.dmi'
icon_state = "barrel_tank"
item_state = "barrel_tank"
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
reagent_flags = REFILLABLE | TRANSPARENT
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)
volume = 500
spillable = FALSE
splashable = FALSE
/obj/item/reagent_containers/barrel_tank/ui_action_click(mob/user)
toggle_tube(user)
/obj/item/reagent_containers/barrel_tank/proc/toggle_tube(mob/living/user)
if(!istype(user))
return
if(user.get_item_by_slot(user.getBackSlot()) != src)
to_chat(user, "<span class='warning'>The barrel must be worn properly to use!</span>")
return
if(user.incapacitated())
return
if(!U)
to_chat(user, "<span class='notice'>You put the barrel's tube in your mouth.</span>")
U = user
START_PROCESSING(SSobj, src)
else
to_chat(user, "<span class='notice'>You remove the barrel's tube from your mouth.</span>")
U = null
/obj/item/reagent_containers/barrel_tank/verb/toggle_tube_verb()
set name = "Toggle Tube"
set category = "Object"
toggle_tube(usr)
/obj/item/reagent_containers/barrel_tank/equipped(mob/user, slot)
..()
if(slot != SLOT_BACK && U != null)
to_chat(user, "<span class='warning'>The barrel's tube slips out of your mouth!</span>")
U = null
/obj/item/reagent_containers/barrel_tank/dropped(mob/user)
..()
U = null
/obj/item/reagent_containers/barrel_tank/process()
if(U == null)
return PROCESS_KILL
if(reagents.total_volume)
var/fraction = min(1/reagents.total_volume, 1)
reagents.reaction(U, INGEST, fraction, FALSE)
reagents.trans_to(U, transfer_amount, 2)
else
to_chat(U, "<span class='warning'>The barrel is empty!</span>")
U = null
/obj/item/reagent_containers/barrel_tank/attack_self(mob/user)
if(reagents.total_volume > 0)
to_chat(user, "<span class='notice'>You empty [src] of all reagents.</span>")
reagents.clear_reagents()
/datum/crafting_recipe/barrel_tank
name = "Barrel tank"
result = /obj/item/reagent_containers/barrel_tank
tools = list(TOOL_CROWBAR)
reqs = list(/obj/item/stack/sheet/mineral/wood = 20)
category = CAT_CLOTHING
@@ -0,0 +1,7 @@
/datum/design/infrared_emitter
name = "Fatness Infrared Emitter"
id = "fatness_infrared_emitter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
build_path = /obj/item/assembly/infra/fat
category = list("initial", "Misc")
@@ -0,0 +1,251 @@
/////////////////////////////////////////
///GS13 designs / nutri designs
/////////////////////////////////////////
//nutritech weapons
/datum/design/fatoray_weak
name = "Basic Fatoray"
id = "fatoray_weak"
build_type = PROTOLATHE
materials = list(MAT_METAL = 8000, MAT_GLASS = 6000, MAT_CALORITE = 10000)
construction_time = 75
build_path = /obj/item/gun/energy/fatoray/weak
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
/datum/design/fatoray_cannon_weak
name = "Basic Cannonshot Fatoray"
id = "fatoray_cannon_weak"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 8000, MAT_CALORITE = 20000)
construction_time = 200
build_path = /obj/item/gun/energy/fatoray/cannon_weak
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
/datum/design/alter_ray_metabolism
name = "AL-T-Ray: Metabolism"
id = "alter_ray_metabolism"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 8000, MAT_CALORITE = 26000)
construction_time = 200
build_path = /obj/item/gun/energy/laser/alter_ray/gainrate
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
/datum/design/alter_ray_reverser
name = "AL-T-Ray: Reverser"
id = "alter_ray_reverser"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 8000, MAT_CALORITE = 26000)
construction_time = 200
build_path = /obj/item/gun/energy/laser/alter_ray/noloss
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY
//nutritech tools
/datum/design/calorite_collar
name = "Calorite Collar"
desc = "A collar that amplifies caloric intake of the wearer."
id = "calorite_collar"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_CALORITE = 4000)
construction_time = 75
build_path = /obj/item/clothing/neck/petcollar/calorite
category = list("Equipment", "Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/cyberimp_nutriment_turbo
name = "Nutriment Pump Implant TURBO"
desc = "This implant was meant to prevent people from going hungry, but due to a flaw in its designs, it permanently produces a small amount of nutriment overtime."
id = "ci-nutrimentturbo"
build_type = PROTOLATHE | MECHFAB
construction_time = 100
materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 750, MAT_URANIUM = 1000)
build_path = /obj/item/organ/cyberimp/chest/nutriment/turbo
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/cyberimp_fat_mobility
name = "Mobility Nanite Core"
desc = "This implant contains nanites that reinforce leg muscles, allowing for unimpeded movement at extreme weights."
id = "ci-fatmobility"
build_type = PROTOLATHE | MECHFAB
construction_time = 100
materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 750, MAT_URANIUM = 1000)
build_path = /obj/item/organ/cyberimp/chest/mobility
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/bluespace_belt
name = "Bluespace Belt"
desc = "A belt made using bluespace technology. The power of space and time, used to hide the fact you are fat."
id = "bluespace_belt"
build_type = PROTOLATHE
construction_time = 100
materials = list(MAT_SILVER = 4000, MAT_GOLD = 4000, MAT_BLUESPACE = 2000, )
build_path = /obj/item/bluespace_belt
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/cookie_synthesizer
name = "Cookie Synthesizer"
desc = "A self-charging miraculous device that's able to produce cookies."
id = "cookie_synthesizer"
build_type = PROTOLATHE
construction_time = 100
materials = list(MAT_SILVER = 4000, MAT_URANIUM = 1000, MAT_BLUESPACE = 1000, MAT_CALORITE = 2000)
build_path = /obj/item/cookiesynth
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SERVICE
//these are made in mech fabricator
/datum/design/borg_cookie_synthesizer
name = "Cyborg Upgrade (Cookie Synthesizer)"
id = "borg_upgrade_cookiesynthesizer"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/cookiesynth
materials = list(MAT_METAL=10000, MAT_GOLD=1500, MAT_URANIUM=250, MAT_PLASMA=1500)
construction_time = 100
category = list("Cyborg Upgrade Modules")
/datum/design/borg_fatoray
name = "Cyborg Upgrade (Fatoray)"
id = "borg_upgrade_fatoray"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/fatoray
materials = list(MAT_METAL = 8000, MAT_GLASS = 6000, MAT_CALORITE = 10000)
construction_time = 100
category = list("Cyborg Upgrade Modules")
/datum/design/borg_feedtube
name = "Cyborg Upgrade (Feeding Tube)"
id = "borg_upgrade_feedingtube"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/feedtube
materials = list(MAT_METAL = 8000, MAT_GLASS = 6000, MAT_CALORITE = 10000)
construction_time = 100
category = list("Cyborg Upgrade Modules")
//todo: make a seperate file for extra borg modules
/obj/item/borg/upgrade/cookiesynth
name = "cyborg cookie synthesizer"
desc = "An extra module that allows cyborgs to dispense cookies."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/cookiesynth/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/cookiesynth/S = new(R.module)
R.module.basic_modules += S
R.module.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/cookiesynth/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
var/obj/item/cookiesynth/S = locate() in R.module
R.module.remove_module(S, TRUE)
/obj/item/gun/energy/fatoray/weak/cyborg
name = "cyborg fatoray"
desc = "An integrated fatoray for cyborg use."
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_weak"
can_charge = FALSE
selfcharge = EGUN_SELFCHARGE_BORG
cell_type = /obj/item/stock_parts/cell/secborg
charge_delay = 5
/obj/item/borg/upgrade/fatoray
name = "cyborg fatoray module"
desc = "An extra module that allows cyborgs to use fatoray weapons."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/fatoray/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/gun/energy/fatoray/weak/cyborg/S = new(R.module)
R.module.basic_modules += S
R.module.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/fatoray/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
var/obj/item/gun/energy/fatoray/weak/cyborg/S = locate() in R.module
R.module.remove_module(S, TRUE)
//cyborg regen feeding tube
/obj/item/reagent_containers/borghypo/feeding_tube
name = "cyborg feeding tube"
desc = "A feeding tube module for a cyborg."
icon = 'GainStation13/icons/obj/feeding_tube.dmi'
icon_state = "borg_tube"
possible_transfer_amounts = list(5,10,20)
charge_cost = 20
recharge_time = 3
accepts_reagent_upgrades = FALSE
reagent_ids = list(/datum/reagent/consumable/cream, /datum/reagent/consumable/milk, /datum/reagent/consumable/nutriment)
var/starttime = 0
var/chemtoadd = 5
/obj/item/reagent_containers/borghypo/feeding_tube/attack(mob/living/carbon/M, mob/user)
var/datum/reagents/R = reagent_list[mode]
if(!R.total_volume)
to_chat(user, "<span class='notice'>The injector is empty.</span>")
return
if(!istype(M))
return
if(R.total_volume && M.can_inject(user, 1, user.zone_selected,bypass_protection))
if(M == user.pulling && ishuman(user.pulling))
starttime = world.time
while(starttime + 300 > world.time && in_range(user, M))
if(do_mob(user, M, 10, 0, 1))
M.reagents.add_reagent(/datum/reagent/consumable/nutriment, chemtoadd)
M.visible_message("<span class='danger'>[user] pumps some liquid in [M]!</span>","<span class='userdanger'>[user] pumps some liquid in you!</span>")
else
to_chat(M, "<span class='warning'>You feel the cyborg's feeding tube pour liquid down your throat!</span>")
to_chat(user, "<span class='warning'>You feed [M] with the integrated feeding tube.</span>")
visible_message("<span class='warning'>The cyborg's feeding tube pours liquid down [M]'s throat!</span>")
var/fraction = min(amount_per_transfer_from_this/R.total_volume, 1)
R.reaction(M, INJECT, fraction)
if(M.reagents)
var/trans = R.trans_to(M, amount_per_transfer_from_this)
to_chat(user, "<span class='notice'>[trans] unit\s injected. [R.total_volume] unit\s remaining.</span>")
/obj/item/reagent_containers/borghypo/feeding_tube/regenerate_reagents()
if(iscyborg(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
for(var/i in modes) //Lots of reagents in this one, so it's best to regenrate them all at once to keep it from being tedious.
var/valueofi = modes[i]
var/datum/reagents/RG = reagent_list[valueofi]
if(RG.total_volume < RG.maximum_volume)
R.cell.use(charge_cost)
RG.add_reagent(reagent_ids[valueofi], 5)
/obj/item/borg/upgrade/feedtube
name = "cyborg feeding tube module"
desc = "An extra module that allows cyborgs to use an integrated feeding tube along with a synthesizer."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/feedtube/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/reagent_containers/borghypo/feeding_tube/S = new(R.module)
R.module.basic_modules += S
R.module.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/feedtube/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
var/obj/item/reagent_containers/borghypo/feeding_tube/S = locate() in R.module
R.module.remove_module(S, TRUE)
@@ -0,0 +1,161 @@
/datum/nanite_rule/fatness
name = "BFI"
desc = "Checks the host's BFI."
var/threshold = 50
var/above = TRUE
/datum/nanite_rule/fatness/check_rule()
if(iscarbon(program.host_mob))
var/mob/living/carbon/C = program.host_mob
var/BFI = C.fatness_real
if(above)
if(BFI >= threshold)
return TRUE
else
if(BFI < threshold)
return TRUE
return FALSE
else
return FALSE
/datum/nanite_rule/fatness/display()
return "[name] [above ? ">" : "<"] [threshold]"
/datum/nanite_program/sensor/fat_sensor
name = "BFI Sensor"
desc = "The nanites receive a signal when the host's BFI is below or exceeds a certain amount."
can_rule = TRUE
var/spent = FALSE
/datum/nanite_program/sensor/fat_sensor/register_extra_settings()
. = ..()
extra_settings[NES_FATNESS] = new /datum/nanite_extra_setting/number(0, 0, 3440, "BFI")
extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below")
/datum/nanite_program/sensor/fat_sensor/check_event()
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
var/datum/nanite_extra_setting/level = extra_settings[NES_FATNESS]
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
var/detected = FALSE
if(direction.get_value())
if(C.fatness >= level.get_value())
detected = TRUE
else
if(C.fatness < level.get_value())
detected = TRUE
if(detected)
if(!spent)
spent = TRUE
return TRUE
return FALSE
else
spent = FALSE
return FALSE
return FALSE
/datum/nanite_program/sensor/fat_sensor/make_rule(datum/nanite_program/target)
var/datum/nanite_rule/fatness/rule = new(target)
var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION]
var/datum/nanite_extra_setting/level = extra_settings[NES_FATNESS]
rule.above = direction.get_value()
rule.threshold = level.get_value()
return rule
/datum/design/nanites/fat_sensor
name = "BFI Sensor"
desc = "The nanites boost can detect the host's BFI."
id = "fat_sensor_nanites"
program_type = /datum/nanite_program/sensor/fat_sensor
category = list("Sensor Nanites")
/datum/nanite_program/fat_adjuster
name = "BFI Regulator"
desc = "The nanites act on the host's adipose tissues, removing or adding based on the specified preference. Nanites consumed are equal to value added/lost"
use_rate = 0
rogue_types = list(/datum/nanite_program/necrotic)
/datum/nanite_program/fat_adjuster/register_extra_settings()
. = ..()
extra_settings[NES_FATNESS] = new /datum/nanite_extra_setting/number(0, -10, 10, "BFI")
/datum/nanite_program/fat_adjuster/check_conditions()
var/datum/nanite_extra_setting/BFI = extra_settings[NES_FATNESS]
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
if(BFI.get_value() < 0)
if(C.fatness_real <= 0)
return FALSE
else
return FALSE
return ..()
/datum/nanite_program/fat_adjuster/active_effect()
var/datum/nanite_extra_setting/BFI = extra_settings[NES_FATNESS]
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
if(BFI.get_value() > 0)
if(consume_nanites(BFI.get_value()))
C.adjust_fatness(BFI.get_value(), FATTENING_TYPE_NANITES)
else
if(consume_nanites(-(BFI.get_value())))
C.adjust_fatness(BFI.get_value(), FATTENING_TYPE_WEIGHT_LOSS)
/datum/design/nanites/fat_adjuster
name = "BFI Regulator"
desc = "The nanites adjust the host's BFI."
id = "fat_adjuster_nanites"
program_type = /datum/nanite_program/fat_adjuster
category = list("Medical Nanites")
/datum/nanite_program/fat_converter
name = "Adipose Conversion"
desc = "Nanites learn to convert excess body mass to replicate."
rogue_types = list(/datum/nanite_program/necrotic)
/datum/nanite_program/fat_converter/check_conditions()
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
if(C.fatness_real <= 0 || nanites.nanite_volume >= nanites.max_nanites)
return FALSE
else
return FALSE
return ..()
/datum/nanite_program/fat_converter/active_effect()
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
if(C.fatness_real > 0 && nanites.nanite_volume < nanites.max_nanites)
nanites.adjust_nanites(src, min(round(C.fatness_real), 5))
C.adjust_fatness(-(min(round(C.fatness_real), 5)), FATTENING_TYPE_WEIGHT_LOSS)
/datum/design/nanites/fat_converter
name = "Adipose Conversion"
desc = "The nanites use fat to replicate quickly."
id = "fat_converter_nanites"
program_type = /datum/nanite_program/fat_converter
category = list("Medical Nanites")
/datum/nanite_program/bwomf
name = "B.W.O.M.F." //Body Widening Operation for Mass Fattening
desc = "Nanites remains on standy-by, massively increasing the host's mass on trigger.."
unique = FALSE
can_trigger = TRUE
trigger_cost = 50
trigger_cooldown = 50
rogue_types = list(/datum/nanite_program/toxic)
/datum/nanite_program/bwomf/on_trigger(comm_message)
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
C.adjust_fatness(100, FATTENING_TYPE_NANITES)
to_chat(C, "<span class='warning'>[pick("Your belly expands quickly!", "Fat envelops you further!", "Lard grows all over you!")]</span>")
/datum/design/nanites/bwomf
name = "B.W.O.M.F."
desc = "Massively increase host's mass on trigger."
id = "bwomf_nanites"
program_type = /datum/nanite_program/bwomf
category = list("Medical Nanites")
@@ -0,0 +1,23 @@
/////////////// GS13 - NUTRITIONAL TECHNOLOGY
/datum/techweb_node/nutritech_tools
id = "nutritech_tools"
display_name = "Nutri-Tech Tools"
description = "Ending world hunger was never made easier!"
prereq_ids = list("biotech", "adv_engi")
design_ids = list("calorite_collar", "ci-nutrimentturbo", "bluespace_belt", "adipoelectric_transformer", "cookie_synthesizer", "borg_upgrade_cookiesynthesizer", "borg_upgrade_feedingtube", "ci-fatmobility")
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
hidden = TRUE
/datum/techweb_node/nutritech_weapons
id = "nutritech_weapons"
display_name = "Nutri-Tech Weapons"
description = "Ever wanted to reach your daily caloric intake in just 5 seconds?"
prereq_ids = list("biotech", "adv_engi")
design_ids = list("fatoray_weak", "fatoray_cannon_weak", "alter_ray_metabolism", "alter_ray_reverser", "borg_upgrade_fatoray", "bwomf_nanites")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
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 = 10000
hidden = TRUE
@@ -0,0 +1,25 @@
//GS13 - implants and similar
/obj/item/organ/cyberimp/chest/nutriment/turbo
name = "Nutriment pump implant TURBO"
desc = "This implant was meant to prevent people from going hungry, but due to a flaw in its designs, it permanently produces a small amount of nutriment overtime."
icon_state = "chest_implant"
implant_color = "#006607"
nutrition_amount = 20 //somewhere around 5 pounds
hunger_threshold = NUTRITION_LEVEL_FULL
poison_amount = 10
message = "" //no message cuz spam is annoying
/obj/item/organ/cyberimp/chest/mobility
name = "Mobility Nanite Core"
desc = "This implant contains nanites that reinforce leg muscles, allowing for unimpeded movement at extreme weights."
icon_state = "chest_implant"
implant_color = "#9034db"
/obj/item/organ/cyberimp/chest/mobility/Insert(mob/living/carbon/M, special = 0)
..()
ADD_TRAIT(M, TRAIT_NO_FAT_SLOWDOWN, src)
/obj/item/organ/cyberimp/chest/mobility/Remove(mob/living/carbon/M, special = 0)
REMOVE_TRAIT(M, TRAIT_NO_FAT_SLOWDOWN, src)
..()
@@ -0,0 +1,29 @@
/obj/machinery/vending/gato
name = "GATO Vending Machine"
desc = "A GATO branded cola machine, a cute little cat is plastered onto it."
icon = 'icons/obj/vending.dmi'
icon_state = "cola_black"
product_slogans = "Meow~, time for some cola!"
vend_reply = "Meow~ Meow~"
products = list(
/obj/item/reagent_containers/food/drinks/beer = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
)
contraband = list(
/obj/item/organ/ears/cat = 2,
)
premium = list(
/obj/item/reagent_containers/food/drinks/soda_cans/air = 20,
/obj/item/reagent_containers/food/drinks/soda_cans/fizzwiz = 5,
/obj/item/reagent_containers/food/drinks/soda_cans/soothseltz = 8,
)
refill_canister = /obj/item/vending_refill/mealdor
/obj/item/vending_refill/mealdor
machine_name = "Meal Vendor Refill"
icon_state = "refill_mealdor"
@@ -0,0 +1,54 @@
/obj/machinery/vending/mealdor
name = "Meal Vendor"
desc = "The vending machine used by starving people. Looks like they've changed the shell, it looks cuter."
icon = 'icons/obj/vending.dmi'
icon_state = "mealdor"
product_slogans = "Are you hungry? Eat some of my food!;Be sure to eat one of our tasty treats!;Was that your stomach? Go ahead, get some food!"
vend_reply = "Enjoy your meal."
products = list(
/obj/item/reagent_containers/food/snacks/store/cake/cheese = 10,
/obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice = 10,
/obj/item/reagent_containers/food/snacks/store/cake/pound_cake = 8,
/obj/item/reagent_containers/food/snacks/cakeslice/bsvc = 5,
/obj/item/reagent_containers/food/snacks/cakeslice/bscc = 5,
// /obj/item/reagent_containers/food/snacks/donut/purefat = 10,
/obj/item/reagent_containers/food/snacks/fries = 10,
/obj/item/reagent_containers/food/snacks/donut = 20,
/obj/item/reagent_containers/food/snacks/candiedapple = 7,
/obj/item/reagent_containers/food/snacks/burrito = 8,
/obj/item/reagent_containers/food/snacks/enchiladas = 10,
/obj/item/reagent_containers/food/snacks/spaghetti = 20,
/obj/item/reagent_containers/food/snacks/kebab/rat = 7,
/obj/item/reagent_containers/food/snacks/kebab/rat/double = 6,
/obj/item/reagent_containers/food/snacks/meatballspaghetti = 10,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 10,
/obj/item/reagent_containers/food/drinks/bottle/pineapplejuice = 10,
/obj/item/reagent_containers/food/drinks/bottle/strawberryjuice = 10,
/obj/item/reagent_containers/food/drinks/beer = 10,
/obj/item/reagent_containers/food/drinks/soda_cans/cola = 10,
/obj/item/reagent_containers/food/snacks/pizza/margherita = 10,
/obj/item/reagent_containers/food/snacks/butterdog = 12,
/obj/item/reagent_containers/food/snacks/burger/plain = 20,
/obj/item/reagent_containers/food/snacks/burger/bearger = 10,
/obj/item/reagent_containers/food/snacks/pie/plump_pie = 8,
/obj/item/reagent_containers/food/snacks/dough = 20
)
contraband = list(
/obj/item/clothing/mask/fakemoustache = 5,
/obj/item/clothing/head/chefhat = 5,
/obj/item/reagent_containers/food/snacks/cookie = 10,
/obj/item/reagent_containers/food/snacks/salad/fruit = 15,
/obj/item/reagent_containers/food/snacks/salad = 20,
/obj/item/reagent_containers/food/snacks/salad/hellcobb = 10,
/obj/item/clothing/under/cowkini = 5,
/obj/item/reagent_containers/food/snacks/blueberry_gum = 5
)
premium = list(
/obj/item/reagent_containers/food/drinks/soda_cans/air = 3,
/obj/item/reagent_containers/food/snacks/donut/chaos = 3,
/obj/item/clothing/mask/cowmask/gag = 2,
/obj/item/clothing/mask/pig/gag = 2
)
refill_canister = /obj/item/vending_refill/mealdor
@@ -0,0 +1,34 @@
/obj/item/bluespace_belt
name = "bluespace belt"
desc = "A belt made using bluespace technology. The power of space and time, used to hide the fact you are fat."
icon = 'GainStation13/icons/obj/clothing/bluespace_belt.dmi'
icon_state = "bluespace_belt"
item_state = "bluespace_belt"
slot_flags = ITEM_SLOT_BELT
equip_sound = 'sound/items/equip/toolbelt_equip.ogg'
drop_sound = 'sound/items/handling/toolbelt_drop.ogg'
pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg'
/obj/item/bluespace_belt/equipped(mob/user, slot)
..()
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
if(slot == SLOT_BELT)
to_chat(U, "<span class='notice'>You put the belt around your waist and your mass begins to shrink...</span>")
U.hider_add(src)
else
to_chat(user, "<span class='notice'>The belt is opened, letting your mass flow out!</span>")
U.hider_remove(src)
/obj/item/bluespace_belt/dropped(mob/user)
..()
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
to_chat(U, "<span class='warning'>The belt is opened, letting your mass flow out!</span>")
U.hider_remove(src)
/obj/item/bluespace_belt/proc/fat_hide(var/mob/living/carbon/user)
return -(user.fatness_real - 1)
+30
View File
@@ -0,0 +1,30 @@
/obj/item/integrated_circuit/input/fat_scanner
name = "integrated body fat analyzer"
desc = "A very small version of the common medical analyser adjusted to scan a target's weight."
icon_state = "medscan"
complexity = 4
inputs = list("target" = IC_PINTYPE_REF)
outputs = list(
"weight (pounds)" = IC_PINTYPE_NUMBER,
"weight (BFI)" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 40
/obj/item/integrated_circuit/input/fat_scanner/do_work()
var/mob/living/carbon/fatty = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
if(!istype(fatty)) //Invalid input
return
if(!fatty.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range.
return
var/weight_in_pounds = fatty.calculate_weight_in_pounds()
var/weight_in_fatness = fatty.fatness
set_pin_data(IC_OUTPUT, 1, weight_in_pounds)
set_pin_data(IC_OUTPUT, 2, weight_in_fatness)
push_data()
activate_pin(2)
+93
View File
@@ -0,0 +1,93 @@
/obj/item/nullrod/attack(mob/target, mob/living/user)
. = ..()
if(iscarbon(target))
var/mob/living/carbon/T = target
for(var/hider in T.fat_hiders)
if(isitem(hider))
var/obj/item/O = hider
T.dropItemToGround(O)
if(T.cursed_fat == 1)
T.cursed_fat = 0
T.fattening_steps_left = 0
/obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
. = ..()
if(iscarbon(M))
var/mob/living/carbon/T = M
for(var/hider in T.fat_hiders)
if(isitem(hider))
var/obj/item/O = hider
T.dropItemToGround(O)
if(T.cursed_fat == 1)
T.cursed_fat = 0
T.fattening_steps_left = 0
/datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M)
. = ..()
for(var/hider in M.fat_hiders)
if(isitem(hider))
var/obj/item/O = hider
M.dropItemToGround(O)
if(M.cursed_fat == 1)
M.cursed_fat = 0
M.fattening_steps_left = 0
/obj/item/nullrod/dream_breaker
name = "dream breaker"
desc = "A cross-shaped weapon emitting a faint, dream-like light. Its blows will wake any dreamer."
icon = 'GainStation13/icons/obj/dreambreaker.dmi'
icon_state = "dreambreaker"
item_state = "dreambreaker"
lefthand_file = 'GainStation13/icons/obj/dreambreaker_left.dmi'
righthand_file = 'GainStation13/icons/obj/dreambreaker_right.dmi'
actions_types = list(/datum/action/item_action/db_slide)
var/slidedistance = 2
var/slidespeed = 3
var/stamina_cost = 34
force = 20
throwforce = 25
throw_range = 10
throw_speed = 2
var/click_delay = 2
slot_flags = ITEM_SLOT_BACK
sharpness = IS_BLUNT
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("smashed", "whacked", "smacked", "bonked")
hitsound = "swing_hit"
var/l_range = 3
var/l_power = 0.8
light_color = "#FFCC66"
/obj/item/nullrod/dream_breaker/Initialize(mapload)
. = ..()
set_light(l_range, l_power, light_color)
/obj/item/nullrod/dream_breaker/attack(mob/living/target, mob/living/user)
. = ..()
user.changeNext_move(CLICK_CD_MELEE * click_delay)
/obj/item/nullrod/dream_breaker/ui_action_click(mob/user, action)
if(!isliving(user))
return
var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction
user.resting = TRUE
if(user:getStaminaLoss() < 100)
if (user.throw_at(target, slidedistance, slidespeed, spin = FALSE, diagonals_first = TRUE))
user:adjustStaminaLoss(stamina_cost) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds
user.visible_message("<span class='warning'>[usr] slides forward!</span>")
user.resting = FALSE
else
to_chat(user, "<span class='warning'>Something prevents you from sliding forward!</span>")
else
to_chat(user, "<span class='warning'>You fall down when attempting to slide!</span>")
/datum/action/item_action/db_slide
name = "Dream Breaker Slide"
desc = "Use dream-like atheletics to slide forward, but don't wear yourself out!."
icon_icon = 'GainStation13/icons/obj/dreambreaker.dmi'
button_icon_state = "dreambreaker"
+171
View File
@@ -0,0 +1,171 @@
/////GS13 - miscellanous items. If it's a small item, a container or something
/////then it should land here, instead of making a seperate .dm file
//fatoray research scraps (maintloot)
/obj/item/trash/fatoray_scrap1
name = "raygun scraps"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_scrap1"
desc = "Small parts that seemingly once belonged to some sort of a raygun."
/obj/item/trash/fatoray_scrap2
name = "raygun scraps"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_scrap2"
desc = "Small parts that seemingly once belonged to some sort of a raygun."
// GS13 fatty liquid beakers defs, for admin stuff and mapping junk
/obj/item/reagent_containers/glass/beaker/lipoifier
list_reagents = list(/datum/reagent/consumable/lipoifier = 50)
/obj/item/reagent_containers/glass/beaker/cornoil
list_reagents = list(/datum/reagent/consumable/cornoil = 50)
/obj/item/reagent_containers/glass/beaker/blueberry_juice
list_reagents = list(/datum/reagent/blueberry_juice = 50)
/obj/item/reagent_containers/glass/beaker/fizulphite
list_reagents = list(/datum/reagent/consumable/fizulphite = 50)
/obj/item/reagent_containers/glass/beaker/extilphite
list_reagents = list(/datum/reagent/consumable/extilphite = 50)
/obj/item/reagent_containers/glass/beaker/calorite_blessing
list_reagents = list(/datum/reagent/consumable/caloriteblessing = 50)
/obj/item/reagent_containers/glass/beaker/flatulose
list_reagents = list(/datum/reagent/consumable/flatulose = 50)
//blueberry gum snack
/obj/item/reagent_containers/food/snacks/blueberry_gum
name = "blueberry gum"
icon = 'GainStation13/icons/obj/gum.dmi'
icon_state = "gum_wrapped"
desc = "Doesn't cause anything more than some discoloration... probably."
trash = /obj/item/trash/blueberry_gum
list_reagents = list(/datum/reagent/blueberry_juice = 50)
bitesize = 5
filling_color = "#001aff"
tastes = list("blueberry gum" = 1)
foodtype = FRUIT
price = 5
//blueberry gum trash
/obj/item/trash/blueberry_gum
name = "chewed gum"
icon = 'GainStation13/icons/obj/gum.dmi'
icon_state = "gum_chewed"
// nutriment pump turbo
/obj/item/autosurgeon/nutripump_turbo
desc = "A single use autosurgeon that contains a turbo version of the nutriment pump. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
starting_organ = /obj/item/organ/cyberimp/chest/nutriment/turbo
/obj/item/autosurgeon/fat_mobility
desc = "A single use autosurgeon that contains a mobility nanite core. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
starting_organ = /obj/item/organ/cyberimp/chest/mobility
//fast food restaurant - closed / open signs
/obj/item/holosign_creator/restaurant
name = "Holosign Projector - Restaurant Adverts"
desc = "A holo-sign maker, used for placing signs that advertises the local fast food restaurant."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holo_fastfood"
holosign_type = /obj/structure/holosign/restaurant
creation_time = 0
max_signs = 6
/obj/item/holosign_creator/closed
name = "Holosign Projector - Closing Sign"
desc = "A holo-sign maker, used for placing signs that inform people of a location being closed off."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holo_closed"
holosign_type = /obj/structure/holosign/barrier/closed
creation_time = 0
max_signs = 6
//holosigns used by the holosign creators
/obj/structure/holosign/restaurant
name = "The Restaurant is OPEN! Come visit!"
desc = "A holographic projector that displays a sign advertising the nearby Fast Food Restaurant."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holosign_ad"
/obj/structure/holosign/barrier/closed
name = "This Location is Closed!"
desc = "A short holographic barrier used to close off areas. Can be passed by walking."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holosign_closed"
//ID for fastfood wagies so they can use the tele
/obj/item/card/id/silver/restaurant
name = "silver identification card"
desc = "A silver ID, given to the GATO's fast food restaurant workers. Doesn't grant much besides teleporter access."
access = list(ACCESS_MAINT_TUNNELS, ACCESS_TELEPORTER)
//gato decal, should be moved elsewhere tbh
/obj/effect/decal/big_gato //96x96 px sprite
name = "GATO"
desc = "Your employer! Probably."
icon = 'GainStation13/icons/turf/96x96.dmi'
icon_state = "gato"
layer = ABOVE_OPEN_TURF_LAYER
pixel_x = -32
pixel_y = -32
/obj/effect/decal/medium_gato //64x64 px sprite
name = "GATO"
desc = "Your employer! Probably."
icon = 'GainStation13/icons/turf/64x64.dmi'
icon_state = "gato"
layer = ABOVE_OPEN_TURF_LAYER
pixel_y = -16
pixel_x = -16
//collar voice modulators, based on cow/pig masks
/obj/item/clothing/mask/pig/gag //this one only lets you say "oink" and similar
name = "Voice modulator - pig"
desc = "A small gag, used to silence people in a rather 'original' way."
icon_state = "ballgag"
item_state = "ballgag"
flags_inv = HIDEFACE
clothing_flags = VOICEBOX_TOGGLABLE
w_class = WEIGHT_CLASS_SMALL
modifies_speech = TRUE
/obj/item/clothing/mask/cowmask/gag //this one only lets you say "moo" and similar
name = "Voice modulator - cow"
desc = "A small gag, used to silence people in a rather 'original' way."
icon = 'icons/obj/clothing/masks.dmi'
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'"
/obj/item/trash/odd_disk
name = "odd disk"
icon = 'icons/obj/module.dmi'
icon_state = "datadisk0"
desc = "A dusty disk, desconstruction will be needed to recover data."
@@ -0,0 +1,47 @@
/obj/item/clothing/accessory/pride_pin
name = "pride pin"
desc = "A pride pin."
icon_state = "pride"
item_color = "pride"
/obj/item/clothing/accessory/pride_pin/bi
name = "bisexual pride pin"
desc = "A bisexual pride pin."
icon_state = "pride_bi"
item_color = "pride_bi"
/obj/item/clothing/accessory/pride_pin/trans
name = "transgender pride pin"
desc = "A transgender pride pin."
icon_state = "pride_trans"
item_color = "pride_trans"
/obj/item/clothing/accessory/pride_pin/ace
name = "asexual pride pin"
desc = "A asexual pride pin."
icon_state = "pride_ace"
item_color = "pride_ace"
/obj/item/clothing/accessory/pride_pin/enby
name = "non-binary pride pin"
desc = "A non-binary pride pin."
icon_state = "pride_enby"
item_color = "pride_enby"
/obj/item/clothing/accessory/pride_pin/pan
name = "pansexual pride pin"
desc = "A pansexual pride pin."
icon_state = "pride_pan"
item_color = "pride_pan"
/obj/item/clothing/accessory/pride_pin/lesbian
name = "lesbian pride pin"
desc = "A lesbian pride pin."
icon_state = "pride_lesbian"
item_color = "pride_lesbian"
/obj/item/clothing/accessory/pride_pin/intersex
name = "intersex pride pin"
desc = "A intersex pride pin."
icon_state = "pride_intersex"
item_color = "pride_intersex"
@@ -0,0 +1,79 @@
/obj/item/assembly/infra/fat
name = "fatness infrared emitter"
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted. This one checks if the person tripping it is above or below a certain level of fatness."
var/fatness_to_trigger = 0
var/trigger_below = FALSE
/obj/item/assembly/infra/fat/examine(mob/user)
. = ..()
. += "<span class='notice'>The infrared trigger is set to trigger when the target is [trigger_below?"above":"below"] being [get_fatness_level_name(fatness_to_trigger)].</span>"
/obj/item/assembly/infra/fat/ui_interact(mob/user)//TODO: change this this to the wire control panel
if(!is_secured(user))
return
user.set_machine(src)
var/dat = "<TT><B>Fatness Infrared Laser</B></TT>"
dat += "<BR><B>Status</B>: [on ? "<A href='?src=[REF(src)];state=0'>On</A>" : "<A href='?src=[REF(src)];state=1'>Off</A>"]"
dat += "<BR><B>Visibility</B>: [visible ? "<A href='?src=[REF(src)];visible=0'>Visible</A>" : "<A href='?src=[REF(src)];visible=1'>Invisible</A>"]"
dat += "<BR><B>Fatness level to trigger:</B><A href='?src=[REF(src)];fatness_to_trigger=1'>[get_fatness_level_name(fatness_to_trigger)]</A>"
dat += "<BR><B>Trigger above or below the target fatness level:</B><A href='?src=[REF(src)];trigger_below=1'>[trigger_below ? "Below" : "Above"]</A>"
dat += "<BR><BR><A href='?src=[REF(src)];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=[REF(src)];close=1'>Close</A>"
user << browse(dat, "window=infra")
onclose(user, "infra")
return
/obj/item/assembly/infra/fat/Topic(href, href_list)
..()
if(href_list["trigger_below"])
trigger_below = !(trigger_below)
update_icon()
refreshBeam()
if(href_list["fatness_to_trigger"])
var/fatness_type = input(usr,
"What level of fatness do you wish to alert above/under at?",
src, "None") as null|anything in list(
"None", "Fat", "Fatter", "Very Fat", "Obese", "Morbidly Obese", "Extremely Obese", "Barely Mobile", "Immobile", "Blob")
if(!fatness_type)
return
var/fatness_amount = 0
switch(fatness_type)
if("Fat")
fatness_amount = FATNESS_LEVEL_FAT
if("Fatter")
fatness_amount = FATNESS_LEVEL_FATTER
if("Very Fat")
fatness_amount = FATNESS_LEVEL_VERYFAT
if("Obese")
fatness_amount = FATNESS_LEVEL_OBESE
if("Morbidly Obese")
fatness_amount = FATNESS_LEVEL_MORBIDLY_OBESE
if("Extremely Obese")
fatness_amount = FATNESS_LEVEL_EXTREMELY_OBESE
if("Barely Mobile")
fatness_amount = FATNESS_LEVEL_BARELYMOBILE
if("Immobile")
fatness_amount = FATNESS_LEVEL_IMMOBILE
if("Blob")
fatness_amount = FATNESS_LEVEL_BLOB
fatness_to_trigger = fatness_amount
update_icon()
refreshBeam()
/obj/item/assembly/infra/fat/trigger_beam(atom/movable/AM, turf/location)
var/mob/living/carbon/crossed_fatty = AM
if(!istype(crossed_fatty))
return FALSE
if(trigger_below && (crossed_fatty.fatness >= fatness_to_trigger))
return FALSE
if(!trigger_below && (crossed_fatty.fatness < fatness_to_trigger))
return FALSE
return ..() // I love using inheritence so much.
@@ -0,0 +1,37 @@
/obj/machinery/door
var/fatness_to_check = 0
var/check_fatness = FALSE
var/check_fatness_below = FALSE
/obj/machinery/door/proc/change_fatness_to_check(mob/user)
var/fatness_type = input(usr,
"What level of fatness do you wish to alert above/under at?",
src, "None") as null|anything in list(
"None", "Fat", "Fatter", "Very Fat", "Obese", "Morbidly Obese", "Extremely Obese", "Barely Mobile", "Immobile", "Blob")
if(!fatness_type)
return FALSE
var/fatness_amount = 0
switch(fatness_type)
if("Fat")
fatness_amount = FATNESS_LEVEL_FAT
if("Fatter")
fatness_amount = FATNESS_LEVEL_FATTER
if("Very Fat")
fatness_amount = FATNESS_LEVEL_VERYFAT
if("Obese")
fatness_amount = FATNESS_LEVEL_OBESE
if("Morbidly Obese")
fatness_amount = FATNESS_LEVEL_MORBIDLY_OBESE
if("Extremely Obese")
fatness_amount = FATNESS_LEVEL_EXTREMELY_OBESE
if("Barely Mobile")
fatness_amount = FATNESS_LEVEL_BARELYMOBILE
if("Immobile")
fatness_amount = FATNESS_LEVEL_IMMOBILE
if("Blob")
fatness_amount = FATNESS_LEVEL_BLOB
fatness_to_check = fatness_amount
return TRUE
@@ -0,0 +1,18 @@
/obj/structure/mineral_door/calorite //GS13
name = "calorite door"
icon = 'GainStation13/icons/obj/structure/calorite_door.dmi'
icon_state = "calorite"
sheetType = /obj/item/stack/sheet/mineral/calorite
max_integrity = 200
light_range = 1
// Sets it open by default
state = TRUE
density = FALSE
// If you ever want to make any door like this, just simply add the component like this :3
/obj/structure/mineral_door/calorite/Initialize(mapload)
. = ..()
AddComponent(/datum/component/fattening_door)
update_icon() // Updates the sprite when spawned in cause it's closed by default.
@@ -0,0 +1,9 @@
/obj/structure/tree/candylight //GS13
name = "Peppermint Light"
desc = "A light source that's made out of a peppermint tree."
icon = 'GainStation13/icons/obj/gslight.dmi'
icon_state = "candylight"
max_integrity = 500
light_color = "#a5cfc5" //testing out my copy cat skills. -Metussi
light_range = 3
anchored = 1
@@ -0,0 +1,43 @@
/obj/structure/cursedfatfountain
name = "Strange fountain"
desc = "An odd fountain, sparking with foreign magic."
icon = 'GainStation13/icons/obj/cursed_fountain.dmi'
icon_state = "full"
anchored = TRUE
density = TRUE
var/curse_given = 0
/mob/living
var/cursed_fat = 0 //decides whether the user is cursed at all (also makes for a fun admin switch)
var/fattening_steps_left = 0 //decides on the lenght of the curse
/obj/structure/cursedfatfountain/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(curse_given == 1)
to_chat(user, "<span class='notice'>The fountain has dried up.</span>")
icon_state = "empty"
return
if (ishuman(user) && user.has_dna())
user.cursed_fat = 1
user.fattening_steps_left += 2000
icon_state = "empty"
to_chat(user, "<span class='notice'>The glittering orange liquid disappears instantly as you touch it. You feel a strange, warm sensation inside, growing stronger the more you move...</span>")
curse_given = 1
// /obj/structure/cursedfatfountain/update_icon()
// if(last_process + time_between_uses > world.time)
// icon_state = "full"
// else
// icon_state = "empty"
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
if(cursed_fat == 1)
fattening_steps_left -= 1
adjust_fatness(20, FATTENING_TYPE_MAGIC)
if(fattening_steps_left <= 0)
cursed_fat = 0
@@ -0,0 +1,6 @@
/obj/structure/statue/fatso
name = "statue of a forgotten god"
desc = "A statue of a long forgotten god, at least on earth."
icon = 'GainStation13/icons/obj/structure/statues.dmi'
icon_state = "fattha_statue"
anchored = TRUE
+81
View File
@@ -0,0 +1,81 @@
/obj/structure/scale
name = "weighing scale"
desc = "You can weigh yourself with this."
icon = 'GainStation13/icons/obj/scale.dmi'
icon_state = "scale"
anchored = TRUE
resistance_flags = NONE
max_integrity = 250
integrity_failure = 25
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 3
layer = OBJ_LAYER
//stores the weight of the last person to step on in Lbs
var/lastreading = 0
//the conversion ratio for how much a point of fatness weighs on a 6' person
var/fatnessToWeight = 0.25
/obj/structure/scale/deconstruct()
// If we have materials, and don't have the NOCONSTRUCT flag
if(buildstacktype && (!(flags_1 & NODECONSTRUCT_1)))
new buildstacktype(loc,buildstackamount)
..()
/obj/structure/scale/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1))
W.play_tool_sound(src)
deconstruct()
else if(istype(W, /obj/item/assembly/shock_kit))
if(!user.temporarilyRemoveItemFromInventory(W))
return
var/obj/item/assembly/shock_kit/SK = W
var/obj/structure/chair/e_chair/E = new /obj/structure/chair/e_chair(src.loc)
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
E.setDir(dir)
E.part = SK
SK.forceMove(E)
SK.master = E
qdel(src)
else
return ..()
/obj/structure/scale/examine(mob/user)
. = ..()
. += "Its last reading was: [src.lastreading]Lbs"
. += "<span class='notice'>It's held together by a couple of <b>bolts</b>.</span>"
/obj/structure/scale/proc/weighEffect(mob/living/carbon/human/fatty)
to_chat(fatty, "<span class='notice'>You weigh yourself.</span>")
to_chat(fatty, "<span class='notice'>The numbers on the screen tick up and eventually settle on:</span>")
//The appearance of the numbers changes with the fat level of the character
if (HAS_TRAIT(fatty, TRAIT_BLOB))
to_chat(fatty, "<span class='userdanger'><span class='big'>[round(src.lastreading/2000, 0.01)]TONS!!!</span></span>")
else if (HAS_TRAIT(fatty, TRAIT_IMMOBILE))
to_chat(fatty, "<span class='boldannounce'>[src.lastreading]Lbs!</span>")
else if(HAS_TRAIT(fatty, TRAIT_OBESE) || HAS_TRAIT(fatty, TRAIT_MORBIDLYOBESE))
to_chat(fatty, "<span class='alert'>[src.lastreading]Lbs!</span>")
else
to_chat(fatty, "<span class='notice'>[src.lastreading]Lbs.</span>")
visible_message("<span class='notice'>The numbers on the screen read out: [fatty] has a BFI of [fatty.fatness].</span>")
/obj/structure/scale/Crossed(AM as mob|obj)
if(isturf(loc))
//need to be sure the thing that just crossed the scale is human
if(ishuman(AM))
var/mob/living/carbon/human/HM = AM
if(!(HM.movement_type & FLYING))
weighperson(HM)
/obj/structure/scale/proc/weighperson(mob/living/carbon/human/fatty)
src.lastreading = fatty.calculate_weight_in_pounds()
weighEffect(fatty)
visible_message("<span class='notice'>[fatty] weighs themselves.</span>")
visible_message("<span class='notice'>The numbers on the screen settle on: [src.lastreading]Lbs.</span>")
visible_message("<span class='notice'>The numbers on the screen read out: [fatty] has a BFI of [fatty.fatness].</span>")
/mob/living/carbon/proc/calculate_weight_in_pounds()
return round((140 + (fatness*FATNESS_TO_WEIGHT_RATIO))*(size_multiplier**2)*((dna.features["taur"] != "None") ? 2.5: 1))
@@ -0,0 +1,171 @@
/////GS13 - rayguns for metabolism and breasts/ass manipulation
//this is pretty wonky code, but ig it works
/obj/item/gun/energy/laser/alter_ray
name = "alter-ray"
icon = 'icons/obj/guns/energy.dmi'
icon_state = "lasernew"
desc = "This weapon is capable of altering one's body capabilities."
item_state = null
selfcharge = EGUN_SELFCHARGE
charge_delay = 5
ammo_x_offset = 2
clumsy_check = 1
/obj/item/gun/energy/laser/alter_ray/gainrate
name = "AL-T-Ray: Metabolism"
desc = "This weapon is capable of altering one's body capabilities. This model appears to be capable of altering one's weight gain and loss rate by 10%."
ammo_type = list(/obj/item/ammo_casing/energy/laser/gainrate_decrease, /obj/item/ammo_casing/energy/laser/gainrate_increase, /obj/item/ammo_casing/energy/laser/lossrate_decrease, /obj/item/ammo_casing/energy/laser/lossrate_increase)
// /obj/item/gun/energy/laser/alter_ray/assbreasts //genius name, I know
// name = "AL-T-Ray: Voluptousness"
// desc = "This weapon is capable of altering one's body capabilities. This model appears to be capable of altering the size's of one's breasts or buttocks."
// ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray, /obj/item/ammo_casing/energy/laser/growthray)
/obj/item/projectile/alter_ray
name = "sizeray beam"
icon_state = "omnilaser"
hitsound = null
damage = 0
damage_type = STAMINA
flag = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
ricochets_max = 50
ricochet_chance = 80
is_reflectable = TRUE
var/ratechange_amount = 0.1
//projectile biz
/obj/item/projectile/alter_ray/gainrate_decrease
icon_state="bluelaser"
/obj/item/projectile/alter_ray/gainrate_increase
icon_state="laser"
/obj/item/projectile/alter_ray/lossrate_decrease
icon_state="bluelaser"
/obj/item/projectile/alter_ray/lossrate_increase
icon_state="laser"
// /obj/item/projectile/alter_ray/breast_decrease
// icon_state="bluelaser"
// /obj/item/projectile/alter_ray/breast_increase
// icon_state="laser"
// /obj/item/projectile/alter_ray/butt_decrease
// icon_state="bluelaser"
// /obj/item/projectile/alter_ray/butt_increase
// icon_state="laser"
//laser hitting / changing code
//wg rate increase
/obj/item/projectile/alter_ray/gainrate_increase/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_gain_rate <= 3)
gainer.weight_gain_rate += ratechange_amount
return TRUE
return FALSE
return FALSE
//wg rate decrease
/obj/item/projectile/alter_ray/gainrate_decrease/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_gain_rate >= 0.11)
gainer.weight_gain_rate -= ratechange_amount
return TRUE
if(gainer.weight_gain_rate <= 0.1)
return FALSE
return FALSE
//wl rate increase
/obj/item/projectile/alter_ray/lossrate_increase/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_loss_rate <= 3)
gainer.weight_loss_rate += ratechange_amount
return TRUE
return FALSE
return FALSE
//wl rate decrease
/obj/item/projectile/alter_ray/lossrate_decrease/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_loss_rate >= 0.11)
gainer.weight_loss_rate -= ratechange_amount
return TRUE
if(gainer.weight_loss_rate <= 0.1)
return FALSE
return FALSE
//ammo casings - these are needed to allow guns to switch between firing modes
/obj/item/ammo_casing/energy/laser/gainrate_increase
projectile_type = /obj/item/projectile/alter_ray/gainrate_increase
select_name = "Weight Gain Increase"
/obj/item/ammo_casing/energy/laser/gainrate_decrease
projectile_type = /obj/item/projectile/alter_ray/gainrate_decrease
select_name = "Weight Gain Decrease"
/obj/item/ammo_casing/energy/laser/lossrate_increase
projectile_type = /obj/item/projectile/alter_ray/lossrate_increase
select_name = "Weight Loss Increase"
/obj/item/ammo_casing/energy/laser/lossrate_decrease
projectile_type = /obj/item/projectile/alter_ray/lossrate_decrease
select_name = "Weight Loss Decrease"
//ALTRay for making someone gain from weight loss
/obj/item/gun/energy/laser/alter_ray/noloss
name = "AL-T-Ray: Reverser"
desc = "This weapon is capable of altering one's body capabilities. This one reverse's ones body functions, to make it so weight loss results in weight gain."
ammo_type = list(/obj/item/ammo_casing/energy/laser/lossrate_reverse)
/obj/item/ammo_casing/energy/laser/lossrate_reverse
projectile_type = /obj/item/projectile/alter_ray/lossrate_reverse
select_name = "Weight Loss Reverse"
/obj/item/projectile/alter_ray/lossrate_reverse
ratechange_amount = -2
icon_state="laser"
/obj/item/projectile/alter_ray/lossrate_reverse/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
gainer.weight_loss_rate = ratechange_amount
return TRUE
+126
View File
@@ -0,0 +1,126 @@
/obj/item/gun/fatbeam // GS13
name = "Fatbeam Gun"
desc = "Apparently used to treat malnourished patients from a safe distance... But we all know what it will truly be used for."
icon = 'icons/obj/fatbeam.dmi'
icon_state = "fatbeam"
item_state = "fatbeam"
w_class = WEIGHT_CLASS_NORMAL
var/mob/living/current_target
var/last_check = 0
var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though
var/max_range = 8
var/active = 0
var/datum/beam/current_beam = null
var/mounted = 0 //Denotes if this is a handheld or mounted version
weapon_weight = WEAPON_MEDIUM
/obj/item/gun/fatbeam/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/gun/fatbeam/Destroy(mob/user)
STOP_PROCESSING(SSobj, src)
LoseTarget()
return ..()
/obj/item/gun/fatbeam/dropped(mob/user)
..()
LoseTarget()
/obj/item/gun/fatbeam/equipped(mob/user)
..()
LoseTarget()
/obj/item/gun/fatbeam/proc/LoseTarget()
if(active)
qdel(current_beam)
current_beam = null
active = 0
on_beam_release(current_target)
current_target = null
/obj/item/gun/fatbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(isliving(user))
add_fingerprint(user)
if(current_target)
LoseTarget()
if(!isliving(target))
return
current_target = target
active = TRUE
current_beam = new(user,current_target,time=6000,beam_icon_state="fatbeam",btype=/obj/effect/ebeam/medical)
INVOKE_ASYNC(current_beam, TYPE_PROC_REF(/datum/beam,Start))
SSblackbox.record_feedback("tally", "gun_fired", 1, type)
/obj/item/gun/fatbeam/process()
var/source = loc
if(!mounted && !isliving(source))
LoseTarget()
return
if(!current_target)
LoseTarget()
return
if(world.time <= last_check+check_delay)
return
last_check = world.time
if(get_dist(source, current_target)>max_range || !los_check(source, current_target))
LoseTarget()
if(isliving(source))
to_chat(source, "<span class='warning'>You lose control of the beam!</span>")
return
if(current_target)
on_beam_tick(current_target)
/obj/item/gun/fatbeam/proc/los_check(atom/movable/user, mob/target)
var/turf/user_turf = user.loc
if(mounted)
user_turf = get_turf(user)
else if(!istype(user_turf))
return FALSE
var/obj/dummy = new(user_turf)
dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows
for(var/turf/turf in getline(user_turf,target))
if(mounted && turf == user_turf)
continue //Mechs are dense and thus fail the check
if(turf.density)
qdel(dummy)
return FALSE
for(var/atom/movable/AM in turf)
if(!AM.CanPass(dummy,turf,1))
qdel(dummy)
return FALSE
for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams!
if(B.owner.origin != current_beam.origin)
explosion(B.loc,0,1,3,4)
qdel(dummy)
return FALSE
qdel(dummy)
return TRUE
/obj/item/gun/fatbeam/proc/on_beam_hit(var/mob/living/target)
return
/obj/item/gun/fatbeam/proc/on_beam_tick(var/mob/living/target)
if(target.health != target.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(target), "#fabb62")
if(target?.client?.prefs?.weight_gain_weapons)
target.nutrition += 50
return
/obj/item/gun/fatbeam/proc/on_beam_release(var/mob/living/target)
return
/obj/effect/ebeam/medical
name = "fattening beam"
+142
View File
@@ -0,0 +1,142 @@
/////GS13 - fattening rayguns and ranged weapons
///The base fatoray
/obj/item/gun/energy/fatoray
name = "Fatoray"
desc = "An energy gun that fattens up anyone it hits."
icon = 'GainStation13/icons/obj/fatoray.dmi'
lefthand_file = 'GainStation13/icons/obj/guns_lefthand.dmi'
righthand_file = 'GainStation13/icons/obj/guns_righthand.dmi'
icon_state = "fatoray"
item_state = "fatoray"
pin = /obj/item/firing_pin
fire_sound = 'sound/weapons/plasma_cutter.ogg'
ammo_type = list(/obj/item/ammo_casing/energy/fattening)
/obj/item/ammo_casing/energy/fattening
name = "fattening weapon lens"
select_name = "fatten"
projectile_type = /obj/item/projectile/beam/fattening
///The base projectile used by the fatoray
/obj/item/projectile/beam/fattening
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "ray"
ricochets_max = 50
ricochet_chance = 80
hitsound = 'sound/weapons/sear.ogg'
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
damage = 0
eyeblur = 0
damage_type = BURN
flag = "energy"
light_range = 2
light_color = LIGHT_COLOR_ORANGE
///How much fat is added to the target mob?
var/fat_added = 100
////// Fatoray - cannon variant, strong but can be charged
/obj/item/gun/energy/fatoray/cannon
name = "Fatoray Cannon"
desc = "An energy gun that fattens up anyone it hits. This version functions as a glass cannon of some sorts. It cannot be recharged."
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_cannon"
recoil = 3
can_charge = 0
slowdown = 1
pin = /obj/item/firing_pin
// charge_sections = 3
weapon_weight = WEAPON_HEAVY
ammo_type = list(/obj/item/ammo_casing/energy/fattening/cannon)
/obj/item/ammo_casing/energy/fattening/cannon
name = "one-shot fattening weapon lens"
select_name = "fatten"
e_cost = 100
projectile_type = /obj/item/projectile/beam/fattening/cannon
/obj/item/projectile/beam/fattening/cannon
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "cannon_ray"
///How much fat is added to the target mob?
fat_added = 1000
////////////////////////////////////////////////////////////////////
////////FATORAYS THAT CAN BE MADE BY LATHES OR RESEARCHED///////////
////////////////////////////////////////////////////////////////////
///Weaker version of fatoray
/obj/item/gun/energy/fatoray/weak
name = "Basic Fatoray"
desc = "An energy gun that fattens up anyone it hits. This version is considerably weaker than its original counterpart, the technology behind it seemingly still not perfected."
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_weak"
pin = /obj/item/firing_pin
ammo_type = list(/obj/item/ammo_casing/energy/fattening/weak)
/obj/item/ammo_casing/energy/fattening/weak
name = "budget fattening weapon lens"
select_name = "fatten"
projectile_type = /obj/item/projectile/beam/fattening/weak
///The base projectile used by the fatoray
/obj/item/projectile/beam/fattening/weak
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "ray"
///How much fat is added to the target mob?
fat_added = 50
///////////////////////////////////////////////////
///Single shot glass cannon fatoray
/obj/item/gun/energy/fatoray/cannon_weak
name = "Basic Fatoray Cannon"
desc = "An energy gun that fattens up anyone it hits. This version functions as a glass cannon of some sorts. It cannot be recharged."
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_cannon_weak"
can_charge = 0
recoil = 3
slowdown = 1
pin = /obj/item/firing_pin
// charge_sections = 3
weapon_weight = WEAPON_HEAVY
ammo_type = list(/obj/item/ammo_casing/energy/fattening/cannon_weak)
/obj/item/ammo_casing/energy/fattening/cannon_weak
name = "one-shot fattening weapon lens"
select_name = "fatten"
e_cost = 300
projectile_type = /obj/item/projectile/beam/fattening/cannon_weak
/obj/item/projectile/beam/fattening/cannon_weak
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "cannon_ray"
///How much fat is added to the target mob?
fat_added = 500
///////////////////////////////////////
//////PROJECTILE MECHANICS/////////////
///////////////////////////////////////
/obj/item/projectile/beam/fattening/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(!iscarbon(gainer))
return FALSE
if(!gainer.adjust_fatness(fat_added, FATTENING_TYPE_WEAPON))
return FALSE
return TRUE
@@ -0,0 +1,25 @@
/obj/item/gun/energy/kinetic_accelerator/crossbow/feeder
name = "feeder's mini energy crossbow"
desc = "a modified version of the standard mini energy crossbow, designed to fatten up a target while incapacitating them."
icon_state = "crossbow_halloween"
item_state = "crossbow"
ammo_type = list(/obj/item/ammo_casing/energy/bolt/fattening)
/obj/item/ammo_casing/energy/bolt/fattening
projectile_type = /obj/item/projectile/energy/bolt/fattening
/obj/item/projectile/energy/bolt/fattening
damage = 0
/obj/item/projectile/energy/bolt/fattening/Initialize(mapload)
. = ..()
/obj/item/projectile/energy/bolt/fattening/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/target_mob = target
if(!istype(target_mob) || (blocked == 100))
return
target_mob.reagents.add_reagent(/datum/reagent/consumable/lipoifier, 2)
@@ -0,0 +1,39 @@
/obj/structure/fat_mirror
name = "mirror" //Exact same text. Good luck.
desc = "Mirror mirror on the wall, who's the most robust of them all?"
icon = 'icons/obj/watercloset.dmi'
icon_state = "mirror"
density = FALSE
anchored = TRUE
/// Does the item delete itself after being "used?"
var/single_use = TRUE
/obj/structure/fat_mirror/attack_hand(mob/user)
. = ..()
if(.)
return
var/mob/living/carbon/looker = user
if(!istype(looker) || !Adjacent(looker))
return
make_fat(looker)
return TRUE
/obj/structure/fat_mirror/proc/make_fat(mob/living/carbon/looker)
if(!istype(looker) || !looker.check_weight_prefs(FATTENING_TYPE_MAGIC))
return FALSE
var/fat_to_add = looker.fatness_until_next_level()
if(!fat_to_add)
fat_to_add = FATNESS_LEVEL_BLOB // If someone is a blob, just add the amount of fatness needed to be a blob in the first place.
fat_to_add += 25 // a little buffer so they don't instantly burn it off.
looker.adjust_fatness(fat_to_add, FATTENING_TYPE_MAGIC, TRUE)
to_chat(looker, span_warning("Taking a look in the mirror, you look fatter than you remeber being."))
if(single_use)
visible_message(span_warning("[src] shatters into pieces."))
qdel(src)
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Some files were not shown because too many files have changed in this diff Show More