Merge branch 'master' of https://github.com/sheepishgoat/GS13-Citadel into maps-we-got-them
@@ -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
|
||||
@@ -11,7 +11,7 @@ jobs:
|
||||
name: Update the TGS DMAPI
|
||||
steps:
|
||||
- name: Clone
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Branch
|
||||
run: |
|
||||
|
||||
@@ -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}"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 595 B |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 227 KiB |
|
After Width: | Height: | Size: 1013 B |
|
After Width: | Height: | Size: 879 B |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 107 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 72 KiB |