Merge branch 'master' into gatofication2

This commit is contained in:
evilew
2024-11-21 22:11:24 +01:00
committed by GitHub
193 changed files with 4649 additions and 708 deletions
+15
View File
@@ -0,0 +1,15 @@
// GS13 - Port CE Gloves
/obj/item/clothing/gloves/color/yellow/ce //funky looking, basically combat gloves
desc = "Special Insulated gloves with pricy thermal shielding normally only found in combat gloves."
name = "Chief Engineer Insulated Gloves"
icon = 'GainStation13/icons/obj/clothing/gloves.dmi'
icon_state = "ce_insuls"
item_state = "blackgloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
strip_delay = 80
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
+2 -2
View File
@@ -4,7 +4,6 @@
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
mob_overlay_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)
slowdown = 0
mutantrace_variation = NONE
@@ -13,9 +12,10 @@
/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'
mob_overlay_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
anthro_mob_worn_overlay = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
icon_state = "haydee_suit"
icon_state = "haydee_suit1"
item_state = "item_haydee"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 25, "fire" = 5, "acid" = 5)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
+23
View File
@@ -125,3 +125,26 @@
mob_trait = TRAIT_DISTANT
value = 0
medical_record_text = "Patient cares little with or dislikes being touched."
/datum/quirk/vegetarian
name = "Vegetarian"
desc = "You find the idea of eating meat morally and physically repulsive."
value = 0
gain_text = "<span class='notice'>You feel repulsion at the idea of eating meat.</span>"
lose_text = "<span class='notice'>You feel like eating meat isn't that bad.</span>"
medical_record_text = "Patient reports a vegetarian diet."
/datum/quirk/vegetarian/add()
var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
species.liked_food &= ~MEAT
species.disliked_food |= MEAT
/datum/quirk/vegetarian/remove()
var/mob/living/carbon/human/H = quirk_holder
if(H)
var/datum/species/species = H.dna.species
if(initial(species.liked_food) & MEAT)
species.liked_food |= MEAT
else
species.disliked_food &= ~MEAT
+49 -36
View File
@@ -9,7 +9,7 @@
name = "GATO Badge - Correspondent"
category = LOADOUT_CATEGORY_DONATOR
path = /obj/item/clothing/accessory/medal/gato_badge/middleman
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny", "Not Number")
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny", "Not Number", "Not_Number", "NotNumber",)
/datum/gear/halsey_overcoat
name = "Halsey's Commander Overcoat"
@@ -29,12 +29,6 @@
path = /obj/item/gun/ballistic/automatic/toy/pistol/haydee
ckeywhitelist = list("lumu", "sonoida")
//sorry for defining this here, just thought it'd be more convenient
/obj/item/clothing/suit/chloe/halsey //sorry to whoever chloe is, but that coat is far too badass not to be used
name = "Halsey's Commander Overcoat"
desc = "A Ginormous red overcoat that looks fit for a commander. Has a tag on it that reads: 'Property of Halsey Harmonten. Please return if lost!'"
armor = list("melee" = 20, "bullet" = 20, "laser" = 0,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 0) //worn by a captain player, might as well recompensate not wearing the carapace
/datum/gear/rose_plush
name = "Dezir Rose Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
@@ -53,10 +47,6 @@
path = /obj/item/clothing/suit/storage/blueshield/grimmy
ckeywhitelist = list("bbgrimmy")
/obj/item/clothing/suit/storage/blueshield/grimmy
name = "Overcoat of the Destitute"
desc = "Welcome all to the everlasting all-time low. Please put your hands together for the ever-failing one man show: Domino!"
/datum/gear/tarek_gps
name = "Tarek's GPS"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
@@ -69,10 +59,6 @@
path = /obj/item/crowbar/bronze/glaug
ckeywhitelist = list("happytpr")
/obj/item/crowbar/bronze/glaug
name = "Milwaukee Pocket Crowbar"
desc = "Much more expensive. Still serves the same function."
/datum/gear/fatfang
name = "Fattening Fangs Injector"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
@@ -85,15 +71,6 @@
path = /obj/item/storage/belt/utility
ckeywhitelist = list("killmewitha22", "Killmewitha22", "KILLMEWITHA22", "sonoida")
/obj/item/toy/sword/chloesabre/halsey
name = "Halsey's Sabre"
desc = "An elegant weapon, similar in design to the Captain's Sabre, but with a platinum hilt and an adamantine blade. the hilt has an engraved hyena on it."
force = 16
/obj/item/gun/ballistic/revolver/mateba/moka
name = "\improper Custom Unica 6 revolver"
desc = "An elegant and ornate revolver belonging to a certain hellcat commander. There are some words carved on its side: 'Dura Lex, Sed Lex'"
//metha rossi you fat hog
/datum/gear/wgspell_add
@@ -114,18 +91,44 @@
path = /obj/item/book/granter/spell/fattening/steal
ckeywhitelist = list("sonoida", "themrsky", "Not Number")
/datum/gear/white_eyepatch_cabal
name = "Cabal's Eyepatch"
category = LOADOUT_CATEGORY_GLASSES
path = /obj/item/clothing/glasses/eyepatch/cabal
ckeywhitelist = list("spess_lizurd", "SPESS LIZURD", "spess lizurd", "SPESS_LIZURD", "spesslizurd", "sonoida")
/datum/gear/white_eyepatch
/datum/gear/white_eyepatch //accessible to anyone, at donator's request
name = "White Eyepatch"
category = LOADOUT_CATEGORY_GLASSES
path = /obj/item/clothing/glasses/eyepatch/white
/datum/gear/metis_plush
name = "Metis Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/toy/plush/gs13/metis
ckeywhitelist = list("paraillegal", "Paraillegal")
/datum/gear/wheelys
name = "Wheely-Heels"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/clothing/shoes/wheelys
ckeywhitelist = list("colorlessspy", "Colorlessspy")
/datum/gear/crowbars_plush
name = "Crowbars Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/toy/plush/gs13/crowbars
ckeywhitelist = list("M16nPregnant", "m16npregnant" )
/datum/gear/sams_welder
name = "Sam's Unlucky Welder"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/weldingtool/bronze
ckeywhitelist = list("almaniak", "Almaniak", "AlManiak")
//
//item presets for donator items
//
/obj/item/clothing/glasses/eyepatch/white
name = "White eyepatch"
desc = "Smells faintly of medicine and headaches."
@@ -138,14 +141,24 @@
icon_state = "eyepatch_white"
item_state = "eyepatch_white"
/datum/gear/metis_plush
name = "Metis Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/toy/plush/gs13/metis
ckeywhitelist = list("paraillegal")
/obj/item/toy/sword/chloesabre/halsey
name = "Halsey's Sabre"
desc = "An elegant weapon, similar in design to the Captain's Sabre, but with a platinum hilt and an adamantine blade. the hilt has an engraved hyena on it."
force = 16
/datum/gear/wheelys
name = "Wheely-Heels"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/clothing/shoes/wheelys
ckeywhitelist = list("colorlessspy")
/obj/item/gun/ballistic/revolver/mateba/moka
name = "\improper Custom Unica 6 revolver"
desc = "An elegant and ornate revolver belonging to a certain hellcat commander. There are some words carved on its side: 'Dura Lex, Sed Lex'"
/obj/item/clothing/suit/chloe/halsey //sorry to whoever chloe is, but that coat is far too badass not to be used
name = "Halsey's Commander Overcoat"
desc = "A Ginormous red overcoat that looks fit for a commander. Has a tag on it that reads: 'Property of Halsey Harmonten. Please return if lost!'"
armor = list("melee" = 20, "bullet" = 20, "laser" = 0,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 0) //worn by a captain player, might as well recompensate not wearing the carapace
/obj/item/clothing/suit/storage/blueshield/grimmy
name = "Overcoat of the Destitute"
desc = "Welcome all to the everlasting all-time low. Please put your hands together for the ever-failing one man show: Domino!"
/obj/item/crowbar/bronze/glaug
name = "Milwaukee Pocket Crowbar"
desc = "Much more expensive. Still serves the same function."
@@ -0,0 +1,18 @@
//GS13 glitters. Making the subtle variants their own subtypes, as some use the fake gas effects to make a room look like it's full of gas, when it isnt.
/obj/effect/decal/cleanable/glitter/pink_subtle
name = "faint pink glitter"
icon = 'GainStation13/icons/effects/atmospherics.dmi'
icon_state = "glitter"
color = "#9e0089"
/obj/effect/decal/cleanable/glitter/white_subtle
name = "faint white glitter"
icon = 'GainStation13/icons/effects/atmospherics.dmi'
icon_state = "glitter"
/obj/effect/decal/cleanable/glitter/blue_subtle
name = "faint blue glitter"
icon = 'GainStation13/icons/effects/atmospherics.dmi'
icon_state = "glitter"
color = "#2dd6ff"
@@ -0,0 +1,7 @@
////////////// GS13 BARSIGNS ///////////////
// Because modularity, yo
/datum/barsign/the_busted_belt //gs13
name = "The Busted Belt"
icon = "thebustedbelt" //...I dont think this survived the rebase, oops.
desc = "GATO is not liable for any pieces of broken wardrobe."
+5
View File
@@ -76,3 +76,8 @@
desc = "A plush of black-furred nerdy goat."
icon_state = "metis"
attack_verb = list("squished", "goated", "baah'd")
/obj/item/toy/plush/gs13/crowbars
desc = "A plush of a silly-eyed xeno seccie."
icon_state = "crowbars"
attack_verb = list("squished", "crowbared", "beno'd")
@@ -25,6 +25,7 @@
/// How many items we can push per-pump.
var/pump_limit = 5
/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload)
. = ..()
@@ -38,6 +39,24 @@
anchored = TRUE
welded = TRUE //Make it functional
/obj/structure/disposaloutlet/industrial_feeding_tube/examine(mob/user)
. = ..()
if(LAZYLEN(pump_stuff))
switch(LAZYLEN(pump_stuff))
if(1)
. += "It seems to have something inside"
if(2 to 20)
. += "It seems to have some stuff inside"
if(21 to 50)
. += "It seems to be rather full of stuff!"
if(51 to 200)
. += "<b>It's walls are bulging out with tons of stuff packed inside!!</b>"
else
. += "<span class='danger'>The whole machine is shuddering as it strains to contain hundreds of objects!</span>"
if(clogged)
. += "<span class='warning'>It seems to be clogged with stuff!</span>"
/obj/structure/disposaloutlet/industrial_feeding_tube/CheckParts(list/parts_list)
..()
pump_limit = 0
@@ -48,6 +67,7 @@
pump_limit = ceil(pump_limit) //Only whole numbers
/obj/structure/disposaloutlet/industrial_feeding_tube/deconstruct(disassembled)
if(!(flags_1 & NODECONSTRUCT_1))
new /obj/item/stack/sheet/metal(loc, 5)
@@ -78,24 +98,23 @@
/obj/structure/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target)
. = ..()
if(!usr.canUseTopic(src, BE_CLOSE)) // iscarbon() so that xenos/wendigos(?) can do feeding stuff maybe. Maybe.
if(!usr.canUseTopic(src, BE_CLOSE))
return
if(!welded)
to_chat(usr, "<span class='warning'>You need to weld down \the [src] before you can use it.</span>")
return
if(attached)
attached.visible_message("<span class='warning'>\The [src]'s tube is removed from [attached].</span>", "<span class='warning'>The tube is removed from you.")
detach_tube(FALSE)
return
if(!isliving(target))
return
if(attached)
attached.visible_message("<span class='warning'>[attached] is detached from [src].</span>")
attached = null
update_icon()
return
if(iscarbon(target))
if(iscarbon(target)) // iscarbon() so that xenos/wendigos(?) can do feeding stuff maybe. Maybe.
var/mob/living/carbon/feedee = target
if(HAS_TRAIT(feedee, TRAIT_TRASHCAN))
var/food_dump = input(usr, "Where do you shove the tube? (cancel for to just feed normally)", "Select belly") as null|anything in feedee.vore_organs
if(HAS_TRAIT(feedee, TRAIT_TRASHCAN) || (feedee.vore_flags & FEEDING))
var/food_dump = input(usr, "Where do you shove the tube? (cancel to just feed normally)", "Select belly") as null|anything in feedee.vore_organs
if(food_dump && isbelly(food_dump))
// Best to be safe with this thing. Since you can eat pretty much anythign with it...
// Including People, Intentionally or otherwise.
@@ -105,38 +124,56 @@
to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...")
return
output_dest = food_dump //Attach to vorebelly
attached = feedee
update_icon()
START_PROCESSING(SSobj, src)
face_atom(feedee)
attach_tube(feedee, food_dump) // Attach in Vore Mode
return
//Either we arn't attaching to vorebelly, or we arnt able to. Let's try to feed them normally!
if(usr != feedee) //
if(usr != feedee)
var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your mouth! Do you want this?", "THE TUBE", "Yes!!", "No!")
if(feedeePrefCheck != "Yes!!")
to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...")
return
output_dest = feedee //Attach normally
attached = feedee
update_icon()
START_PROCESSING(SSobj, src)
face_atom(feedee)
attach_tube(feedee) // Attach normally
return
/obj/structure/disposaloutlet/industrial_feeding_tube/process()
if(!attached)
return PROCESS_KILL
/// Attaches the tube to the target. dest defaults to the target, if dest isnt defined
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/attach_tube(var/mob/living/target, var/dest = null, var/loud = TRUE)
if(!target)
return FALSE
if(dest)
output_dest = dest
else
output_dest = target
attached = target
if(loud)
if(isbelly(output_dest))
target.visible_message("\The [src]'s tube is shoved into [attached]!", "The tube is shoved directly into your [output_dest]!")
else
target.visible_message("\The [src]'s tube is shoved into [attached]!", "The tube is shoved directly into you!")
RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(check_target_dist))
update_icon()
face_atom(target)
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/detach_tube(var/loud = TRUE)
UnregisterSignal(attached, COMSIG_MOVABLE_MOVED)
if(loud)
attached.visible_message("<span class='warning'>[attached] is detached from [src].</span>")
attached = null
output_dest = null
update_icon()
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/check_target_dist()
if(!attached) //oh no
UnregisterSignal()
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
to_chat(attached, "<span class='userdanger'>The feeding hose is yanked out of you!</span>")
attached = null
output_dest = null
update_icon()
return PROCESS_KILL
attached.visible_message("<span class='danger'The feeding tube is yanked out of [attached]!</span>","<span class='userdanger'>The feeding hose is yanked out of you!</span>")
detach_tube(FALSE)
return
face_atom(attached)
@@ -165,10 +202,9 @@
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
/obj/structure/disposaloutlet/industrial_feeding_tube/expel(obj/structure/disposalholder/H)
var/clunkVol = LAZYLEN(H.contents)
if(H.hasmob) //Uh oh-
clunkVol += 25
playsound(src, H.hasmob ? "clang" : "clangsmall", clamp(clunkVol, 5, H.hasmob ? 50 : 25))
playsound(src, "clang", 100)
visible_message("<span class='danger'>\The [src] loudly clunks as something large enters it's intake!</span>")
H.active = FALSE
H.vent_gas(get_turf(src))
if(clogged)
@@ -193,12 +229,14 @@
break
if(!pumping)
pumping = TRUE
playsound(src, 'GainStation13/sound/rakshasa/Corrosion3.ogg', 50, 1)
update_icon()
spawn(8)
pumping = FALSE
update_icon()
spawn(9) //Wait for the animation to finish
if(!output_dest || !attached) //We either arnt, or got disconnected by time stuff was about to splort out!
spew(this_pump, TRUE)
if(LAZYLEN(pump_stuff) && repeat)
@@ -251,13 +289,13 @@
if(is_type_in_list(I, item_vore_blacklist))
inedible += I
continue
/*
if(isliving(AM))
var/mob/living/cutie = AM
if(cutie.devourable != TRUE) //Do not eat this QT...
if(!(cutie.vore_flags & DEVOURABLE)) //Do not eat this QT...
inedible += cutie
continue
*/
fed_something = TRUE
AM.forceMove(output_dest)
@@ -267,7 +305,7 @@
// After everything, if we've pushed something, play the "rubber tube noise"
// It's technically an evil digestion sound from a snowflake shadekin, but it makes for a good tube sound. Thanks Verkie!
if(fed_something)
playsound(attached.loc, 'v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg', rand(10,50), 1)
playsound(attached.loc, 'GainStation13/sound/rakshasa/Corrosion3.ogg', rand(50,70), 1)
if(LAZYLEN(pump_stuff) && repeat)
pump()
@@ -277,7 +315,7 @@
/obj/structure/disposaloutlet/industrial_feeding_tube/expel_holder(obj/structure/disposalholder/H, playsound=FALSE)
if(playsound)
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
playsound(src, 'sound/machines/hiss.ogg', 25, 0, 0)
if(!H)
return
@@ -290,10 +328,7 @@
/obj/structure/disposaloutlet/industrial_feeding_tube/attack_hand(mob/user)
. = ..()
if(attached)
attached.visible_message("<span class='warning'>[attached] is detached from [src].</span>")
attached = null
output_dest = null
update_icon()
detach_tube()
return
/obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params)
@@ -340,18 +375,32 @@
update_icon()
return
if(TOOL_CROWBAR)
if(!clogged)
to_chat(user, "<span class='notice'>\The [src] doesnt seem to be clogged at the moment...")
return TRUE
user.visible_message("<span class='italics'>[user] starts to pry open the maintenance hatch of \the [src], attempting to unclog it...</span>")
if(do_after(user, 30, TRUE, src))
user.visible_message("<span class='notice'>[user] unclogs \the [src]!</span>")
unclog()
return
. = ..()
/obj/structure/disposaloutlet/industrial_feeding_tube/crowbar_act(mob/living/user, obj/item/I)
if(!clogged)
to_chat(user, "<span class='notice'>\The [src] doesnt seem to be clogged at the moment...")
return TRUE
user.visible_message("<span class='italics'>[user] starts to pry open the maintenance hatch of \the [src], attempting to unclog it...</span>")
I.play_tool_sound(src, 100)
if(I.use_tool(src, user, 30))
user.visible_message("<span class='notice'>[user] pries open the maintenance hatch on \the [src], unclogging it!</span>")
unclog()
return TRUE
// Plungers are a thing now, why not give them the ability to unclog?
/obj/structure/disposaloutlet/industrial_feeding_tube/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
if(!clogged)
to_chat(user, "<span class='notice'>\The [src] doesnt seem to be clogged at the moment...")
return TRUE
user.visible_message("<span class='italics'>[user] starts to furiously plunge the tube of \the [src], attempting to unclog it...</span>")
//I.play_tool_sound(src, 100) I dont think plungers have a use sound...
if(P.use_tool(src, user, 20)) //Plungers are slightly shorter because funny niche use
user.visible_message("<span class='notice'>[user] pries open the maintenance hatch on \the [src], unclogging it!</span>")
unclog()
return
/obj/structure/disposaloutlet/industrial_feeding_tube/welder_act(mob/living/user, obj/item/I)
if(!I.tool_start_check(user, amount=0))
return
+29 -4
View File
@@ -1,6 +1,28 @@
/datum/material/calorite
name = "calorite"
sheet_type = /obj/item/stack/sheet/mineral/calorite
color = list(340/255, 150/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
strength_modifier = 1.5
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
beauty_modifier = 0.05
armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, RAD = 1, FIRE = 0.7, ACID = 1.1) // Same armor as gold.
/datum/material/calorite/on_applied_obj(obj/source, amount, material_flags)
. = ..()
if(!(material_flags & MATERIAL_AFFECT_STATISTICS))
return
var/obj/source_obj = source
source_obj.damtype = FAT
/datum/material/calorite/on_removed_obj(obj/source, material_flags)
if(!(material_flags & MATERIAL_AFFECT_STATISTICS))
return ..()
var/obj/source_obj = source
source_obj.damtype = initial(source_obj.damtype)
return ..()
/turf/closed/mineral/calorite //GS13
mineralType = /obj/item/stack/ore/calorite
@@ -33,13 +55,14 @@
GLOBAL_LIST_INIT(calorite_recipes, list ( \
new/datum/stack_recipe("Calorite tile", /obj/item/stack/tile/mineral/calorite, 1, 4, 20), \
new/datum/stack_recipe("Fatty statue", /obj/structure/statue/calorite/fatty, 5, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("Calorite doors", /obj/structure/mineral_door/calorite, 5, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("Calorite Ingots", /obj/item/ingot/calorite, time = 30), \
new/datum/stack_recipe("Fatty statue", /obj/structure/statue/calorite/fatty, 5, one_per_turf = 1, on_floor = 1),\
new/datum/stack_recipe("Calorite doors", /obj/structure/mineral_door/calorite, 5, one_per_turf = 1, on_floor = 1),\
))
/obj/item/stack/sheet/mineral/calorite/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.calorite_recipes
/obj/item/stack/sheet/mineral/calorite/get_main_recipes()
. = ..()
. += GLOB.calorite_recipes
/obj/item/stack/tile/mineral/calorite //GS13
@@ -246,3 +269,5 @@ GLOBAL_LIST_INIT(calorite_recipes, list ( \
fatten()
. = ..()
/obj/item/ingot/calorite
custom_materials = list(/datum/material/calorite=1500)
@@ -0,0 +1,16 @@
/obj/item/reagent_containers/food/snacks/proc/handle_tf(mob/living/eater)
var/datum/component/transformation_item/transformation_component = GetComponent(/datum/component/transformation_item)
if(!istype(transformation_component) || transformation_component.transfer_to_vore || (transformation_component.transformed_mob != src))
return FALSE
var/mob/living/food_mob = transformation_component.transformed_mob
if(!istype(food_mob) || !(food_mob?.vore_flags & DEVOURABLE) || (eater?.vore_flags & NO_VORE) || !istype(eater.vore_selected))
return FALSE
qdel(transformation_component)
var/obj/belly/vore_belly = eater.vore_selected
if(!vore_belly.nom_mob(food_mob,eater))
return FALSE
return TRUE
@@ -0,0 +1,36 @@
/mob/living/proc/get_tf_component()
var/obj/item/item_loc = loc
if(!istype(item_loc))
return FALSE
var/datum/component/transformation_item/transformation_component = item_loc.GetComponent(/datum/component/transformation_item)
if(!istype(transformation_component) || (transformation_component.transformed_mob != src))
return FALSE
return transformation_component
/mob/living/proc/handle_transformation_ooc_escape()
var/datum/component/transformation_item/transformation_component = get_tf_component()
if(!transformation_component)
return FALSE
qdel(transformation_component)
return TRUE
/mob/living/proc/attempt_to_escape_tf()
var/datum/component/transformation_item/transformation_component = get_tf_component()
if(!transformation_component)
return FALSE
if(!transformation_component.able_to_struggle_out)
to_chat(src, span_warning("You are unable to struggle out."))
return FALSE
to_chat(src, span_notice("You attempt to escape your transformation."))
if(!do_after(src, 60 SECONDS))
to_chat(src, span_warning("You fail to escape."))
return FALSE
qdel(transformation_component)
return TRUE
@@ -0,0 +1,105 @@
/datum/component/transformation_item
/// What mob do we currently have stuck in us?
var/mob/living/transformed_mob
/// Do we release the mob when the parent item is destroyed?
var/release_mob = TRUE
/// Is the mob able to speak as the item?
var/able_to_speak = FALSE
/// Is the mob able to emote as the item?
var/able_to_emote = FALSE
/// Does the object scale with the sprite size of the mob inside of it?
var/scale_object = TRUE
/// Show custom description.
var/show_that_object_is_tf = TRUE
/// Stored real name
var/stored_real_name = ""
/// Stored name
var/stored_name = ""
/// Is the component able to be removed?
var/stuck_on_item = FALSE
/// Is the person able to struggle out?
var/able_to_struggle_out = TRUE
/// Transfer to vore belly when eaten
var/transfer_to_vore = TRUE
/datum/component/transformation_item/Initialize()
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(remove_mob))
/datum/component/transformation_item/Destroy(force, silent)
remove_mob()
return ..()
/datum/component/transformation_item/proc/examine(datum/source, mob/user, list/examine_list)
if(show_that_object_is_tf)
examine_list += span_notice("Something about [source] seems lifelike.")
/datum/component/transformation_item/proc/register_mob(mob/living/mob_to_register)
var/atom/parent_atom = parent
if(!istype(mob_to_register))
return FALSE
transformed_mob = mob_to_register
stored_real_name = mob_to_register.real_name
stored_name = mob_to_register.name
// This is really dumb, but if it works, then maybe it is not dumb.
mob_to_register.real_name = parent_atom.name
mob_to_register.name = parent_atom.name
ADD_TRAIT(mob_to_register, TRAIT_TRANSFORMED, src)
ADD_TRAIT(mob_to_register, TRAIT_RESISTCOLD, src)
ADD_TRAIT(mob_to_register, TRAIT_RESISTLOWPRESSURE, src)
ADD_TRAIT(mob_to_register, TRAIT_LOWPRESSURECOOLING, src)
if(!able_to_speak)
ADD_TRAIT(mob_to_register, TRAIT_MUTE, src)
if(!able_to_emote)
ADD_TRAIT(mob_to_register, TRAIT_EMOTEMUTE, src)
// need to stop them from using radio headsets.
var/mob/living/carbon/human/human_mob = mob_to_register
if(istype(human_mob))
ADD_TRAIT(mob_to_register, TRAIT_PARALYSIS_L_ARM, src)
ADD_TRAIT(mob_to_register, TRAIT_PARALYSIS_R_ARM, src)
human_mob.update_disabled_bodyparts()
mob_to_register.forceMove(parent_atom)
if(scale_object)
var/target_size = mob_to_register.size_multiplier
var/matrix/new_matrix = new
new_matrix.Scale(target_size)
new_matrix.Translate(0,16 * (target_size-1))
parent_atom.transform = new_matrix
/datum/component/transformation_item/proc/remove_mob()
if(!release_mob || !transformed_mob)
return FALSE
transformed_mob.real_name = stored_real_name
transformed_mob.name = stored_name
if(!able_to_speak)
REMOVE_TRAIT(transformed_mob, TRAIT_MUTE, src)
if(!able_to_emote)
REMOVE_TRAIT(transformed_mob, TRAIT_EMOTEMUTE, src)
REMOVE_TRAIT(transformed_mob, TRAIT_TRANSFORMED, src)
REMOVE_TRAIT(transformed_mob, TRAIT_RESISTCOLD, src)
REMOVE_TRAIT(transformed_mob, TRAIT_RESISTLOWPRESSURE, src)
REMOVE_TRAIT(transformed_mob, TRAIT_LOWPRESSURECOOLING, src)
var/mob/living/carbon/human/human_mob = transformed_mob
if(istype(human_mob))
REMOVE_TRAIT(human_mob, TRAIT_PARALYSIS_L_ARM, src)
REMOVE_TRAIT(human_mob, TRAIT_PARALYSIS_R_ARM, src)
human_mob.update_disabled_bodyparts()
var/atom/parent_atom = parent
transformed_mob.forceMove(parent_atom.loc)
if(scale_object)
parent_atom.transform = null
@@ -0,0 +1,116 @@
/obj/item/transformation_item
name = "Handheld Transmogrifier"
desc = "a handheld device that is mysteriously able to turn people into objects. It can also be used to remove said transformations."
icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "silencer"
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
/// What item are we wanting to TF people into?
var/obj/item/target_item
/// Do we want our transformed person to be able to speak as the object?
var/able_to_speak = TRUE
/// Do we want our transformed person to be able to emote as the object?
var/able_to_emote = TRUE
/// Do we want the item to scale?
var/scale_object = FALSE
/// Do we want to show that the object was once a person?
var/show_that_object_is_tf = TRUE
/// Is our captured person able to struggle out?
var/able_to_struggle_out = TRUE
/// Do we have any items we can't turn people into?
var/list/object_blacklist = list()
/obj/item/transformation_item/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
var/obj/item/attacked_item = target
if(!proximity_flag || !istype(attacked_item))
return FALSE
var/datum/component/transformation_item/transformation_component = attacked_item.GetComponent(/datum/component/transformation_item)
if(istype(transformation_component) && !transformation_component.stuck_on_item)
qdel(transformation_component)
to_chat(user, span_notice("You dispel the current transformation for [attacked_item]."))
return
target_item = attacked_item
to_chat(user, span_notice("The next time someone is transformed, they will be transformed into [attacked_item]."))
return
/obj/item/transformation_item/attack(mob/living/M, mob/living/user)
if(!target_item)
to_chat(user, span_warning("You need to have an item linked to transform someone."))
return
perform_transfomration(M, user)
return
/obj/item/transformation_item/proc/perform_transfomration(mob/living/target_mob, mob/living/user)
if(!istype(target_mob))
return FALSE
if(!target_item.Adjacent(target_mob))
to_chat(user, span_warning("The [target_item] isn't close enough to [target_mob]"))
return FALSE
if(target_item in target_mob.get_contents())
return FALSE // Don't TF someone into something they are holding.
if(!target_mob?.client?.prefs?.object_tf)
to_chat(user, span_warning("It seems like [target_mob] does not want to be transformed."))
return FALSE
var/datum/component/transformation_item/transformation_component = target_item.AddComponent(/datum/component/transformation_item)
// Make sure that we apply our variables before we actually put the mob in the item.
transformation_component.able_to_speak = able_to_speak
transformation_component.able_to_emote = able_to_emote
transformation_component.scale_object = scale_object
transformation_component.show_that_object_is_tf = show_that_object_is_tf
transformation_component.able_to_struggle_out = able_to_struggle_out
transformation_component.register_mob(target_mob)
target_item = null
return TRUE
/obj/item/transformation_item/ui_data(mob/user)
var/list/data = list()
data["able_to_speak"] = able_to_speak
data["able_to_emote"] = able_to_emote
data["scale_object"] = scale_object
data["show_that_object_is_tf"] = show_that_object_is_tf
data["linked_item_name"] = target_item
data["able_to_struggle_out"] = able_to_struggle_out
return data
/obj/item/transformation_item/ui_act(action, params)
if(..())
return
switch(action)
if("set_speaking")
able_to_speak = !able_to_speak
. = TRUE
if("set_emote")
able_to_emote = !able_to_emote
. = TRUE
if("set_scale")
scale_object = !scale_object
. = TRUE
if("toggle_struggle")
able_to_struggle_out = !able_to_struggle_out
. = TRUE
if("set_show_desc")
show_that_object_is_tf = !show_that_object_is_tf
. = TRUE
/obj/item/transformation_item/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "TransformTool", name)
ui.open()
@@ -0,0 +1,17 @@
//Roses dont exist here... Sad
// /datum/gear/head/rose
// name = "Rose"
// path = /obj/item/grown/rose
/datum/gear/head/sunflower
name = "Sunflower"
path = /obj/item/grown/sunflower
/datum/gear/head/poppy
name = "Poppy"
path = /obj/item/reagent_containers/food/snacks/grown/poppy
/datum/gear/head/harebell
name = "Harebell"
path = /obj/item/reagent_containers/food/snacks/grown/harebell
@@ -0,0 +1,3 @@
/datum/gear/uniform/modularjumpsuit
name = "Modular Jumpsuit (gray)"
path = /obj/item/clothing/under/color/grey/modular
@@ -31,6 +31,8 @@
var/fatness_vulnerable = FALSE
/// Similar to fatness_vulnerable, but with more extreme effects such as transformation/hypno.
var/extreme_fatness_vulnerable = FALSE
/// Can the person be transformed into an object?
var/object_tf
// 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?
@@ -0,0 +1,13 @@
/datum/reagent/consumable
var/use_gs_icon = FALSE
/obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change(changetype)
icon = 'icons/obj/drinks.dmi'
if(reagents.reagent_list.len)
var/datum/reagent/R = reagents.get_master_reagent()
if(istype(R, /datum/reagent/consumable))
var/datum/reagent/consumable/C = R
if(C.use_gs_icon == TRUE)
icon = 'GainStation13/icons/obj/drinks.dmi'
..()
+1 -1
View File
@@ -22,7 +22,7 @@
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(do_after(usr, CLICK_CD_RESIST-reps, usr))
if(iscarbon(user))
var/mob/living/carbon/U = user
U.adjust_fatness(-10, FATTENING_TYPE_WEIGHT_LOSS)
@@ -1,7 +1,6 @@
/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
@@ -11,11 +10,18 @@
yield = 1
production = 10
rarity = 30
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
icon_state = "seed-blueberry"
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes
icon_dead = "berry-dead" // Same for the dead icon
icon_harvest = "blueberry-harvest"
/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 = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
icon_state = "blueberrypile"
filling_color = "#5d00c7"
foodtype = FRUIT
@@ -1,8 +1,6 @@
/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
@@ -11,17 +9,19 @@
maturation = 8
production = 5
yield = 1
growing_icon = 'GainStation13/icons/obj/hydroponics/lipo_growing.dmi'
reagents_add = list(/datum/reagent/consumable/lipoifier = 0.05)
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
icon_state = "seed-lipo"
growing_icon = 'GainStation13/icons/obj/hydroponics/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 = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
icon_state = "lipo_nut"
item_state = "lipo_nut"
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
@@ -8,22 +8,26 @@
/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
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
icon_state = "seed-munchies"
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
icon_grow = "munchycannabis-grow" // Uses one growth icons set for all the subtypes
icon_dead = "munchycannabis-dead" // Same for the dead icon
icon_harvest = "munchycannabis-harvest"
/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 = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
icon_state = "munchycannabis"
wine_power = 90
@@ -1 +1,11 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
/datum/sprite_accessory/hair/elize
name = "Elize"
icon = 'GainStation13/icons/mob/human_face.dmi'
icon_state = "hair_elize"
/datum/sprite_accessory/hair/lem
name = "Lem"
icon = 'GainStation13/icons/mob/human_face.dmi'
icon_state = "hair_lem"
@@ -7,6 +7,7 @@
icon_state = "gator"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
hide_legs = FALSE
/datum/sprite_accessory/taur/fatdrake //ported from Vorestation
name = "Fat Drake"
@@ -46,3 +47,17 @@
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "bigleggy"
color_src = MUTCOLORS
/datum/sprite_accessory/taur/fatnaga //ported from Vorestation
name = "Fat Naga"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "fatnaga"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/taur/altnaga //ported from Vorestation
name = "Alt Naga"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "altnaga"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
@@ -6,3 +6,50 @@
icon_state = "hjackal"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/snouts/mam_snouts/synthlizproto1
name = "Synthetic Lizard - Prototype Visor 1"
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
icon_state = "synthlizproto1"
color_src = MATRIXED
/datum/sprite_accessory/snouts/mam_snouts/synthlizproto2
name = "Synthetic Lizard - Prototype Visor 2"
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
icon_state = "synthlizproto2"
color_src = MATRIXED
/datum/sprite_accessory/snouts/mam_snouts/gator
name = "Gator"
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
icon_state = "gator"
color_src = MATRIXED
//eastern dragon
/datum/sprite_accessory/snouts/mam_snouts/easterndragon
name = "Eastern Dragon"
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
icon_state = "easterndw"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/snouts/mam_snouts/easterndragon/no_whiskers
name = "Eastern Dragon - No Whiskers"
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
icon_state = "easterndnw"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/snouts/mam_snouts/feasterndragon
name = "Eastern Dragon (Top)"
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
icon_state = "feasterndw"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/snouts/mam_snouts/feasterndragon/no_whiskers
name = "Eastern Dragon - No Whiskers (Top)"
icon = 'GainStation13/icons/mob/markings/char_snouts.dmi'
icon_state = "feasterndnw"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
@@ -1 +1,92 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
//snaketail
/datum/sprite_accessory/tails/lizard/snaketail //GS13 - ...6 seperate paths for one tail. Wew.
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/lizard/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/human/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/human/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/mam_tails/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/mam_tails_animated/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
//spaded tail
/datum/sprite_accessory/tails/mam_tails/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
/datum/sprite_accessory/tails_animated/mam_tails_animated/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
/datum/sprite_accessory/tails/human/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
/datum/sprite_accessory/tails_animated/human/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
//deer tail
/datum/sprite_accessory/tails/human/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
/datum/sprite_accessory/tails/mam_tails/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/mam_tails_animated/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
@@ -18,7 +18,7 @@
layer_index = BELLY_LAYER_INDEX
/obj/item/organ/genital/belly/modify_size(modifier, min = BELLY_SIZE_DEF, max = BELLY_SIZE_MAX)
var/new_value = clamp(size_cached + modifier, min, max)
var/new_value = clamp(size_cached + modifier, starting_size, max)
if(new_value == size_cached)
return
prev_size = size_cached
@@ -40,12 +40,13 @@
switch(owner.fullness)
if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG)
icon = 'hyperstation/icons/obj/genitals/belly_round.dmi' //We use round belly to represent stuffedness
icon_state = "belly_round_[size]"
if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ)
icon = 'hyperstation/icons/obj/genitals/belly_round.dmi'
icon_state = "belly_[icon_shape_state]_[size+1]"
icon_state = "belly_round_[size+1]"
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)
icon = 'hyperstation/icons/obj/genitals/belly_round.dmi'
icon_state = "belly_[icon_shape_state]_[size+2]"
icon_state = "belly_round_[size+2]"
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
@@ -64,6 +65,7 @@
else
color = "#[D.features["belly_color"]]"
size = D.features["belly_size"]
starting_size = D.features["belly_size"]
shape = D.features["belly_shape"]
inflatable = D.features["inflatable_belly"]
toggle_visibility(D.features["belly_visibility"], FALSE)
@@ -13,6 +13,7 @@
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/glyphid_slammer
name = "Glyphid slammer"
@@ -26,3 +27,4 @@
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
use_gs_icon = TRUE
@@ -11,6 +11,7 @@
glass_name = "belly bloats"
glass_desc = "The perfect mix to be big and merry with."
shot_glass_icon_state = "shotglassbrown"
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/belly_bloats/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -30,6 +31,7 @@
glass_name = "blobby mary"
glass_desc = "For the morbidly obese ladies and gentlemen."
shot_glass_icon_state = "shotglassred"
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/blobby_mary/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -49,6 +51,7 @@
glass_name = "beltbuster mead"
glass_desc = "The ambrosia of the blubbery gods."
shot_glass_icon_state = "shotglassgold"
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/beltbuster_mead/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -67,6 +70,7 @@
glass_name = "heavy cafe"
glass_desc = "To enjoy slow mornings with."
shot_glass_icon_state = "shotglassbrown"
use_gs_icon = TRUE
/datum/reagent/consumable/heavy_cafe/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -92,6 +96,7 @@
glass_name = "fruits tea"
glass_desc = "Goes down really easy and stays there for a long time."
shot_glass_icon_state = "shotglassgold"
use_gs_icon = TRUE
/datum/reagent/consumable/fruits_tea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -118,6 +123,7 @@
glass_name = "snakebite"
glass_desc = "Won't hurt like a real bite, but you'll still regert drinking this."
shot_glass_icon_state = "shotglassgreen"
use_gs_icon = TRUE
/datum/reagent/consumable/snakebite/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -0,0 +1,17 @@
// GS13 subtle glitters
/datum/reagent/glitter/pink_subtle
name = "lesser pink glitter"
description = "pink sparkles that get everywhere. these ones seem lower density than normal."
color = "#ff8080" //A light pink color
glitter_type = /obj/effect/decal/cleanable/glitter/pink_subtle
/datum/reagent/glitter/white_subtle
name = "lesser white glitter"
description = "white sparkles that get everywhere. these ones seem lower density than normal."
glitter_type = /obj/effect/decal/cleanable/glitter/white_subtle
/datum/reagent/glitter/blue_subtle
name = "lesser blue glitter"
description = "blue sparkles that get everywhere. these ones seem lower density than normal."
color = "#4040FF" //A blueish color
glitter_type = /obj/effect/decal/cleanable/glitter/blue_subtle
@@ -0,0 +1,20 @@
///////////////////////////////// SUBTLE GLITTERS ////////////////////////////
/datum/chemical_reaction/lesser_pink
name = "pink glitter dilution"
id = "lesser_pink_glitter"
results = list(/datum/reagent/glitter/pink_subtle = 2)
required_reagents = list(/datum/reagent/glitter/pink = 1, /datum/reagent/space_cleaner = 1) //You clean some of it away, I guess?
/datum/chemical_reaction/lesser_white
name = "white glitter dilution"
id = "lesser_white_glitter"
results = list(/datum/reagent/glitter/white_subtle = 2)
required_reagents = list(/datum/reagent/glitter/white = 1, /datum/reagent/space_cleaner = 1)
/datum/chemical_reaction/lesser_blue
name = "pink glitter dilution"
id = "lesser_blue_glitter"
results = list(/datum/reagent/glitter/blue_subtle = 2)
required_reagents = list(/datum/reagent/glitter/blue = 1, /datum/reagent/space_cleaner = 1)
//Im not going to do the recolor recipes for the subtle glitters. Unless that's really wanted (except you cant even make glitter to start with so the recipes are already super niche to begin with.)
@@ -0,0 +1,26 @@
/obj/item/borg/upgrade/feeding_arm
name = "food gripper module"
desc = "An extra module that allows cyborgs to grab food and drinks, and feed them to people."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/feeding_arm/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/gripper/food/S = new(R.module)
R.module.basic_modules += S
R.module.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/feeding_arm/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
var/obj/item/gripper/food/S = locate() in R.module
R.module.remove_module(S, TRUE)
/obj/item/gripper/food
name = "food gripper"
desc = "A simple grasping tool for interacting with various food and drink related items."
item_flags = NOBLUDGEON
can_hold = list(
/obj/item/reagent_containers,
)
@@ -129,6 +129,15 @@
construction_time = 100
category = list("Cyborg Upgrade Modules")
/datum/design/borg_foodgrip
name = "Cyborg Upgrade (Food Gripper)"
id = "borg_upgrade_foodgrip"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/feeding_arm
materials = list(/datum/material/iron = 8000, /datum/material/glass = 6000)
construction_time = 100
category = list("Cyborg Upgrade Modules")
//todo: make a seperate file for extra borg modules
/obj/item/borg/upgrade/cookiesynth
@@ -0,0 +1,28 @@
/turf/open/floor/mineral/titanium/old
name = "tiled floor"
icon = 'GainStation13/icons/turf/floors.dmi'
icon_state = "titanium_old"
floor_tile = /obj/item/stack/tile/mineral/titanium
broken_states = list("titanium_dam1_old","titanium_dam2_old","titanium_dam3_old","titanium_dam4_old","titanium_dam5_old")
/turf/open/floor/mineral/titanium/old/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/yellow
icon_state = "titanium_yellow_old"
/turf/open/floor/mineral/titanium/old/yellow/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/blue
icon_state = "titanium_blue_old"
/turf/open/floor/mineral/titanium/old/blue/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/white
icon_state = "titanium_white_old"
/turf/open/floor/mineral/titanium/old/white/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/purple
icon_state = "titanium_purple_old"
/turf/open/floor/mineral/titanium/purple/airless
initial_gas_mix = "TEMP=2.7"
@@ -0,0 +1,165 @@
/////////////////////
// Tile reskinning //
/////////////////////
// Q: What is this?
// A: A simple function to allow you to change what tiles you place with a stack of tiles.
// Q: Why do it this way?
// A: This allows players more freedom to do beautiful-looking builds. Having five types of titanium tile would be clunky as heck.
// Q: Great! Can I use this for all floors?
// A: Unfortunately, this does not work on subtypes of plasteel and instead we must change the icon_state of these turfs instead, as the icon_regular_floor var that "saves" what type of floor a plasteel subtype turf was so once repaired...
// ... it'll go back to the floor it was instead of grey (medical floors turn white even after crowbaring the tile and putting it back). This stops changing turf_type from working.
/obj/item/stack/tile/mineral/titanium/attack_self(mob/user)
var/static/list/choices = list(
"Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle"),
"Yellow Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_yellow"),
"Blue Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_blue"),
"White Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_white"),
"Purple Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_purple"),
"Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old"),
"Yellow Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_yellow"),
"Blue Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_blue"),
"White Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_white"),
"Purple Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_purple"),
)
var/choice = show_radial_menu(user, src, choices, radius = 48, require_near = TRUE)
switch(choice)
if("Titanium")
turf_type = /turf/open/floor/mineral/titanium
icon_state = "tile_shuttle"
desc = "Sleek titanium tiles."
if("Yellow Titanium")
turf_type = /turf/open/floor/mineral/titanium/yellow
icon_state = "tile_shuttle_yellow"
desc = "Sleek yellow titanium tiles."
if("Blue Titanium")
turf_type = /turf/open/floor/mineral/titanium/blue
icon_state = "tile_shuttle_blue"
desc = "Sleek blue titanium tiles."
if("White Titanium")
turf_type = /turf/open/floor/mineral/titanium/white
icon_state = "tile_shuttle_white"
desc = "Sleek white titanium tiles."
if("Purple Titanium")
turf_type = /turf/open/floor/mineral/titanium/purple
icon_state = "tile_shuttle_purple"
desc = "Sleek purple titanium tiles."
if("Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old
icon_state = "tile_shuttle_old"
desc = "Titanium floor tiles."
if("Yellow Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/yellow
icon_state = "tile_shuttle_old_yellow"
desc = "Yellow titanium floor tiles."
if("Blue Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/blue
icon_state = "tile_shuttle_old_blue"
desc = "Blue titanium floor tiles."
if("White Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/white
icon_state = "tile_shuttle_old_white"
desc = "White titanium floor tiles."
if("Purple Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/purple
icon_state = "tile_shuttle_old_purple"
desc = "Purple titanium floor tiles."
/obj/item/stack/tile/plasteel
desc = "Metal tiles that can be placed on top of plating. Press Z or use these to change tiles."
icon = 'GainStation13/icons/obj/tiles.dmi'
var/tile_reskin_mode
tile_reskin_mode = "plasteel"
/obj/item/stack/tile/plasteel/attack_self(mob/user)
var/static/list/choices = list(
"Plasteel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_plasteel"),
"White Plasteel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_white"),
"Dark Plasteel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_dark"),
"Chapel Flooring" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_chapel"),
"Shower" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shower"),
"Freezer" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_freezer"),
"Kitchen" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_kitchen"),
"Grimy" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_grimy"),
"Solar Panel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_solar"),
)
var/choice = show_radial_menu(user, src, choices, radius = 48, require_near = TRUE)
switch(choice)
if("Plasteel")
turf_type = /turf/open/floor/plasteel
icon_state = "tile_plasteel"
desc = "Metal floor tiles."
tile_reskin_mode = "plasteel"
if("White Plasteel")
turf_type = /turf/open/floor/plasteel/white
icon_state = "tile_white"
desc = "White metal floor tiles."
tile_reskin_mode = "white plasteel"
if("Dark Plasteel")
turf_type = /turf/open/floor/plasteel/dark
icon_state = "tile_dark"
desc = "Dark metal floor tiles."
tile_reskin_mode = "dark plasteel"
if("Chapel Flooring")
turf_type = /turf/open/floor/plasteel/chapel
icon_state = "tile_chapel"
desc = "Those very dark floor tiles you find in the chapel a lot."
tile_reskin_mode = "chapel"
if("Shower")
turf_type = /turf/open/floor/plasteel/showroomfloor
icon_state = "tile_shower"
desc = "Tiles for showers, bathrooms and wetrooms."
tile_reskin_mode = "shower"
if("Freezer")
turf_type = /turf/open/floor/plasteel/freezer
icon_state = "tile_freezer"
desc = "High-grip flooring for walk-in freezers and chillers."
tile_reskin_mode = "freezer"
if("Kitchen")
turf_type = /turf/open/floor/plasteel/cafeteria
icon_state = "tile_kitchen"
desc = "Chequered pattern plasteel tiles."
tile_reskin_mode = "kitchen"
if("Grimy")
turf_type = /turf/open/floor/plasteel/grimy
icon_state = "tile_grimy"
desc = "I'm sure it'll look nice somewhere?"
tile_reskin_mode = "grimy"
if("Solar Panel")
turf_type = /turf/open/floor/plasteel/airless/solarpanel
icon_state = "tile_solar"
desc = "Flooring usually placed below solar panels. Using this indoors is an intergalactic fashion crime."
tile_reskin_mode = "solar"
/turf/open/floor/plasteel/attackby(obj/item/reskinstack, mob/user, params)
if(istype(reskinstack, /obj/item/stack/tile/plasteel))
var/obj/item/stack/tile/plasteel/hitfloor = reskinstack
switch(hitfloor.tile_reskin_mode)
if("plasteel")
icon_state = "floor"
icon_regular_floor = "floor"
if("white plasteel")
icon_state = "white"
icon_regular_floor = "white"
if("dark plasteel")
icon_state = "darkfull"
icon_regular_floor = "darkfull"
if("chapel")
icon_state = "chapel_alt"
icon_regular_floor = "chapel_alt"
if("shower")
icon_state = "showroomfloor"
icon_regular_floor = "showroomfloor"
if("freezer")
icon_state = "freezerfloor"
icon_regular_floor = "freezerfloor"
if("kitchen")
icon_state = "cafeteria"
icon_regular_floor = "cafeteria"
if("grimy")
icon_state = "grimy"
icon_regular_floor = "grimy"
if("solar")
icon_state = "solarpanel"
icon_regular_floor = "solarpanel"
else return