Merge branch 'master' of https://github.com/sheepishgoat/GS13-Citadel into maps-we-got-them

This commit is contained in:
evilew
2024-11-21 23:03:17 +01:00
714 changed files with 9588 additions and 2322 deletions
+19 -24
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-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Restore SpacemanDMM cache
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/SpacemanDMM
key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }}
- name: Restore Yarn cache
uses: actions/cache@v2
uses: actions/cache@v4
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
pip3 install setuptools --upgrade
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-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Restore BYOND cache
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
@@ -66,11 +66,10 @@ 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-20.04
runs-on: ubuntu-22.04
services:
mysql:
image: mysql:latest
@@ -80,14 +79,14 @@ jobs:
- 3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Restore BYOND cache
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: ~/BYOND
key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }}
- name: Restore Yarn cache
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -104,9 +103,6 @@ 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: |
@@ -118,15 +114,14 @@ 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@v2
- uses: actions/checkout@v4
- name: Restore Yarn cache
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: tgui/.yarn/cache
key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }}
@@ -143,7 +138,7 @@ jobs:
md deploy
bash tools/deploy.sh ./deploy
- name: Deploy artifact
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: deploy
path: deploy
@@ -0,0 +1,31 @@
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@v2
uses: actions/checkout@v4
- name: Branch
run: |
+14
View File
@@ -7,6 +7,13 @@
"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",
@@ -45,6 +52,13 @@
"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,6 +24,31 @@
"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",
@@ -74,6 +99,32 @@
],
"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",
@@ -0,0 +1 @@
GLOBAL_LIST_INIT(genital_fluids_list, list("Milk", "Water", "Semen", "Femcum", "Honey", "Strawberry Milk", "Nutriment", "Berry Juice"))
@@ -0,0 +1,57 @@
/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
-8
View File
@@ -1,8 +0,0 @@
/obj/item/clothing/neck/cloak/centcom
name = "central command's cloak"
desc = "Worn by High-Ranking Central Command Personnel. I guess they needed one too."
icon = 'GainStation13/icons/obj/clothing/cloaks.dmi'
mob_overlay_icon = 'GainStation13/icons/mob/neck.dmi'
icon_state = "centcomcloak"
armor = list("melee" = 35, "bullet" = 40, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 20, "rad" = 20, "fire" = 60, "acid" = 60)
body_parts_covered = CHEST|GROIN|ARMS
+15
View File
@@ -0,0 +1,15 @@
// GS13 - Port CE Gloves
/obj/item/clothing/gloves/color/yellow/ce //funky looking, basically combat gloves
desc = "Special Insulated gloves with pricy thermal shielding normally only found in combat gloves."
name = "Chief Engineer Insulated Gloves"
icon = 'GainStation13/icons/obj/clothing/gloves.dmi'
icon_state = "ce_insuls"
item_state = "blackgloves"
siemens_coefficient = 0
permeability_coefficient = 0.05
strip_delay = 80
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
+2 -2
View File
@@ -4,7 +4,6 @@
icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
mob_overlay_icon = 'GainStation13/icons/obj/clothing/haydee_modular.dmi'
icon_state = "haydee_helmet"
item_state = "item_haydee_helmet"
armor = list("melee" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 0, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
slowdown = 0
mutantrace_variation = NONE
@@ -13,11 +12,12 @@
/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" = 10, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 0, "rad" = 25, "fire" = 25, "acid" = 25)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 25, "fire" = 5, "acid" = 5)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
actions_types = list(/datum/action/item_action/toggle_helmet)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/haydee
-13
View File
@@ -21,16 +21,3 @@
mob_overlay_icon = 'GainStation13/icons/mob/uniform.dmi'
icon_state = "rsecuritypink"
item_state = "r_suit"
/obj/item/clothing/under/shorts/yellow
name = "Yellow workout short"
icon_state = "yellowwshort"
icon = 'GainStation13/icons/obj/clothing/uniforms.dmi'
mob_overlay_icon = 'GainStation13/icons/mob/uniform.dmi'
/obj/item/clothing/under/shorts/pink
name = "Pink workout short"
icon_state = "pinkwshort"
icon = 'GainStation13/icons/obj/clothing/uniforms.dmi'
mob_overlay_icon = 'GainStation13/icons/mob/uniform.dmi'
@@ -0,0 +1,46 @@
/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
@@ -0,0 +1,18 @@
// 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
-17
View File
@@ -1,17 +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)
/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>"
@@ -0,0 +1,13 @@
/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
+100
View File
@@ -19,6 +19,15 @@
value = -1
medical_record_text = "Patient's legs seem to lack strength"
/datum/quirk/strong_legs //GS13
name = "Strong Legs"
desc = "Your body is able to handle heavier sizes very well."
value = 2
mob_trait = TRAIT_STRONGLEGS
gain_text = "<span class='notice'>You feel like you can carry more weight.</span>"
lose_text = "<span class='notice'>Your legs cannot bear heavier loads anymore.</span>"
medical_record_text = "Patient exhibits increased muscle strength in their legs."
/datum/quirk/draconicspeaker
name = "Draconic speaker"
desc = "Due to your time spent around lizards, you can speak Draconic!"
@@ -48,3 +57,94 @@
/datum/quirk/slimespeaker/remove()
var/mob/living/M = quirk_holder
M?.remove_language(/datum/language/slime)
/datum/quirk/SpawnWithWheelchair
name = "Mobility Assistance"
desc = "After your last failed fitness test, you were advised to start using a hoverchair"
/datum/quirk/SpawnWithWheelchair/on_spawn()
if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs.
quirk_holder.buckled.unbuckle_mob(quirk_holder)
var/turf/T = get_turf(quirk_holder)
var/obj/structure/chair/spawn_chair = locate() in T
var/obj/vehicle/ridden/wheelchair/wheels = new(T)
if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
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
+51 -26
View File
@@ -9,7 +9,7 @@
name = "GATO Badge - Correspondent"
category = LOADOUT_CATEGORY_DONATOR
path = /obj/item/clothing/accessory/medal/gato_badge/middleman
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny", "Not Number")
ckeywhitelist = list("johnjimjim", "sonoida", "yeeny", "Not Number", "Not_Number", "NotNumber",)
/datum/gear/halsey_overcoat
name = "Halsey's Commander Overcoat"
@@ -29,12 +29,6 @@
path = /obj/item/gun/ballistic/automatic/toy/pistol/haydee
ckeywhitelist = list("lumu", "sonoida")
//sorry for defining this here, just thought it'd be more convenient
/obj/item/clothing/suit/chloe/halsey //sorry to whoever chloe is, but that coat is far too badass not to be used
name = "Halsey's Commander Overcoat"
desc = "A Ginormous red overcoat that looks fit for a commander. Has a tag on it that reads: 'Property of Halsey Harmonten. Please return if lost!'"
armor = list("melee" = 20, "bullet" = 20, "laser" = 0,"energy" = 20, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 0) //worn by a captain player, might as well recompensate not wearing the carapace
/datum/gear/rose_plush
name = "Dezir Rose Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
@@ -53,10 +47,6 @@
path = /obj/item/clothing/suit/storage/blueshield/grimmy
ckeywhitelist = list("bbgrimmy")
/obj/item/clothing/suit/storage/blueshield/grimmy
name = "Overcoat of the Destitute"
desc = "Welcome all to the everlasting all-time low. Please put your hands together for the ever-failing one man show: Domino!"
/datum/gear/tarek_gps
name = "Tarek's GPS"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
@@ -69,10 +59,6 @@
path = /obj/item/crowbar/bronze/glaug
ckeywhitelist = list("happytpr")
/obj/item/crowbar/bronze/glaug
name = "Milwaukee Pocket Crowbar"
desc = "Much more expensive. Still serves the same function."
/datum/gear/fatfang
name = "Fattening Fangs Injector"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
@@ -85,15 +71,6 @@
path = /obj/item/storage/belt/utility
ckeywhitelist = list("killmewitha22", "Killmewitha22", "KILLMEWITHA22", "sonoida")
/obj/item/toy/sword/chloesabre/halsey
name = "Halsey's Sabre"
desc = "An elegant weapon, similar in design to the Captain's Sabre, but with a platinum hilt and an adamantine blade. the hilt has an engraved hyena on it."
force = 16
/obj/item/gun/ballistic/revolver/mateba/moka
name = "\improper Custom Unica 6 revolver"
desc = "An elegant and ornate revolver belonging to a certain hellcat commander. There are some words carved on its side: 'Dura Lex, Sed Lex'"
//metha rossi you fat hog
/datum/gear/wgspell_add
@@ -114,18 +91,44 @@
path = /obj/item/book/granter/spell/fattening/steal
ckeywhitelist = list("sonoida", "themrsky", "Not Number")
/datum/gear/white_eyepatch_cabal
name = "Cabal's Eyepatch"
category = LOADOUT_CATEGORY_GLASSES
path = /obj/item/clothing/glasses/eyepatch/cabal
ckeywhitelist = list("spess_lizurd", "SPESS LIZURD", "spess lizurd", "SPESS_LIZURD", "spesslizurd", "sonoida")
/datum/gear/white_eyepatch
/datum/gear/white_eyepatch //accessible to anyone, at donator's request
name = "White Eyepatch"
category = LOADOUT_CATEGORY_GLASSES
path = /obj/item/clothing/glasses/eyepatch/white
/datum/gear/metis_plush
name = "Metis Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/toy/plush/gs13/metis
ckeywhitelist = list("paraillegal", "Paraillegal")
/datum/gear/wheelys
name = "Wheely-Heels"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/clothing/shoes/wheelys
ckeywhitelist = list("colorlessspy", "Colorlessspy")
/datum/gear/crowbars_plush
name = "Crowbars Plush"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/toy/plush/gs13/crowbars
ckeywhitelist = list("M16nPregnant", "m16npregnant" )
/datum/gear/sams_welder
name = "Sam's Unlucky Welder"
category = LOADOUT_SUBCATEGORY_BACKPACK_TOYS
path = /obj/item/weldingtool/bronze
ckeywhitelist = list("almaniak", "Almaniak", "AlManiak")
//
//item presets for donator items
//
/obj/item/clothing/glasses/eyepatch/white
name = "White eyepatch"
desc = "Smells faintly of medicine and headaches."
@@ -137,3 +140,25 @@
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/grimmy
name = "Overcoat of the Destitute"
desc = "Welcome all to the everlasting all-time low. Please put your hands together for the ever-failing one man show: Domino!"
/obj/item/crowbar/bronze/glaug
name = "Milwaukee Pocket Crowbar"
desc = "Much more expensive. Still serves the same function."
+6
View File
@@ -549,3 +549,9 @@
</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)."
@@ -0,0 +1,18 @@
//GS13 glitters. Making the subtle variants their own subtypes, as some use the fake gas effects to make a room look like it's full of gas, when it isnt.
/obj/effect/decal/cleanable/glitter/pink_subtle
name = "faint pink glitter"
icon = 'GainStation13/icons/effects/atmospherics.dmi'
icon_state = "glitter"
color = "#9e0089"
/obj/effect/decal/cleanable/glitter/white_subtle
name = "faint white glitter"
icon = 'GainStation13/icons/effects/atmospherics.dmi'
icon_state = "glitter"
/obj/effect/decal/cleanable/glitter/blue_subtle
name = "faint blue glitter"
icon = 'GainStation13/icons/effects/atmospherics.dmi'
icon_state = "glitter"
color = "#2dd6ff"
@@ -63,3 +63,101 @@
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,3 +20,74 @@
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"
+2 -2
View File
@@ -3,7 +3,7 @@
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly. This model works at a distance."
id = "arcd_design"
build_type = PROTOLATHE
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, MAT_BLUESPACE = 500) // costs more than what it did in the autolathe, this one comes loaded.
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, /datum/material/bluespace = 500) // costs more than what it did in the autolathe, this one comes loaded.
build_path = /obj/item/construction/rcd/arcd
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
@@ -41,6 +41,6 @@
id = "borg_arcd"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/arcd
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, MAT_BLUESPACE = 500)
materials = list(/datum/material/iron = MINERAL_MATERIAL_AMOUNT, /datum/material/glass = MINERAL_MATERIAL_AMOUNT, /datum/material/diamond = 500, /datum/material/bluespace = 500)
construction_time = 100
category = list("Cyborg Upgrade Modules")
@@ -0,0 +1,7 @@
////////////// GS13 BARSIGNS ///////////////
// Because modularity, yo
/datum/barsign/the_busted_belt //gs13
name = "The Busted Belt"
icon = "thebustedbelt" //...I dont think this survived the rebase, oops.
desc = "GATO is not liable for any pieces of broken wardrobe."
@@ -0,0 +1,12 @@
/obj/structure/chair/sofa/old
icon_state = "sofamiddle"
/obj/structure/chair/sofa/left/old
icon_state = "sofaend_left"
/obj/structure/chair/sofa/right/old
icon_state = "sofaend_right"
/obj/structure/chair/sofa/corner/old
icon_state = "sofacorner"
+19 -12
View File
@@ -1,8 +1,8 @@
/obj/item/toy/plush/gs13
icon = 'icons/obj/plushes.dmi'
icon = 'GainStation13/icons/obj/plushes.dmi'
/obj/item/toy/plush/gs13/metha
name = "Magical Captain plush/gs13ie"
name = "Magical Captain plushie"
desc = "A NEW GATO TOY FROM GATO CORPORATION, FEEL THE MAGIC OF THIS COOL TOY!"
icon_state = "metha"
attack_verb = list("fattened","Metha'd", "Brigged")
@@ -45,32 +45,39 @@
squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1)
/obj/item/toy/plush/gs13/kinichi
desc = "A silly looking plush/gs13ie of an adorable lizard janitor. His smile is heartwarming to look at."
desc = "A silly looking plushie of an adorable lizard janitor. His smile is heartwarming to look at."
icon_state = "kinichi"
attack_verb = list("hissed","squished", "hugged")
/obj/item/toy/plush/gs13/lgo
desc = "An attempt to market one of cleaning machines from the local market, in the form of a purchasable plush/gs13ie."
desc = "An attempt to market one of cleaning machines from the local market, in the form of a purchasable plushie."
icon_state = "lgo"
attack_verb = list("gronkled","beeped", "brushed")
/obj/item/toy/plush/gs13/oliver
desc = "A plush/gs13 of a silly shark with a stylish bandanna."
desc = "A plush of a silly shark with a stylish bandanna."
icon_state = "oliver"
attack_verb = list("chomped", "bit")
/obj/item/toy/plush/gs13/chloe
desc = "A plush/gs13 of a chunky red-haired botanist."
desc = "A plush of a chunky red-haired botanist."
icon_state = "chloe"
attack_verb = list("squished", "hugged", "smushed")
/obj/item/toy/plush/gs13/mammal/fox
icon_state = "fox"
/obj/item/toy/plush/gs13/delta
desc = "A plush of a chunky greaseball."
icon_state = "delta"
attack_verb = list("squished", "hugged", "smushed")
/obj/item/toy/plush/mothplushie/moffplush
name = "moth plushie"
desc = "A plushie depicting an adorable mothperson. It's a huggable bug!"
icon_state = "moffplush"
item_state = "moffplush"
squeak_override = list('modular_citadel/sound/voice/scream_moth.ogg' = 1)
/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")
+2 -2
View File
@@ -16,12 +16,12 @@
/turf/closed/indestructible/candy
name = "Candy wall"
desc = "Despite being made out of mere candy, this wall is harder than stone!"
icon = 'Gainstation13/icons/turf/wall_candy.dmi'
icon = 'Gainstation13/icons/turf/walls/wall_candy.dmi'
icon_state = "candywall"
/turf/closed/indestructible/chocolate
name = "Chocolate wall"
desc = "Somehow, it doesn't melt at all..."
icon = 'Gainstation13/icons/turf/wall_candy.dmi'
icon = 'Gainstation13/icons/turf/walls/wall_candy.dmi'
icon_state = "choco_wall1"
-22
View File
@@ -59,25 +59,3 @@
name = "gato-themed carpet"
icon_state = "tile-carpet-gato"
turf_type = /turf/open/floor/carpet/gato
/turf/open/indestructible/layenia/crystal
name = "Lattice Crystal"
desc = "A glowing azure crystal, with strange properties to make things float."
icon = 'GainStation13/icons/turf/crystal_floor.dmi'
baseturfs = /turf/open/indestructible/layenia/crystal
slowdown = 1
light_range = 4
light_power = 0.5
barefootstep = FOOTSTEP_HARD_BAREFOOT
clawfootstep = FOOTSTEP_HARD_CLAW
heavyfootstep = FOOTSTEP_GENERIC_HEAVY
light_color = LIGHT_COLOR_BLUE
initial_gas_mix = FROZEN_ATMOS
planetary_atmos = TRUE
smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE
canSmoothWith = list(/turf/open/indestructible/layenia/crystal)
/turf/open/indestructible/layenia/crystal/garden
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
planetary_atmos = TRUE
@@ -0,0 +1,513 @@
/**
* 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
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.
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)
@@ -0,0 +1,7 @@
/obj/machinery/quantumpad
/// Does the quantum pad need power to work?
var/needs_power = TRUE
/obj/machinery/quantumpad/always_powered
needs_power = FALSE
+33 -4
View File
@@ -1,6 +1,28 @@
/datum/material/calorite
name = "calorite"
sheet_type = /obj/item/stack/sheet/mineral/calorite
color = list(340/255, 150/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
strength_modifier = 1.5
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
beauty_modifier = 0.05
armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, RAD = 1, FIRE = 0.7, ACID = 1.1) // Same armor as gold.
/datum/material/calorite/on_applied_obj(obj/source, amount, material_flags)
. = ..()
if(!(material_flags & MATERIAL_AFFECT_STATISTICS))
return
var/obj/source_obj = source
source_obj.damtype = FAT
/datum/material/calorite/on_removed_obj(obj/source, material_flags)
if(!(material_flags & MATERIAL_AFFECT_STATISTICS))
return ..()
var/obj/source_obj = source
source_obj.damtype = initial(source_obj.damtype)
return ..()
/turf/closed/mineral/calorite //GS13
mineralType = /obj/item/stack/ore/calorite
@@ -14,6 +36,7 @@
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"
@@ -25,17 +48,21 @@
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("Fatty statue", /obj/structure/statue/calorite/fatty, 5, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("Calorite doors", /obj/structure/mineral_door/calorite, 5, one_per_turf = 1, on_floor = 1),
new/datum/stack_recipe("Calorite Ingots", /obj/item/ingot/calorite, time = 30), \
new/datum/stack_recipe("Fatty statue", /obj/structure/statue/calorite/fatty, 5, one_per_turf = 1, on_floor = 1),\
new/datum/stack_recipe("Calorite doors", /obj/structure/mineral_door/calorite, 5, one_per_turf = 1, on_floor = 1),\
))
/obj/item/stack/sheet/mineral/calorite/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.calorite_recipes
/obj/item/stack/sheet/mineral/calorite/get_main_recipes()
. = ..()
. += GLOB.calorite_recipes
/obj/item/stack/tile/mineral/calorite //GS13
@@ -242,3 +269,5 @@ GLOBAL_LIST_INIT(calorite_recipes, list ( \
fatten()
. = ..()
/obj/item/ingot/calorite
custom_materials = list(/datum/material/calorite=1500)
@@ -26,7 +26,7 @@
var/credits = linked_scale?.credits
dat += "Gear Credits: [credits] <br>"
dat += "<b>Transfer credits in exchange for supplies:</b><br>"
dat += "<b>Transfer credits in exchange for supplies:</b><br>"
for(var/goodie in subtypesof(/datum/feeders_den_goodie))
var/datum/feeders_den_goodie/temp_goodie = new goodie()
dat += "<a href='?src=[REF(src)];dispense=[goodie]'>[temp_goodie.name] (Cost: [temp_goodie.credit_cost])</A><br>"
@@ -64,7 +64,7 @@
say("Unable to purchase more!")
return FALSE
if(!Dispense(item_path, price))
if(!Dispense(item_path, price))
return FALSE
if(buy_counts[goodie_datum.name] == null)
@@ -146,7 +146,7 @@
return TRUE
return ..()
/obj/structure/scale/credits
name = "tracking scale"
desc = "A upgraded scale that tracks to weight of all of those that have stepped on it. Using this will add credits to the feeder console"
@@ -155,7 +155,7 @@
/// How much credits do we currently have?
var/credits = 0
/// How many credits are we going to reward per pound gained?
var/credits_per_fatness = 0.25
var/credits_per_fatness = 0.25
/// A list containing all of the people we've scanned and their maximum weight.
var/list/scanned_people = list()
/// What is the current team number?
@@ -201,7 +201,7 @@
var/credit_total = max((credits_to_add - credits_to_remove), 0)
if(credit_total > 0)
say("[credit_total] credits have been deposited into the console.")
credits += credit_total
scanned_people[fatty] += credit_total
@@ -214,6 +214,7 @@
team_number = 27
vest_mode_action = null
vest_disguise_action = null
check_if_abductor = FALSE
/obj/machinery/computer/camera_advanced/abductor/feeder/IsScientist(mob/living/carbon/human/H)
return TRUE
@@ -245,4 +246,4 @@
prepare(target,user)
return TRUE
+23 -3
View File
@@ -21,10 +21,8 @@ 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
var/burpslurring = 0
var/fullness_reducion_timer = 0 // When was the last time they emoted to reduce their fullness
var/fullness_reduction_timer = 0 // When was the last time they emoted to reduce their fullness
/**
* Adjusts the fatness level of the parent mob.
@@ -60,6 +58,25 @@ 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)
@@ -76,6 +93,9 @@ 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
+3 -3
View File
@@ -16,14 +16,14 @@
var/mob/living/carbon/C = quirk_holder
C.hider_remove(src)
/*
/datum/quirk/fatrousal/proc/fat_hide(var/mob/living/carbon/user)
if(iscarbon(quirk_holder))
var/mob/living/carbon/C = quirk_holder
return C.getArousalLoss()*35
return C.getArousal()*35
return FALSE
*/
///mob/living/adjust_arousal(amount, updating_arousal=1)
// if(HAS_TRAIT(src, TRAIT_FATROUSAL))
+11 -1
View File
@@ -2,4 +2,14 @@
name = "Calorite dance floor"
result = /obj/item/stack/tile/mineral/calorite/dance
reqs = list(/obj/item/stack/cable_coil = 3, /obj/item/stack/tile/mineral/calorite = 1)
category = CAT_MISC
subcategory = CAT_MISCELLANEOUS
category = CAT_MISCELLANEOUS
/datum/crafting_recipe/nutribot
name = "Nutribot"
reqs = list(/obj/item/stack/sheet/cardboard = 1,
/obj/item/stack/sheet/mineral/calorite = 1,
/obj/item/bodypart/r_arm/robot = 1,
/obj/item/assembly/prox_sensor = 1)
result = /mob/living/simple_animal/bot/nutribot
category = CAT_ROBOT
@@ -0,0 +1,16 @@
/obj/item/reagent_containers/food/snacks/proc/handle_tf(mob/living/eater)
var/datum/component/transformation_item/transformation_component = GetComponent(/datum/component/transformation_item)
if(!istype(transformation_component) || transformation_component.transfer_to_vore || (transformation_component.transformed_mob != src))
return FALSE
var/mob/living/food_mob = transformation_component.transformed_mob
if(!istype(food_mob) || !(food_mob?.vore_flags & DEVOURABLE) || (eater?.vore_flags & NO_VORE) || !istype(eater.vore_selected))
return FALSE
qdel(transformation_component)
var/obj/belly/vore_belly = eater.vore_selected
if(!vore_belly.nom_mob(food_mob,eater))
return FALSE
return TRUE
@@ -0,0 +1,36 @@
/mob/living/proc/get_tf_component()
var/obj/item/item_loc = loc
if(!istype(item_loc))
return FALSE
var/datum/component/transformation_item/transformation_component = item_loc.GetComponent(/datum/component/transformation_item)
if(!istype(transformation_component) || (transformation_component.transformed_mob != src))
return FALSE
return transformation_component
/mob/living/proc/handle_transformation_ooc_escape()
var/datum/component/transformation_item/transformation_component = get_tf_component()
if(!transformation_component)
return FALSE
qdel(transformation_component)
return TRUE
/mob/living/proc/attempt_to_escape_tf()
var/datum/component/transformation_item/transformation_component = get_tf_component()
if(!transformation_component)
return FALSE
if(!transformation_component.able_to_struggle_out)
to_chat(src, span_warning("You are unable to struggle out."))
return FALSE
to_chat(src, span_notice("You attempt to escape your transformation."))
if(!do_after(src, 60 SECONDS))
to_chat(src, span_warning("You fail to escape."))
return FALSE
qdel(transformation_component)
return TRUE
@@ -0,0 +1,105 @@
/datum/component/transformation_item
/// What mob do we currently have stuck in us?
var/mob/living/transformed_mob
/// Do we release the mob when the parent item is destroyed?
var/release_mob = TRUE
/// Is the mob able to speak as the item?
var/able_to_speak = FALSE
/// Is the mob able to emote as the item?
var/able_to_emote = FALSE
/// Does the object scale with the sprite size of the mob inside of it?
var/scale_object = TRUE
/// Show custom description.
var/show_that_object_is_tf = TRUE
/// Stored real name
var/stored_real_name = ""
/// Stored name
var/stored_name = ""
/// Is the component able to be removed?
var/stuck_on_item = FALSE
/// Is the person able to struggle out?
var/able_to_struggle_out = TRUE
/// Transfer to vore belly when eaten
var/transfer_to_vore = TRUE
/datum/component/transformation_item/Initialize()
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine))
RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(remove_mob))
/datum/component/transformation_item/Destroy(force, silent)
remove_mob()
return ..()
/datum/component/transformation_item/proc/examine(datum/source, mob/user, list/examine_list)
if(show_that_object_is_tf)
examine_list += span_notice("Something about [source] seems lifelike.")
/datum/component/transformation_item/proc/register_mob(mob/living/mob_to_register)
var/atom/parent_atom = parent
if(!istype(mob_to_register))
return FALSE
transformed_mob = mob_to_register
stored_real_name = mob_to_register.real_name
stored_name = mob_to_register.name
// This is really dumb, but if it works, then maybe it is not dumb.
mob_to_register.real_name = parent_atom.name
mob_to_register.name = parent_atom.name
ADD_TRAIT(mob_to_register, TRAIT_TRANSFORMED, src)
ADD_TRAIT(mob_to_register, TRAIT_RESISTCOLD, src)
ADD_TRAIT(mob_to_register, TRAIT_RESISTLOWPRESSURE, src)
ADD_TRAIT(mob_to_register, TRAIT_LOWPRESSURECOOLING, src)
if(!able_to_speak)
ADD_TRAIT(mob_to_register, TRAIT_MUTE, src)
if(!able_to_emote)
ADD_TRAIT(mob_to_register, TRAIT_EMOTEMUTE, src)
// need to stop them from using radio headsets.
var/mob/living/carbon/human/human_mob = mob_to_register
if(istype(human_mob))
ADD_TRAIT(mob_to_register, TRAIT_PARALYSIS_L_ARM, src)
ADD_TRAIT(mob_to_register, TRAIT_PARALYSIS_R_ARM, src)
human_mob.update_disabled_bodyparts()
mob_to_register.forceMove(parent_atom)
if(scale_object)
var/target_size = mob_to_register.size_multiplier
var/matrix/new_matrix = new
new_matrix.Scale(target_size)
new_matrix.Translate(0,16 * (target_size-1))
parent_atom.transform = new_matrix
/datum/component/transformation_item/proc/remove_mob()
if(!release_mob || !transformed_mob)
return FALSE
transformed_mob.real_name = stored_real_name
transformed_mob.name = stored_name
if(!able_to_speak)
REMOVE_TRAIT(transformed_mob, TRAIT_MUTE, src)
if(!able_to_emote)
REMOVE_TRAIT(transformed_mob, TRAIT_EMOTEMUTE, src)
REMOVE_TRAIT(transformed_mob, TRAIT_TRANSFORMED, src)
REMOVE_TRAIT(transformed_mob, TRAIT_RESISTCOLD, src)
REMOVE_TRAIT(transformed_mob, TRAIT_RESISTLOWPRESSURE, src)
REMOVE_TRAIT(transformed_mob, TRAIT_LOWPRESSURECOOLING, src)
var/mob/living/carbon/human/human_mob = transformed_mob
if(istype(human_mob))
REMOVE_TRAIT(human_mob, TRAIT_PARALYSIS_L_ARM, src)
REMOVE_TRAIT(human_mob, TRAIT_PARALYSIS_R_ARM, src)
human_mob.update_disabled_bodyparts()
var/atom/parent_atom = parent
transformed_mob.forceMove(parent_atom.loc)
if(scale_object)
parent_atom.transform = null
@@ -0,0 +1,116 @@
/obj/item/transformation_item
name = "Handheld Transmogrifier"
desc = "a handheld device that is mysteriously able to turn people into objects. It can also be used to remove said transformations."
icon = 'icons/obj/abductor.dmi'
icon_state = "gizmo_scan"
item_state = "silencer"
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
/// What item are we wanting to TF people into?
var/obj/item/target_item
/// Do we want our transformed person to be able to speak as the object?
var/able_to_speak = TRUE
/// Do we want our transformed person to be able to emote as the object?
var/able_to_emote = TRUE
/// Do we want the item to scale?
var/scale_object = FALSE
/// Do we want to show that the object was once a person?
var/show_that_object_is_tf = TRUE
/// Is our captured person able to struggle out?
var/able_to_struggle_out = TRUE
/// Do we have any items we can't turn people into?
var/list/object_blacklist = list()
/obj/item/transformation_item/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
var/obj/item/attacked_item = target
if(!proximity_flag || !istype(attacked_item))
return FALSE
var/datum/component/transformation_item/transformation_component = attacked_item.GetComponent(/datum/component/transformation_item)
if(istype(transformation_component) && !transformation_component.stuck_on_item)
qdel(transformation_component)
to_chat(user, span_notice("You dispel the current transformation for [attacked_item]."))
return
target_item = attacked_item
to_chat(user, span_notice("The next time someone is transformed, they will be transformed into [attacked_item]."))
return
/obj/item/transformation_item/attack(mob/living/M, mob/living/user)
if(!target_item)
to_chat(user, span_warning("You need to have an item linked to transform someone."))
return
perform_transfomration(M, user)
return
/obj/item/transformation_item/proc/perform_transfomration(mob/living/target_mob, mob/living/user)
if(!istype(target_mob))
return FALSE
if(!target_item.Adjacent(target_mob))
to_chat(user, span_warning("The [target_item] isn't close enough to [target_mob]"))
return FALSE
if(target_item in target_mob.get_contents())
return FALSE // Don't TF someone into something they are holding.
if(!target_mob?.client?.prefs?.object_tf)
to_chat(user, span_warning("It seems like [target_mob] does not want to be transformed."))
return FALSE
var/datum/component/transformation_item/transformation_component = target_item.AddComponent(/datum/component/transformation_item)
// Make sure that we apply our variables before we actually put the mob in the item.
transformation_component.able_to_speak = able_to_speak
transformation_component.able_to_emote = able_to_emote
transformation_component.scale_object = scale_object
transformation_component.show_that_object_is_tf = show_that_object_is_tf
transformation_component.able_to_struggle_out = able_to_struggle_out
transformation_component.register_mob(target_mob)
target_item = null
return TRUE
/obj/item/transformation_item/ui_data(mob/user)
var/list/data = list()
data["able_to_speak"] = able_to_speak
data["able_to_emote"] = able_to_emote
data["scale_object"] = scale_object
data["show_that_object_is_tf"] = show_that_object_is_tf
data["linked_item_name"] = target_item
data["able_to_struggle_out"] = able_to_struggle_out
return data
/obj/item/transformation_item/ui_act(action, params)
if(..())
return
switch(action)
if("set_speaking")
able_to_speak = !able_to_speak
. = TRUE
if("set_emote")
able_to_emote = !able_to_emote
. = TRUE
if("set_scale")
scale_object = !scale_object
. = TRUE
if("toggle_struggle")
able_to_struggle_out = !able_to_struggle_out
. = TRUE
if("set_show_desc")
show_that_object_is_tf = !show_that_object_is_tf
. = TRUE
/obj/item/transformation_item/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "TransformTool", name)
ui.open()
+191
View File
@@ -0,0 +1,191 @@
/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
+45 -2
View File
@@ -1,2 +1,45 @@
/datum/emote/proc/get_sound(mob/living/user)
return sound //by default just return this var.
/datum/emote/speen
key = "speen"
key_third_person = "speeeeens!"
restraint_check = TRUE
mob_type_allowed_typecache = list(/mob/living, /mob/dead/observer)
mob_type_ignore_stat_typecache = list(/mob/dead/observer)
/datum/emote/speen/run_emote(mob/user)
. = ..()
if(.)
user.spin(20, 1)
if(iscyborg(user) && user.has_buckled_mobs())
var/mob/living/silicon/robot/R = user
var/datum/component/riding/riding_datum = R.GetComponent(/datum/component/riding)
if(riding_datum)
for(var/mob/M in R.buckled_mobs)
riding_datum.force_dismount(M)
else
R.unbuckle_all_mobs()
/datum/emote/speen/run_emote(mob/living/user, params)
if(ishuman(user))
if(user.nextsoundemote >= world.time)
return
user.nextsoundemote = world.time + 7
playsound(user, 'GainStation13/sound/voice/speen.ogg', 50, 1, -1)
. = ..()
/datum/emote/living/cackle
key = "cackle"
key_third_person = "cackles"
message = "cackles hysterically!"
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
/datum/emote/living/cackle/run_emote(mob/living/user, params)
if(ishuman(user))
if(user.nextsoundemote >= world.time)
return
user.nextsoundemote = world.time + 7
playsound(user, 'GainStation13/sound/voice//cackle_yeen.ogg', 50, 1, -1)
. = ..()
@@ -0,0 +1,19 @@
//GS13 Port
/mob/living/proc/mob_climax(forced_climax = FALSE, cause = "none")//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
set name = "Masturbate"
set category = "IC"
if(canbearoused && !restrained() && !stat)
if(mb_cd_timer <= world.time)
//start the cooldown even if it fails
mb_cd_timer = world.time + mb_cd_length
if(getArousal() >= ((max_arousal / 100) * 33))//33% arousal or greater required
src.visible_message("<span class='danger'>[src] starts masturbating!</span>", \
"<span class='userdanger'>You start masturbating.</span>")
if(do_after(src, 30, target = src))
src.visible_message("<span class='danger'>[src] relieves [p_them()]self!</span>", \
"<span class='userdanger'>You have relieved yourself.</span>")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
setArousal(min_arousal)
else
to_chat(src, "<span class='notice'>You aren't aroused enough for that.</span>")
@@ -0,0 +1,189 @@
#define BORDER_CONTROL_DISABLED 0
#define BORDER_CONTROL_LEARNING 1
#define BORDER_CONTROL_ENFORCED 2
GLOBAL_LIST_EMPTY(whitelistedCkeys)
GLOBAL_VAR_INIT(borderControlFile, new /savefile("data/bordercontrol.db"))
GLOBAL_VAR_INIT(whitelistLoaded, FALSE)
//////////////////////////////////////////////////////////////////////////////////
proc/BC_ModeToText(mode)
switch(mode)
if(BORDER_CONTROL_DISABLED)
return "Disabled"
if(BORDER_CONTROL_LEARNING)
return "Learning"
if(BORDER_CONTROL_ENFORCED)
return "Enforced"
//////////////////////////////////////////////////////////////////////////////////
proc/BC_IsKeyAllowedToConnect(key)
key = ckey(key)
var/borderControlMode = CONFIG_GET(number/border_control)
if(borderControlMode == BORDER_CONTROL_DISABLED)
return 1
else if (borderControlMode == BORDER_CONTROL_LEARNING)
if(!BC_IsKeyWhitelisted(key))
log_and_message_admins("[key] has joined and was added to the border whitelist.")
BC_WhitelistKey(key)
return 1
else
return BC_IsKeyWhitelisted(key)
//////////////////////////////////////////////////////////////////////////////////
proc/BC_IsKeyWhitelisted(key)
key = ckey(key)
if(!GLOB.whitelistLoaded)
BC_LoadWhitelist()
if(LAZYISIN(GLOB.whitelistedCkeys, key))
return 1
else
return 0
//////////////////////////////////////////////////////////////////////////////////
//ADMIN_VERB_ADD(/client/proc/BC_WhitelistKeyVerb, R_ADMIN, FALSE)
///client/proc/BC_WhitelistKeyVerb()
/datum/admins/proc/BC_WhitelistKeyVerb()
set name = "Border Control - Whitelist Key"
set category = "Admin.Border Control"
var/key = input("CKey to Whitelist", "Whitelist Key") as null|text
if(key)
var/confirm = alert("Add [key] to the border control whitelist?", , "Yes", "No")
if(confirm == "Yes")
log_and_message_admins("added [key] to the border whitelist.")
BC_WhitelistKey(key)
//////////////////////////////////////////////////////////////////////////////////
proc/BC_WhitelistKey(key)
var/keyAsCkey = ckey(key)
if(!GLOB.whitelistLoaded)
BC_LoadWhitelist()
if(!keyAsCkey)
return 0
else
if(LAZYISIN(GLOB.whitelistedCkeys,keyAsCkey))
// Already in
return 0
else
LAZYINITLIST(GLOB.whitelistedCkeys)
ADD_SORTED(GLOB.whitelistedCkeys, keyAsCkey, /proc/cmp_text_asc)
BC_SaveWhitelist()
return 1
//////////////////////////////////////////////////////////////////////////////////
//ADMIN_VERB_ADD(/client/proc/BC_RemoveKeyVerb, R_ADMIN, FALSE)
///client/proc/BC_RemoveKeyVerb()
/datum/admins/proc/BC_RemoveKeyVerb()
set name = "Border Control - Remove Key"
set category = "Admin.Border Control"
var/keyToRemove = input("CKey to Remove", "Remove Key") as null|anything in GLOB.whitelistedCkeys
if(keyToRemove)
var/confirm = alert("Remove [keyToRemove] from the border control whitelist?", , "Yes", "No")
if(confirm == "Yes")
log_and_message_admins("removed [keyToRemove] from the border whitelist.")
BC_RemoveKey(keyToRemove)
return
//////////////////////////////////////////////////////////////////////////////////
proc/BC_RemoveKey(key)
key = ckey(key)
if(!LAZYISIN(GLOB.whitelistedCkeys, key))
return 1
else
if(GLOB.whitelistedCkeys)
GLOB.whitelistedCkeys.Remove(key)
BC_SaveWhitelist()
return 1
//////////////////////////////////////////////////////////////////////////////////
//ADMIN_VERB_ADD(/client/proc/BC_ToggleState, R_ADMIN, FALSE)
///client/proc/BC_ToggleState()
/datum/admins/proc/BC_ToggleState()
set name = "Border Control - Toggle Mode"
set category = "Admin.Border Control"
set desc="Enables or disables border control"
var/borderControlMode = CONFIG_GET(number/border_control)
var/choice = input("New State (Current state is: [BC_ModeToText(borderControlMode)])", "Border Control State") as null|anything in list("Disabled", "Learning", "Enforced")
switch(choice)
if("Disabled")
if(borderControlMode != BORDER_CONTROL_DISABLED)
borderControlMode = BORDER_CONTROL_DISABLED
log_and_message_admins("has disabled border control.")
if("Learning")
if(borderControlMode != BORDER_CONTROL_LEARNING)
borderControlMode = BORDER_CONTROL_LEARNING
log_and_message_admins("has set border control to learn new keys on connection!")
var/confirm = alert("Learn currently connected keys?", , "Yes", "No")
if(confirm == "Yes")
for(var/client/C in GLOB.clients)
if (BC_WhitelistKey(C.key))
log_and_message_admins("[key_name(usr)] added [C.key] to the border whitelist by adding all current clients.")
if("Enforced")
if(borderControlMode != BORDER_CONTROL_ENFORCED)
borderControlMode = BORDER_CONTROL_ENFORCED
log_and_message_admins("has enforced border controls. New keys can no longer join.")
CONFIG_SET(number/border_control, borderControlMode)
return
//////////////////////////////////////////////////////////////////////////////////
/hook/startup/proc/loadBorderControlWhitelistHook()
BC_LoadWhitelist()
return 1
//////////////////////////////////////////////////////////////////////////////////
/proc/BC_LoadWhitelist()
LAZYCLEARLIST(GLOB.whitelistedCkeys)
LAZYINITLIST(GLOB.whitelistedCkeys)
if(!GLOB.borderControlFile)
return 0
GLOB.borderControlFile["WhitelistedCkeys"] >> GLOB.whitelistedCkeys
GLOB.whitelistLoaded = 1
//////////////////////////////////////////////////////////////////////////////////
proc/BC_SaveWhitelist()
if(!GLOB.whitelistedCkeys)
return 0
if(!GLOB.borderControlFile)
return 0
GLOB.borderControlFile["WhitelistedCkeys"] << GLOB.whitelistedCkeys
@@ -0,0 +1,17 @@
//Roses dont exist here... Sad
// /datum/gear/head/rose
// name = "Rose"
// path = /obj/item/grown/rose
/datum/gear/head/sunflower
name = "Sunflower"
path = /obj/item/grown/sunflower
/datum/gear/head/poppy
name = "Poppy"
path = /obj/item/reagent_containers/food/snacks/grown/poppy
/datum/gear/head/harebell
name = "Harebell"
path = /obj/item/reagent_containers/food/snacks/grown/harebell
@@ -0,0 +1,3 @@
/datum/gear/uniform/modularjumpsuit
name = "Modular Jumpsuit (gray)"
path = /obj/item/clothing/under/color/grey/modular
@@ -31,6 +31,8 @@
var/fatness_vulnerable = FALSE
/// Similar to fatness_vulnerable, but with more extreme effects such as transformation/hypno.
var/extreme_fatness_vulnerable = FALSE
/// Can the person be transformed into an object?
var/object_tf
// Helplessness, a set of prefs that make things extra tough at higher weights. If set to FALSE, they won't do anything.
///What fatness level disables movement?
@@ -57,6 +59,8 @@
///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
@@ -69,7 +69,9 @@
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/icon_location = 'GainStation13/icons/mob/modclothes/graymodular.dmi' //Default belly
var/icon_round_location = 'GainStation13/icons/mob/modclothes/graymodular_round.dmi'
var/icon_stuffed_location = 'GainStation13/icons/mob/modclothes/graymodular_stuffed.dmi'
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
@@ -93,16 +95,43 @@
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)
// Change to visually update sprite depending on fullness.
if(ishuman(O.owner))
// Get mob
var/mob/living/carbon/human/H = O.owner
// Check what belly shape the mob has
var/used_icon_location
switch(G.shape)
if("Soft Belly")
used_icon_location = icon_location
if("Round Belly")
used_icon_location = icon_round_location
var/size = 0
switch(H.fullness)
if(-100 to FULLNESS_LEVEL_BLOATED) // Normal
size = G.size
if(FULLNESS_LEVEL_BLOATED to FULLNESS_LEVEL_BEEG) // Take the stuffed sprite of the same size
size = G.size
used_icon_location = icon_stuffed_location
if(FULLNESS_LEVEL_BEEG to FULLNESS_LEVEL_NOMOREPLZ) // Take the stuffed sprite of size + 1
size = G.size + 1
used_icon_location = icon_stuffed_location
if(FULLNESS_LEVEL_NOMOREPLZ to INFINITY)// Take the stuffed sprite of size + 2
size = G.size + 2
used_icon_location = icon_stuffed_location
if(!adjusted) //check the style, if it needs to be the adjusted variants
if(G.size <= 9+FULLNESS_STUFFED_EXTRA_SPRITE_SIZES) //check that the size is within accepted values, NOTE: these need to be removed later, better to cap organ sizes to begin with. Cap is 9 (max fat stage) + 2 (stuffed stages)
. += mutable_appearance(used_icon_location, "belly_[size]", GENITALS_FRONT_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(used_icon_location, "belly_11", GENITALS_FRONT_LAYER)
else //use the alternative adjusted sprites
if(G.size <= 9+FULLNESS_STUFFED_EXTRA_SPRITE_SIZES)
. += mutable_appearance(used_icon_location, "belly_[size]_d", GENITALS_FRONT_LAYER)
else
. += mutable_appearance(used_icon_location, "belly_11_d", GENITALS_FRONT_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
@@ -0,0 +1,27 @@
/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
@@ -0,0 +1,13 @@
/datum/reagent/consumable
var/use_gs_icon = FALSE
/obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change(changetype)
icon = 'icons/obj/drinks.dmi'
if(reagents.reagent_list.len)
var/datum/reagent/R = reagents.get_master_reagent()
if(istype(R, /datum/reagent/consumable))
var/datum/reagent/consumable/C = R
if(C.use_gs_icon == TRUE)
icon = 'GainStation13/icons/obj/drinks.dmi'
..()
@@ -1,7 +1,6 @@
/obj/item/seeds/berry/blueberry
name = "pack of blueberry seeds"
desc = "These seeds grow into blueberry bushes."
icon_state = "seed-blueberry"
species = "blueberry"
plantname = "Blueberry Bush"
product = /obj/item/reagent_containers/food/snacks/grown/berries/blueberry
@@ -11,11 +10,18 @@
yield = 1
production = 10
rarity = 30
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
icon_state = "seed-blueberry"
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
icon_grow = "berry-grow" // Uses one growth icons set for all the subtypes
icon_dead = "berry-dead" // Same for the dead icon
icon_harvest = "blueberry-harvest"
/obj/item/reagent_containers/food/snacks/grown/berries/blueberry
seed = /obj/item/seeds/berry/blueberry
name = "bunch of blueberries"
desc = "Taste so good, you might turn blue!"
icon = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
icon_state = "blueberrypile"
filling_color = "#5d00c7"
foodtype = FRUIT
@@ -1,8 +1,6 @@
/obj/item/seeds/lipoplant
name = "pack of adipolipus"
desc = "These seeds grow into a foreign plant."
icon = 'GainStation13/icons/obj/hydroponics/lipo_seeds.dmi'
icon_state = "lipo_seed"
species = "adipolipus"
plantname = "Adipolipus"
product = /obj/item/reagent_containers/food/snacks/grown/lipofruit
@@ -11,17 +9,19 @@
maturation = 8
production = 5
yield = 1
growing_icon = 'GainStation13/icons/obj/hydroponics/lipo_growing.dmi'
reagents_add = list(/datum/reagent/consumable/lipoifier = 0.05)
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
icon_state = "seed-lipo"
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
icon_grow = "lipo-grow" // Uses one growth icons set for all the subtypes
icon_dead = "lipo-dead" // Same for the dead icon
icon_harvest = "lipo-harvest"
reagents_add = list(/datum/reagent/consumable/lipoifier = 0.05)
/obj/item/reagent_containers/food/snacks/grown/lipofruit
seed = /obj/item/seeds/lipoplant
name = "lipofruit"
desc = "A foreign fruit with an hard shell. Perhaps something sharp could open it?"
icon = 'GainStation13/icons/obj/hydroponics/lipo_harvest.dmi'
icon = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
icon_state = "lipo_nut"
item_state = "lipo_nut"
possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50)
@@ -8,22 +8,26 @@
/obj/item/seeds/cannabis/munchies
name = "pack of munchies weed seeds"
desc = "These seeds grow into munchies weed."
icon_state = "seed-munchies"
species = "munchycannabis"
plantname = "Munchies Weed"
icon_grow = "munchycannabis-grow" // Uses one growth icons set for all the subtypes
icon_dead = "munchycannabis-dead" // Same for the dead icon
product = /obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/orange)
mutatelist = list()
reagents_add = list(/datum/reagent/drug/space_drugs = 0.05,
/datum/reagent/drug/munchies = 0.10)
rarity = 69
icon = 'GainStation13/icons/obj/hydroponics/seeds.dmi'
icon_state = "seed-munchies"
growing_icon = 'GainStation13/icons/obj/hydroponics/growing.dmi'
icon_grow = "munchycannabis-grow" // Uses one growth icons set for all the subtypes
icon_dead = "munchycannabis-dead" // Same for the dead icon
icon_harvest = "munchycannabis-harvest"
/obj/item/reagent_containers/food/snacks/grown/cannabis/munchies
seed = /obj/item/seeds/cannabis/munchies
name = "munchies cannabis leaf"
desc = "You feel hungry just looking at it."
icon = 'GainStation13/icons/obj/hydroponics/harvest.dmi'
icon_state = "munchycannabis"
wine_power = 90
@@ -1,4 +1,4 @@
/datum/gear/bluespace_belt
/datum/gear/backpack/bluespace_belt
name = "Bluespace Belt"
category = LOADOUT_SUBCATEGORY_BACKPACK_GENERAL
path = /obj/item/bluespace_belt
+2 -4
View File
@@ -1,11 +1,9 @@
/datum/gear/syntech/ring
/datum/gear/gloves/syntech/ring
name = "Normalizer Ring"
category = LOADOUT_CATEGORY_GLOVES
path = /obj/item/clothing/gloves/ring/syntech
cost = 6
/datum/gear/syntech/band
/datum/gear/gloves/syntech/band
name = "Normalizer Band"
category = LOADOUT_CATEGORY_GLOVES
path = /obj/item/clothing/gloves/ring/syntech/band
cost = 6
+3 -6
View File
@@ -1,17 +1,14 @@
/datum/gear/syntech/pendant
/datum/gear/neck/syntech/pendant
name = "Normalizer Pendant"
category = LOADOUT_CATEGORY_NECK
path = /obj/item/clothing/neck/syntech
cost = 6
/datum/gear/syntech/choker
/datum/gear/neck/syntech/choker
name = "Normalizer Choker"
category = LOADOUT_CATEGORY_NECK
path = /obj/item/clothing/neck/syntech/choker
cost = 6
/datum/gear/syntech/collar
/datum/gear/neck/syntech/collar
name = "Normalizer Collar"
category = LOADOUT_CATEGORY_NECK
path = /obj/item/clothing/neck/syntech/collar
cost = 6
@@ -12,6 +12,7 @@
flavour_text = "After you've sold your soul to corporate overlords, your contract obliged you to enter cryostasis. \
Finally, after God knows how long, the cryopod system have awakened you with only a single sentence of information - welcome and lure in new guests into the freshly opened GATO restaurant!"
assignedrole = "Restaurant worker"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/fastfoodmanager
name = "Corporate cryostasis pod"
@@ -27,6 +28,7 @@
flavour_text = "After you've sold your soul to corporate overlords, your contract obliged you to enter cryostasis. \
Finally, after God knows how long, the cryopod system have awakened you with only a single sentence of information - make sure to keep the best care of GATO's restaurant, currently under your management! You have a higher say over your workers, but do not abuse this power."
assignedrole = "Restaurant manager"
mirrorcanloadappearance = TRUE
/obj/effect/mob_spawn/human/fastfood/Initialize(mapload)
. = ..()
@@ -108,6 +110,7 @@
death = FALSE
roundstart = FALSE
mob_species = /datum/species/human
mirrorcanloadappearance = TRUE
/datum/outfit/feeders_den/fanatic
name = "Feeder Fanatic"
@@ -152,6 +155,7 @@
death = FALSE
roundstart = FALSE
mob_species = /datum/species/human
mirrorcanloadappearance = TRUE
/datum/outfit/feeders_den/victim
name = "Den Victim"
@@ -0,0 +1,41 @@
//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
@@ -0,0 +1,22 @@
//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'
@@ -0,0 +1 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -0,0 +1,11 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
/datum/sprite_accessory/hair/elize
name = "Elize"
icon = 'GainStation13/icons/mob/human_face.dmi'
icon_state = "hair_elize"
/datum/sprite_accessory/hair/lem
name = "Lem"
icon = 'GainStation13/icons/mob/human_face.dmi'
icon_state = "hair_lem"
@@ -0,0 +1 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -0,0 +1 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -0,0 +1,63 @@
//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
@@ -0,0 +1,55 @@
//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
//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
@@ -0,0 +1 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
@@ -0,0 +1,92 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
//snaketail
/datum/sprite_accessory/tails/lizard/snaketail //GS13 - ...6 seperate paths for one tail. Wew.
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/lizard/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/human/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/human/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/mam_tails/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails_animated/mam_tails_animated/snaketail
name = "Snaketail"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "snaketail"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
//spaded tail
/datum/sprite_accessory/tails/mam_tails/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
/datum/sprite_accessory/tails_animated/mam_tails_animated/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
/datum/sprite_accessory/tails/human/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
/datum/sprite_accessory/tails_animated/human/spade
name = "Demon Spade"
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
icon_state = "spade"
//deer tail
/datum/sprite_accessory/tails/human/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/human/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
/datum/sprite_accessory/tails/mam_tails/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
/datum/sprite_accessory/tails_animated/mam_tails_animated/deer
name = "Deer"
icon_state = "deer"
color_src = MATRIXED
icon = 'GainStation13/icons/mob/markings/mam_tails.dmi'
@@ -0,0 +1 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
+29 -5
View File
@@ -7,16 +7,18 @@
slot = ORGAN_SLOT_BELLY
w_class = 3
size = 0
shape = DEF_BELLY_SHAPE
var/statuscheck = FALSE
shape = "belly"
genital_flags = UPDATE_OWNER_APPEARANCE
masturbation_verb = "massage"
var/sent_full_message = TRUE //defaults to 1 since they're full to start
var/inflatable = FALSE //For inflation connoisseurs
var/size_cached = 0
var/prev_size = 0
layer_index = BELLY_LAYER_INDEX
/obj/item/organ/genital/belly/modify_size(modifier, min = BELLY_SIZE_DEF, max = BELLY_SIZE_MAX)
var/new_value = clamp(size_cached + modifier, min, max)
var/new_value = clamp(size_cached + modifier, starting_size, max)
if(new_value == size_cached)
return
prev_size = size_cached
@@ -26,7 +28,26 @@
..()
/obj/item/organ/genital/belly/update_appearance()
icon_state = "belly_[shape]_[size]"
//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]"
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...
@@ -42,8 +63,11 @@
if(D.species.use_skintones && D.features["genitals_use_skintone"])
color = SKINTONE2HEX(H.skin_tone)
else
color = "[D.features["belly_color"]]"
size = "[D.features["belly_size"]]"
color = "#[D.features["belly_color"]]"
size = D.features["belly_size"]
starting_size = D.features["belly_size"]
shape = D.features["belly_shape"]
inflatable = D.features["inflatable_belly"]
toggle_visibility(D.features["belly_visibility"], FALSE)
@@ -2,7 +2,7 @@
if(!ishuman(src))
return
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reducion_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reduction_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
fullness -= amount // Remove Fullness
@@ -239,7 +239,10 @@
fatness_delay += (H.fatness / FATNESS_LEVEL_IMMOBILE) * FATNESS_WEAKLEGS_MODIFIER
fatness_delay = min(fatness_delay, 60)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
if(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)
if(HAS_TRAIT(H, TRAIT_BLOB))
handle_fatness_trait(
@@ -13,6 +13,7 @@
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/glyphid_slammer
name = "Glyphid slammer"
@@ -26,3 +27,4 @@
shot_glass_icon_state = "shotglassbrown"
pH = 4.5
value = 0.1
use_gs_icon = TRUE
@@ -11,6 +11,7 @@
glass_name = "belly bloats"
glass_desc = "The perfect mix to be big and merry with."
shot_glass_icon_state = "shotglassbrown"
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/belly_bloats/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -30,6 +31,7 @@
glass_name = "blobby mary"
glass_desc = "For the morbidly obese ladies and gentlemen."
shot_glass_icon_state = "shotglassred"
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/blobby_mary/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -49,6 +51,7 @@
glass_name = "beltbuster mead"
glass_desc = "The ambrosia of the blubbery gods."
shot_glass_icon_state = "shotglassgold"
use_gs_icon = TRUE
/datum/reagent/consumable/ethanol/beltbuster_mead/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -67,6 +70,7 @@
glass_name = "heavy cafe"
glass_desc = "To enjoy slow mornings with."
shot_glass_icon_state = "shotglassbrown"
use_gs_icon = TRUE
/datum/reagent/consumable/heavy_cafe/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-5)
@@ -92,6 +96,7 @@
glass_name = "fruits tea"
glass_desc = "Goes down really easy and stays there for a long time."
shot_glass_icon_state = "shotglassgold"
use_gs_icon = TRUE
/datum/reagent/consumable/fruits_tea/on_mob_life(mob/living/carbon/M)
M.dizziness = max(0,M.dizziness-2)
@@ -118,6 +123,7 @@
glass_name = "snakebite"
glass_desc = "Won't hurt like a real bite, but you'll still regert drinking this."
shot_glass_icon_state = "shotglassgreen"
use_gs_icon = TRUE
/datum/reagent/consumable/snakebite/on_mob_life(mob/living/carbon/M)
if(M && M?.client?.prefs.weight_gain_food) // GS13
@@ -0,0 +1,17 @@
// GS13 subtle glitters
/datum/reagent/glitter/pink_subtle
name = "lesser pink glitter"
description = "pink sparkles that get everywhere. these ones seem lower density than normal."
color = "#ff8080" //A light pink color
glitter_type = /obj/effect/decal/cleanable/glitter/pink_subtle
/datum/reagent/glitter/white_subtle
name = "lesser white glitter"
description = "white sparkles that get everywhere. these ones seem lower density than normal."
glitter_type = /obj/effect/decal/cleanable/glitter/white_subtle
/datum/reagent/glitter/blue_subtle
name = "lesser blue glitter"
description = "blue sparkles that get everywhere. these ones seem lower density than normal."
color = "#4040FF" //A blueish color
glitter_type = /obj/effect/decal/cleanable/glitter/blue_subtle
@@ -5,7 +5,7 @@
name = "lipoifier"
id = /datum/reagent/consumable/lipoifier
results = list(/datum/reagent/consumable/lipoifier = 3)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cornoil = 1, /datum/reagent/medicine/synthflesh = 1)
required_reagents = list(/datum/reagent/consumable/caramel = 1, /datum/reagent/consumable/cornoil = 1, /datum/reagent/medicine/synthflesh = 1)
/datum/chemical_reaction/lipolicide
@@ -0,0 +1,20 @@
///////////////////////////////// SUBTLE GLITTERS ////////////////////////////
/datum/chemical_reaction/lesser_pink
name = "pink glitter dilution"
id = "lesser_pink_glitter"
results = list(/datum/reagent/glitter/pink_subtle = 2)
required_reagents = list(/datum/reagent/glitter/pink = 1, /datum/reagent/space_cleaner = 1) //You clean some of it away, I guess?
/datum/chemical_reaction/lesser_white
name = "white glitter dilution"
id = "lesser_white_glitter"
results = list(/datum/reagent/glitter/white_subtle = 2)
required_reagents = list(/datum/reagent/glitter/white = 1, /datum/reagent/space_cleaner = 1)
/datum/chemical_reaction/lesser_blue
name = "pink glitter dilution"
id = "lesser_blue_glitter"
results = list(/datum/reagent/glitter/blue_subtle = 2)
required_reagents = list(/datum/reagent/glitter/blue = 1, /datum/reagent/space_cleaner = 1)
//Im not going to do the recolor recipes for the subtle glitters. Unless that's really wanted (except you cant even make glitter to start with so the recipes are already super niche to begin with.)
@@ -5,3 +5,43 @@
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")
@@ -0,0 +1,15 @@
/datum/design/mutagen
name = "10u Unstable Mutagen"
id = "mutagen_biogen"
build_type = BIOGENERATOR
materials = list(/datum/material/biomass = 25)
make_reagents = list(/datum/reagent/toxin/mutagen = 10)
category = list("initial","Botany Chemicals")
/datum/design/flour
name = "10u Flour"
id = "flour_biogen"
build_type = BIOGENERATOR
materials = list(/datum/material/biomass = 25)
make_reagents = list(/datum/reagent/consumable/flour = 10)
category = list("initial","Organic Materials")
@@ -0,0 +1,26 @@
/obj/item/borg/upgrade/feeding_arm
name = "food gripper module"
desc = "An extra module that allows cyborgs to grab food and drinks, and feed them to people."
icon_state = "cyborg_upgrade3"
/obj/item/borg/upgrade/feeding_arm/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
var/obj/item/gripper/food/S = new(R.module)
R.module.basic_modules += S
R.module.add_module(S, FALSE, TRUE)
/obj/item/borg/upgrade/feeding_arm/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
var/obj/item/gripper/food/S = locate() in R.module
R.module.remove_module(S, TRUE)
/obj/item/gripper/food
name = "food gripper"
desc = "A simple grasping tool for interacting with various food and drink related items."
item_flags = NOBLUDGEON
can_hold = list(
/obj/item/reagent_containers,
)
@@ -85,7 +85,7 @@
id = "bluespace_belt"
build_type = PROTOLATHE
construction_time = 100
materials = list(/datum/material/silver = 4000, /datum/material/gold = 4000, MAT_BLUESPACE = 2000, )
materials = list(/datum/material/silver = 4000, /datum/material/gold = 4000, /datum/material/bluespace = 2000, )
build_path = /obj/item/bluespace_belt
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
@@ -96,7 +96,7 @@
id = "cookie_synthesizer"
build_type = PROTOLATHE
construction_time = 100
materials = list(/datum/material/silver = 4000, /datum/material/uranium = 1000, MAT_BLUESPACE = 1000, /datum/material/calorite = 2000)
materials = list(/datum/material/silver = 4000, /datum/material/uranium = 1000, /datum/material/bluespace = 1000, /datum/material/calorite = 2000)
build_path = /obj/item/cookiesynth
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SERVICE
@@ -107,7 +107,7 @@
id = "borg_upgrade_cookiesynthesizer"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/cookiesynth
materials = list(/datum/material/iron=10000, /datum/material/gold=1500, /datum/material/uranium=250, MAT_PLASMA=1500)
materials = list(/datum/material/iron=10000, /datum/material/gold=1500, /datum/material/uranium=250, /datum/material/plasma=1500)
construction_time = 100
category = list("Cyborg Upgrade Modules")
@@ -129,6 +129,15 @@
construction_time = 100
category = list("Cyborg Upgrade Modules")
/datum/design/borg_foodgrip
name = "Cyborg Upgrade (Food Gripper)"
id = "borg_upgrade_foodgrip"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/feeding_arm
materials = list(/datum/material/iron = 8000, /datum/material/glass = 6000)
construction_time = 100
category = list("Cyborg Upgrade Modules")
//todo: make a seperate file for extra borg modules
/obj/item/borg/upgrade/cookiesynth
@@ -0,0 +1,28 @@
/turf/open/floor/mineral/titanium/old
name = "tiled floor"
icon = 'GainStation13/icons/turf/floors.dmi'
icon_state = "titanium_old"
floor_tile = /obj/item/stack/tile/mineral/titanium
broken_states = list("titanium_dam1_old","titanium_dam2_old","titanium_dam3_old","titanium_dam4_old","titanium_dam5_old")
/turf/open/floor/mineral/titanium/old/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/yellow
icon_state = "titanium_yellow_old"
/turf/open/floor/mineral/titanium/old/yellow/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/blue
icon_state = "titanium_blue_old"
/turf/open/floor/mineral/titanium/old/blue/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/white
icon_state = "titanium_white_old"
/turf/open/floor/mineral/titanium/old/white/airless
initial_gas_mix = "TEMP=2.7"
/turf/open/floor/mineral/titanium/old/purple
icon_state = "titanium_purple_old"
/turf/open/floor/mineral/titanium/purple/airless
initial_gas_mix = "TEMP=2.7"
+21
View File
@@ -0,0 +1,21 @@
/////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/dromedary
/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'
@@ -171,3 +171,55 @@
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
@@ -0,0 +1,165 @@
/////////////////////
// Tile reskinning //
/////////////////////
// Q: What is this?
// A: A simple function to allow you to change what tiles you place with a stack of tiles.
// Q: Why do it this way?
// A: This allows players more freedom to do beautiful-looking builds. Having five types of titanium tile would be clunky as heck.
// Q: Great! Can I use this for all floors?
// A: Unfortunately, this does not work on subtypes of plasteel and instead we must change the icon_state of these turfs instead, as the icon_regular_floor var that "saves" what type of floor a plasteel subtype turf was so once repaired...
// ... it'll go back to the floor it was instead of grey (medical floors turn white even after crowbaring the tile and putting it back). This stops changing turf_type from working.
/obj/item/stack/tile/mineral/titanium/attack_self(mob/user)
var/static/list/choices = list(
"Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle"),
"Yellow Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_yellow"),
"Blue Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_blue"),
"White Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_white"),
"Purple Titanium" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_purple"),
"Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old"),
"Yellow Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_yellow"),
"Blue Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_blue"),
"White Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_white"),
"Purple Titanium Tile" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shuttle_old_purple"),
)
var/choice = show_radial_menu(user, src, choices, radius = 48, require_near = TRUE)
switch(choice)
if("Titanium")
turf_type = /turf/open/floor/mineral/titanium
icon_state = "tile_shuttle"
desc = "Sleek titanium tiles."
if("Yellow Titanium")
turf_type = /turf/open/floor/mineral/titanium/yellow
icon_state = "tile_shuttle_yellow"
desc = "Sleek yellow titanium tiles."
if("Blue Titanium")
turf_type = /turf/open/floor/mineral/titanium/blue
icon_state = "tile_shuttle_blue"
desc = "Sleek blue titanium tiles."
if("White Titanium")
turf_type = /turf/open/floor/mineral/titanium/white
icon_state = "tile_shuttle_white"
desc = "Sleek white titanium tiles."
if("Purple Titanium")
turf_type = /turf/open/floor/mineral/titanium/purple
icon_state = "tile_shuttle_purple"
desc = "Sleek purple titanium tiles."
if("Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old
icon_state = "tile_shuttle_old"
desc = "Titanium floor tiles."
if("Yellow Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/yellow
icon_state = "tile_shuttle_old_yellow"
desc = "Yellow titanium floor tiles."
if("Blue Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/blue
icon_state = "tile_shuttle_old_blue"
desc = "Blue titanium floor tiles."
if("White Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/white
icon_state = "tile_shuttle_old_white"
desc = "White titanium floor tiles."
if("Purple Titanium Tile")
turf_type = /turf/open/floor/mineral/titanium/old/purple
icon_state = "tile_shuttle_old_purple"
desc = "Purple titanium floor tiles."
/obj/item/stack/tile/plasteel
desc = "Metal tiles that can be placed on top of plating. Press Z or use these to change tiles."
icon = 'GainStation13/icons/obj/tiles.dmi'
var/tile_reskin_mode
tile_reskin_mode = "plasteel"
/obj/item/stack/tile/plasteel/attack_self(mob/user)
var/static/list/choices = list(
"Plasteel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_plasteel"),
"White Plasteel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_white"),
"Dark Plasteel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_dark"),
"Chapel Flooring" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_chapel"),
"Shower" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_shower"),
"Freezer" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_freezer"),
"Kitchen" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_kitchen"),
"Grimy" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_grimy"),
"Solar Panel" = image(icon = 'GainStation13/icons/obj/tiles.dmi', icon_state = "tile_solar"),
)
var/choice = show_radial_menu(user, src, choices, radius = 48, require_near = TRUE)
switch(choice)
if("Plasteel")
turf_type = /turf/open/floor/plasteel
icon_state = "tile_plasteel"
desc = "Metal floor tiles."
tile_reskin_mode = "plasteel"
if("White Plasteel")
turf_type = /turf/open/floor/plasteel/white
icon_state = "tile_white"
desc = "White metal floor tiles."
tile_reskin_mode = "white plasteel"
if("Dark Plasteel")
turf_type = /turf/open/floor/plasteel/dark
icon_state = "tile_dark"
desc = "Dark metal floor tiles."
tile_reskin_mode = "dark plasteel"
if("Chapel Flooring")
turf_type = /turf/open/floor/plasteel/chapel
icon_state = "tile_chapel"
desc = "Those very dark floor tiles you find in the chapel a lot."
tile_reskin_mode = "chapel"
if("Shower")
turf_type = /turf/open/floor/plasteel/showroomfloor
icon_state = "tile_shower"
desc = "Tiles for showers, bathrooms and wetrooms."
tile_reskin_mode = "shower"
if("Freezer")
turf_type = /turf/open/floor/plasteel/freezer
icon_state = "tile_freezer"
desc = "High-grip flooring for walk-in freezers and chillers."
tile_reskin_mode = "freezer"
if("Kitchen")
turf_type = /turf/open/floor/plasteel/cafeteria
icon_state = "tile_kitchen"
desc = "Chequered pattern plasteel tiles."
tile_reskin_mode = "kitchen"
if("Grimy")
turf_type = /turf/open/floor/plasteel/grimy
icon_state = "tile_grimy"
desc = "I'm sure it'll look nice somewhere?"
tile_reskin_mode = "grimy"
if("Solar Panel")
turf_type = /turf/open/floor/plasteel/airless/solarpanel
icon_state = "tile_solar"
desc = "Flooring usually placed below solar panels. Using this indoors is an intergalactic fashion crime."
tile_reskin_mode = "solar"
/turf/open/floor/plasteel/attackby(obj/item/reskinstack, mob/user, params)
if(istype(reskinstack, /obj/item/stack/tile/plasteel))
var/obj/item/stack/tile/plasteel/hitfloor = reskinstack
switch(hitfloor.tile_reskin_mode)
if("plasteel")
icon_state = "floor"
icon_regular_floor = "floor"
if("white plasteel")
icon_state = "white"
icon_regular_floor = "white"
if("dark plasteel")
icon_state = "darkfull"
icon_regular_floor = "darkfull"
if("chapel")
icon_state = "chapel_alt"
icon_regular_floor = "chapel_alt"
if("shower")
icon_state = "showroomfloor"
icon_regular_floor = "showroomfloor"
if("freezer")
icon_state = "freezerfloor"
icon_regular_floor = "freezerfloor"
if("kitchen")
icon_state = "cafeteria"
icon_regular_floor = "cafeteria"
if("grimy")
icon_state = "grimy"
icon_regular_floor = "grimy"
if("solar")
icon_state = "solarpanel"
icon_regular_floor = "solarpanel"
else return
+1 -1
View File
@@ -115,4 +115,4 @@
mineralSpawnChanceList = list(
/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, /obj/item/stack/ore/titanium = 11,
/obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40,
/turf/closed/mineral/gibtonite/volcanic = 4, /obj/item/stack/ore/bluespace_crystal = 1, /obj/item/strangerock = 15, /obj/item/stack/ore/calorite = 1,) //GS13 EDIT
/turf/closed/mineral/gibtonite/volcanic = 4, /obj/item/stack/ore/bluespace_crystal = 1, /obj/item/strangerock = 30, /obj/item/stack/ore/calorite = 1,) //GS13 EDIT
+19 -19
View File
@@ -388,7 +388,7 @@
desc = "A hammer that destroys 1 cm of debris."
id = "hammercm1"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/hammer/cm1
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -398,7 +398,7 @@
desc = "A hammer that destroys 2 cm of debris."
id = "hammercm2"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/hammer/cm2
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -408,7 +408,7 @@
desc = "A hammer that destroys 3 cm of debris."
id = "hammercm3"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/hammer/cm3
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -418,7 +418,7 @@
desc = "A hammer that destroys 4 cm of debris."
id = "hammercm4"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/hammer/cm4
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -428,7 +428,7 @@
desc = "A hammer that destroys 5 cm of debris."
id = "hammercm5"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/hammer/cm5
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -438,7 +438,7 @@
desc = "A hammer that destroys 6 cm of debris."
id = "hammercm6"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/hammer/cm6
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -448,7 +448,7 @@
desc = "A hammer that destroys 15 cm of debris."
id = "hammercm15"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/hammer/cm15
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -458,7 +458,7 @@
desc = "A hammer that destroys up to 30 cm of debris."
id = "hammercmadv"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 1500)
materials = list(/datum/material/plastic = 1500)
build_path = /obj/item/xenoarch/clean/hammer/advanced
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -468,7 +468,7 @@
desc = "A brush that cleans debris."
id = "hammerbrush"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/clean/brush/basic
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -478,7 +478,7 @@
desc = "A brush that cleans debris."
id = "hammerbrushadv"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 1500)
materials = list(/datum/material/plastic = 1500)
build_path = /obj/item/xenoarch/clean/brush/adv
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -490,7 +490,7 @@
desc = "A tool that scans depths of rocks."
id = "xenoscanner"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/help/scanner
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -500,7 +500,7 @@
desc = "A tool that scans depths of rocks."
id = "advxenoscanner"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 1500)
materials = list(/datum/material/plastic = 1500)
build_path = /obj/item/xenoarch/help/scanneradv
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -510,7 +510,7 @@
desc = "A tool to measure the dug depth of rocks."
id = "xenomeasure"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 500)
materials = list(/datum/material/plastic = 500)
build_path = /obj/item/xenoarch/help/measuring
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -520,7 +520,7 @@
desc = "A tool used to get research points from artifacts."
id = "xenoresearch"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 1000)
materials = list(/datum/material/plastic = 1000)
build_path = /obj/item/xenoarch/help/research
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -530,7 +530,7 @@
desc = "A tool to extract the seeds from prehistoric fossils."
id = "xenoplant"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 1000)
materials = list(/datum/material/plastic = 1000)
build_path = /obj/item/xenoarch/help/plant
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -540,7 +540,7 @@
desc = "A tool used to sell items, virtually."
id = "advcargoscanner"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 1000, MAT_BLUESPACE = 1000)
materials = list(/datum/material/plastic = 1000, /datum/material/bluespace = 1000)
build_path = /obj/item/xenoarch/help/cargo
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_CARGO
@@ -550,7 +550,7 @@
desc = "A belt used to store some xenoarch tools."
id = "xenobelt"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 2000)
materials = list(/datum/material/plastic = 2000)
build_path = /obj/item/storage/belt/xenoarch
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -560,7 +560,7 @@
desc = "A bag used to store 10 strange rocks."
id = "xenorockback"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 2000)
materials = list(/datum/material/plastic = 2000)
build_path = /obj/item/storage/bag/strangerock
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
@@ -570,7 +570,7 @@
desc = "A bluespace bag used to store 50 strange rocks."
id = "xenorockbackadv"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 2000, MAT_BLUESPACE = 1000)
materials = list(/datum/material/plastic = 2000, /datum/material/bluespace = 1000)
build_path = /obj/item/storage/bag/strangerockadv
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 879 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

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