4 Commits

Author SHA1 Message Date
evilew 7f156083f5 Merge branch 'master' of https://github.com/sheepishgoat/GS13-Citadel into tweaks-and-fixes 2024-10-15 14:16:16 +02:00
evilew 39a425e2cd Revert "mirror appearance"
This reverts commit 050dcb5cc1.
2024-10-15 14:15:45 +02:00
evilew 050dcb5cc1 mirror appearance
threw in some defines and other stuff for testing 'mirrorcanloadappearance', but it just kinda doesn't seem to work
2024-10-14 17:49:11 +02:00
evilew f82de944b3 small tweaks
- brought back fat jacqueen sprites
- added modular suits and flowers to loadouts
- nerfed electrical storms
2024-10-14 17:19:26 +02:00
758 changed files with 744658 additions and 3904050 deletions
+24 -19
View File
@@ -8,18 +8,18 @@ on:
- master
jobs:
run_linters:
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
if: "!contains(github.event.head_commit.message, '[ci skip]')"
name: Run Linters
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Restore SpacemanDMM cache
uses: actions/cache@v4
uses: actions/cache@v2
with:
path: ~/SpacemanDMM
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}
- name: Restore Yarn cache
uses: actions/cache@v4
uses: actions/cache@v2
with:
path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -29,7 +29,7 @@ jobs:
${{ runner.os }}-
- name: Install Tools
run: |
pip3 install setuptools --upgrade
pip3 install setuptools
bash tools/ci/install_node.sh
bash tools/ci/install_spaceman_dmm.sh dreamchecker
tools/bootstrap/python -c ''
@@ -51,13 +51,13 @@ jobs:
outputFile: output-annotations.txt
compile_all_maps:
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
if: "!contains(github.event.head_commit.message, '[ci skip]')"
name: Compile Maps
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Restore BYOND cache
uses: actions/cache@v4
uses: actions/cache@v2
with:
path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
@@ -66,10 +66,11 @@ jobs:
bash tools/ci/install_byond.sh
source $HOME/BYOND/byond/bin/byondsetup
tools/build/build --ci dm -DCIBUILDING -DCITESTING -DALL_MAPS
run_all_tests:
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
if: "!contains(github.event.head_commit.message, '[ci skip]')"
name: Integration Tests
runs-on: ubuntu-22.04
runs-on: ubuntu-20.04
services:
mysql:
image: mysql:latest
@@ -79,14 +80,14 @@ jobs:
- 3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Restore BYOND cache
uses: actions/cache@v4
uses: actions/cache@v2
with:
path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
- name: Restore Yarn cache
uses: actions/cache@v4
uses: actions/cache@v2
with:
path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -103,6 +104,9 @@ jobs:
mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql
- name: Install rust-g
run: |
sudo dpkg --add-architecture i386
sudo apt update || true
sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386
bash tools/ci/install_rust_g.sh
- name: Install auxmos
run: |
@@ -114,14 +118,15 @@ jobs:
source $HOME/BYOND/byond/bin/byondsetup
tools/build/build --ci -DCIBUILDING
bash tools/ci/run_server.sh
test_windows:
if: ( !contains(github.event.head_commit.message, '[ci skip]') )
if: "!contains(github.event.head_commit.message, '[ci skip]')"
name: Windows Build
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v2
- name: Restore Yarn cache
uses: actions/cache@v4
uses: actions/cache@v2
with:
path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -138,7 +143,7 @@ jobs:
md deploy
bash tools/deploy.sh ./deploy
- name: Deploy artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3
with:
name: deploy
path: deploy
@@ -1,31 +0,0 @@
name: Generate documentation
on:
push:
branches:
- master
jobs:
generate_documentation:
if: "!contains(github.event.head_commit.message, '[ci skip]')"
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4
- name: Setup cache
uses: actions/cache@v4
with:
path: ~/SpacemanDMM
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}
- name: Install SpacemanDMM
run: bash tools/ci/install_spaceman_dmm.sh dmdoc
- name: Generate documentation
run: |
~/dmdoc
touch dmdoc/.nojekyll
echo codedocs.citadel-station.net > dmdoc/CNAME
- name: Deploy
uses: JamesIves/github-pages-deploy-action@3.7.1
with:
BRANCH: gh-pages
CLEAN: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SINGLE_COMMIT: true
FOLDER: dmdoc
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
name: Update the TGS DMAPI
steps:
- name: Clone
uses: actions/checkout@v4
uses: actions/checkout@v2
- name: Branch
run: |
+1 -1
View File
@@ -18,6 +18,6 @@ linux_scripts:
PreCompile.sh: tools/tgs4_scripts/PreCompile.sh
# Same as above for Windows hosted servers
windows_scripts:
PreCompile.bat: tools/tgs4_scripts/PreCompile.bat
PreCompile.bat: tools/tgs_scripts/PreCompile.bat
# The security level the game should be run at
security: Trusted
-14
View File
@@ -7,13 +7,6 @@
"name": "Launch DreamSeeker",
"preLaunchTask": "Build All",
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
},
{
"type": "byond",
"request": "launch",
"name": "Launch DreamSeeker (TRACY)",
"preLaunchTask": "Build All (TRACY)",
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
},
{
"type": "byond",
@@ -52,13 +45,6 @@
"preLaunchTask": "Build All (LOWMEMORYMODE)",
"dmb": "${workspaceFolder}/${command:CurrentDMB}",
"dreamDaemon": true
},
{
"type": "byond",
"request": "launch",
"name": "Launch DreamSeeker (LOWMEMORYMODE + TRACY)",
"preLaunchTask": "Build All (LOWMEMORYMODE TRACY)",
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
}
]
}
-51
View File
@@ -24,31 +24,6 @@
"dependsOn": "dm: reparse",
"label": "Build All"
},
{
"type": "process",
"command": "tools/build/build",
"windows": {
"command": ".\\tools\\build\\build.bat"
},
"options": {
"env": {
"DM_EXE": "${config:dreammaker.byondPath}"
}
},
"problemMatcher": [
"$dreammaker",
"$tsc",
"$eslint-stylish"
],
"group": {
"kind": "build"
},
"dependsOn": "dm: reparse",
"args": [
"-DUSE_BYOND_TRACY"
],
"label": "Build All (TRACY)"
},
{
"type": "process",
"command": "tools/build/build",
@@ -99,32 +74,6 @@
],
"label": "Build All (LOWMEMORYMODE)"
},
{
"type": "process",
"command": "tools/build/build",
"windows": {
"command": ".\\tools\\build\\build.bat"
},
"options": {
"env": {
"DM_EXE": "${config:dreammaker.byondPath}"
}
},
"problemMatcher": [
"$dreammaker",
"$tsc",
"$eslint-stylish"
],
"group": {
"kind": "build"
},
"dependsOn": "dm: reparse",
"args": [
"-DLOWMEMORYMODE",
"-DUSE_BYOND_TRACY"
],
"label": "Build All (LOWMEMORYMODE TRACY)"
},
{
"type": "dreammaker",
"dme": "tgstation.dme",
@@ -1 +0,0 @@
#define GAS_FAT "lipoifium"
@@ -1,57 +0,0 @@
/client/proc/breadify(atom/movable/target)
var/obj/item/reagent_containers/food/snacks/store/bread/plain/funnyBread = new(get_turf(target))
target.forceMove(funnyBread)
GLOBAL_LIST_EMPTY(transformation_animation_objects)
/*
* Creates animation that turns current icon into result appearance from top down.
*
* result_appearance - End result appearance/atom/image
* time - Animation duration
* transform_overlay - Appearance/atom/image of effect that moves along the animation - should be horizonatally centered
* reset_after - If FALSE, filters won't be reset and helper vis_objects will not be removed after animation duration expires. Cleanup must be handled by the caller!
*/
/atom/movable/proc/transformation_animation(result_appearance,time = 3 SECONDS,transform_overlay,reset_after=TRUE)
var/list/transformation_objects = GLOB.transformation_animation_objects[src] || list()
//Disappearing part
var/top_part_filter = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0)
filters += top_part_filter
var/filter_index = length(filters)
animate(filters[filter_index],y=-32,time=time)
//Appearing part
var/obj/effect/overlay/appearing_part = new
appearing_part.appearance = result_appearance
appearing_part.appearance_flags |= KEEP_TOGETHER | KEEP_APART
appearing_part.vis_flags = VIS_INHERIT_ID
appearing_part.filters = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0,flags=MASK_INVERSE)
animate(appearing_part.filters[1],y=-32,time=time)
transformation_objects += appearing_part
//Transform effect thing - todo make appearance passed in
if(transform_overlay)
var/obj/transform_effect = new
transform_effect.appearance = transform_overlay
transform_effect.vis_flags = VIS_INHERIT_ID
transform_effect.pixel_y = 16
transform_effect.alpha = 255
transformation_objects += transform_effect
animate(transform_effect,pixel_y=-16,time=time)
animate(alpha=0)
GLOB.transformation_animation_objects[src] = transformation_objects
for(var/A in transformation_objects)
vis_contents += A
if(reset_after)
addtimer(CALLBACK(src,.proc/_reset_transformation_animation,filter_index),time)
/*
* Resets filters and removes transformation animations helper objects from vis contents.
*/
/atom/movable/proc/_reset_transformation_animation(filter_index)
var/list/transformation_objects = GLOB.transformation_animation_objects[src]
for(var/A in transformation_objects)
vis_contents -= A
qdel(A)
transformation_objects.Cut()
GLOB.transformation_animation_objects -= src
if(filters && length(filters) >= filter_index)
filters -= filters[filter_index]
//else
// filters = null
-15
View File
@@ -1,15 +0,0 @@
// 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,6 +4,7 @@
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
@@ -12,12 +13,11 @@
/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_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)
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
-14
View File
@@ -1,14 +0,0 @@
/obj/item/clothing/glasses/hud/health/gar
name = "gar health scanner HUD"
desc = "When you're scared, that's all the more reason to move forward!"
icon ='GainStation13/icons/obj/clothing/glasses.dmi'
mob_overlay_icon = 'GainStation13/icons/mob/eyes.dmi'
icon_state = "garh"
item_state = "garh"
force = 10
throwforce = 10
throw_speed = 4
attack_verb = list("sliced")
hitsound = 'sound/weapons/bladeslice.ogg'
sharpness = SHARP_POINTY
-9
View File
@@ -1,9 +0,0 @@
/datum/accent/kitty/modify_speech(list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
var/static/regex/taja_purr = new("r+", "g")
var/static/regex/taja_puRR = new("R+", "g")
if(message[1] != "*")
message = taja_purr.Replace(message, "rrr")
message = taja_puRR.Replace(message, "Rrr")
speech_args[SPEECH_MESSAGE] = message
return speech_args
@@ -1,46 +0,0 @@
/datum/award/achievement/fat
category = "Gluttony"
icon = "basemisc"
//chemistry
/datum/award/achievement/fat/blob
name = "Become a blob"
desc = "You've gotten fat enough to become a blob!"
database_id = GLUTTONY_BLOB
/datum/award/achievement/fat/milestone_one
name = "Fatness Milestone One"
desc = "Reach a BFI level of 10,000!"
database_id = GLUTTONY_MILESTONE_ONE
/datum/award/achievement/fat/milestone_two
name = "Fatness Milestone One"
desc = "Reach a BFI level of 25,000!"
database_id = GLUTTONY_MILESTONE_TWO
/datum/award/achievement/fat/milestone_three
name = "Fatness Milestone Three"
desc = "Reach a BFI level of 50,000!"
database_id = GLUTTONY_MILESTONE_THREE
/datum/award/achievement/fat/milestone_four
name = "Fatness Milestone Four"
desc = "Reach a BFI level of 100,000!"
database_id = GLUTTONY_MILESTONE_FOUR
/datum/award/achievement/fat/milestone_five
name = "Fatness Milestone Five"
desc = "Reach a BFI level of 500,000!"
database_id = GLUTTONY_MILESTONE_FIVE
/datum/award/achievement/fat/milestone_six
name = "Fatness Milestone Six"
desc = "Reach a BFI level of 1,000,000!"
database_id = GLUTTONY_MILESTONE_SIX
/datum/award/achievement/fat/milestone_seven
name = "Fatness Milestone Seven"
desc = "Reach a BFI level of 10,000,000!"
database_id = GLUTTONY_MILESTONE_SEVEN
@@ -1,31 +0,0 @@
// GS miscellaneous recipes
/datum/crafting_recipe/industrial_feeding_tube
name = "Industrial Feeding Tube"
reqs = list(
// /obj/machinery/iv_drip/feeding_tube = 1, //Removing this. Seems to be buggy with not-items used to craft
/obj/item/stack/sheet/metal = 5,
/obj/item/stack/sheet/plastic = 5,
/obj/item/pipe = 2,
/obj/item/stock_parts/matter_bin = 2
)
parts = list(
/obj/item/stock_parts/matter_bin = 2
)
result = /obj/structure/disposaloutlet/industrial_feeding_tube
tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_SCREWDRIVER)
subcategory = CAT_MISCELLANEOUS
category = CAT_MISCELLANEOUS
/datum/crafting_recipe/liberator // It's easy to craft, but it's not a good gun.
name = "Liberator Pistol"
reqs = list(
/obj/item/stack/sheet/metal = 3,
/obj/item/weaponcrafting/receiver = 1,
/obj/item/ammo_casing/c10mm = 1,
)
result = /obj/item/gun/ballistic/liberator
tools = list(TOOL_WELDER, TOOL_SCREWDRIVER)
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -31,11 +31,3 @@
suffix = "lavaland_surface_blueberryarea.dmm"
allow_duplicates = TRUE
cost = 0
/datum/map_template/ruin/lavaland/cozy_cabin //HS13 (I think?)
name = "Cozy Cabin"
id = "cozycabin"
description = "A comfy lil cabin, amidst the barren hot landscape."
suffix = "lavaland_surface_cozy_cabin.dmm"
allow_duplicates = TRUE
cost = 0
@@ -1,13 +0,0 @@
/datum/mood_event/fat_bad
description = "<span class='warning'><B>I'm so fat...</B></span>\n"
mood_change = -4
/datum/mood_event/fat_good
description = "<span class='nicegreen'><B>I'm so fat!</B></span>\n"
mood_change = 4
//GS13 Port
/datum/mood_event/lewd_headpat
description = "<span class='nicegreen'>I love headpats so much!</span>\n"
mood_change = 3
timeout = 2 MINUTES
@@ -1,178 +0,0 @@
/datum/mutation/human/adipohazard
name = "Adipohazard"
desc = "A mutation that causes swelling upon touching the mutated person."
quality = POSITIVE
text_gain_indication = "<span class='notice'>Everything around you feels soft...</span>"
text_lose_indication = "<span class='notice'>The soft feeling around you disappears.</span>"
difficulty = 14
instability = 30
power_coeff = 1
var/fat_add = 2
/datum/mutation/human/adipohazard/on_life()
. = ..()
if(owner.pulledby != null && iscarbon(owner.pulledby))
var/mob/living/carbon/C = owner.pulledby
var/pwr = GET_MUTATION_POWER(src)
C.adjust_fatness(get_fatness_bonus(owner) + (fat_add * pwr), FATTENING_TYPE_RADIATIONS)
if(C.grab_state >= GRAB_AGGRESSIVE)
C.adjust_fatness(get_fatness_bonus(owner) + ((fat_add * 2) * pwr), FATTENING_TYPE_RADIATIONS)
if(prob(5))
var/add_text = pick("You feel softer.", "[owner] feels warm to the touch", "It's so nice to touch [owner].", "You don't want to let go of [owner].")
to_chat(C, "<span class='notice'>[add_text]</span>")
if(owner.pulling != null && iscarbon(owner.pulling))
var/mob/living/carbon/C = owner.pulling
var/pwr = GET_MUTATION_POWER(src)
C.adjust_fatness(get_fatness_bonus(owner) + (fat_add * pwr), FATTENING_TYPE_RADIATIONS)
if(C.grab_state >= GRAB_AGGRESSIVE)
C.adjust_fatness(get_fatness_bonus(owner) + ((fat_add * 2) * pwr), FATTENING_TYPE_RADIATIONS)
if(prob(5))
var/add_text = pick("You feel softer.", "[owner] feels warm to the touch", "It's so nice for [owner] to touch.", "You don't want [owner] to let go of you.")
to_chat(C, "<span class='notice'>[add_text]</span>")
/datum/mutation/human/adipohazard/proc/get_fatness_bonus(mob/living/carbon/user)
var/fatness_level = get_fatness_level_name(user.fatness)
var/fatness_bonus = 0
switch(fatness_level)
if("Fat", "Fatter")
fatness_bonus = 1
if("Very Fat", "Obese")
fatness_bonus = 2
if("Very Obese", "Extremely Obese")
fatness_bonus = 3
if("Barely Mobile", "Immobile")
fatness_bonus = 4
if("Blob")
fatness_bonus = 5
return fatness_bonus
/datum/mutation/human/adipohazard/proc/fatten(mob/living/carbon/toucher, amount = 1)
toucher.adjust_fatness(get_fatness_bonus(owner) + (amount * GET_MUTATION_POWER(src)), FATTENING_TYPE_RADIATIONS)
to_chat(toucher, "<span class='notice'>That felt so nice!</span>")
/obj/item/dnainjector/antiadipohazard
name = "\improper DNA injector (Anti-Adipohazard)"
desc = "No hugs?"
remove_mutations = list(ADIPOHAZARD)
/obj/item/dnainjector/adipohazard
name = "\improper DNA injector (Adipohazard)"
desc = "It's hugs time!"
add_mutations = list(ADIPOHAZARD)
/mob/living/carbon/help_shake_act(mob/living/carbon/M)
. = ..()
var/datum/mutation/human/adipohazard/touched_mutation
for(var/datum/mutation/human/adipohazard/HM in dna.mutations)
if(istype(HM, /datum/mutation/human/adipohazard))
touched_mutation = HM
var/datum/mutation/human/adipohazard/touching_mutation
for(var/datum/mutation/human/adipohazard/HM in M.dna.mutations)
if(istype(HM, /datum/mutation/human/adipohazard))
touching_mutation = HM
if(on_fire)
return
if(M == src && check_self_for_injuries())
return
if(touched_mutation)
if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
if(mob_run_block(M, 0, M.name, ATTACK_TYPE_UNARMED, 0, null, null, null))
return
if(lying)
if(buckled)
return
touched_mutation.fatten(M, 5)
else if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH)
touched_mutation.fatten(M, 1)
else if(check_zone(M.zone_selected) == BODY_ZONE_HEAD)
touched_mutation.fatten(M, 3)
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
if((pulling == M) && (grab_state == GRAB_PASSIVE))
touched_mutation.fatten(M, 2)
else
touched_mutation.fatten(M, 1)
else
touched_mutation.fatten(M, 5)
if(touching_mutation)
if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
if(mob_run_block(M, 0, M.name, ATTACK_TYPE_UNARMED, 0, null, null, null))
return
if(lying)
if(buckled)
return
touching_mutation.fatten(src, 5)
else if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH)
touching_mutation.fatten(src, 1)
else if(check_zone(M.zone_selected) == BODY_ZONE_HEAD)
touching_mutation.fatten(src, 3)
else if(check_zone(M.zone_selected) == BODY_ZONE_R_ARM || check_zone(M.zone_selected) == BODY_ZONE_L_ARM)
if((pulling == M) && (grab_state == GRAB_PASSIVE))
touching_mutation.fatten(src, 2)
else
touching_mutation.fatten(src, 1)
else
touching_mutation.fatten(src, 5)
/mob/living/carbon/human/kisstarget(mob/living/L)
. = ..()
if(isliving(L))
if(iscarbon(L))
var/datum/mutation/human/adipohazard/touched_mutation
var/mob/living/carbon/C = L
for(var/datum/mutation/human/adipohazard/HM in C.dna.mutations)
if(istype(HM, /datum/mutation/human/adipohazard))
touched_mutation = HM
if(touched_mutation)
touched_mutation.fatten(src, 10)
var/datum/mutation/human/adipohazard/touching_mutation
for(var/datum/mutation/human/adipohazard/HM in dna.mutations)
if(istype(HM, /datum/mutation/human/adipohazard))
touching_mutation = HM
if(touching_mutation)
touching_mutation.fatten(L, 10)
/datum/species/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
. = ..()
var/aim_for_mouth = user.zone_selected == "mouth"
var/target_on_help = target.a_intent == INTENT_HELP
var/target_aiming_for_mouth = target.zone_selected == "mouth"
var/target_restrained = target.restrained()
var/same_dir = (target.dir & user.dir)
var/aim_for_groin = user.zone_selected == "groin"
var/target_aiming_for_groin = target.zone_selected == "groin"
var/opposite_dir = user.dir == DIRFLIP(target.dir)
var/datum/mutation/human/adipohazard/touched_mutation
for(var/datum/mutation/human/adipohazard/HM in target.dna.mutations)
if(istype(HM, /datum/mutation/human/adipohazard))
touched_mutation = HM
var/datum/mutation/human/adipohazard/touching_mutation
for(var/datum/mutation/human/adipohazard/HM in user.dna.mutations)
if(istype(HM, /datum/mutation/human/adipohazard))
touching_mutation = HM
if(touched_mutation != null && target != user)
if(!IS_STAMCRIT(user))
if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
touched_mutation.fatten(user, 4)
else if(aim_for_groin && (target == user || target.lying || same_dir || opposite_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
touched_mutation.fatten(user, 5)
else
touched_mutation.fatten(user, 5)
if(touching_mutation != null && target != user)
if(!IS_STAMCRIT(user))
if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
touching_mutation.fatten(target, 4)
else if(aim_for_groin && (target == user || target.lying || same_dir || opposite_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
touching_mutation.fatten(target, 5)
else
touching_mutation.fatten(target, 2)
-74
View File
@@ -74,77 +74,3 @@
wheels.setDir(spawn_chair.dir)
wheels.buckle_mob(quirk_holder)
/datum/quirk/universal_diet
name = "Universal diet"
desc = "You are fine with eating just about anything normally edible, you have no strong dislikes in food. Toxic food will still hurt you, though."
value = 0
gain_text = "<span class='notice'>You feel like you can eat any food type.</span>"
lose_text = "<span class='notice'>You start to dislike certain food types again.</span>"
medical_record_text = "Patient reports no strong dietary dislikes."
/datum/quirk/universal_diet/add()
var/mob/living/carbon/human/H = quirk_holder
var/datum/species/species = H.dna.species
species.disliked_food = null
/datum/quirk/universal_diet/remove()
var/mob/living/carbon/human/H = quirk_holder
if(H)
var/datum/species/species = H.dna.species
species.disliked_food = initial(species.disliked_food)
//GS13 Port
//Port from Shadow
/datum/quirk/donotclone
name = "DNC"
desc = "You have filed a Do Not Clone order, stating that you do not wish to be cloned. You can still be revived by other means."
value = -2
mob_trait = TRAIT_NEVER_CLONE
medical_record_text = "Patient has a DNC (Do not clone) order on file, and cannot be cloned as a result."
/datum/quirk/inheat
name = "In Heat"
desc = "Your system burns with the desire to be bred, your body will betray you and alert others' to your desire when examining you. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy."
value = 0
mob_trait = TRAIT_HEAT
gain_text = "<span class='notice'>You body burns with the desire to be bred.</span>"
lose_text = "<span class='notice'>You feel more in control of your body and thoughts.</span>"
/datum/quirk/headpat_slut
name = "Headpat Slut"
desc = "You like headpats, alot, maybe even a little bit too much. Headpats give you a bigger mood boost and cause arousal"
mob_trait = TRAIT_HEADPAT_SLUT
value = 0
medical_record_text = "Patient seems overly affectionate."
/datum/quirk/headpat_hater
name = "Distant"
desc = "You don't seem to show much care for being touched. Whether it's because you're reserved or due to self control, you won't wag your tail outside of your own control should you possess one."
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
-28
View File
@@ -36,31 +36,3 @@
/area/ruin/powered/candycaveLower/inside
name = "Candy Cave"
icon_state = "away"
//fatventure gateway map
/area/awaymission/fatventure
name = "Unknown Area"
icon_state = "awaycontent1"
requires_power = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
/area/awaymission/fatventure/outside
name = "Unknown Area - Outside"
icon_state = "awaycontent25"
/area/awaymission/fatventure/inside
name = "Unknown Area - Inside"
icon_state = "awaycontent2"
// requires_power = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
/obj/effect/light_emitter/light //made this light emitter for adventure maps where you have to naturally switch between dynamic and nondynamic light
set_luminosity = 4
set_cap = 2.5
light_color = LIGHT_COLOR_TUNGSTEN
/turf/closed/indestructible/junglemineral
name = "tough rock"
icon = 'icons/turf/mining.dmi'
icon_state = "rock"
+127 -40
View File
@@ -1,7 +1,131 @@
//GS13: donator items and other ckey-locked junk
/datum/gear/gatobadge_employee //these are available only to admins with CC-related characters
name = "GATO Badge - Employee"
category = LOADOUT_CATEGORY_DONATOR
path = /obj/item/clothing/accessory/medal/gato_badge/employee
ckeywhitelist = list("sonoida", "yeeny")
/datum/gear/gatobadge_middleman //these are available to players who were granted permission to have their characters to CC
name = "GATO Badge - Correspondent"
category = LOADOUT_CATEGORY_DONATOR
path = /obj/item/clothing/accessory/medal/gato_badge/middleman
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny", "Not Number")
/datum/gear/halsey_overcoat
name = "Halsey's Commander Overcoat"
category = LOADOUT_CATEGORY_DONATOR
path = /obj/item/clothing/suit/chloe/halsey
ckeywhitelist = list("yeeny")
/datum/gear/haydee_suit
name = "Haydee Suit"
category = LOADOUT_CATEGORY_DONATOR
path = /obj/item/clothing/suit/space/hardsuit/engine/haydee
ckeywhitelist = list("lumu", "sonoida")
/datum/gear/haydee_pistol
name = "Haydee Pistol"
category = LOADOUT_CATEGORY_DONATOR
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
path = /obj/item/toy/plush/gs13/rose
ckeywhitelist = list("eremitanovem", "sonoida")
/datum/gear/chloe_plush
name = "Chloe Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/toy/plush/gs13/chloe
ckeywhitelist = list("alphas0")
/datum/gear/grimmy_coat
name = "Overcoat of the Destitute"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
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
path = /obj/item/gps/mining
ckeywhitelist = list("e926user25")
/datum/gear/milwaukee_crowbar
name = "Milwaukee Pocket Crowbar"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
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
path = /obj/item/dnainjector/fatfang
ckeywhitelist = list("sonoida")
/datum/gear/toolbelt
name = "Empty Toolbelt"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
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
name = "Weight Gain Spellbook"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/book/granter/spell/fattening
ckeywhitelist = list("sonoida", "themrsky", "Not Number")
/datum/gear/wgspell_transfer
name = "Weight Transfer Spellbook"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/book/granter/spell/fattening/transfer
ckeywhitelist = list("sonoida", "themrsky", "Not Number")
/datum/gear/wgspell_take
name = "Weight Steal Spellbook"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
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
name = "White Eyepatch"
category = LOADOUT_CATEGORY_GLASSES
path = /obj/item/clothing/glasses/eyepatch/white
//
//item presets for donator items and other gunk
//
/obj/item/clothing/glasses/eyepatch/white
name = "White eyepatch"
desc = "Smells faintly of medicine and headaches."
@@ -13,40 +137,3 @@
desc = "Vulpine sluts only."
icon_state = "eyepatch_white"
item_state = "eyepatch_white"
/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'"
/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 //Look man I don't know, this is the file it was in on Oracle. Don't shoot me. Please.
name = "blueshield coat"
desc = "An armored coat often worn by bodyguards. Tough because everyone knows deep down you're a softie."
icon = 'GainStation13/icons/obj/clothing/suits.dmi'
mob_overlay_icon = 'GainStation13/icons/mob/suit.dmi'
icon_state = "blueshieldcoat"
item_state = "blueshieldcoat"
body_parts_covered = CHEST|LEGS|ARMS
allowed = list(/obj/item/gun/energy, /obj/item/reagent_containers/spray/pepper, /obj/item/ammo_box, /obj/item/ammo_casing,/obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/flashlight/seclite, /obj/item/melee/classic_baton)
armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = CHEST|LEGS|ARMS
heat_protection = CHEST|LEGS|ARMS
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
/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!"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/crowbar/bronze/glaug
name = "Milwaukee Pocket Crowbar"
desc = "Much more expensive. Still serves the same function."
-63
View File
@@ -549,66 +549,3 @@
</body>
</html>
"}
//gs13 snack attack shuttle loan
/obj/item/paper/fluff/chocoslime_research
name = "Stained Research Papers"
info = "<b>AUDIO LOG OF CHOCOLATE SLIME REPORT NO.3</b>. Despite possessing no obvious combat capabilities, the chocolate slime can feed itself to its victim, possibly rupturing its st-- mmhfph- grhm... ...(AUDIO LOG END)."
//gs13 - solar defence crate
/obj/item/paper/guides/jobs/engi/solar_defence
name = "Info on Satellite Defence"
info = "<h1>Welcome</h1><p>With this crate, you will be able to protect the station's solar arrays from constant barrages of space sand. The set-up is simple. Drag around all the satellites in front of solar panel arrays, preferably in direction open to space (the best spot is near the solar tracker and outside of the grilles), as that is where the space sand will come from. It's advised to set down just 1 satellite for each solar array. Once you set the satellite down, you can activate it by flicking on the switch. The crate also provides you with an OPTIONAL computer board to keep track of your defence satellites. Voila!</p>"
//GS13's gateway map
/obj/item/paper/fluff/ruins/gateway_fats/caloriteslime1
name = "Day 5 - Calorite Slime Specimen"
info = "We finally got the calorite slime specimen to react - it began to self-produce lipoifier wherever it went, along with making subtle traces of lipoifium every now and then. Any contact without protection results in almost immediate immobilization. Jay Cobb has been smacking it with a cattle prod for a good 5 hours now. I hope it doesn't escape."
/obj/item/paper/fluff/ruins/gateway_fats/caloriteslime2
name = "Day 6 - Calorite Slime Specimen"
info = "It escaped."
/obj/item/paper/fluff/ruins/gateway_fats/candyland_shack
name = "Dear Diary"
info = "So far living here has been working out quite well. I don't need to worry about food at all! The only problem: I really should've made a bigger doorway..."
/obj/item/paper/fluff/ruins/gateway_fats/facility_doodle
name = "a doodle"
info = "(it's a crude drawing of a man in a suit, being hit by a car. There are stink lines coming off him, for some reason.)"
/obj/item/paper/fluff/ruins/gateway_fats/facility_report1
name = "Personal note"
info = "I really don't know which executive or RD comes up with this shit. Sure, I can get building chambers for testing properties of various creatures or items on people, as illegal and immoral it might be... But building a SMALL HAZARD COURSE? Really? I wouldn't be surprised if this room's camera tapes are saved every week..."
/obj/item/paper/fluff/ruins/gateway_fats/facility_report2
name = "Security Notice"
info = "We've spotted a few life signatures poking around this region near the facility. The scans don't match any of the local flora or fauna... Be on the lookout for potential threats."
/obj/item/paper/fluff/ruins/gateway_fats/facility_report3
name = "Security Notice 2"
info = "We've captured an agent - turtleneck sweater, black and red gear, stechkin tucked away in his boot. Seems like a typical syndie. Before we could really squeeze out any information though, he bit through one of his teeth and succumbed to poison. Need to poke HOS about more thorough search scans in the future."
/obj/item/paper/fluff/ruins/gateway_fats/facility_report4
name = "My Will"
info = "I don't think I'm gonna squeeze out of this rubble anytime soon. In case I don't make it: Please leave all that I have to-- (the rest of the page is covered in droplets of dried blood)"
/obj/item/paper/fluff/ruins/gateway_fats/facility_report5
name = "AUTOMATIC REPORT - CODE RED EMERGENCY"
info = "MULTIPLE EXPLOSIONS DETECTED. STRUCTURAL INTEGRITY OF THE FACILITY HAS BEEN COMPROMISED - EMERGENCY PROTOCOLS ENGAGED. CONTACTING HQ... ... ... ... ... CONTACT FAILED. CHECK SYSTEM WIRING."
/obj/item/paper/fluff/ruins/gateway_fats/facility_report6
name = "STOP STEALING MY FUCKING LUNCH"
info = "Tell that cunt Jerry from requisitions that if he ever steals my lunch again, I'm gonna lock him in a room with 10 of those creepy floating orange hands."
/obj/item/paper/fluff/ruins/gateway_fats/facility_report7
name = "Report #383 C28 - Prolonged Exposure to Calorite and Calorite-Derived Products"
info = "(the entire paper is covered in some sort of grease, smudging all the ink and making it unreadable...)"
/obj/item/paper/fluff/ruins/gateway_fats/facility_report8
name = "Report #192 A38 - Lipoifium"
info = "Subject 2 - Male, Anthropomorphic Fox, blue fur. Name: Sam S. At the beginning of the testing, subject was recorded to have weight of 160lbs. After a day minutes of exposure, their weight went into quadruple digits. Testing had to be concluded due to insufficient build of the test chamber. More detailed report found in the system."
@@ -1,18 +0,0 @@
//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"
@@ -63,101 +63,3 @@
desc = "A poster from terran sectors, suggesting non-existence of mythical country of Malta."
icon_state = "poster50"
icon = 'GainStation13/icons/obj/contraband.dmi'
//recoloring of propaganda posters - from NT blue to GT pink
/obj/structure/sign/poster/gato/safety
name = "Here For Your Safety"
desc = "A poster glorifying the station's security force."
icon_state = "poster1_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/lovegato
name = "GATO Poster"
desc = "A poster with the GATO's friendly feline mascot."
icon_state = "poster2_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/cleanhands
name = "Cleanliness"
desc = "A poster warning of the dangers of poor hygiene."
icon_state = "poster3_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/helpothers
name = "Help Others"
desc = "A poster encouraging you to help fellow crewmembers."
icon_state = "poster4_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/buildstuff
name = "Build"
desc = "A poster glorifying the engineering team."
icon_state = "poster5_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/blessthisspess
name = "Bless This Spess"
desc = "A poster blessing this area."
icon_state = "poster6_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/science
name = "Science"
desc = "A poster depicting an atom."
icon_state = "poster7_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/arf
name = "Ian"
desc = "Arf arf. Yap."
icon_state = "poster8_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/obey
name = "Obey"
desc = "A poster instructing the viewer to obey authority."
icon_state = "poster9_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/walk
name = "Walk"
desc = "A poster instructing the viewer to walk instead of running."
icon_state = "poster10_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/statelaws
name = "State Laws"
desc = "A poster instructing cyborgs to state their laws."
icon_state = "poster11_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/loveian
name = "Love Ian"
desc = "Ian is love, Ian is life."
icon_state = "poster12_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/futurework
name = "Work For A Future"
desc = " A poster encouraging you to work for your future."
icon_state = "poster17_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/safety
name = "Safety: Internals"
desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic."
icon_state = "poster19_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/safety2
name = "Safety: Eye Protection"
desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights."
icon_state = "poster20_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
/obj/structure/sign/poster/gato/reportcrimes
name = "Report Crimes"
desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security."
icon_state = "poster22_legit"
icon = 'GainStation13/icons/obj/contraband.dmi'
@@ -20,74 +20,3 @@
last_event = world.time
active = 0
return
//gato colored signs - from NT blue to GT pink
/obj/structure/sign/warning/gato
name = "\improper WARNING SIGN"
desc = "A warning sign which reads 'SECURE AREA'."
icon = 'GainStation13/icons/obj/decals.dmi'
/obj/structure/sign/warning/gato/securearea
name = "\improper SECURE AREA"
desc = "A warning sign which reads 'SECURE AREA'."
/obj/structure/sign/warning/gato/docking
name = "\improper KEEP CLEAR: DOCKING AREA"
desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."
/obj/structure/sign/warning/gato/biohazard
name = "\improper BIOHAZARD"
desc = "A warning sign which reads 'BIOHAZARD'."
icon_state = "bio"
/obj/structure/sign/warning/gato/electricshock
name = "\improper HIGH VOLTAGE"
desc = "A warning sign which reads 'HIGH VOLTAGE'."
icon_state = "shock"
/obj/structure/sign/warning/gato/vacuum
name = "\improper HARD VACUUM AHEAD"
desc = "A warning sign which reads 'HARD VACUUM AHEAD'."
icon_state = "space"
/obj/structure/sign/warning/gato/vacuum/external
name = "\improper EXTERNAL AIRLOCK"
desc = "A warning sign which reads 'EXTERNAL AIRLOCK'."
layer = MOB_LAYER
/obj/structure/sign/warning/gato/deathsposal
name = "\improper DISPOSAL: LEADS TO SPACE"
desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'."
icon_state = "deathsposal"
/obj/structure/sign/warning/gato/pods
name = "\improper ESCAPE PODS"
desc = "A warning sign which reads 'ESCAPE PODS'."
icon_state = "pods"
/obj/structure/sign/warning/gato/fire
name = "\improper DANGER: FIRE"
desc = "A warning sign which reads 'DANGER: FIRE'."
icon_state = "fire"
/obj/structure/sign/warning/gato/nosmoking
name = "\improper NO SMOKING"
desc = "A warning sign which reads 'NO SMOKING'."
icon_state = "nosmoking2"
/obj/structure/sign/warning/gato/nosmoking/circle
icon_state = "nosmoking"
/obj/structure/sign/warning/gato/radiation
name = "\improper HAZARDOUS RADIATION"
desc = "A warning sign alerting the user of potential radiation hazards."
icon_state = "radiation"
/obj/structure/sign/warning/gato/radiation/rad_area
name = "\improper RADIOACTIVE AREA"
desc = "A warning sign which reads 'RADIOACTIVE AREA'."
/obj/structure/sign/warning/gato/enginesafety
name = "\improper ENGINEERING SAFETY"
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
icon_state = "safety"
@@ -1,7 +0,0 @@
////////////// 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."
@@ -1,13 +0,0 @@
//gs13 - solar defence crate
/obj/structure/closet/crate/solarpanel_defence
name = "solar system defence crate"
icon_state = "engi_e_crate"
/obj/structure/closet/crate/solarpanel_defence/PopulateContents()
..()
new /obj/machinery/satellite/meteor_shield(src)
new /obj/machinery/satellite/meteor_shield(src)
new /obj/machinery/satellite/meteor_shield(src)
new /obj/machinery/satellite/meteor_shield(src)
new /obj/item/paper/guides/jobs/engi/solar_defence(src)
new /obj/item/circuitboard/computer/sat_control(src)
+1 -11
View File
@@ -1,5 +1,5 @@
/obj/item/toy/plush/gs13
icon = 'GainStation13/icons/obj/plushes.dmi'
icon = 'icons/obj/plushes.dmi'
/obj/item/toy/plush/gs13/metha
name = "Magical Captain plushie"
@@ -71,13 +71,3 @@
desc = "A plush of a chunky greaseball."
icon_state = "delta"
attack_verb = list("squished", "hugged", "smushed")
/obj/item/toy/plush/gs13/metis
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")
+15 -28
View File
@@ -1,7 +1,7 @@
/proc/playsound_prefed(atom/source, soundin, pref, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE,
falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, envwet = -10000, envdry = 0, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, distance_multiplier_min_range = SOUND_DEFAULT_MULTIPLIER_EFFECT_RANGE)
/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))
CRASH("playsound(): source is an area")
throw EXCEPTION("playsound(): source is an area")
return
var/turf/turf_source = get_turf(source)
@@ -9,42 +9,29 @@
return
//allocate a channel if necessary now so its the same for everyone
channel = channel || SSsounds.random_available_channel()
channel = channel //|| open_sound_channel()
// Looping through the player list has the added bonus of working for mobs inside containers
// Looping through the player list has the added bonus of working for mobs inside containers
var/sound/S = sound(get_sfx(soundin))
var/maxdistance = SOUND_RANGE + extrarange
var/source_z = turf_source.z
var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy()
var/turf/above_turf = SSmapping.get_turf_above(turf_source)
var/turf/below_turf = SSmapping.get_turf_below(turf_source)
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)
if(above_turf && istransparentturf(above_turf))
listeners += hearers(maxdistance,above_turf)
if(below_turf && istransparentturf(turf_source))
listeners += hearers(maxdistance,below_turf)
else
if(above_turf && istransparentturf(above_turf))
listeners += SSmobs.clients_by_zlevel[above_turf.z]
if(below_turf && istransparentturf(turf_source))
listeners += SSmobs.clients_by_zlevel[below_turf.z]
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_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry)
for(var/P in SSmobs.dead_players_by_zlevel[source_z])
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_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry)
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
@@ -1,88 +0,0 @@
//GS13 Port - stuckage code
/obj/machinery/door/airlock/Crossed(mob/living/carbon/L)
if(!istype(L))
return ..()
var/stuckage_weight = L?.client?.prefs?.stuckage
if(isnull(stuckage_weight) || (stuckage_weight < 10))
return ..() // They aren't able to get stuck
if(L.fatness > (stuckage_weight * 2))
if(rand(1, 3) == 1)
L.doorstuck = 1
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
L.Stun(100, updating = TRUE, ignore_canstun = TRUE)
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/door/airlock/, AsyncDoorstuckCall), L), 100)
//sleep(100)
return ..()
else if(L.fatness > stuckage_weight)
if(rand(1, 5) == 1)
L.doorstuck = 1
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
L.Stun(55, updating = TRUE, ignore_canstun = TRUE)
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/door/airlock/, AsyncDoorstuckCall), L), 55)
//sleep(55)
return ..()
if(rand(1, 5) == 5)
to_chat(L, "<span class='danger'>With great effort, you manage to squeeze your massive form through \the [src]. It's a tight fit, but you successfully navigate the narrow opening, barely avoiding getting stuck.</span>")
return ..()
else if(L.fatness > (stuckage_weight / 2))
if(rand(1, 5) == 1)
L.visible_message("<span class'danger'>[L]'s hips brush against the doorway...</span>")
to_chat(L, "<span class='danger'>As you pass through \the [src], you feel a slight brushing against your hips. The [src] frame accommodates your form, but it's a close fit..</span>")
return ..()
return ..()
/obj/structure/mineral_door/Crossed(mob/living/carbon/L)
if(!istype(L))
return ..()
var/stuckage_weight = L?.client?.prefs?.stuckage
if(isnull(stuckage_weight) || (stuckage_weight < 10))
return ..() // They aren't able to get stuck
if(L.fatness > (stuckage_weight * 2))
if(rand(1, 3) == 1)
L.doorstuck = 1
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
L.Stun(100, updating = TRUE, ignore_canstun = TRUE)
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/mineral_door/, AsyncDoorstuckCall), L), 100)
//sleep(100)
return ..()
else if(L.fatness > stuckage_weight)
if(rand(1, 5) == 1)
L.doorstuck = 1
L.visible_message("<span class'danger'>[L] gets stuck in the doorway!</span>")
to_chat(L, "<span class='danger'>As you attempt to pass through \the [src], your ample curves get wedged in the narrow opening. You find yourself stuck in the [src] frame, struggling to free yourself from the tight squeeze.</span>")
L.Stun(55, updating = TRUE, ignore_canstun = TRUE)
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/structure/mineral_door/, AsyncDoorstuckCall), L), 55)
//sleep(55)
return ..()
if(rand(1, 5) == 5)
to_chat(L, "<span class='danger'>With great effort, you manage to squeeze your massive form through \the [src]. It's a tight fit, but you successfully navigate the narrow opening, barely avoiding getting stuck.</span>")
return ..()
else if(L.fatness > (stuckage_weight / 2))
if(rand(1, 5) == 1)
L.visible_message("<span class'danger'>[L]'s hips brush against the doorway...</span>")
to_chat(L, "<span class='danger'>As you pass through \the [src], you feel a slight brushing against your hips. The [src] frame accommodates your form, but it's a close fit..</span>")
return ..()
return ..()
// Callback proc to replace sleep function
/obj/machinery/door/airlock/proc/AsyncDoorstuckCall(mob/living/carbon/L)
L.doorstuck = 0
L.Knockdown(1)
// Callback proc to replace sleep function
/obj/structure/mineral_door/proc/AsyncDoorstuckCall(mob/living/carbon/L)
L.doorstuck = 0
L.Knockdown(1)
@@ -1,517 +0,0 @@
/**
* Contains:
* Industrial Feeding Tube
*/
/obj/structure/disposaloutlet/industrial_feeding_tube
name = "\improper industrial feeding tube"
desc = "An imposing machine designed to pump an absurd amount of \"food\" down something's throat. It seems to connect to disposal pipes."
icon = 'GainStation13/icons/obj/feeding_tube_industrial.dmi'
icon_state = "base"
max_integrity = 500 //Durable...
anchored = FALSE
/// Is it welded down?
var/welded = FALSE
/// Who the tube is attached to
var/mob/living/attached
/// Where the tube tries to dump it's stuff into
var/output_dest
/// It's Glogged !
var/clogged = FALSE
/// Are we currently pumping?
var/pumping = FALSE
/// Stuff we're currently trying to pump out
var/list/pump_stuff = list()
/// How many items we can push per-pump.
var/pump_limit = 5
/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload)
. = ..()
update_icon()
if(anchored) // So it can be mapped in, attached to something.
trunk = locate() in loc
if(!trunk)
return
trunk.linked = src // link the pipe trunk to self
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
for(var/obj/item/stock_parts/matter_bin/mb in contents)
if(mb in pump_stuff) //stuff we're going to pump are not being used to build us.
continue
pump_limit += mb.rating * 2.5 // ~20 items per pump with 2 bluespace bins
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)
new /obj/item/stack/sheet/plastic(loc, 5)
new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH)
new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH)
if(contents) //Anything still glogged inside...
for(var/atom/movable/AM in src)
AM.forceMove(loc)
qdel(src)
/obj/structure/disposaloutlet/industrial_feeding_tube/Destroy()
if(attached)
attached = null
if(output_dest)
output_dest = null
if(LAZYLEN(contents)) // Just to be safe, lets dump everything out before it's deleted.
for(var/atom/movable/AM in contents)
if(istype(AM, /obj/item/stock_parts/matter_bin))
if(AM in pump_stuff) // Unless it's one of our component parts..
AM.forceMove(loc)
continue
qdel(AM)
return ..()
/obj/structure/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target)
. = ..()
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(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) || (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.
if(usr != feedee) // If someone is feeding themself, skip the prefcheck.
var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your [food_dump]! Do you want this?", "THE TUBE", "Yes!!", "No!")
if(feedeePrefCheck != "Yes!!")
to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...")
return
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)
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
attach_tube(feedee) // Attach normally
return
/// 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)))
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)
/obj/structure/disposaloutlet/industrial_feeding_tube/update_overlays()
// A lot of this is temp. More likely than not you shouldnt see this comment as it'll be properly updated when reo PRs this.
// Or it wont because epic fail :333
. = ..()
cut_overlays()
var/mutable_appearance/tube_overlay = mutable_appearance('GainStation13/icons/obj/feeding_tube_industrial.dmi', "tube_idle")
if(pumping)
tube_overlay.icon_state = "tube-pump"
else
if(attached)
tube_overlay.icon_state = "tube-active"
else
tube_overlay.icon_state = "tube-idle"
if(welded) //if we're not welded, dont show our light on.
add_overlay("light-[clogged ? "r" : "g"]")
add_overlay(tube_overlay)
// 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)
if(H.hasmob) //Uh oh-
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)
clog(H.contents)
else
var/start_pumping = FALSE
for(var/atom/movable/AM in H.contents)
pump_stuff += AM // Get ready to pump!
AM.forceMove(src)
if(!pumping) //Lets start a new pump cycle if we arnt pumping. Otherwise, it'll just be added to the queue.
start_pumping = TRUE
pumping = TRUE
if(start_pumping)
pump()
qdel(H)
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/pump(repeat = TRUE, unlimited = FALSE)
if(clogged)
return
var/list/this_pump = list() //What we're going to pump this cycle
var/item_count = 0
for(var/atom/movable/AM in pump_stuff)
this_pump += AM // Add to the stuff we're currently pumping
item_count++
if(item_count > pump_limit && !unlimited) //We're pumping as much as our parts allow!
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)
pump()
return
var/fed_something = FALSE
// Feed Normally
if(isliving(output_dest))
var/list/not_food = list()
for(var/atom/movable/AM in this_pump)
if(istype(AM, /obj/item/reagent_containers/food/snacks))
var/obj/item/reagent_containers/food/snacks/food = AM
var/datum/reagents/food_reagents = food.reagents
if(food_reagents.total_volume)
var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~
SEND_SIGNAL(food, COMSIG_FOOD_EATEN, attached)
food_reagents.reaction(attached, INGEST, food_size)
food_reagents.trans_to(attached, food_size)
food.checkLiked(food_size, attached) //...Hopefully you like the taste.
if(food.trash) //Lets make the trash the food's supposed to make, if it has any
var/obj/item/trash = food.generate_trash(src)
if(not_food)
not_food += trash // If it's already going to get clogged, clog it more with the trash
else
trash.forceMove(get_turf(src)) // Otherwise move it to the tile. For convinience
fed_something = TRUE
pump_stuff -= food
qdel(food) //Gulp...
continue
else
not_food += AM // That's not (traditionally) edible!
if(LAZYLEN(not_food))
clog(not_food) // Now you've gone and clogged us...
// Feed Voraciously
if(isbelly(output_dest))
var/list/inedible //Some things shouldnt be eaten...
for(var/atom/movable/AM in this_pump)
pump_stuff -= AM // We're putting this in. Remove it from the list.
if(isitem(AM))
var/obj/item/I = AM
if(is_type_in_list(I, item_vore_blacklist))
inedible += I
continue
if(isliving(AM))
var/mob/living/cutie = AM
if(!(cutie.vore_flags & DEVOURABLE)) //Do not eat this QT...
inedible += cutie
continue
fed_something = TRUE
AM.forceMove(output_dest)
if(inedible)
clog(inedible)
// 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, 'GainStation13/sound/rakshasa/Corrosion3.ogg', rand(50,70), 1)
if(LAZYLEN(pump_stuff) && repeat)
pump()
else
pumping = FALSE
update_icon()
/obj/structure/disposaloutlet/industrial_feeding_tube/expel_holder(obj/structure/disposalholder/H, playsound=FALSE)
if(playsound)
playsound(src, 'sound/machines/hiss.ogg', 25, 0, 0)
if(!H)
return
spew(H.contents)
H.vent_gas(get_turf(src))
qdel(H)
/obj/structure/disposaloutlet/industrial_feeding_tube/attack_hand(mob/user)
. = ..()
if(attached)
detach_tube()
return
/obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params)
if(user.a_intent != INTENT_HELP)
return ..()
switch(I.tool_behaviour)
if(TOOL_WRENCH)
if(welded)
to_chat(user, "<span class='warning'>\The [src] is firmly welded to the floor. Cut the floorwelds before trying to unwrench it!</span>")
return TRUE
var/turf/T = get_turf(src)
if(T.intact && isfloorturf(T))
to_chat(user, "<span class='warning'>You need to remove the floor tiles before [anchored ? "detaching" : "attaching"] \the [src]!</span>")
return TRUE
if(anchored)
I.play_tool_sound(src, 100)
anchored = FALSE
trunk.linked = null
trunk = null
attached = null
output_dest = null
user.visible_message("<span class='notice'>[user] detaches \the [src] from the floor!</span>")
return TRUE
else
var/found_trunk = FALSE
for(var/obj/structure/disposalpipe/P in T)
if(istype(P, /obj/structure/disposalpipe/trunk))
var/obj/structure/disposalpipe/trunk/newtrunk = P
if(newtrunk.linked) //Trunk is already linked to something
continue
found_trunk = TRUE
trunk = newtrunk
break
if(!found_trunk)
to_chat(user, "<span class='warning'>\The [src] requires a trunk underneath it in order to work!</span>")
return
to_chat(user, "<span class='notice'>You attach \the [src] to the trunk.</span>")
anchored = TRUE
I.play_tool_sound(src, 100)
update_icon()
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
if(anchored)
//var/turf/T = get_turf(src)
if(!welded)
if(!trunk) // If we're attaching it, we need to check for the pipe we're attaching to
to_chat(user, "<span class='danger'>\The [src] needs to be welded to a trunk.</span>")
return TRUE
to_chat(user, "<span class='notice'>You start welding \the [src] in place...</span>")
else
if(clogged) // There's junk inside!
to_chat(user, "<span class='warning'>There's junk inside \the [src]! Clean it out before trying to remove it!</span>")
return TRUE
//Already welded, lets cut it free
to_chat(user, "<span class='notice'>You start slicing the floorweld off \the [src]...</span>")
playsound(src, 'sound/items/welder2.ogg', 100, 1)
if(I.use_tool(src, user, 20))
update_icon()
playsound(src, 'sound/items/welder.ogg', 100, 1)
if(welded)
to_chat(user, "<span class='notice'>You slice the floorweld off [src].</span>")
welded = FALSE
trunk.linked = null
return TRUE
else
to_chat(user, "<span class='notice'>You weld \the [src] to the floor.</span>")
welded = TRUE
trunk.linked = src
return TRUE
else
playsound(src, 'sound/items/welder2.ogg', 100, 1)
to_chat(user, "<span class='notice'>You begin deconstructing \the [src]</span>")
if(I.use_tool(src, user, 30))
playsound(src, 'sound/items/welder.ogg', 100, 1)
deconstruct(TRUE)
return TRUE
// Someone got stuck inside after it got clogged!
// Lets let them force their way out
/obj/structure/disposaloutlet/industrial_feeding_tube/container_resist(mob/living/user)
if(user.stat || !clogged) //If it's not clogged, they'll be ejected soon... One way or another.
return
playsound(src, 'sound/effects/clang.ogg', 50)
visible_message("\The [src] loudly clongs as something inside tries to break free!")
if(do_after(user, 100))
unclog()
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk, loud = TRUE)
clogged = TRUE
for(var/atom/movable/AM in clog_junk)
if(!(AM in pump_stuff))
pump_stuff += AM
AM.forceMove(src)
update_icon()
if(loud)
playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1)
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog()
spew(pump_stuff)
clogged = FALSE
update_icon()
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/spew(var/list/spew_stuff, playsound = FALSE)
var/turf/T = get_turf(src)
if(playsound)
playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
for(var/atom/movable/AM in spew_stuff)
if(AM in pump_stuff)
pump_stuff -= AM
target = get_offset_target_turf(loc, rand(2)-rand(2), rand(2)-rand(2))
AM.forceMove(T)
AM.pipe_eject(dir)
AM.throw_at(target, eject_range, 1)
/obj/structure/disposaloutlet/industrial_feeding_tube/proc/face_atom(atom/A) //Literally stolen from /mob. Sue me.
if(!A || !x || !y || !A.x || !A.y )
return
var/dx = A.x - x
var/dy = A.y - y
if(!dx && !dy) // Wall items are graphically shifted but on the floor
if(A.pixel_y > 16)
setDir(NORTH)
else if(A.pixel_y < -16)
setDir(SOUTH)
else if(A.pixel_x > 16)
setDir(EAST)
else if(A.pixel_x < -16)
setDir(WEST)
return
if(abs(dx) < abs(dy))
if(dy > 0)
setDir(NORTH)
else
setDir(SOUTH)
else
if(dx > 0)
setDir(EAST)
else
setDir(WEST)
+4 -33
View File
@@ -1,28 +1,6 @@
/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
@@ -36,7 +14,6 @@
points = 40
custom_materials = list(/datum/material/calorite=MINERAL_MATERIAL_AMOUNT)
refined_type = /obj/item/stack/sheet/mineral/calorite
mine_experience = 20
/obj/item/stack/sheet/mineral/calorite
name = "calorite"
@@ -48,21 +25,17 @@
novariants = TRUE
grind_results = list(/datum/reagent/consumable/lipoifier = 2)
point_value = 40
custom_materials = list(/datum/material/calorite=MINERAL_MATERIAL_AMOUNT)
merge_type = /obj/item/stack/sheet/mineral/calorite
material_type = /datum/material/calorite
walltype = /turf/closed/wall/mineral/calorite
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("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),\
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/get_main_recipes()
/obj/item/stack/sheet/mineral/calorite/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.calorite_recipes
. = ..()
. += GLOB.calorite_recipes
/obj/item/stack/tile/mineral/calorite //GS13
@@ -269,5 +242,3 @@ GLOBAL_LIST_INIT(calorite_recipes, list ( \
fatten()
. = ..()
/obj/item/ingot/calorite
custom_materials = list(/datum/material/calorite=1500)
+7 -41
View File
@@ -1,8 +1,5 @@
GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/maintenance, /area/security/prison, /area/holodeck, /area/commons/vacant_room/office, /area/space, /area/ruin, /area/lavaland, /area/awaymission, /area/centcom, /area/fatlab))
/mob/living
var/burpslurring = 0 //GS13 - necessary due to "say" being defined by mob/living
/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
@@ -24,7 +21,10 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
var/doorstuck = 0
var/fullness = FULLNESS_LEVEL_HALF_FULL
var/fullness_reduction_timer = 0 // When was the last time they emoted to reduce their fullness
var/fullness_reduction_timer = 0
var/burpslurring = 0
var/fullness_reducion_timer = 0 // When was the last time they emoted to reduce their fullness
/**
* Adjusts the fatness level of the parent mob.
@@ -60,25 +60,6 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
perma_apply() //Check and apply for permanent fat
xwg_resize() //Apply XWG
// Handle Awards
if(client)
if(fatness > FATNESS_LEVEL_BLOB)
client.give_award(/datum/award/achievement/fat/blob, src)
if(fatness > 10000)
client.give_award(/datum/award/achievement/fat/milestone_one, src)
if(fatness > 25000)
client.give_award(/datum/award/achievement/fat/milestone_two, src)
if(fatness > 50000)
client.give_award(/datum/award/achievement/fat/milestone_three, src)
if(fatness > 100000)
client.give_award(/datum/award/achievement/fat/milestone_four, src)
if(fatness > 500000)
client.give_award(/datum/award/achievement/fat/milestone_five, src)
if(fatness > 1000000)
client.give_award(/datum/award/achievement/fat/milestone_six, src)
if(fatness > 10000000)
client.give_award(/datum/award/achievement/fat/milestone_seven, src)
return TRUE
/mob/living/carbon/fully_heal(admin_revive)
@@ -95,9 +76,6 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
return FALSE
switch(type_of_fattening)
if(FATTENING_TYPE_ALMIGHTY)
return TRUE
if(FATTENING_TYPE_ITEM)
if(!client?.prefs?.weight_gain_items)
return FALSE
@@ -126,10 +104,6 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
if(!client?.prefs?.weight_gain_nanites)
return FALSE
if(FATTENING_TYPE_ATMOS)
if(!client?.prefs?.weight_gain_atmos)
return FALSE
if(FATTENING_TYPE_WEIGHT_LOSS)
if(HAS_TRAIT(src, TRAIT_WEIGHT_LOSS_IMMUNE))
return FALSE
@@ -216,9 +190,9 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
var/xwg_size = sqrt(fatness/FATNESS_LEVEL_BLOB)
xwg_size = min(xwg_size, RESIZE_MACRO)
xwg_size = max(xwg_size, custom_body_size)
if(xwg_size > RESIZE_A_HUGEBIG) //check if the size needs capping otherwise don't bother searching the list
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_A_HUGEBIG
xwg_size = RESIZE_BIG
resize(xwg_size)
/proc/get_fatness_level_name(fatness_amount)
@@ -233,7 +207,7 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
if(fatness_amount < FATNESS_LEVEL_MORBIDLY_OBESE)
return "Obese"
if(fatness_amount < FATNESS_LEVEL_EXTREMELY_OBESE)
return "Very Obese"
return "Morbidly Obese"
if(fatness_amount < FATNESS_LEVEL_BARELYMOBILE)
return "Extremely Obese"
if(fatness_amount < FATNESS_LEVEL_IMMOBILE)
@@ -277,11 +251,3 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
var/fat_to_add = ((amount * CONFIG_GET(number/damage_multiplier)) * FAT_DAMAGE_TO_FATNESS)
adjust_fatness(fat_to_add, FATTENING_TYPE_WEAPON)
return fat_to_add
/mob/living/carbon/proc/applyPermaFatnessDamage(amount)
if(!client?.prefs?.weight_gain_permanent) // If we cant apply permafat, apply regular fat
return applyFatnessDamage(amount)
var/fat_to_add = ((amount * CONFIG_GET(number/damage_multiplier)) * PERMA_FAT_DAMAGE_TO_FATNESS)
adjust_perma(fat_to_add, FATTENING_TYPE_WEAPON)
return fat_to_add
@@ -1,28 +0,0 @@
/obj/item/organ/lungs/proc/lipoifium_breathing(datum/gas_mixture/breath, mob/living/carbon/human/H)
if(breath)
var/pressure = breath.return_pressure()
var/total_moles = breath.total_moles()
var/lipoifium_moles = breath.get_moles(GAS_FAT)
#define PP_MOLES(X) ((X / total_moles) * pressure)
var/gas_breathed = PP_MOLES(lipoifium_moles) // this does the same thing as the bit below but I think this is more readable
// #define PP(air, gas) PP_MOLES(air.get_moles(gas))
// var/gas_breathed = PP(breath, GAS_FAT)
if(gas_breathed > 0)
// listen I know I can debug this but sometimes having this show up in chat without a pause is more convenient
// message_admins("Lipoifium pp is [gas_breathed]")
// message_admins("Lipoifium moles are [lipoifium_moles]")
H.adjust_fatness(2 * gas_breathed, FATTENING_TYPE_ATMOS)
breath.adjust_moles(GAS_FAT, -gas_breathed)
// TODO: the entire code below is a workaround for default odor not working
// The problem seems to be auxmos'es get_gasses function not acknowledging that lipoifium exists
// which is strange, considering that everything else regarding this gas and auxmos works
// I do not know what kind of spaghetti coding must be going on there, but I pray god has in his
// care the poor sods who have to work on that
var/smell_chance = min(lipoifium_moles * 100 / total_moles, 20)
if(prob(smell_chance))
to_chat(owner, "<span class='notice'>You can smell lard.</span>")
/obj/item/organ/lungs/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
lipoifium_breathing(breath, H)
. = ..()
+3 -8
View File
@@ -5,21 +5,16 @@
return ..()
/datum/species/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self)
if(!istype(I, /obj/item/mod) && HAS_TRAIT(H, TRAIT_NO_BACKPACK) && slot ==ITEM_SLOT_BACK)
if(HAS_TRAIT(H, TRAIT_NO_BACKPACK) && slot ==ITEM_SLOT_BACK)
to_chat(H, "<span class='warning'>You are too fat to wear anything on your back.</span>")
return FALSE
if(I.modular_icon_location == null && HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && slot == ITEM_SLOT_ICLOTHING)
if(!istype(I, /obj/item/clothing/under/color/grey/modular) && HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && slot == ITEM_SLOT_ICLOTHING)
to_chat(H, "<span class='warning'>You are too fat to wear [I].</span>")
return FALSE
if(!mod_check(I) && HAS_TRAIT(H, TRAIT_NO_MISC) && (slot == ITEM_SLOT_FEET || slot ==ITEM_SLOT_GLOVES || slot == ITEM_SLOT_OCLOTHING))
if(HAS_TRAIT(H, TRAIT_NO_MISC) && (slot == ITEM_SLOT_FEET || slot ==ITEM_SLOT_GLOVES || slot == ITEM_SLOT_OCLOTHING))
to_chat(H, "<span class='warning'>You are too fat to wear [I].</span>")
return FALSE
return ..()
/datum/species/proc/mod_check(I)
if(istype(I, /obj/item/mod) || istype(I, /obj/item/clothing/head/mod) || istype(I, /obj/item/clothing/gloves/mod) || istype(I, /obj/item/clothing/shoes/mod) || istype(I, /obj/item/clothing/suit/mod) )
return TRUE
return FALSE
+9 -33
View File
@@ -2,10 +2,10 @@
var/savekey
var/ckeyslot
/mob/living/carbon/proc/perma_fat_save()
/mob/living/carbon/proc/perma_fat_save(mob/living/carbon/character)
var/key = savekey
if(!key || !client)
return FALSE
if(!key)
return FALSE
var/filename = "preferences.sav"
var/path = "data/player_saves/[key[1]]/[key]/[filename]"
@@ -13,42 +13,18 @@
if(!path)
return FALSE
if(ckeyslot)
var/slot = ckeyslot
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"] , fatness_real)
client.prefs.starting_weight = fatness_real
to_chat(src, span_notice("Your starting weight has been updated!"))
var/perma
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"] , fatness_perma)
client.prefs.permanent_fat = fatness_perma
to_chat(src, span_notice("Your permanent fat has been updated!"))
/mob/living/carbon/proc/queue_perma_save()
to_chat(src,"Your permanence options are being saved, please wait." )
addtimer(CALLBACK(src, PROC_REF(perma_fat_save), TRUE, silent), 3 SECONDS, TIMER_STOPPABLE)
/datum/controller/subsystem/ticker/declare_completion()
. = ..()
for(var/mob/m in GLOB.player_list)
if(iscarbon(m))
var/mob/living/carbon/C = m
if(C)
C.queue_perma_save()
/obj/machinery/cryopod/despawn_occupant()
var/mob/living/mob_occupant = occupant
if(iscarbon(mob_occupant))
var/mob/living/carbon/C = mob_occupant
if(C)
C.perma_fat_save(C)
. = ..()
WRITE_FILE(S["permanent_fat"] , character.fatness_perma)
/*
/datum/preferences/proc/perma_fat_save(character)
@@ -69,7 +45,7 @@
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)
@@ -1,16 +0,0 @@
/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
var/obj/belly/vore_belly = eater?.vore_selected
if(!istype(food_mob) || !(food_mob?.vore_flags & DEVOURABLE) || (eater?.vore_flags & NO_VORE) || !istype(vore_belly))
return FALSE
qdel(transformation_component)
if(!vore_belly?.nom_mob(food_mob,eater))
return FALSE
return TRUE
@@ -1,36 +0,0 @@
/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
@@ -1,115 +0,0 @@
/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
/// Has the mob already been removed?
var/mob_removed = FALSE
/datum/component/transformation_item/Initialize()
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, PROC_REF(remove_mob))
/datum/component/transformation_item/Destroy(force, silent)
if(!mob_removed)
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)
ADD_TRAIT(mob_to_register, TRAIT_NOBREATH, 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)
REMOVE_TRAIT(transformed_mob, TRAIT_NOBREATH, 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
var/turf/parent_turf = get_turf(parent_atom)
transformed_mob.forceMove(parent_turf)
if(scale_object)
parent_atom.transform = null
mob_removed = TRUE
qdel(src)
@@ -1,116 +0,0 @@
/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()
+11 -22
View File
@@ -6,9 +6,6 @@
lose_text = "<span class='notice'>You don't feel absorbant anymore.</span>"
mob_trait = TRAIT_WATER_SPONGE
/datum/reagent/water
var/bloat_coeff = 3.5
/datum/reagent/water/on_mob_add(mob/living/L, amount)
if(HAS_TRAIT(L, TRAIT_WATER_SPONGE))
if(iscarbon(L))
@@ -33,7 +30,7 @@
/datum/reagent/water/proc/fat_hide(mob/living/carbon/user)
return volume * bloat_coeff
return volume * 3.5
/obj/machinery/shower/process()
..()
@@ -43,25 +40,17 @@
var/mob/living/carbon/L = AM
L.reagents.add_reagent(/datum/reagent/water, 3)
/obj/item/organ/lungs/proc/water_check(datum/gas_mixture/breath, mob/living/carbon/human/H)
if(HAS_TRAIT(H, TRAIT_WATER_SPONGE))
/* Disabling this for now.
/mob/living/carbon/proc/water_check(datum/gas_mixture/breath)
if(HAS_TRAIT(src, TRAIT_WATER_SPONGE))
if(breath)
var/pressure = breath.return_pressure()
var/total_moles = breath.total_moles()
//#define PP_MOLES(X) ((X / total_moles) * pressure)
#define PP(air, gas) PP_MOLES(air.get_moles(gas))
var/gas_breathed = PP(breath,GAS_H2O)
if(gas_breathed > 0)
H.reagents.add_reagent(/datum/reagent/water, gas_breathed)
breath.adjust_moles(GAS_H2O, -gas_breathed)
/obj/item/organ/lungs/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
water_check(breath, H)
. = ..()
/datum/reagent/water/overdose_start(mob/living/M)
. = 1
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
+6 -25
View File
@@ -41,7 +41,7 @@
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(user, 30 SECONDS, target))
if(!do_after_mob(user, target, 30 SECONDS))
return FALSE
var/obj/structure/spider/cocoon/quirk/spawned_cocoon = new(target.loc)
@@ -60,7 +60,7 @@
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(user, 10 SECONDS, target) || !target.dropItemToGround(suit))
if(!do_after_mob(user, target, 10 SECONDS) || !target.dropItemToGround(suit))
return FALSE
var/obj/item/clothing/suit/straight_jacket/web/wrapping = new
@@ -68,7 +68,7 @@
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(user, 20 SECONDS, target) || !target.equip_to_slot_if_possible(wrapping, ITEM_SLOT_OCLOTHING, TRUE, TRUE))
if(!do_after_mob(user, target, 20 SECONDS) || !target.equip_to_slot_if_possible(wrapping, ITEM_SLOT_OCLOTHING, 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
@@ -105,28 +105,9 @@
/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>")
var/obj/structure/spider/stickyweb/W = locate() in get_turf(src)
if(W || !do_after(owner, 10 SECONDS, T))
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
new /obj/structure/spider/stickyweb(T)
owner.visible_message("<span class='warning'>[owner] spins a sticky web!</span>", "<span class='warning'>You spin a sticky web.</span>")
return TRUE
/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target)
if (genetic)
return
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider) || HAS_TRAIT(mover, TRAIT_WEB_WEAVER))
return TRUE
else if(isliving(mover))
if(istype(mover.pulledby, /mob/living/simple_animal/hostile/poison/giant_spider))
return TRUE
if(mover.pulledby)
if(HAS_TRAIT(mover.pulledby, TRAIT_WEB_WEAVER))
return TRUE
if(prob(50))
to_chat(mover, "<span class='danger'>You get stuck in \the [src] for a moment.</span>")
return FALSE
else if(istype(mover, /obj/item/projectile))
return prob(30)
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
+4 -47
View File
@@ -38,7 +38,10 @@
blood_volume = 0
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
initial_language_holder = /datum/language_holder/slime
vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
// // 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
@@ -90,49 +93,3 @@
if(HAS_TRAIT(L, TRAIT_VORACIOUS))
fullness_add = fullness_add * 0.67
L.fullness += (fullness_add)
//should probably put this in elsewhere or whatever, but for now it'll do
/mob/living/simple_animal/hostile/fatten/magehand
name = "Magehand"
desc = "It's a floating mage hand of strange, crackling orange energy..."
icon = 'GainStation13/icons/mob/fathand.dmi'
icon_state = "fathand"
icon_living = "fathand"
icon_dead = "fathand_dead"
speak_emote = list("crackles")
emote_hear = list("crackles")
speak_chance = 5
mob_biotypes = MOB_SPIRIT
pressure_resistance = 9000
turns_per_move = 5
aggro_vision_range = 10
see_in_dark = 10
maxHealth = 20
health = 20
blood_volume = 0 //don't want it to bleed
del_on_death = TRUE //it's an apparition, shouldn't have a body
movement_type = FLYING
attack_verb_continuous = "pokes"
attack_verb_simple = "pokes"
a_intent = INTENT_HARM
pass_flags = PASSTABLE
move_to_delay = 2 //very fast
attack_sound = 'sound/weapons/pulse.ogg'
unique_name = 1
faction = list(ROLE_WIZARD)
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
/mob/living/simple_animal/hostile/fatten
var/fat_per_hit = 30
/mob/living/simple_animal/hostile/fatten/AttackingTarget()
. = ..()
var/mob/living/carbon/L = target
if(L.client?.prefs?.weight_gain_magic)
L.adjust_fatness(fat_per_hit)
-191
View File
@@ -1,191 +0,0 @@
/mob/living
var/adminbus_trash = FALSE // For abusing trash eater for event shenanigans.
/obj/item
var/trash_eatable = TRUE
/mob/living/proc/eat_trash()
set name = "Eat Trash"
set category = "Vore" //No Abilities?
set desc = "Consume held garbage."
if(!vore_selected)
to_chat(src,"<span class='warning'>You either don't have a belly selected, or don't have a belly!</span>")
return
var/obj/item/I = get_active_held_item()
if(!I)
to_chat(src, "<span class='notice'>You are not holding anything.</span>")
return
if(is_type_in_list(I,item_vore_blacklist) && !adminbus_trash) //If someone has adminbus, they can eat whatever they want.
to_chat(src, "<span class='warning'>You are not allowed to eat this.</span>")
return
if(!I.trash_eatable) //OOC pref. This /IS/ respected, even if adminbus_trash is enabled
to_chat(src, "<span class='warning'>You can't eat that so casually!</span>")
return
/*
if(istype(I, /obj/item/paicard))
var/obj/item/paicard/palcard = I
var/mob/living/silicon/pai/pocketpal = palcard.pai
if(pocketpal && (!pocketpal.devourable))
to_chat(src, "<span class='warning'>\The [pocketpal] doesn't allow you to eat it.</span>")
return
*/
if(is_type_in_list(I,edible_trash) | adminbus_trash /*|| is_type_in_list(I,edible_tech) && isSynthetic()*/)
/*
if(I.hidden_uplink)
to_chat(src, "<span class='warning'>You really should not be eating this.</span>")
message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? ADMIN_JMP(src) : "null"])")
return
*/
if(istype(I,/obj/item/pda))
var/obj/item/pda/P = I
if(P.owner)
var/watching = FALSE
for(var/mob/living/carbon/human/H in view(src))
if(H.real_name == P.owner && H.client)
watching = TRUE
break
if(!watching)
return
else
visible_message("<span class='warning'>[src] is threatening to make [P] disappear!</span>")
if(P.id)
var/confirm = alert(src, "The PDA you're holding contains a vulnerable ID card. Will you risk it?", "Confirmation", "Definitely", "Cancel") //No tgui input?
if(confirm != "Definitely")
return
if(!do_after(src, 100, P))
return
visible_message("<span class='warning'>[src] successfully makes [P] disappear!</span>")
to_chat(src, "<span class='notice'>You can taste the sweet flavor of delicious technology.</span>")
dropItemToGround(I)
I.forceMove(vore_selected)
updateVRPanel()
return
/*
if(istype(I,/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = I
if(S.holding)
to_chat(src, "<span class='warning'>There's something inside!</span>")
return
*/
/*
if(iscapturecrystal(I))
var/obj/item/capture_crystal/C = I
if(!C.bound_mob.devourable)
to_chat(src, "<span class='warning'>That doesn't seem like a good idea. (\The [C.bound_mob]'s prefs don't allow it.)</span>")
return
*/
dropItemToGround(I)
I.forceMove(vore_selected)
updateVRPanel()
log_admin("VORE: [src] used Eat Trash to swallow [I].")
if(istype(I,/obj/item/flashlight/flare) || istype(I,/obj/item/match) || istype(I,/obj/item/storage/box/matches))
to_chat(src, "<span class='notice'>You can taste the flavor of spicy cardboard.</span>")
else if(istype(I,/obj/item/flashlight/glowstick)) //Repath from /obj/item/device/flashlight/glowstick
to_chat(src, "<span class='notice'>You found out the glowy juice only tastes like regret.</span>")
else if(istype(I,/obj/item/cigbutt)) //Repath from /obj/item/trash/cigbutt
to_chat(src, "<span class='notice'>You can taste the flavor of bitter ash. Classy.</span>")
else if(istype(I,/obj/item/clothing/mask/cigarette)) //Repath from /obj/item/clothing/mask/smokable
var/obj/item/clothing/mask/cigarette/C = I
if(C.lit)
to_chat(src, "<span class='notice'>You can taste the flavor of burning ash. Spicy!</span>")
else
to_chat(src, "<span class='notice'>You can taste the flavor of aromatic rolling paper and funny looks.</span>")
else if(istype(I,/obj/item/paper)) //Repath from /obj/item/weapon/paper
to_chat(src, "<span class='notice'>You can taste the dry flavor of bureaucracy.</span>")
else if(istype(I,/obj/item/dice)) //Repath from /obj/item/weapon/dice
to_chat(src, "<span class='notice'>You can taste the bitter flavor of cheating.</span>")
else if(istype(I,/obj/item/lipstick)) //Repath from /obj/item/weapon/lipstick
to_chat(src, "<span class='notice'>You can taste the flavor of couture and style. Toddler at the make-up bag style.</span>")
else if(istype(I,/obj/item/soap)) //Repath from /obj/item/weapon/soap
to_chat(src, "<span class='notice'>You can taste the bitter flavor of verbal purification.</span>")
else if(istype(I,/obj/item/stack/spacecash) || istype(I,/obj/item/storage/wallet)) //Repath from /obj/item/weapon/spacecash and /obj/item/weapon/storage/wallet
to_chat(src, "<span class='notice'>You can taste the flavor of wealth and reckless waste.</span>")
else if(istype(I,/obj/item/broken_bottle) || istype(I,/obj/item/shard)) //Repath from /obj/item/weapon/broken_bottle
to_chat(src, "<span class='notice'>You can taste the flavor of pain. This can't possibly be healthy for your guts.</span>")
else if(istype(I,/obj/item/light)) //Repath from /obj/item/weapon/light
var/obj/item/light/L = I
if(L.status == LIGHT_BROKEN)
to_chat(src, "<span class='notice'>You can taste the flavor of pain. This can't possibly be healthy for your guts.</span>")
else
to_chat(src, "<span class='notice'>You can taste the flavor of really bad ideas.</span>")
/*
else if(istype(I,/obj/item/weapon/bikehorn/tinytether)) //Doenst exist
to_chat(src, "<span class='notice'>You feel a rush of power swallowing such a large, err, tiny structure.</span>")
*/
else if(istype(I,/obj/item/mmi/posibrain) || istype(I,/obj/item/aicard)) //Repath from /obj/item/device/mmi/digital/posibrain and //Repath from /obj/item/device/aicard
to_chat(src, "<span class='notice'>You can taste the sweet flavor of digital friendship. Or maybe it is something else.</span>")
else if(istype(I,/obj/item/paicard)) //Repath from /obj/item/device/paicard
to_chat(src, "<span class='notice'>You can taste the sweet flavor of digital friendship.</span>")
var/obj/item/paicard/ourcard = I
if(ourcard.pai && ourcard.pai.client && isbelly(ourcard.loc))
var/obj/belly/B = ourcard.loc
to_chat(ourcard.pai, "<span class= 'notice'><B>[B.desc]</B></span>")
else if(istype(I,/obj/item/reagent_containers/food)) //Repath from /obj/item/weapon/reagent_containers/food
var/obj/item/reagent_containers/food/F = I
if(!F.reagents.total_volume)
to_chat(src, "<span class='notice'>You can taste the flavor of garbage and leftovers. Delicious?</span>")
else
to_chat(src, "<span class='notice'>You can taste the flavor of gluttonous waste of food.</span>")
else if (istype(I,/obj/item/clothing/neck/petcollar))
to_chat(src, "<span class='notice'>You can taste the submissiveness in the wearer of [I]!</span>")
/*
else if(iscapturecrystal(I))
var/obj/item/capture_crystal/C = I
if(C.bound_mob && (C.bound_mob in C.contents))
if(isbelly(C.loc))
//var/obj/belly/B = C.loc //CHOMPedit
//to_chat(C.bound_mob, "<span class= 'notice'>Outside of your crystal, you can see; <B>[B.desc]</B></span>") //CHOMPedit: moved to modular_chomp capture_crystal.dm
to_chat(src, "<span class='notice'>You can taste the the power of command.</span>")
*/
// CHOMPedit begin
/*
else if(istype(I,/obj/item/starcaster_news))
to_chat(src, "<span class='notice'>You can taste the dry flavor of digital garbage, oh wait its just the news.</span>")
*/
else if(istype(I,/obj/item/newspaper))
to_chat(src, "<span class='notice'>You can taste the dry flavor of garbage, oh wait its just the news.</span>")
else if (istype(I,/obj/item/stock_parts/cell))
visible_message("<span class='warning'>[src] sates their electric appetite with a [I]!</span>")
to_chat(src, "<span class='notice'>You can taste the spicy flavor of electrolytes, yum.</span>")
/*
else if (istype(I,/obj/item/walkpod))
visible_message("<span class='warning'>[src] sates their musical appetite with a [I]!</span>")
to_chat(src, "<span class='notice'>You can taste the jazzy flavor of music.</span>")
*/
/*
else if (istype(I,/obj/item/mail/junkmail))
visible_message("<span class='warning'>[src] devours the [I]!</span>")
to_chat(src, "<span class='notice'>You can taste the flavor of the galactic postal service.</span>")
*/
/*
else if (istype(I,/obj/item/weapon/gun/energy/sizegun))
visible_message("<span class='warning'>[src] devours the [I]!</span>")
to_chat(src, "<span class='notice'>You didn't read the warning label, did you?</span>")
*/
/*
else if (istype(I,/obj/item/device/slow_sizegun))
visible_message("<span class='warning'>[src] devours the [I]!</span>")
to_chat(src, "<span class='notice'>You taste the flavor of sunday driver bluespace.</span>")
*/
else if (istype(I,/obj/item/laser_pointer))
visible_message("<span class='warning'>[src] devours the [I]!</span>")
to_chat(src, "<span class='notice'>You taste the flavor of a laser.</span>")
else if (istype(I,/obj/item/canvas))
visible_message("<span class='warning'>[src] devours the [I]!</span>")
to_chat(src, "<span class='notice'>You taste the flavor of priceless artwork.</span>")
//CHOMPedit end
else
to_chat(src, "<span class='notice'>You can taste the flavor of garbage. Delicious.</span>")
visible_message("<span class='warning'>[src] demonstrates their voracious capabilities by swallowing [I] whole!</span>")
return
to_chat(src, "<span class='notice'>This snack is too powerful to go down that easily.</span>") //CHOMPEdit
return
+3 -1
View File
@@ -33,7 +33,9 @@
var/held_icon = "slugcat"
do_footstep = TRUE
//lizard food
vore_flags = DEVOURABLE | DIGESTABLE | FEEDING
devourable = 1
digestable = 1
feeding = 1
var/obj/item/spear/weapon
/mob/living/simple_animal/pet/slugcat/Initialize(mapload)
@@ -1,9 +0,0 @@
/datum/gas/lipoifium
id = GAS_FAT
specific_heat = 20
name = "Lipoifium"
moles_visible = MOLES_GAS_VISIBLE
color = "#e2e1b1"
odor = "that this is a function that wasn't working, but it now, for some reason, is. You should speak to the gods about this and the conditions under which it happened"
odor_strength = 1 // TODO: doesn't work for now
@@ -1,33 +0,0 @@
/datum/gas_reaction/lipoifium_formation
priority = 7
name = "Lipoifium Formation"
id = "lipoifium_formation"
/datum/gas_reaction/lipoifium_formation/init_reqs()
min_requirements = list(
"MAX_TEMP" = 100,
GAS_BZ = 15,
GAS_TRITIUM = 15
)
/datum/gas_reaction/lipoifium_formation/react(datum/gas_mixture/air)
if (air.get_moles(GAS_BZ) < 15 || air.get_moles(GAS_TRITIUM) < 15)
return NO_REACTION
var/temperature = air.return_temperature()
var/reaction_efficiency = 0
if (temperature <= 5)
reaction_efficiency = 1
else if (temperature >= 100)
return NO_REACTION
else
reaction_efficiency = -((temperature - 5) / 95) + 1 // will equal 1 at 5 kelvin, and will linearly fall until 0 at 100k
var/energy_released = reaction_efficiency * FIRE_CARBON_ENERGY_RELEASED
var/old_heat_capacity = air.heat_capacity()
air.adjust_moles(GAS_FAT, reaction_efficiency)
air.adjust_moles(GAS_TRITIUM, -reaction_efficiency / 2)
air.adjust_moles(GAS_BZ, -reaction_efficiency / 2)
var/new_heat_capacity = air.heat_capacity()
air.set_temperature(max((temperature * old_heat_capacity + energy_released) / new_heat_capacity, TCMB))
return REACTING
@@ -1,6 +0,0 @@
/obj/machinery/portable_atmospherics/canister/lipoifium
name = "lipoifium canister"
desc = "Lipoifium. Inhaling causes quick buildup of adipose in one's body."
icon = 'GainStation13/icons/obj/atmos.dmi'
icon_state = "yellowblack"
gas_type = GAS_FAT
@@ -1,17 +0,0 @@
//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
@@ -1,4 +0,0 @@
/datum/gear/uniform/modularjumpsuit
name = "Grey jumpsuit (Modular)"
path = /obj/item/clothing/under/color/grey
cost = 0
@@ -15,8 +15,6 @@
var/weight_gain_viruses = FALSE
///Weight gain from nanites
var/weight_gain_nanites = FALSE
//Weight gain from atmos gasses
var/weight_gain_atmos = FALSE
///Blueberry Inflation
var/blueberry_inflation = FALSE
///Extreme weight gain
@@ -33,8 +31,6 @@
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?
@@ -61,8 +57,6 @@
///Does the person wish to be involved with non-con weight gain events?
var/noncon_weight_gain = FALSE
///Does the person want to get into confrontation?
var/trouble_seeker = FALSE
//Does the person wish to be fed from bots?
var/bot_feeding = FALSE
@@ -0,0 +1 @@
@@ -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/butt))
G = O
if(mutantrace_variation == STYLE_DIGITIGRADE)
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(length(accessory_overlays))
. += accessory_overlays
/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/butt)) //if that organ is the butt
G = O
if(mutantrace_variation == STYLE_DIGITIGRADE) //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(length(accessory_overlays))
. += accessory_overlays
/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"
@@ -1,257 +0,0 @@
//////////////////////////////////////
// MODULAR ITEMS 2.0 //
// BETTER AND BIGGER THAN EVER //
//////////////////////////////////////
//HOW TO CREATE A NEW MODULAR ITEM
// 1) DRAW THE SPRITES (see already made modular sprites)
// 2) FIND THE ITEM YOU WANT TO MAKE MODULAR (example: the grey jumpsuit is /obj/item/clothing/under/color/grey )
// 3) CHANGE IT'S modular_icon_location TO BE THE LOCATION OF THE SPRITES YOU'VE MADE (example: modular_icon_location = 'GainStation13/icons/mob/modclothes/modular_grey.dmi')
// 4) YOU ARE DONE. YOUR ITEM IS NOW MODULAR
//Many functions of the system can be customized by overloading the various procs
//If you know what you are doing then I encoourage you to tweak your item to work better for the idea you had in mind
/mob/living/carbon
var/modular_items = list()
// Called by handle_fatness, this is called periodically to tell all items to check for sprites and, if needed, build new ones
/mob/living/carbon/proc/handle_modular_items(adjustment_amount, type_of_fattening = FATTENING_TYPE_ITEM)
for(var/obj/item/item in modular_items)
item.update_modular_overlays(src)
/obj/item
var/modular_icon_location = null //Locates the sprites, null if it is not a modular item. Changing this makes the item modular
var/mod_overlays = list() //Keeps track of the modular sprite overlays for the item
var/mod_breasts_rec //Records the last used sprite for breasts to avoid building sprites if no change occurred
var/mod_butt_rec //^^^ for butt
var/mod_belly_rec //^^^ for belly
//General condition for activating modular sprites for an item.
//When equipped to that item's appropriate slot, if the item has modular icons then initialize it as a modular item
/obj/item/equipped(mob/user, slot)
if(modular_icon_location != null && slot == slot_flags)
add_modular_item(user)
..()
//General condition for deactivating modular sprites for an item.
//When dropped. And/or moved to another slot, works together with equipped checking the approporiate slot
/obj/item/dropped(mob/user)
remove_modular_item(user)
..()
//Initialize a modular item by resetting any recorded sprite names and force a sprite update
/obj/item/proc/add_modular_item(mob/user)
mod_breasts_rec = null
mod_butt_rec = null
mod_belly_rec = null
update_modular_overlays(user)
//Remove a modular item by deleting it from the user's list of tracked modular items
//and forcing sprite deletion
/obj/item/proc/remove_modular_item(mob/user)
if(!iscarbon(user))
return
delete_modular_overlays(user)
var/mob/living/carbon/U = user
if(src in U.modular_items)
U.modular_items -= src
//The meat of the system, checks the genitals, compares to recorded size and request
//the sprites if new ones are needed
/obj/item/proc/update_modular_overlays(mob/user)
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
var/list/genitals_list
var/build_modular = FALSE
//Before requesting sprites we must make sure new ones are actually needed
//Go through the genitals of the user to detect belly, butt and breasts (individually, not all 3 are needed)
//Add it to a list of found genitals to not go through all organs again
//Get the sprite name of the sprites needed and compare it to the ones recorded
//If they are different, record the sprites and build_modular to TRUE to signal that new sprites are needed
var/obj/item/organ/genital/O
for(O in U.internal_organs)
if(istype(O, /obj/item/organ/genital/belly))
genitals_list += list(O)
var/belly = get_modular_belly(O)
if(belly != mod_belly_rec)
mod_belly_rec = belly
build_modular = TRUE
if(istype(O, /obj/item/organ/genital/butt))
genitals_list += list(O)
var/butt = get_modular_butt(O)
if(butt != mod_butt_rec)
mod_butt_rec = butt
build_modular = TRUE
if(istype(O, /obj/item/organ/genital/breasts))
genitals_list += list(O)
var/breasts = get_modular_breasts(O)
if(breasts != mod_breasts_rec)
mod_breasts_rec = breasts
build_modular = TRUE
if(!build_modular) //Stop early if no new sprites are needed
return
delete_modular_overlays(U) //Delete the old sprites
if(!(src in U.modular_items)) //Make sure the item is inside the user's tracked modular items
U.modular_items += src //used on the first sprite request and to ensure it's being tracked for future updates
//Go through the list of genitals previously found and for each add the modular sprite overlays to the user
var/obj/item/organ/genital/G
for(G in genitals_list)
if(istype(G, /obj/item/organ/genital/belly))
add_modular_overlay(U, mod_belly_rec, MODULAR_BELLY_LAYER, color)
add_modular_overlay(U, "[mod_belly_rec]_SOUTH", BELLY_FRONT_LAYER, color)
if(istype(G, /obj/item/organ/genital/butt))
add_modular_overlay(U, mod_butt_rec, MODULAR_BUTT_LAYER, color)
add_modular_overlay(U, "[mod_butt_rec]_NORTH", BUTT_BEHIND_LAYER, color)
if(istype(G, /obj/item/organ/genital/breasts))
add_modular_overlay(U, mod_breasts_rec, MODULAR_BREASTS_LAYER, color)
add_modular_overlay(U, "[mod_breasts_rec]_NORTH", BREASTS_BEHIND_LAYER, color)
add_modular_overlay(U, "[mod_breasts_rec]_SOUTH", BREASTS_FRONT_LAYER, color)
//Remove the previously built modular sprite overlays and empty the list of tracked overlays
/obj/item/proc/delete_modular_overlays(mob/user)
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
if(!(src in U.modular_items))
return
for(var/mutable_appearance/overlay in mod_overlays)
U.cut_overlay(overlay)
mod_overlays -= mod_overlays
//Function to easily add a requested overlay
//Create the appropriate sprite object (mod_overlay) using the icon previously found, from the item's modular sprites file, on the appropriate overlay and with the item's color
//The sprite is then added to the item's list of built modular sprites overlay
//Added to the appropriate layer of the user
//Then the layer is applied
//
// Why is the layer in mutable appearance entered as its negative version?
// No. Damn. Clue. SS13, I don't question it further.
//
/obj/item/proc/add_modular_overlay(mob/living/carbon/U, modular_icon, modular_layer, sprite_color)
var/mutable_appearance/mod_overlay = mutable_appearance(modular_icon_location, modular_icon, -(modular_layer), color = sprite_color)
mod_overlays += mod_overlay
U.overlays_standing[modular_layer] = mod_overlay
U.apply_overlay(modular_layer)
//General function to generate the right icon_state for belly modular sprites
/obj/item/proc/get_modular_belly(obj/item/organ/genital/G)
return "belly_[get_belly_size(G)][get_belly_alt()]"
//General function to get the appropriate shape and size for the belly, accounting for fullness
/obj/item/proc/get_belly_size(obj/item/organ/genital/G)
var/size = G.size
if(G.size > 9)
size = 9
var/shape
if(G.owner.fullness <= FULLNESS_LEVEL_BLOATED)
switch(G.shape)
if("Soft Belly")
shape = "soft"
if("Round Belly")
shape = "round"
else
shape = "stuffed"
var/stuffed_modifier
switch(G.owner.fullness)
if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG) // Take the stuffed sprite of the same size
stuffed_modifier = 0
if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ) // Take the stuffed sprite of size + 1
stuffed_modifier = 1
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)// Take the stuffed sprite of size + 2
stuffed_modifier = 2
size = size + stuffed_modifier
return "[shape]_[size]"
//Placeholder function for alternate variants of the shape and size sprites for belly
/obj/item/proc/get_belly_alt()
return ""
//General function to get the appropriate shape and size for the butt
/obj/item/proc/get_modular_butt(obj/item/organ/genital/G)
return "butt_[(G.size <= 10 ) ? "[G.size]" : "10"][get_butt_alt()]"
//General function to get the alternate variants for butt sprites, used for digitigrade characters
/obj/item/proc/get_butt_alt()
return "[(mutantrace_variation == STYLE_DIGITIGRADE) ? "_l" : ""]"
//General function to get the appropriate size for the breasts
/obj/item/proc/get_modular_breasts(obj/item/organ/genital/G)
var/size
if(G.size <= "o")
size = G.size
else
switch(G.size)
if("huge")
size = "huge"
if("massive")
size = "massive"
if("giga")
size = "giga"
if("impossible")
size = "impossible"
return "breasts_[size][get_breasts_alt()]"
//Placeholder function for alternate variants of the breasts
/obj/item/proc/get_breasts_alt()
return ""
//The modular grey jumpsuit. The foundation of modular items and our holy grail
/obj/item/clothing/under/color/grey
name = "grey jumpsuit (Modular)" //(Modular) to tell players it is modular
modular_icon_location = 'GainStation13/icons/mob/modclothes/modular_grey.dmi' //Location of the sprites, to make it modular
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
//Overload of the alt belly sprites function, for adjusteable clothing
/obj/item/clothing/under/get_belly_alt()
return "[(adjusted) ? "_d" : ""]"
//The placeholder colored jumpsuits
/obj/item/clothing/under/color/grey/service
name = "service grey jumpsuit (Modular)"
desc = "Grey only in name"
color = "#6AD427"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5)
/obj/item/clothing/under/color/grey/medical
name = "medical grey jumpsuit (Modular)"
desc = "Grey only in name"
color = "#5A96BB"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5)
/obj/item/clothing/under/color/grey/cargo
name = "cargo grey jumpsuit (Modular)"
desc = "Grey only in name"
color = "#BB9042"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 0, WOUND = 10)
/obj/item/clothing/under/color/grey/engi
name = "engineering grey jumpsuit (Modular)"
desc = "Grey only in name"
color = "#FF8800"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20, WOUND = 5)
/obj/item/clothing/under/color/grey/science
name = "science grey jumpsuit (Modular)"
desc = "Grey only in name"
color = "#9900FF"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 5)
/obj/item/clothing/under/color/grey/security
name = "security grey jumpsuit (Modular)"
desc = "Grey only in name"
color = "#F4080C"
armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, WOUND = 10)
/obj/item/clothing/under/color/grey/command
name = "command grey jumpsuit (Modular)"
desc = "Grey only in name"
color = "#004B8F"
armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, WOUND = 15)
@@ -1,27 +0,0 @@
/datum/round_event_control/vent_clog/fattening
name = "Clogged Vents: Fattening"
typepath = /datum/round_event/vent_clog/fattening
max_occurrences = 0
min_players = 5
description = "Spits out lipoifier foam through the scrubber system."
/datum/round_event/vent_clog/fattening
reagentsAmount = 50
/datum/round_event/vent_clog/fattening/announce()
priority_announce("The scrubbers network is experiencing an unexpected surge of lipo-related chemicals. Some ejection of contents may occur.", "Atmospherics alert")
/datum/round_event/vent_clog/fattening/start()
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
if(vent && vent.loc && !vent.welded)
var/datum/reagents/R = new/datum/reagents(1000)
R.my_atom = vent
R.add_reagent(/datum/reagent/consumable/lipoifier, reagentsAmount)
var/datum/effect_system/foam_spread/foam = new
foam.set_up(200, get_turf(vent), R)
foam.start()
CHECK_TICK
@@ -1,71 +0,0 @@
////////////////////////////////////////////////////////////////////////////////
/// GS13 - big bottles
////////////////////////////////////////////////////////////////////////////////
//unfortunately I wasn't able to code in a fancy overlay that changes depending on bottle's contents volume
//however if anyone would like to give it a go, the sprites for it are already there, in the .dmi
/obj/item/reagent_containers/food/drinks/bigbottle
name = "Bottle"
desc = "You shouldn't see this."
icon = 'GainStation13/icons/obj/food/bigbottle.dmi'
icon_state = "bigbottle_default"
list_reagents = list(/datum/reagent/consumable/space_cola = 25)
custom_materials = list(/datum/material/plastic=200)
foodtype = SUGAR
isGlass = FALSE
volume = 100
/obj/item/reagent_containers/food/drinks/bigbottle/starkist
name = "StarKist Bottle"
desc = "A big bottle of Sunkist - for all your chuggin' needs."
icon_state = "bigbottle_fan"
list_reagents = list(/datum/reagent/consumable/sodawater = 20, /datum/reagent/consumable/orangejuice = 60)
/obj/item/reagent_containers/food/drinks/bigbottle/cola
name = "GT-Cola Bottle"
desc = "A big bottle of GT-Cola - for all your chuggin' needs."
icon_state = "bigbottle_cola"
list_reagents = list(/datum/reagent/consumable/space_cola = 80)
/obj/item/reagent_containers/food/drinks/bigbottle/spaceup
name = "Space-Up! Bottle"
desc = "A big bottle of Space-Up! - for all your chuggin' needs."
icon_state = "bigbottle_spr"
list_reagents = list(/datum/reagent/consumable/space_up = 60, /datum/reagent/consumable/sodawater = 20)
/obj/item/reagent_containers/food/drinks/bigbottle/fizz
name = "Fizz-Wizz Bottle"
desc = "A big bottle of Fizz-Wizz - for all your chuggin' needs."
icon_state = "bigbottle_fizz"
list_reagents = list(/datum/reagent/consumable/space_cola = 50, /datum/reagent/consumable/fizulphite = 30)
//code for overlays
/obj/item/reagent_containers/food/drinks/bigbottle/on_reagent_change()
cut_overlays()
var/mutable_appearance/reagent_overlay = mutable_appearance(icon, "reagent")
if(reagents.reagent_list.len)
/*if(!renamedByPlayer)
name = "bottle of " + R.name
desc = R.glass_desc*/
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
if(0)
reagent_overlay.icon_state = "reagent0"
if(1 to 19)
reagent_overlay.icon_state = "reagent20"
if(20 to 39)
reagent_overlay.icon_state = "reagent40"
if(40 to 59)
reagent_overlay.icon_state = "reagent60"
if(60 to 79)
reagent_overlay.icon_state = "reagent80"
if(80 to 100)
reagent_overlay.icon_state = "reagent100"
reagent_overlay.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(reagent_overlay)
else
reagent_overlay.icon_state = "reagent0"
add_overlay(reagent_overlay)
@@ -1,13 +0,0 @@
/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'
..()
@@ -3,7 +3,6 @@
/obj/item/reagent_containers/food/snacks/gbburrito
name = "\improper GATO Gas Giant Burrito"
icon = 'Gainstation13/icons/obj/food/food.dmi'
icon_state = "gbburrito"
desc = "More than three pounds of beans, meat, and cheese wrapped in a greasy tortilla. It's piping hot."
trash = null
+1 -1
View File
@@ -83,7 +83,7 @@
/obj/item/circuitboard/machine/treadmill
name = "Treadmill (Machine Board)"
build_path = /obj/machinery/treadmill
build_path = /obj/machinery/autolathe
req_components = list(/obj/item/stock_parts/manipulator = 1)
/datum/design/treadmill
@@ -1,9 +1,7 @@
/obj/item/seeds/berry
mutatelist = list(/obj/item/seeds/berry/glow, /obj/item/seeds/berry/poison, /obj/item/seeds/berry/blueberry)
/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
@@ -13,18 +11,11 @@
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,6 +1,8 @@
/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
@@ -9,19 +11,17 @@
maturation = 8
production = 5
yield = 1
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'
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/harvest.dmi'
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)
@@ -1,11 +1,6 @@
/mob/living/carbon
var/nutri_mult = 1
/obj/item/seeds/cannabis
mutatelist = list(/obj/item/seeds/cannabis/rainbow,
/obj/item/seeds/cannabis/death,
/obj/item/seeds/cannabis/munchies)
/datum/plant_gene/trait/glow/orange
name = "Orange Bioluminescence"
glow_color = "#ff9166"
@@ -13,26 +8,22 @@
/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,55 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
//I don't know why these need both mam_ears and human variants, because some other ear datums just work fine without that??
//It didn't want to show up otherwise so I'll keep it as that
/datum/sprite_accessory/ears/mam_ears/dragon //ported from Virgo
name = "Dragon"
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
icon_state = "dragon"
/datum/sprite_accessory/ears/human/dragon //ported from Virgo
name = "Dragon"
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
icon_state = "dragon"
/datum/sprite_accessory/ears/mam_ears/avali
name = "Avali"
icon_state = "avali"
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/avali
name = "Avali"
icon_state = "avali"
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/fennec_tall
name = "Fennec (Tall)"
icon = 'GainStation13/icons/mob/32x64_mam_ears.dmi'
icon_state = "fennectall"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/fennec_tall
name = "Fennec (Tall)"
icon = 'GainStation13/icons/mob/32x64_mam_ears.dmi'
icon_state = "fennectall"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/undergoat
name = "Goat"
icon_state = "goat"
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/human/undergoat
name = "Avali"
icon_state = "avali"
icon = 'GainStation13/icons/mob/markings/mam_ears.dmi'
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
@@ -1,22 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
/datum/sprite_accessory/frills/cobra
name = "Cobra Hood"
icon_state = "cobrahood"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
icon = 'hyperstation/icons/mob/snek.dmi'
/datum/sprite_accessory/frills/cobraslim
name = "Narrow Cobra Hood"
icon_state = "cobraslim"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
icon = 'hyperstation/icons/mob/snek.dmi'
/datum/sprite_accessory/frills/cobrahood_alt
name = "Cobra Hood - Alt"
icon_state = "cobrahood_alt"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
icon = 'hyperstation/icons/mob/snek.dmi'
@@ -1 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -1,10 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
#define NEWHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = #_name;/datum/sprite_accessory/hair/##new_state/icon = 'GainStation13/icons/mob/human_face.dmi'
NEWHAIR(Elize, hair_elize)
NEWHAIR(Lem, hair_lem)
NEWHAIR(Straight (Floorlength), hair_straightfloorlength)
#undef NEWHAIR
@@ -1 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -1 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -1,63 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
/datum/sprite_accessory/taur/gator //ported from Vorestation
name = "Gator"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
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"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "fatdrake"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/taur/fatwolf //ported from Vorestation
name = "Fat Wolf"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "fatwolf"
color_src = MUTCOLORS
/datum/sprite_accessory/taur/fatliz //ported from Vorestation
name = "Fat Lizard"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "fatliz"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/taur/longtailfluff //ported from Vorestation
name = "Long Fluffy Tail"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "longtailfluff"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/taur/fatsynthwolf //ported from Vorestation
name = "Fat Synth Wolf"
icon = 'GainStation13/icons/mob/markings/mam_taur.dmi'
icon_state = "fatsynthwolf"
color_src = MUTCOLORS
/datum/sprite_accessory/taur/bigleggies //ported from Vorestation
name = "Big Leggies"
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
@@ -1,70 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
/datum/sprite_accessory/snouts/mam_snouts/hjackal
name = "Jackal"
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
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
matrixed_sections = MATRIX_RED_GREEN
//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
/datum/sprite_accessory/snouts/mam_snouts/hhorse
name = "Horse"
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
icon_state = "hhorse"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/snouts/mam_snouts/deer
name = "Deer"
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
icon_state = "deer"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
@@ -1 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -1,100 +0,0 @@
//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"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/mam_tails_animated/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/human/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/human/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
matrixed_sections = MATRIX_RED_GREEN
//deer tail
/datum/sprite_accessory/tails/human/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/human/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/mam_tails/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
matrixed_sections = MATRIX_RED_GREEN
/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'
matrixed_sections = MATRIX_RED_GREEN
@@ -1 +0,0 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
+3 -27
View File
@@ -7,10 +7,8 @@
slot = ORGAN_SLOT_BELLY
w_class = 3
size = 0
var/max_size = 0
shape = DEF_BELLY_SHAPE
var/statuscheck = FALSE
genital_flags = UPDATE_OWNER_APPEARANCE
shape = "belly"
masturbation_verb = "massage"
var/sent_full_message = TRUE //defaults to 1 since they're full to start
var/inflatable = FALSE //For inflation connoisseurs
@@ -19,7 +17,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, starting_size, max)
var/new_value = clamp(size_cached + modifier, min, max)
if(new_value == size_cached)
return
prev_size = size_cached
@@ -29,26 +27,7 @@
..()
/obj/item/organ/genital/belly/update_appearance()
//GS13 - Port Stuffed states
// Default settings
var/datum/sprite_accessory/S = GLOB.belly_shapes_list[shape] //GS13 - get belly shape
var/icon_shape_state = S ? S.icon_state : "belly" //fallback to default belly in case we cant find a shape
icon_state = "belly_[icon_shape_state]_[size]"
var/icon_shape = S ? S.icon : "hyperstation/icons/obj/genitals/belly.dmi" //fallback to default belly in case we cant find a shape
icon = icon_shape
// Change belly sprite and size based on current fullness
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_round_[size+1]"
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)
icon = 'hyperstation/icons/obj/genitals/belly_round.dmi'
icon_state = "belly_round_[size+2]"
icon_state = "belly_[shape]_[size]"
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
@@ -66,9 +45,6 @@
else
color = "#[D.features["belly_color"]]"
size = D.features["belly_size"]
max_size = D.features["max_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)
@@ -2,7 +2,7 @@
if(!ishuman(src))
return
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reduction_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reducion_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
fullness -= amount // Remove Fullness
@@ -7,23 +7,11 @@
var/obj/item/organ/genital/breasts/breasts = H.getorganslot(ORGAN_SLOT_BREASTS)
if(butt)
if(butt.max_size > 0)
if((butt.size + size_change) <= butt.max_size)
butt.modify_size(size_change)
else
butt.modify_size(size_change)
butt.modify_size(size_change)
if(belly)
if(belly.max_size > 0)
if((belly.size + size_change) <= belly.max_size)
belly.modify_size(size_change)
else
belly.modify_size(size_change)
belly.modify_size(size_change)
if(breasts)
if(breasts.max_size > 0)
if((breasts.cached_size + size_change) <= breasts.max_size)
breasts.modify_size(size_change)
else
breasts.modify_size(size_change)
breasts.modify_size(size_change)
H.genital_override = TRUE
H.update_body()
@@ -50,7 +38,7 @@
/datum/species/proc/handle_helplessness(mob/living/carbon/human/fatty)
var/datum/preferences/preferences = fatty?.client?.prefs
if(!istype(preferences) || HAS_TRAIT(fatty, TRAIT_NO_HELPLESSNESS))
if(!istype(preferences))
return FALSE
if(preferences.helplessness_no_movement)
@@ -154,7 +142,7 @@
ADD_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
var/obj/item/clothing/under/jumpsuit = fatty.w_uniform
if(istype(jumpsuit) && jumpsuit.modular_icon_location == null)
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)
@@ -173,17 +161,17 @@
ADD_TRAIT(fatty, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
var/obj/item/clothing/suit/worn_suit = fatty.wear_suit
if(istype(worn_suit) && !istype(worn_suit, /obj/item/clothing/suit/mod))
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)&& !istype(worn_gloves, /obj/item/clothing/gloves/mod))
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) && !istype(worn_shoes, /obj/item/clothing/shoes/mod))
if(istype(worn_shoes))
to_chat(fatty, "<span class='warning'>[worn_shoes] can no longer contain your weight!</span>")
fatty.dropItemToGround(worn_shoes)
@@ -201,7 +189,7 @@
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) && !istype(back_item, /obj/item/mod))
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)
@@ -232,48 +220,8 @@
id = "fat"
variable = TRUE
/mob/living/carbon
var/list/fatness_delay_modifiers
/datum/fatness_delay_modifier
var/name
var/amount = 0
var/multiplier = 1
/mob/living/carbon/proc/add_fat_delay_modifier(name = "", amount = 0, multiplier = 1)
var/find_name = FALSE
for(var/datum/fatness_delay_modifier/modifier in fatness_delay_modifiers)
if(modifier.name == name && find_name == FALSE)
modifier.amount = amount
modifier.multiplier = multiplier
find_name = TRUE
if(find_name == FALSE)
var/datum/fatness_delay_modifier/new_modifier = new()
new_modifier.name = name
new_modifier.amount = amount
new_modifier.multiplier = multiplier
LAZYADD(fatness_delay_modifiers, new_modifier)
/mob/living/carbon/proc/remove_fat_delay_modifier(name)
for(var/datum/fatness_delay_modifier/modifier in fatness_delay_modifiers)
if(modifier.name == name)
LAZYREMOVE(fatness_delay_modifiers, modifier)
/datum/species/proc/apply_fatness_speed_modifiers(mob/living/carbon/human/H, fatness_delay)
var/delay_cap = FATNESS_MAX_MOVE_PENALTY
if(HAS_TRAIT(H, TRAIT_WEAKLEGS))
delay_cap = 60
for(var/datum/fatness_delay_modifier/modifier in H.fatness_delay_modifiers)
fatness_delay = fatness_delay + modifier.amount
for(var/datum/fatness_delay_modifier/modifier in H.fatness_delay_modifiers)
fatness_delay *= modifier.multiplier
fatness_delay = max(fatness_delay, 0)
fatness_delay = min(fatness_delay, delay_cap)
return fatness_delay
/datum/species/proc/handle_fatness(mob/living/carbon/human/H)
handle_helplessness(H)
H.handle_modular_items()
// update movement speed
var/fatness_delay = 0
@@ -291,11 +239,7 @@
fatness_delay += (H.fatness / FATNESS_LEVEL_IMMOBILE) * FATNESS_WEAKLEGS_MODIFIER
fatness_delay = min(fatness_delay, 60)
if(fatness_delay)
fatness_delay = apply_fatness_speed_modifiers(H, fatness_delay)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
else
H.remove_movespeed_modifier(/datum/movespeed_modifier/fatness)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
if(HAS_TRAIT(H, TRAIT_BLOB))
handle_fatness_trait(
@@ -1,37 +0,0 @@
//GS13 - BURP SLURRING, USED IN SOME CHEMS OR EFFECTS
/proc/burpslur(phrase, strength = 50)
strength = min(50, strength)
phrase = html_decode(phrase)
var/leng = length(phrase)
. = ""
var/newletter = ""
var/rawchar = ""
for(var/i = 1, i <= leng, i += length(rawchar))
rawchar = newletter = phrase[i]
if(rand(1,100)<=strength * 0.5)
var/lowerletter = lowertext(newletter)
if(lowerletter == "o")
newletter = "+BURRP+"
else if(lowerletter == "s")
newletter = "+URP+"
else if(lowerletter == "a")
newletter = "+GWUURRP+"
else if(lowerletter == "u")
newletter = "+BUUUURRP+"
else if(lowerletter == "c")
newletter = "+BURP+"
if(rand(1,100) <= strength * 0.25)
if(newletter == " ")
newletter = "...+GWWUUARRP+..."
else if(newletter == ".")
newletter = "+BWUUARRP+."
switch(rand(1,100) <= strength * 0.5)
if(1)
newletter += "+BURRP+"
if(10)
newletter += "[newletter]"
if(20)
newletter += "[newletter][newletter]"
. += "[newletter]"
return sanitize(.)
@@ -1,235 +0,0 @@
/obj/item/mod/module/hydraulic_movement
icon = 'GainStation13/icons/obj/clothing/modsuit/mod_modules.dmi'
icon_state = "hydraulic_mod"
name = "MOD hydraulic movement assistance module"
desc = "A module created by GATO, installed across the suit, featuring a system of hydraulic pistons \
that support and lighten vast amounts of excess weight to provide easier movement."
complexity = 1
incompatible_modules = list(/obj/item/mod/module/hydraulic_movement)
idle_power_cost = 5
var/amount = -2
var/modifier_name = "hydraulic_mod"
/obj/item/mod/module/hydraulic_movement/locked
name = "MOD hydraulic movement assistance module (locked)"
removable = FALSE
/obj/item/mod/module/hydraulic_movement/on_suit_activation()
var/mob/living/carbon/human/wearer = mod.wearer
wearer.add_fat_delay_modifier(modifier_name, amount)
if(!HAS_TRAIT_FROM(wearer, TRAIT_NO_HELPLESSNESS, src))
ADD_TRAIT(wearer, TRAIT_NO_HELPLESSNESS, src)
if(HAS_TRAIT_FROM(wearer, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(wearer, TRAIT_NO_MOVE, HELPLESSNESS_TRAIT)
// if(HAS_TRAIT_FROM(wearer, TRAIT_CLUMSY, HELPLESSNESS_TRAIT))
// REMOVE_TRAIT(wearer, TRAIT_CLUMSY, HELPLESSNESS_TRAIT)
// if(HAS_TRAIT_FROM(wearer, TRAIT_NEARSIGHT, HELPLESSNESS_TRAIT))
// wearer.cure_nearsighted(HELPLESSNESS_TRAIT)
// if(HAS_TRAIT_FROM(wearer, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT))
// REMOVE_TRAIT(wearer, TRAIT_DISFIGURED, HELPLESSNESS_TRAIT)
if(HAS_TRAIT_FROM(wearer, TRAIT_MUTE, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(wearer, TRAIT_MUTE, HELPLESSNESS_TRAIT)
if(HAS_TRAIT_FROM(wearer, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(wearer, TRAIT_PARALYSIS_L_ARM, HELPLESSNESS_TRAIT)
REMOVE_TRAIT(wearer, TRAIT_PARALYSIS_R_ARM, HELPLESSNESS_TRAIT)
wearer.update_disabled_bodyparts()
// if(HAS_TRAIT_FROM(wearer, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT))
// REMOVE_TRAIT(wearer, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
if(HAS_TRAIT_FROM(wearer, TRAIT_NO_MISC, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(wearer, TRAIT_NO_MISC, HELPLESSNESS_TRAIT)
if(HAS_TRAIT_FROM(wearer, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT))
REMOVE_TRAIT(wearer, TRAIT_NO_BACKPACK, HELPLESSNESS_TRAIT)
// if(HAS_TRAIT_FROM(wearer, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT))
// REMOVE_TRAIT(wearer, TRAIT_NO_BUCKLE, HELPLESSNESS_TRAIT)
/obj/item/mod/module/hydraulic_movement/on_suit_deactivation(deleting = FALSE)
if(deleting)
return
if(HAS_TRAIT_FROM(mod.wearer, TRAIT_NO_HELPLESSNESS, src))
REMOVE_TRAIT(mod.wearer, TRAIT_NO_HELPLESSNESS, src)
mod.wearer.remove_fat_delay_modifier(modifier_name)
/datum/design/module/hydraulic_movement
name = "Hydraulic Assistance Module"
id = "mod_hydraulic"
materials = list(/datum/material/iron = 1000, /datum/material/glass = 200)
build_path = /obj/item/mod/module/hydraulic_movement
desc = "A GATO-designed module that supports plumper bodies and allows easier movement."
/obj/item/mod/module/calovoltaic
icon = 'GainStation13/icons/obj/clothing/modsuit/mod_modules.dmi'
icon_state = "calovoltaic_mod"
name = "MOD calovoltaic generator module"
desc = "A module created by GATO, capable of burning adipose tissue \
to generate power for the suit it is installed onto."
module_type = MODULE_TOGGLE
complexity = 1
incompatible_modules = list(/obj/item/mod/module/calovoltaic)
var/rate = 5
/obj/item/mod/module/calovoltaic/locked
name = "MOD calovoltaic generator module (locked)"
removable = FALSE
/obj/item/mod/module/storage/locked
name = "MOD storage containment module (locked)"
removable = FALSE
/obj/item/mod/module/calovoltaic/on_select()
. = ..()
if(active)
balloon_alert(mod.wearer, "activated!")
else
balloon_alert(mod.wearer, "deactivated!")
/obj/item/mod/module/calovoltaic/on_active_process(delta_time)
if(istype(mod.wearer, /mob/living/carbon))
var/mob/living/carbon/C = mod.wearer
var/adjusted_rate = rate * C.weight_loss_rate
if(C.fatness_real > 0 && (C.fatness_real - adjusted_rate) >= adjusted_rate)
C.adjust_fatness(-rate, FATTENING_TYPE_WEIGHT_LOSS)
mod.cell.give(rate)
/datum/design/module/calovoltaic
name = "Calovoltaic Generator Module"
id = "mod_calovoltaic"
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 500)
build_path = /obj/item/mod/module/calovoltaic
desc = "A GATO-designed module for burning excess fat to make power for your suit."
/obj/item/mod/construction/armor/exoskeleton
theme = /datum/mod_theme/exoskeleton
/obj/item/mod/control/Initialize(mapload, new_theme, new_skin)
. = ..()
gs13_icon_update()
/obj/item/mod/control/proc/gs13_icon_update()
if(theme.use_gs_icon == TRUE)
icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
icon_state = "[theme]-control"
item_state = "[theme]-control"
helmet.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
helmet.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
helmet.icon_state = "[theme]-helmet"
helmet.item_state = "[theme]-helmet"
chestplate.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
chestplate.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
chestplate.icon_state = "[theme]-chestplate"
chestplate.item_state = "[theme]-chestplate"
gauntlets.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
gauntlets.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
gauntlets.icon_state = "[theme]-gauntlets"
gauntlets.item_state = "[theme]-gauntlets"
boots.icon = 'GainStation13/icons/obj/clothing/modsuit/mod_clothing.dmi'
boots.mob_overlay_icon = 'GainStation13/icons/mob/clothing/modsuit/mod_clothing.dmi'
boots.icon_state = "[theme]-boots"
boots.item_state = "[theme]-boots"
/datum/mod_theme
var/use_gs_icon = FALSE
/datum/mod_theme/exoskeleton
use_gs_icon = TRUE
name = "exoskeleton"
desc = "The design for a GATO-branded mobility exoskeleton"
extended_desc = "To combat the obesity epidemic that spreads on its stations, \
GATO scientists have worked hard to create this simple yet efficient way to support \
people whose weight proves restrictive and help them on their journey to lose it."
default_skin = "exoskeleton"
complexity_max = 5
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 5, BIO = 5, FIRE = 5, ACID = 5, WOUND = 5, RAD = 5)
resistance_flags = FIRE_PROOF
max_heat_protection_temperature = 1
min_cold_protection_temperature = -1
permeability_coefficient = 1
siemens_coefficient = 1
slowdown_inactive = 0
slowdown_active = 0
inbuilt_modules = list(/obj/item/mod/module/hydraulic_movement, /obj/item/mod/module/calovoltaic, /obj/item/mod/module/storage)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
skins = list(
"exoskeleton" = list(
HELMET_LAYER = NECK_LAYER,
HELMET_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
UNSEALED_INVISIBILITY = NONE,
SEALED_INVISIBILITY = NONE,
SEALED_COVER = NONE,
),
CHESTPLATE_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
SEALED_INVISIBILITY = NONE,
),
GAUNTLETS_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
),
BOOTS_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
),
),
"invisible" = list(
HELMET_LAYER = NECK_LAYER,
HELMET_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
UNSEALED_INVISIBILITY = NONE,
SEALED_INVISIBILITY = NONE,
SEALED_COVER = NONE,
),
CHESTPLATE_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
SEALED_INVISIBILITY = NONE,
),
GAUNTLETS_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
),
BOOTS_FLAGS = list(
UNSEALED_CLOTHING = NONE,
SEALED_CLOTHING = NONE,
),
)
)
/datum/mod_theme/exoskeleton/locked
inbuilt_modules = list(/obj/item/mod/module/hydraulic_movement/locked, /obj/item/mod/module/calovoltaic/locked, /obj/item/mod/module/storage/locked)
/obj/item/mod/control/pre_equipped/exoskeleton
desc = "A pre-built GATO mobility exoskeleton, designed to support high weights, favor movement and weight loss."
theme = /datum/mod_theme/exoskeleton
cell = /obj/item/stock_parts/cell/upgraded/plus
/obj/item/mod/control/pre_equipped/exoskeleton/locked
name = "MOD control unit (locked)"
desc = "A pre-built GATO mobility exoskeleton, designed to support high weights, favor movement and weight loss. This model's modules cannot be removed."
theme = /datum/mod_theme/exoskeleton/locked
/datum/design/module/exoskeleton
name = "MOD exoskeleton"
id = "mod_exoskeleton"
materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/plasma = 5000)
build_path = /obj/item/mod/control/pre_equipped/exoskeleton
desc = "A GATO-designed assistance exoskeleton based on MODsuit tech."
build_type = MECHFAB
construction_time = 10 SECONDS
category = list("MODsuit Chassis", "MODsuit Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/gear/hands/exoskeleton
name = "MOD exoskeleton"
category = LOADOUT_CATEGORY_HANDS
path = /obj/item/mod/control/pre_equipped/exoskeleton/locked
cost = 3
@@ -13,7 +13,6 @@
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/glyphid_slammer
name = "Glyphid slammer"
@@ -27,4 +26,3 @@
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
use_gs_icon = TRUE
@@ -11,7 +11,6 @@
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
@@ -31,7 +30,6 @@
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
@@ -51,7 +49,6 @@
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
@@ -70,7 +67,6 @@
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)
@@ -96,7 +92,6 @@
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)
@@ -123,7 +118,6 @@
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
@@ -143,7 +137,6 @@
glass_name = "vanilla milkshake"
glass_desc = "Guess they fixed the milkshake machine after all, huh?"
shot_glass_icon_state = "shotglasscream"
use_gs_icon = TRUE
/datum/reagent/consumable/milkshake_chocolate
name = "Chocolate Milkshake"
@@ -156,4 +149,3 @@
glass_name = "chocolate milkshake"
glass_desc = "Nothing better than cream AND cocoa!"
shot_glass_icon_state = "shotglassbrown"
use_gs_icon = TRUE
@@ -1,17 +0,0 @@
// 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
@@ -1,20 +0,0 @@
///////////////////////////////// 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.)
@@ -5,43 +5,3 @@
materials = list(/datum/material/iron = 1000, /datum/material/glass = 500)
build_path = /obj/item/assembly/infra/fat
category = list("initial", "Misc")
/datum/design/small_cup
name = "Small Gulp Cup"
id = "Small_Gulp"
build_type = AUTOLATHE
materials = list(/datum/material/plastic=200)
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/small
category = list("initial","Dinnerware")
/datum/design/medium_cup
name = "Medium Gulp Cup"
id = "Medium_Gulp"
build_type = AUTOLATHE
materials = list(/datum/material/plastic=300)
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/medium
category = list("initial","Dinnerware")
/datum/design/small_cup
name = "Big Gulp Cup"
id = "Big_Gulp"
build_type = AUTOLATHE
materials = list(/datum/material/plastic=500)
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/big
category = list("initial","Dinnerware")
/datum/design/extra_big_cup
name = "Extra Big Gulp Cup"
id = "Extra_Big_Gulp"
build_type = AUTOLATHE
materials = list(/datum/material/plastic=600)
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/extra_big
category = list("initial","Dinnerware")
/datum/design/super_extra_big_cup
name = "Super Extra Big Gulp Cup"
id = "Super_Extra_Big_Gulp"
build_type = AUTOLATHE
materials = list(/datum/material/plastic=1000)
build_path = /obj/item/reagent_containers/food/drinks/flask/paper_cup/super_extra_big
category = list("initial","Dinnerware")
@@ -1,26 +0,0 @@
/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,15 +129,6 @@
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
@@ -1,113 +0,0 @@
//Lists to keep track of:
// - Mobs with a sprite size over 100%
// - Mobs with the toggle activated
// Done to reduce the amount of mobs that need to be taken into account when the toggle is switched and for updating the seen sprite
GLOBAL_LIST_EMPTY(enabled_smallsprite)
GLOBAL_LIST_EMPTY(see_toggle_smallsprite)
/mob/
///var to know if one has the toggle activated or not
var/see_resized_others = FALSE
/datum/atom_hud/alternate_appearance/basic/showSmall
//Verb for the associated toggle.
//When switched on, add the current mob to the list of mobs that need to see smallsprites and apply the ones already present immediately to the mob's hud.
//When switched off, remove from the list and remove smallsprites for the user's hud.
/client/verb/toggle_others_giant()
set name = "Toggle Others' Giant Sprite"
set category = "Preferences.GS13"
set desc = "Change display settings to and from displaying others' giant sprites."
var/list/remove_from_list = new()
mob.see_resized_others = !mob.see_resized_others
if(mob.see_resized_others)
GLOB.see_toggle_smallsprite += mob
for(var/mob/living/resize_mob in GLOB.enabled_smallsprite)
if(QDELETED(resize_mob))
remove_from_list += resize_mob
continue
if(resize_mob && resize_mob != mob && resize_mob.alternate_appearances && resize_mob.alternate_appearances["gscode_smallsprite"])
var/datum/atom_hud/alternate_appearance/appearance = resize_mob.alternate_appearances["gscode_smallsprite"]
appearance.add_to_single_hud(mob, resize_mob)
GLOB.enabled_smallsprite -= remove_from_list
to_chat(src, "Resize others view toggled ON.")
return
GLOB.see_toggle_smallsprite -= mob
for(var/mob/living/resize_mob in GLOB.enabled_smallsprite)
if(QDELETED(resize_mob))
remove_from_list += resize_mob
continue
if(resize_mob && resize_mob.alternate_appearances && resize_mob.alternate_appearances["gscode_smallsprite"])
var/datum/atom_hud/alternate_appearance/appearance = resize_mob.alternate_appearances["gscode_smallsprite"]
appearance.remove_from_single_hud(mob, resize_mob)
GLOB.enabled_smallsprite -= remove_from_list
to_chat(src, "Resize others view toggled OFF.")
///Generate the image based on the mob's current icon and apply matrix transformations to adjust its position and angle
/mob/living/proc/create_smallsprite()
var/image/smallsprite = image(icon=icon, icon_state=icon_state, loc=src, layer=layer, pixel_x=pixel_x, pixel_y=pixel_y)
smallsprite.overlays += overlays
smallsprite.override = TRUE
var/matrix/ntransform = matrix(lying, MATRIX_ROTATE)
if(lying != 0)
ntransform.Translate(0, -get_standard_pixel_y_offset(lying))
smallsprite.transform = ntransform
return smallsprite
/**
* Call to regenerate the sprites and update huds.
* * If present, remove the old sprite from the huds and from the mob
* * If the size_multiplier is still higher than 1, check if the mob is in the list of smallsprite mobs and add it if not
* * add a new sprite by generating it, then go through the list of mobs with smallsprites toggled on and it to their hud
* * If the size_multiplier was not higher than one then remove the mob from the list of smallsprite mobs
*/
/mob/living/proc/regenerate_smallsprite()
var/list/remove_from_list = new()
if(length(alternate_appearances) && alternate_appearances["gscode_smallsprite"])
for(var/mob/viewer_mob in GLOB.see_toggle_smallsprite)
if(QDELETED(viewer_mob))
remove_from_list += viewer_mob
continue
var/datum/atom_hud/alternate_appearance/appearance = alternate_appearances["gscode_smallsprite"]
appearance.remove_from_single_hud(viewer_mob, src)
remove_alt_appearance("gscode_smallsprite")
if(size_multiplier > 1)
if(!GLOB.enabled_smallsprite[src])
GLOB.enabled_smallsprite += src
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/showSmall, "gscode_smallsprite", create_smallsprite(), FALSE)
for(var/mob/viewer_mob in GLOB.see_toggle_smallsprite)
if(QDELETED(viewer_mob))
remove_from_list += viewer_mob
continue
if(viewer_mob != src)
var/datum/atom_hud/alternate_appearance/appearance = alternate_appearances["gscode_smallsprite"]
appearance.add_to_single_hud(viewer_mob, src)
return TRUE
else
if(GLOB.enabled_smallsprite[src])
GLOB.enabled_smallsprite -= src
GLOB.see_toggle_smallsprite -= remove_from_list
return FALSE
//Called periodically to regenerate the mob's smallsprite
/mob/living/carbon/human/BiologicalLife(delta_time, times_fired)
. = ..()
regenerate_smallsprite()
@@ -5,10 +5,8 @@
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 //Dunno if this is still needed. Will test.
hunger_threshold = NUTRITION_LEVEL_FULL
poison_amount = 10
message = "" //Why wasn't this ported over? Spam is a pain in the butt. Just shaddup already!
/obj/item/organ/cyberimp/chest/mobility
name = "Mobility Nanite Core"
@@ -1,8 +0,0 @@
/obj/item/organ/tongue/kitty
name = "barbed tongue"
desc = "A thin and prickled on top tongue, common among cats"
icon_state = "tonguenormal"
say_mod = "mrowls"
taste_sensitivity = 15 //Tastes like normal
maxHealth = 60 //And so has health like normal
initial_accents = list(/datum/accent/kitty)
@@ -6,15 +6,12 @@
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,
/obj/item/reagent_containers/food/drinks/bigbottle/starkist = 6,
/obj/item/reagent_containers/food/drinks/bigbottle/cola = 6,
/obj/item/reagent_containers/food/drinks/bigbottle/spaceup = 6,
/obj/item/reagent_containers/food/drinks/bigbottle/fizz = 3,
)
contraband = list(
/obj/item/organ/ears/cat = 2,
+23 -13
View File
@@ -5,27 +5,37 @@
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."
free = TRUE
products = list(
/obj/item/reagent_containers/food/snacks/fries = 4,
/obj/item/reagent_containers/food/snacks/donut = 10,
/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/pizza/margherita = 4,
/obj/item/reagent_containers/food/snacks/butterdog = 5,
/obj/item/reagent_containers/food/snacks/burger/plain = 5,
/obj/item/reagent_containers/food/snacks/pie/plump_pie = 4,
/obj/item/reagent_containers/food/snacks/store/cake/cheese = 2,
/obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice = 2,
/obj/item/reagent_containers/food/snacks/store/cake/pound_cake = 2,
/obj/item/reagent_containers/food/snacks/cakeslice/bsvc = 3,
/obj/item/reagent_containers/food/snacks/cakeslice/bscc = 3,
/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/snacks/dough = 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,
@@ -1,53 +0,0 @@
/obj/belly/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE)
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
predator.hider_remove(src)
. = ..()
/obj/belly/release_specific_contents(var/atom/movable/M, var/silent = FALSE)
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
var/found = FALSE
for(var/prey in contents)
if(istype(prey, /mob/living/carbon))
found = TRUE
if(found)
predator.hider_add(src)
else
predator.hider_remove(src)
. = ..()
/obj/belly/process_belly(var/times_fired,var/wait)
////////////////////////// Vore Fatness /////////////////////////////
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
var/found = FALSE
for(var/prey in contents)
if(istype(prey, /mob/living/carbon))
found = TRUE
if(found)
predator.hider_add(src)
else
predator.hider_remove(src)
///////////////////////////// DM_FATTEN /////////////////////////////
if(digest_mode == DM_FATTEN)
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
for(var/mob/living/M in contents)
var/mob/living/carbon/prey = M
if(iscarbon(prey) && predator.fatness_real)
if(predator.fatness_real > 50)
prey.adjust_fatness(predator.fatness_real * 0.02, FATTENING_TYPE_FOOD)
predator.adjust_fatness(-predator.fatness_real * 0.02, FATTENING_TYPE_FOOD)
if(predator.nutrition > NUTRITION_LEVEL_HUNGRY)
predator.nutrition -= 3
. = ..()
/obj/belly/proc/fat_hide(var/mob/living/carbon/user)
var/preys_fatness = 0
for(var/prey in contents)
if(iscarbon(prey))
var/mob/living/carbon/cprey = prey
preys_fatness += cprey.fatness
return preys_fatness
@@ -1,63 +0,0 @@
/obj/item/gun/ballistic/liberator
name = "liberator pistol"
desc = "Hey, it's better than no gun, right?"
icon = 'GainStation13/icons/obj/weapons/gun.dmi' // Sprites were made by Static and Lew
icon_state = "liberator"
w_class = WEIGHT_CLASS_SMALL // It's not really much of a gun...
mag_type = /obj/item/ammo_box/magazine/m10mm/ramrod
can_suppress = FALSE
/// How many bullets are currently stashed in the gun
var/list/stashed_bullets = list()
/// What is the max amount of bullets we can stash in this baby?
var/max_bullets = 5
/obj/item/gun/ballistic/liberator/examine(mob/user)
. = ..()
. += span_notice("Inside of the weapon there is a storage container, containing [length(stashed_bullets)] 10mm bullets.")
. += span_notice("Bullets can be removed from the internal storage using <b>Alt+Click</b>.")
/obj/item/gun/ballistic/liberator/attackby(obj/item/A, mob/user, params)
if(!istype(A, /obj/item/ammo_casing/c10mm))
return ..()
if(length(stashed_bullets) >= max_bullets)
to_chat(user, span_notice("The storage container in the gun is already full."))
return
if(!A.forceMove(src))
return
stashed_bullets += A
to_chat(user, span_notice("You slip the [A] inside of the storage chamber."))
return
/obj/item/gun/ballistic/liberator/AltClick(mob/user)
if(!length(stashed_bullets))
to_chat(user, span_notice("The storage container in the gun is already empty."))
return
var/obj/item/removed_bullet = stashed_bullets[1]
if(!user.put_in_hands(removed_bullet))
return
stashed_bullets.Remove(removed_bullet)
to_chat(user, span_notice("You remove the [removed_bullet] from [src]"))
/obj/item/gun/ballistic/liberator/can_shoot()
if(!chambered)
return FALSE
return TRUE
/obj/item/ammo_box/magazine/m10mm/ramrod // baaaaaaa
name = "ram rod"
desc = "Allows for bullets to be pushed into guns."
icon = 'GainStation13/icons/obj/weapons/gun.dmi'
icon_state = "ram_rod"
max_ammo = 1
multiple_sprites = 1
@@ -1,28 +0,0 @@
/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"
-21
View File
@@ -1,21 +0,0 @@
/////GS13 - reflavoring of random items into GATO corp, mostly seperated variants so we don't overwrite NT
/obj/item/storage/fancy/cigarettes/gatito
name = "\improper HumoGatitos packet"
desc = "Strangely tasty for a cigarette."
icon = 'GainStation13/icons/obj/cigarettes.dmi'
icon_state = "smokegatitos"
spawn_type = /obj/item/clothing/mask/cigarette/gatito
/obj/item/clothing/mask/cigarette/gatito
desc = "A HumoGatitos brand cigarette."
/obj/item/banner/gato
name = "GATO banner"
desc = "The banner of GATO, our corporate overlords."
icon = 'GainStation13/icons/obj/items_and_weapons.dmi'
icon_state = "banner_gato"
job_loyalties = list("Command")
warcry = "FOR THE INTEREST OF GATO!!"
lefthand_file = 'GainStation13/icons/mob/inhands/equipment/banners_lefthand.dmi'
righthand_file = 'GainStation13/icons/mob/inhands/equipment/banners_righthand.dmi'
-104
View File
@@ -38,21 +38,6 @@
/obj/item/reagent_containers/glass/beaker/flatulose
list_reagents = list(/datum/reagent/consumable/flatulose = 50)
/obj/item/reagent_containers/glass/beaker/galbanic
list_reagents = list(/datum/reagent/fermi_fat = 50)
/obj/item/reagent_containers/glass/beaker/macarenic
list_reagents = list(/datum/reagent/fermi_slim = 50)
//evil fucking donut
/obj/item/reagent_containers/food/snacks/donut/evil_superfat
name = "Evil Fuckin' Donut"
desc = "Merely looking at this thing makes you feel like you're getting fat..."
bitesize = 100 // Always eat it in one bite
list_reagents = list(/datum/reagent/fermi_fat = 120, /datum/reagent/consumable/lipoifier = 70, /datum/reagent/consumable/cornoil = 70)
tastes = list("imminent immobility" = 10)
//blueberry gum snack
/obj/item/reagent_containers/food/snacks/blueberry_gum
@@ -186,92 +171,3 @@
icon = 'icons/obj/module.dmi'
icon_state = "datadisk0"
desc = "A dusty disk, desconstruction will be needed to recover data."
//GS 13 Port - Big gulps in all sizes
/obj/item/reagent_containers/food/drinks/flask/paper_cup
name = "paper cup"
icon = 'GainStation13/icons/obj/paper_cups.dmi'
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
volume = 50
reagent_flags = OPENCONTAINER
spillable = TRUE
container_HP = 5
pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg'
drop_sound = 'sound/items/handling/cardboardbox_drop.ogg'
/obj/item/reagent_containers/food/drinks/flask/paper_cup/small
name = "Small Gulp Cup"
desc = "A paper cup. It can hold up to 50 units. It's not very strong."
icon_state = "small"
custom_materials = list(/datum/material/plastic=200)
w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/drinks/flask/paper_cup/medium
name = "Medium Gulp Cup"
desc = "It's a paper cup, but you wouldn't call it 'medium' though. It can hold up to 75 units. It's not very strong."
icon_state = "medium"
volume = 75
custom_materials = list(/datum/material/plastic=300)
w_class = WEIGHT_CLASS_SMALL
/obj/item/reagent_containers/food/drinks/flask/paper_cup/big
name = "Big Gulp Cup"
desc = "A huge paper cup, a normal person would struggle to drink it all in one sitting. It can hold up to 120 units. It's not very strong."
icon_state = "big"
volume = 120
custom_materials = list(/datum/material/plastic=500)
w_class = WEIGHT_CLASS_NORMAL
/obj/item/reagent_containers/food/drinks/flask/paper_cup/extra_big
name = "Extra Big Gulp Cup"
desc = "A comically large paper cup. It can hold up to 160 units. It's not very strong."
icon_state = "extra_big"
volume = 160
custom_materials = list(/datum/material/plastic=600)
w_class = WEIGHT_CLASS_BULKY
/obj/item/reagent_containers/food/drinks/flask/paper_cup/super_extra_big
name = "Super Extra Big Gulp Cup"
desc = "Its called a paper 'cup', but it looks more like an oversized bucket to you. It can hold up to 250 units. It's not very strong."
icon_state = "super_extra_big"
volume = 250
custom_materials = list(/datum/material/plastic=1000)
w_class = WEIGHT_CLASS_HUGE
//weapon prefabs
/obj/item/melee/curator_whip/fattening
name = "calorite-lined whip"
desc = "The whip seems to glisten with an orange gleam inbetween its threads."
damtype = "fat"
attack_verb = list("fattened")
force = 40
/obj/item/melee/curator_whip/permafattening
name = "galbanic whip"
desc = "How can a whip even be infused galbanic? No one knows."
damtype = "perma_fat"
attack_verb = list("fattened")
force = 20
/obj/item/gavelhammer/fattening
desc = "Some madman managed to create a weapon out of calorite... Luckily, it has a rubber handle for you to wield."
name = "Calorite Hammer"
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "toyhammer"
damtype = "fat"
throwforce = 40
force = 60
attack_verb = list("fattened")
/obj/item/gavelhammer/permafattening
desc = "You may ask yourself - how did someone make a hammer out of a chemical? The answer is clear: no one knows."
name = "Permafat Hammer"
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "toyhammer"
damtype = "perma_fat"
throwforce = 10
force = 20
attack_verb = list("fattened")
@@ -1,165 +0,0 @@
/////////////////////
// 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
+2 -32
View File
@@ -56,35 +56,5 @@
icon = 'hyperstation/icons/obj/objects.dmi'
icon_state = "shelf"
/obj/structure/chair/beanbag
name = "beanbag chair"
desc = "A comfy beanbag chair. Almost as soft as your fat ass."
icon = 'GainStation13/icons/obj/chairs.dmi'
icon_state = "beanbag"
color = "#ffffff"
anchored = FALSE
buildstacktype = /obj/item/stack/sheet/cloth
buildstackamount = 5
item_chair = null
/obj/structure/chair/beanbag/gato
name = "GATO beanbag chair"
desc = "A comfy beanbag chair. This one seems to a super duper cutesy GATO mascot."
icon_state = "beanbag_gato"
//beanbag chair colors
/obj/structure/chair/beanbag/red
color = "#8b2e2e"
/obj/structure/chair/beanbag/blue
color = "#345bbc"
/obj/structure/chair/beanbag/green
color = "#76da4b"
/obj/structure/chair/beanbag/purple
color = "#a83acf"
/obj/structure/chair/beanbag/black
color = "#404040"
/obj/structure/chair/comfy/blue
color = rgb(50, 64, 255)
-35
View File
@@ -1,35 +0,0 @@
/obj/structure/table/plaswood
name = "plaswood table"
desc = "An strong and grey wooden table."
icon = 'GainStation13/icons/obj/smooth_structures/plaswoodpoker_table.dmi'
icon_state = "plaswood_table"
resistance_flags = FLAMMABLE
max_integrity = 200
integrity_failure = 50
armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
canSmoothWith = list(/obj/structure/table/plaswood,
/obj/structure/table/plaswood/plaswoodpoker)
/obj/structure/table/plaswood/plaswoodpoker
name = "gambling table"
desc = "A seedy table for seedy dealings in seedy places."
icon = 'GainStation13/icons/obj/smooth_structures/plaswoodpoker_table.dmi'
icon_state = "plaswoodpoker_table"
buildstack = /obj/item/stack/tile/carpet
/obj/structure/table/gmushroom
name = "Mushroom table"
desc = "A pinkish table. And is fireproof!"
icon = 'GainStation13/icons/obj/smooth_structures/gmushroom_table.dmi'
icon_state = "gmushroom_table"
resistance_flags = FIRE_PROOF
max_integrity = 70
canSmoothWith = list(/obj/structure/table/gmushroom,
/obj/structure/table/gmushroom/gmushroompoker)
/obj/structure/table/gmushroom/gmushroompoker
name = "gambling table"
desc = "A seedy table for seedy dealings in seedy places."
icon = 'GainStation13/icons/obj/smooth_structures/gmushroompoker_table.dmi'
icon_state = "gmushroompoker_table"
buildstack = /obj/item/stack/tile/carpet
Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

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