mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-28 22:48:38 +01:00
Merge branch 'master' of https://github.com/SweetBlueSylveon/VOREStation
This commit is contained in:
@@ -60,8 +60,8 @@ Then in our `handle_grabs_vr()` proc, if we want to avoid performing the stock g
|
||||
|
||||
### Pull Requests
|
||||
|
||||
* Your submission must pass Travis CI checking. The checks are important, prevent many common mistakes, and even experienced coders get caught by it sometimes. If you think there is a bug in Travis, open an issue. (One known Travis issue is comments in the middle of multi-line lists, just don't do it)
|
||||
* Your PR should not have an excessive number of commits unless it is a large project or includes many separate remote commits (such as a pull from Polaris). If you need to keep tweaking your PR to pass Travis or to satisfy a maintainer's requests and are making many commits, you should squash them in the end and update your PR accordingly so these commits don't clog up the history.
|
||||
* Your submission must pass CI checking. The checks are important, prevent many common mistakes, and even experienced coders get caught by it sometimes. If you think there is a bug in CI, open an issue. (One known CI issue is comments in the middle of multi-line lists, just don't do it)
|
||||
* Your PR should not have an excessive number of commits unless it is a large project or includes many separate remote commits (such as a pull from Polaris). If you need to keep tweaking your PR to pass CI or to satisfy a maintainer's requests and are making many commits, you should squash them in the end and update your PR accordingly so these commits don't clog up the history.
|
||||
* You can create a WIP PR, and if so, please mark it with [WIP] in the title so it can be labeled appropriately. These can't sit forever, though.
|
||||
* If your pull request has many no-conflict merge commits ('merge from master' into your PR branch), it cannot be merged. Squash and make a new PR/forcepush to your PR branch.
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
name: Autochangelog
|
||||
on:
|
||||
pull_request:
|
||||
types: closed
|
||||
branches:
|
||||
- master
|
||||
|
||||
env:
|
||||
BASENAME: "polaris"
|
||||
|
||||
jobs:
|
||||
autochangelog:
|
||||
name: Autochangelog
|
||||
runs-on: ubuntu-16.04
|
||||
if: github.event.pull_request.merged == true
|
||||
steps:
|
||||
- uses: /actions/checkout@v2
|
||||
- name: Ensure +x on CI directory
|
||||
run: |
|
||||
chmod -R +x ./tools/ci
|
||||
- uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.7'
|
||||
- name: Generate Changelog
|
||||
run: |
|
||||
pip install pyyaml
|
||||
python tools/GenerateChangelog/ss13_autochangelog.py \
|
||||
html/changelogs \
|
||||
${{ github.event.pull_request.number }} \
|
||||
"${{ github.event.pull_request.user.login }}" \
|
||||
"${{ github.event.pull_request.body }}"
|
||||
python tools/GenerateChangelog/ss13_genchangelog.py \
|
||||
html/changelog.html \
|
||||
html/changelogs
|
||||
- uses: stefanzweifel/git-auto-commit-action@v4
|
||||
with:
|
||||
commit_message: Automatic changelog generation for ${{ github.events.pull_request.number }}
|
||||
branch: ${{ github.events.pull_request.base }}
|
||||
commit_user_name: Autochangelog Bot
|
||||
@@ -0,0 +1,69 @@
|
||||
name: CI
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
env:
|
||||
BASENAME: "vorestation"
|
||||
|
||||
jobs:
|
||||
file_tests:
|
||||
name: Run Linters
|
||||
runs-on: ubuntu-16.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Ensure +x on CI directory
|
||||
run: |
|
||||
chmod -R +x ./tools/ci
|
||||
- name: Install Tools
|
||||
run: |
|
||||
bash tools/ci/install_build_deps.sh
|
||||
- name: Run Tests
|
||||
run: |
|
||||
tools/ci/validate_files.sh
|
||||
tools/ci/build_tgui.sh
|
||||
|
||||
unit_tests:
|
||||
name: Integration Tests
|
||||
runs-on: ubuntu-16.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Ensure +x on CI directory
|
||||
run: |
|
||||
chmod -R +x ./tools/ci
|
||||
- name: Setup Cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: $HOME/BYOND
|
||||
key: ${{ runner.os }}-byond
|
||||
- name: Install RUST_G Dependencies
|
||||
run: |
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo apt update || true
|
||||
sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 g++-7 g++-7-multilib gcc-multilib zlib1g:i386
|
||||
ldd librust_g.so
|
||||
- name: Unit Tests
|
||||
run: |
|
||||
tools/ci/install_byond.sh
|
||||
tools/ci/compile_and_run.sh
|
||||
env:
|
||||
TEST_DEFINE: "UNIT_TEST"
|
||||
TEST_FILE: "code/_unit_tests.dm"
|
||||
RUN: "1"
|
||||
- name: Compile POIs (no run)
|
||||
run: |
|
||||
tools/ci/install_byond.sh
|
||||
tools/ci/compile_and_run.sh
|
||||
env:
|
||||
TEST_DEFINE: "MAP_TEST"
|
||||
TEST_FILE: "code/_map_tests.dm"
|
||||
RUN: "0"
|
||||
- name: Compile away missions (no run)
|
||||
run: |
|
||||
tools/ci/install_byond.sh
|
||||
tools/ci/compile_and_run.sh
|
||||
env:
|
||||
TEST_DEFINE: "AWAY_MISSION_TEST"
|
||||
TEST_FILE: "code/_away_mission_tests.dm"
|
||||
RUN: "0"
|
||||
@@ -6,7 +6,8 @@
|
||||
name: 'Render Nanomaps'
|
||||
on:
|
||||
push:
|
||||
branches: master
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- 'maps/**'
|
||||
|
||||
@@ -15,21 +16,37 @@ jobs:
|
||||
name: 'Generate NanoMaps'
|
||||
runs-on: ubuntu-18.04
|
||||
steps:
|
||||
- name: 'Update Branch'
|
||||
- name: Clone
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: 'Generate Maps'
|
||||
- name: Branch
|
||||
run: |
|
||||
git fetch origin
|
||||
git branch -f nanomaps_generation
|
||||
git checkout nanomaps_generation
|
||||
git reset --hard origin/master
|
||||
|
||||
- name: Ensure +x on github-actions directory
|
||||
run: chmod -R +x ./tools/github-actions
|
||||
|
||||
- name: Generate Maps
|
||||
run: './tools/github-actions/nanomap-renderer-invoker.sh'
|
||||
|
||||
- name: 'Commit Maps'
|
||||
- name: Commit Maps
|
||||
run: |
|
||||
git config --local user.email "action@github.com"
|
||||
git config --local user.name "NanoMap Generation"
|
||||
git pull origin master
|
||||
git add .
|
||||
git commit -m "NanoMap Auto-Update (`date`)" -a || true
|
||||
- name: 'Push Maps'
|
||||
uses: ad-m/github-push-action@master
|
||||
git push -f -u origin nanomaps_generation
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: repo-sync/pull-request@v2
|
||||
with:
|
||||
source_branch: "nanomaps_generation"
|
||||
destination_branch: "master"
|
||||
pr_title: "Automatic NanoMap Update"
|
||||
pr_body: "This pull request updates the nanomap images to the latest version of the map."
|
||||
pr_label: "Infrastructure"
|
||||
pr_allow_empty: false
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
-62
@@ -1,62 +0,0 @@
|
||||
language: generic
|
||||
os: linux
|
||||
dist: bionic
|
||||
|
||||
env:
|
||||
global:
|
||||
- BASENAME="vorestation" # $BASENAME.dmb, $BASENAME.dme, etc.
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/BYOND
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libc6:i386
|
||||
- libgcc1:i386
|
||||
- libstdc++6:i386
|
||||
- libssl1.1:i386
|
||||
- g++-7
|
||||
- g++-7-multilib
|
||||
- gcc-multilib
|
||||
- zlib1g:i386
|
||||
|
||||
before_install:
|
||||
- chmod -R +x ./tools/travis
|
||||
|
||||
install:
|
||||
- ./tools/travis/install_byond.sh
|
||||
|
||||
before_script:
|
||||
- shopt -s globstar
|
||||
|
||||
script:
|
||||
- ldd librust_g.so
|
||||
- ./tools/travis/compile_and_run.sh
|
||||
|
||||
# Build-specific settings
|
||||
jobs:
|
||||
include:
|
||||
- stage: "File Tests" #This is the odd man out, with specific installs and stuff.
|
||||
name: "Validate Files"
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- python3
|
||||
- python3-pip
|
||||
- python3-setuptools
|
||||
install: #Need python for some of the tag matching stuff
|
||||
- tools/travis/install_build_deps.sh
|
||||
script:
|
||||
- tools/travis/validate_files.sh
|
||||
- tools/travis/build_tgui.sh
|
||||
- stage: "Unit Tests"
|
||||
env: TEST_DEFINE="UNIT_TEST" TEST_FILE="code/_unit_tests.dm" RUN="1"
|
||||
name: "Compile normally (unit tests)"
|
||||
- stage: "Isolation Tests"
|
||||
env: TEST_DEFINE="MAP_TEST" TEST_FILE="code/_map_tests.dm" RUN="0"
|
||||
name: "Compile POIs (no run)"
|
||||
- env: TEST_DEFINE="AWAY_MISSION_TEST" TEST_FILE="code/_away_mission_tests.dm" RUN="0"
|
||||
name: "Compile away missions (no run)"
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
export SPACEMANDMM_TAG=suite-1.4
|
||||
# For NanoUI + TGUI
|
||||
export NODE_VERSION=12
|
||||
# For the scripts in tools
|
||||
export PHP_VERSION=7.2
|
||||
# Byond Major
|
||||
export BYOND_MAJOR=513
|
||||
# Byond Minor
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/obj/machinery/atmospherics/pipe/tank/phoron/full
|
||||
start_pressure = 15000
|
||||
|
||||
/obj/machinery/atmospherics/pipe/tank/air/full
|
||||
start_pressure = 15000
|
||||
@@ -9,30 +9,17 @@
|
||||
#define DM_SIZE_STEAL "Size Steal"
|
||||
#define DM_HEAL "Heal"
|
||||
#define DM_EGG "Encase In Egg"
|
||||
#define DM_TRANSFORM "Transform"
|
||||
|
||||
//#define DM_ITEMWEAK "Digest (Item Friendly)"
|
||||
//#define DM_STRIPDIGEST "Strip Digest (Items Only)"
|
||||
//#define DM_DIGEST_NUMB "Digest (Numbing)"
|
||||
|
||||
//TF modes
|
||||
#define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)"
|
||||
#define DM_TRANSFORM_MALE "Transform (Male)"
|
||||
#define DM_TRANSFORM_FEMALE "Transform (Female)"
|
||||
#define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)"
|
||||
#define DM_TRANSFORM_REPLICA "Transform (Replica Of Self)"
|
||||
#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR "Transform (Change Species and Taur)"
|
||||
#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)"
|
||||
#define DM_TRANSFORM_REPLICA_EGG "Transform (Replica Of Self) (EGG)"
|
||||
#define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)"
|
||||
#define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)"
|
||||
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
|
||||
|
||||
//Addon mode flags
|
||||
#define DM_FLAG_NUMBING 0x1
|
||||
#define DM_FLAG_STRIPPING 0x2
|
||||
#define DM_FLAG_LEAVEREMAINS 0x4
|
||||
#define DM_FLAG_THICKBELLY 0x8
|
||||
#define DM_FLAG_AFFECTWORN 0x10
|
||||
|
||||
//Item related modes
|
||||
#define IM_HOLD "Hold"
|
||||
|
||||
+14
-1
@@ -157,6 +157,8 @@
|
||||
#define MAT_GRAPHITE "graphite"
|
||||
#define MAT_LEATHER "leather"
|
||||
#define MAT_CHITIN "chitin"
|
||||
#define MAT_CLOTH "cloth"
|
||||
#define MAT_SYNCLOTH "syncloth"
|
||||
|
||||
#define SHARD_SHARD "shard"
|
||||
#define SHARD_SHRAPNEL "shrapnel"
|
||||
@@ -480,4 +482,15 @@ GLOBAL_LIST_INIT(all_volume_channels, list(
|
||||
VOLUME_CHANNEL_ALARMS,
|
||||
VOLUME_CHANNEL_VORE,
|
||||
VOLUME_CHANNEL_DOORS,
|
||||
))
|
||||
))
|
||||
|
||||
#define APPEARANCECHANGER_CHANGED_RACE "Race"
|
||||
#define APPEARANCECHANGER_CHANGED_GENDER "Gender"
|
||||
#define APPEARANCECHANGER_CHANGED_GENDER_ID "Gender Identity"
|
||||
#define APPEARANCECHANGER_CHANGED_SKINTONE "Skin Tone"
|
||||
#define APPEARANCECHANGER_CHANGED_SKINCOLOR "Skin Color"
|
||||
#define APPEARANCECHANGER_CHANGED_HAIRSTYLE "Hair Style"
|
||||
#define APPEARANCECHANGER_CHANGED_HAIRCOLOR "Hair Color"
|
||||
#define APPEARANCECHANGER_CHANGED_F_HAIRSTYLE "Facial Hair Style"
|
||||
#define APPEARANCECHANGER_CHANGED_F_HAIRCOLOR "Facial Hair Color"
|
||||
#define APPEARANCECHANGER_CHANGED_EYES "Eye Color"
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#define BORGMESON 0x1
|
||||
#define BORGTHERM 0x2
|
||||
#define BORGXRAY 0x4
|
||||
#define BORGMATERIAL 8
|
||||
#define BORGMATERIAL 0x8
|
||||
|
||||
#define STANCE_ATTACK 11 // Backwards compatability
|
||||
#define STANCE_ATTACKING 12 // Ditto
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
#define LANGUAGE_ALAI "Alai"
|
||||
#define LANGUAGE_ZADDAT "Vedahq"
|
||||
#define LANGUAGE_PROMETHEAN "Promethean Biolinguistics"
|
||||
#define LANGUAGE_BLOB "Blob"
|
||||
#define LANGUAGE_BLOB "Chemosense Transmission"
|
||||
#define LANGUAGE_GIBBERISH "Babel"
|
||||
|
||||
// Language flags.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
*
|
||||
* This file is used by Travis to indicate that additional maps need to be compiled to look for errors such as missing paths.
|
||||
* Do not add anything but the AWAY_MISSION_TEST definition here as it will be overwritten by Travis when running tests.
|
||||
* This file is used by CI to indicate that additional maps need to be compiled to look for errors such as missing paths.
|
||||
* Do not add anything but the AWAY_MISSION_TEST definition here as it will be overwritten by CI when running tests.
|
||||
*
|
||||
*
|
||||
* Should you wish to edit set AWAY_MISSION_TEST to 1 like so:
|
||||
|
||||
@@ -215,7 +215,7 @@ var/global/list/string_slot_flags = list(
|
||||
GLOB.closet_appearances[T] = app
|
||||
|
||||
// VOREStation Add - Vore Modes!
|
||||
paths = typesof(/datum/digest_mode) - /datum/digest_mode/transform
|
||||
paths = typesof(/datum/digest_mode)
|
||||
for(var/T in paths)
|
||||
var/datum/digest_mode/DM = new T
|
||||
GLOB.digest_modes[DM.id] = DM
|
||||
|
||||
@@ -3,13 +3,16 @@
|
||||
*/
|
||||
|
||||
var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type
|
||||
var/global/list/hair_accesories_list= list()// Stores /datum/sprite_accessory/hair_accessory indexed by type
|
||||
var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type
|
||||
var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type
|
||||
var/global/list/negative_traits = list() // Negative custom species traits, indexed by path
|
||||
var/global/list/neutral_traits = list() // Neutral custom species traits, indexed by path
|
||||
var/global/list/everyone_traits = list() // Neutral traits available to all species, indexed by path
|
||||
var/global/list/positive_traits = list() // Positive custom species traits, indexed by path
|
||||
var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup
|
||||
var/global/list/all_traits = list() // All of 'em at once (same instances)
|
||||
var/global/list/active_ghost_pods = list()
|
||||
|
||||
var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list
|
||||
|
||||
@@ -105,30 +108,66 @@ var/global/list/fancy_release_sounds = list(
|
||||
)
|
||||
|
||||
var/global/list/global_vore_egg_types = list(
|
||||
"Unathi" = UNATHI_EGG,
|
||||
"Tajaran" = TAJARAN_EGG,
|
||||
"Akula" = AKULA_EGG,
|
||||
"Skrell" = SKRELL_EGG,
|
||||
"Nevrean" = NEVREAN_EGG,
|
||||
"Sergal" = SERGAL_EGG,
|
||||
"Human" = HUMAN_EGG,
|
||||
"Slime" = SLIME_EGG,
|
||||
"Egg" = EGG_EGG,
|
||||
"Xenochimera" = XENOCHIMERA_EGG,
|
||||
"Xenomorph" = XENOMORPH_EGG)
|
||||
"Unathi",
|
||||
"Tajara",
|
||||
"Akula",
|
||||
"Skrell",
|
||||
"Sergal",
|
||||
"Nevrean",
|
||||
"Human",
|
||||
"Slime",
|
||||
"Egg",
|
||||
"Xenochimera",
|
||||
"Xenomorph",
|
||||
"Chocolate",
|
||||
"Boney",
|
||||
"Slime glob",
|
||||
"Chicken",
|
||||
"Synthetic",
|
||||
"Cooking error",
|
||||
"Escape pod",
|
||||
"Web cocoon",
|
||||
"Bug cocoon",
|
||||
"Rock",
|
||||
"Yellow",
|
||||
"Blue",
|
||||
"Green",
|
||||
"Orange",
|
||||
"Purple",
|
||||
"Red",
|
||||
"Rainbow",
|
||||
"Spotted pink")
|
||||
|
||||
var/global/list/tf_vore_egg_types = list(
|
||||
"Unathi" = /obj/structure/closet/secure_closet/egg/unathi,
|
||||
"Tajara" = /obj/structure/closet/secure_closet/egg/tajaran,
|
||||
"Akula" = /obj/structure/closet/secure_closet/egg/shark,
|
||||
"Skrell" = /obj/structure/closet/secure_closet/egg/skrell,
|
||||
"Sergal" = /obj/structure/closet/secure_closet/egg/sergal,
|
||||
"Nevrean" = /obj/structure/closet/secure_closet/egg/nevrean,
|
||||
"Human" = /obj/structure/closet/secure_closet/egg/human,
|
||||
"Slime" = /obj/structure/closet/secure_closet/egg/slime,
|
||||
"Egg" = /obj/structure/closet/secure_closet/egg,
|
||||
"Xenochimera" = /obj/structure/closet/secure_closet/egg/scree,
|
||||
"Xenomorph" = /obj/structure/closet/secure_closet/egg/xenomorph)
|
||||
"Unathi" = /obj/item/weapon/storage/vore_egg/unathi,
|
||||
"Tajara" = /obj/item/weapon/storage/vore_egg/tajaran,
|
||||
"Akula" = /obj/item/weapon/storage/vore_egg/shark,
|
||||
"Skrell" = /obj/item/weapon/storage/vore_egg/skrell,
|
||||
"Sergal" = /obj/item/weapon/storage/vore_egg/sergal,
|
||||
"Nevrean" = /obj/item/weapon/storage/vore_egg/nevrean,
|
||||
"Human" = /obj/item/weapon/storage/vore_egg/human,
|
||||
"Slime" = /obj/item/weapon/storage/vore_egg/slime,
|
||||
"Egg" = /obj/item/weapon/storage/vore_egg,
|
||||
"Xenochimera" = /obj/item/weapon/storage/vore_egg/scree,
|
||||
"Xenomorph" = /obj/item/weapon/storage/vore_egg/xenomorph,
|
||||
"Chocolate" = /obj/item/weapon/storage/vore_egg/chocolate,
|
||||
"Boney" = /obj/item/weapon/storage/vore_egg/owlpellet,
|
||||
"Slime glob" = /obj/item/weapon/storage/vore_egg/slimeglob,
|
||||
"Chicken" = /obj/item/weapon/storage/vore_egg/chicken,
|
||||
"Synthetic" = /obj/item/weapon/storage/vore_egg/synthetic,
|
||||
"Cooking error" = /obj/item/weapon/storage/vore_egg/badrecipe,
|
||||
"Escape pod" = /obj/item/weapon/storage/vore_egg/escapepod,
|
||||
"Web cocoon" = /obj/item/weapon/storage/vore_egg/cocoon,
|
||||
"Bug cocoon" = /obj/item/weapon/storage/vore_egg/bugcocoon,
|
||||
"Rock" = /obj/item/weapon/storage/vore_egg/rock,
|
||||
"Yellow" = /obj/item/weapon/storage/vore_egg/yellow,
|
||||
"Blue" = /obj/item/weapon/storage/vore_egg/blue,
|
||||
"Green" = /obj/item/weapon/storage/vore_egg/green,
|
||||
"Orange" = /obj/item/weapon/storage/vore_egg/orange,
|
||||
"Purple" = /obj/item/weapon/storage/vore_egg/purple,
|
||||
"Red" = /obj/item/weapon/storage/vore_egg/red,
|
||||
"Rainbow" = /obj/item/weapon/storage/vore_egg/rainbow,
|
||||
"Spotted pink" = /obj/item/weapon/storage/vore_egg/pinkspots)
|
||||
|
||||
var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars,
|
||||
@@ -179,7 +218,8 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
|
||||
/obj/item/weapon/storage/fancy/cigarettes,
|
||||
/obj/item/weapon/storage/fancy/crayons,
|
||||
/obj/item/weapon/storage/fancy/egg_box,
|
||||
/obj/item/weapon/storage/wallet)
|
||||
/obj/item/weapon/storage/wallet,
|
||||
/obj/item/weapon/storage/vore_egg)
|
||||
|
||||
var/global/list/contamination_flavors = list(
|
||||
"Generic" = contamination_flavors_generic,
|
||||
@@ -451,6 +491,12 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
var/datum/sprite_accessory/wing/instance = new path()
|
||||
wing_styles_list[path] = instance
|
||||
|
||||
// Custom Hair Accessories
|
||||
paths = typesof(/datum/sprite_accessory/hair_accessory) - /datum/sprite_accessory/hair_accessory
|
||||
for(var/path in paths)
|
||||
var/datum/sprite_accessory/hair_accessory/instance = new path()
|
||||
hair_accesories_list[path] = instance
|
||||
|
||||
// Custom species traits
|
||||
paths = typesof(/datum/trait) - /datum/trait
|
||||
for(var/path in paths)
|
||||
@@ -465,6 +511,8 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
negative_traits[path] = instance
|
||||
if(0)
|
||||
neutral_traits[path] = instance
|
||||
if(!(instance.custom_only))
|
||||
everyone_traits[path] = instance
|
||||
if(0.1 to INFINITY)
|
||||
positive_traits[path] = instance
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
input = replace_characters(input, list("\n"=" ","\t"=" "))
|
||||
|
||||
if(encode)
|
||||
// The below \ escapes have a space inserted to attempt to enable Travis auto-checking of span class usage. Please do not remove the space.
|
||||
// The below \ escapes have a space inserted to attempt to enable CI auto-checking of span class usage. Please do not remove the space.
|
||||
//In addition to processing html, html_encode removes byond formatting codes like "\ red", "\ i" and other.
|
||||
//It is important to avoid double-encode text, it can "break" quotes and some other characters.
|
||||
//Also, keep in mind that escaped characters don't work in the interface (window titles, lower left corner of the main window, etc.)
|
||||
|
||||
@@ -1178,12 +1178,19 @@ proc/is_hot(obj/item/W as obj)
|
||||
|
||||
// check if mob is lying down on something we can operate him on.
|
||||
// The RNG with table/rollerbeds comes into play in do_surgery() so that fail_step() can be used instead.
|
||||
/proc/can_operate(mob/living/carbon/M)
|
||||
return M.lying
|
||||
/proc/can_operate(mob/living/carbon/M, mob/living/user)
|
||||
. = M.lying
|
||||
|
||||
if(user && M == user && user.allow_self_surgery && user.a_intent == I_HELP) // You can, technically, always operate on yourself after standing still. Inadvised, but you can.
|
||||
|
||||
if(!M.isSynthetic())
|
||||
. = TRUE
|
||||
|
||||
return .
|
||||
|
||||
// Returns an instance of a valid surgery surface.
|
||||
/mob/living/proc/get_surgery_surface()
|
||||
if(!lying)
|
||||
/mob/living/proc/get_surgery_surface(mob/living/user)
|
||||
if(!lying && user != src)
|
||||
return null // Not lying down means no surface.
|
||||
var/obj/surface = null
|
||||
for(var/obj/O in loc) // Looks for the best surface.
|
||||
@@ -1283,6 +1290,9 @@ var/mob/dview/dview_mob = new
|
||||
/proc/dview(var/range = world.view, var/center, var/invis_flags = 0)
|
||||
if(!center)
|
||||
return
|
||||
if(!dview_mob) //VOREStation Add: Debugging
|
||||
dview_mob = new
|
||||
log_error("Had to recreate the dview mob!")
|
||||
|
||||
dview_mob.loc = center
|
||||
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
*
|
||||
* This file is used by Travis to indicate that additional maps need to be compiled to look for errors such as missing paths.
|
||||
* Do not add anything but the MAP_TEST definition here as it will be overwritten by Travis when running tests.
|
||||
* This file is used by CI to indicate that additional maps need to be compiled to look for errors such as missing paths.
|
||||
* Do not add anything but the MAP_TEST definition here as it will be overwritten by CI when running tests.
|
||||
*
|
||||
*
|
||||
* Should you wish to edit set MAP_TEST to 1 like so:
|
||||
|
||||
+5
-10
@@ -354,19 +354,13 @@
|
||||
facedir(direction)
|
||||
|
||||
/obj/screen/click_catcher
|
||||
name = "Darkness"
|
||||
icon = 'icons/mob/screen_gen.dmi'
|
||||
icon_state = "click_catcher"
|
||||
plane = CLICKCATCHER_PLANE
|
||||
layer = LAYER_HUD_UNDER
|
||||
mouse_opacity = 2
|
||||
screen_loc = "CENTER-7,CENTER-7"
|
||||
|
||||
/obj/screen/click_catcher/proc/MakeGreed()
|
||||
. = list()
|
||||
for(var/i = 0, i<15, i++)
|
||||
for(var/j = 0, j<15, j++)
|
||||
var/obj/screen/click_catcher/CC = new()
|
||||
CC.screen_loc = "NORTH-[i],EAST-[j]"
|
||||
. += CC
|
||||
screen_loc = "SOUTHWEST to NORTHEAST"
|
||||
|
||||
/obj/screen/click_catcher/Click(location, control, params)
|
||||
var/list/modifiers = params2list(params)
|
||||
@@ -374,7 +368,8 @@
|
||||
var/mob/living/carbon/C = usr
|
||||
C.swap_hand()
|
||||
else
|
||||
var/turf/T = screen_loc2turf(screen_loc, get_turf(usr))
|
||||
var/list/P = params2list(params)
|
||||
var/turf/T = screen_loc2turf(P["screen-loc"], get_turf(usr))
|
||||
if(T)
|
||||
T.Click(location, control, params)
|
||||
. = 1
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
|
||||
#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
|
||||
#define ui_shadekin_display "EAST-1:28,CENTER-3:15"
|
||||
#define ui_xenochimera_danger_display "EAST-1:28,CENTER-3:15"
|
||||
@@ -14,7 +14,7 @@
|
||||
var/other = list()
|
||||
var/hotkeybuttons = list()
|
||||
var/slot_info = list()
|
||||
|
||||
|
||||
HUD.adding = adding
|
||||
HUD.other = other
|
||||
HUD.hotkeybuttons = hotkeybuttons //These can be disabled for hotkey users
|
||||
@@ -258,15 +258,10 @@
|
||||
hud_elements |= healths
|
||||
|
||||
//VOREStation Addition begin
|
||||
shadekin_dark_display = new /obj/screen/shadekin/darkness()
|
||||
shadekin_dark_display.screen_loc = ui_shadekin_dark_display
|
||||
shadekin_dark_display.icon_state = "dark"
|
||||
hud_elements |= shadekin_dark_display
|
||||
|
||||
shadekin_energy_display = new /obj/screen/shadekin/energy()
|
||||
shadekin_energy_display.screen_loc = ui_shadekin_energy_display
|
||||
shadekin_energy_display.icon_state = "energy0"
|
||||
hud_elements |= shadekin_energy_display
|
||||
shadekin_display = new /obj/screen/shadekin()
|
||||
shadekin_display.screen_loc = ui_shadekin_display
|
||||
shadekin_display.icon_state = "shadekin"
|
||||
hud_elements |= shadekin_display
|
||||
|
||||
xenochimera_danger_display = new /obj/screen/xenochimera/danger_level()
|
||||
xenochimera_danger_display.screen_loc = ui_xenochimera_danger_display
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
var/mob/living/simple_mob/shadekin/SK = usr
|
||||
if(istype(SK))
|
||||
to_chat(usr,"<span class='notice'><b>Energy:</b> [SK.energy] ([SK.dark_gains])</span>")
|
||||
if("shadekin status")
|
||||
var/turf/T = get_turf(usr)
|
||||
if(T)
|
||||
var/darkness = round(1 - T.get_lumcount(),0.1)
|
||||
to_chat(usr,"<span class='notice'><b>Darkness:</b> [darkness]</span>")
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H) && istype(H.species, /datum/species/shadekin))
|
||||
to_chat(usr,"<span class='notice'><b>Energy:</b> [H.shadekin_get_energy(H)]</span>")
|
||||
|
||||
@@ -49,7 +49,7 @@ avoid code duplication. This includes items that may sometimes act as a standard
|
||||
/mob/living/attackby(obj/item/I, mob/user, var/attack_modifier, var/click_parameters)
|
||||
if(!ismob(user))
|
||||
return 0
|
||||
if(can_operate(src) && I.do_surgery(src,user))
|
||||
if(can_operate(src, user) && I.do_surgery(src,user))
|
||||
return 1
|
||||
if(attempt_vr(src,"vore_attackby",args)) return //VOREStation Add - The vore, of course.
|
||||
return I.attack(src, user, user.zone_sel.selecting, attack_modifier)
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
*
|
||||
* This file is used by Travis to indicate that Unit Tests are to be ran.
|
||||
* Do not add anything but the UNIT_TEST definition here as it will be overwritten by Travis when running tests.
|
||||
* This file is used by CI to indicate that Unit Tests are to be ran.
|
||||
* Do not add anything but the UNIT_TEST definition here as it will be overwritten by CI when running tests.
|
||||
*
|
||||
*
|
||||
* Should you wish to edit set UNIT_TEST to 1 like so:
|
||||
|
||||
@@ -496,7 +496,7 @@ var/list/gamemode_cache = list()
|
||||
config.respawn_time = raw_minutes MINUTES
|
||||
|
||||
if ("respawn_message")
|
||||
config.respawn_message = value
|
||||
config.respawn_message = "<span class='notice'><B>[value]</B></span>"
|
||||
|
||||
if ("servername")
|
||||
config.server_name = value
|
||||
|
||||
@@ -27,7 +27,7 @@ SUBSYSTEM_DEF(air)
|
||||
// Updating zone tiles requires temporary storage location of self-zone-blocked turfs across resumes. Used only by process_tiles_to_update.
|
||||
var/list/selfblock_deferred = null
|
||||
|
||||
// This is used to tell Travis WHERE the edges are.
|
||||
// This is used to tell CI WHERE the edges are.
|
||||
var/list/startup_active_edge_log = list()
|
||||
|
||||
/datum/controller/subsystem/air/PreInit()
|
||||
|
||||
@@ -26,6 +26,12 @@
|
||||
name = "mechanical trap"
|
||||
path =/obj/item/weapon/beartrap
|
||||
|
||||
/datum/category_item/autolathe/devices/barbedwire
|
||||
name = "barbed wire"
|
||||
path = /obj/item/weapon/material/barbedwire
|
||||
hidden = 1
|
||||
resources = list(DEFAULT_WALL_MATERIAL = 10000)
|
||||
|
||||
/datum/category_item/autolathe/devices/electropack
|
||||
name = "electropack"
|
||||
path =/obj/item/device/radio/electropack
|
||||
|
||||
@@ -48,6 +48,11 @@
|
||||
path = /obj/item/weapon/reagent_containers/spray
|
||||
resources = list(MAT_PLASTIC = 2000)
|
||||
|
||||
/datum/category_item/autolathe/devices/slowwire
|
||||
name = "snare wire"
|
||||
path = /obj/item/weapon/material/barbedwire/plastic
|
||||
resources = list(MAT_PLASTIC = 10000)
|
||||
|
||||
/datum/category_item/autolathe/tools/spraynozzle
|
||||
name = "spray nozzle"
|
||||
path = /obj/item/weapon/reagent_containers/spray
|
||||
|
||||
@@ -43,7 +43,7 @@ GLOBAL_LIST_EMPTY(event_listen_count)
|
||||
for(var/entry in GLOB.all_observable_events.events)
|
||||
var/decl/observ/event = entry
|
||||
if(event.unregister_global(listener))
|
||||
log_debug("[event] - [listener] was deleted while still registered to global events.")
|
||||
// log_debug("[event] - [listener] was deleted while still registered to global events.") // TODO: Apply axe, reimplement with datum component listeners
|
||||
if(!(--listen_count))
|
||||
return
|
||||
|
||||
@@ -55,7 +55,7 @@ GLOBAL_LIST_EMPTY(event_listen_count)
|
||||
if(proc_owners)
|
||||
for(var/proc_owner in proc_owners)
|
||||
if(event.unregister(event_source, proc_owner))
|
||||
log_debug("[event] - [event_source] was deleted while still being listened to by [proc_owner].")
|
||||
// log_debug("[event] - [event_source] was deleted while still being listened to by [proc_owner].") // TODO: Apply axe, reimplement with datum component listeners
|
||||
if(!(--source_listener_count))
|
||||
return
|
||||
|
||||
@@ -65,6 +65,6 @@ GLOBAL_LIST_EMPTY(event_listen_count)
|
||||
var/decl/observ/event = entry
|
||||
for(var/event_source in event.event_sources)
|
||||
if(event.unregister(event_source, listener))
|
||||
log_debug("[event] - [listener] was deleted while still listening to [event_source].")
|
||||
// log_debug("[event] - [listener] was deleted while still listening to [event_source].") // TODO: Apply axe, reimplement with datum component listeners
|
||||
if(!(--listener_count))
|
||||
return
|
||||
@@ -9,6 +9,21 @@
|
||||
id_type = /obj/item/weapon/card/id/centcom
|
||||
pda_type = /obj/item/device/pda/centcom
|
||||
|
||||
/decl/hierarchy/outfit/job/emergency_responder
|
||||
name = OUTFIT_JOB_NAME("Emergency Responder")
|
||||
uniform = /obj/item/clothing/under/ert
|
||||
shoes = /obj/item/clothing/shoes/boots/swat
|
||||
gloves = /obj/item/clothing/gloves/swat
|
||||
l_ear = /obj/item/device/radio/headset/ert
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
back = /obj/item/weapon/storage/backpack/satchel
|
||||
id_type = /obj/item/weapon/card/id/centcom/ERT
|
||||
pda_type = /obj/item/device/pda/centcom
|
||||
|
||||
post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
ert.add_antagonist(H.mind)
|
||||
|
||||
/decl/hierarchy/outfit/job/clown
|
||||
name = OUTFIT_JOB_NAME("Clown")
|
||||
uniform = /obj/item/clothing/under/rank/clown
|
||||
|
||||
@@ -21,14 +21,20 @@
|
||||
|
||||
/datum/supply_pack/costumes/tesh_smocks_vr
|
||||
name = "Teshari smocks"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/under/seromi/smock,
|
||||
/obj/item/clothing/under/seromi/smock/rainbow,
|
||||
/obj/item/clothing/under/seromi/smock/red,
|
||||
/obj/item/clothing/under/seromi/smock/white,
|
||||
/obj/item/clothing/under/seromi/smock/yellow
|
||||
/obj/item/clothing/under/seromi/smock/red,
|
||||
/obj/item/clothing/under/seromi/smock/yellow,
|
||||
/obj/item/clothing/under/seromi/smock/rainbow,
|
||||
/obj/item/clothing/under/seromi/smock/dress,
|
||||
/obj/item/clothing/under/seromi/smock/blackutilitysmock,
|
||||
/obj/item/clothing/under/seromi/smock/greydress,
|
||||
/obj/item/clothing/under/seromi/smock/blackutility,
|
||||
/obj/item/clothing/under/seromi/smock/bluegreydress
|
||||
)
|
||||
cost = 25
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Teshari smocks crate"
|
||||
|
||||
@@ -36,18 +42,18 @@
|
||||
name = "Teshari undercoats"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/blue_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/brown_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/green_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/lightgrey_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/orange,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/orange_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/pink_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/purple_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/rainbow,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/red_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/lightgrey_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/white_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/yellow_grey
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/red_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/orange,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/yellow_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/green_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/blue_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/purple_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/pink_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/brown_grey
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate
|
||||
@@ -57,19 +63,18 @@
|
||||
name = "Teshari undercoats (black)"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_blue,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_brown,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_green,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_lightgrey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_midgrey,
|
||||
/obj/item/clothing/under/seromi/undercoat,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_orange,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_pink,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_purple,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_red,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_grey,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_white,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_yellow
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_red,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_yellow,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_green,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_blue,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_purple,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_pink,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/black_brown
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate
|
||||
@@ -79,18 +84,18 @@
|
||||
name = "Teshari cloaks"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/blue_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/brown_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/green_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/lightgrey_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/orange,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/orange_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/pink_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/purple_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/rainbow,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/red_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/white,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/yellow_grey
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/red_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/orange_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/yellow_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/green_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/blue_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/purple_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/pink_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/brown_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/rainbow,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/orange
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate
|
||||
@@ -100,19 +105,125 @@
|
||||
name = "Teshari cloaks (black)"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_blue,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_brown,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_green,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_lightgrey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_midgrey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_orange,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_pink,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_purple,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_red,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_orange,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_yellow,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_green,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_blue,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_purple,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_pink,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_brown,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_white,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_yellow
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/black_glow,
|
||||
/obj/item/clothing/suit/storage/seromi/cloak/standard/dark_retrowave
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Teshari cloaks crate"
|
||||
|
||||
/datum/supply_pack/costumes/tesh_worksuits_vr
|
||||
name = "Teshari worksuits"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackpurple,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackorange,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackblue,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackgreen,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitered,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitepurple,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whiteorange,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whiteblue,
|
||||
/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitegreen
|
||||
)
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Teshari worksuits crate"
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_beltcloaks_vr
|
||||
name = "Teshari cloaks (belted)"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/orange_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/rainbow,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/lightgrey_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/white_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/red_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/orange,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/yellow_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/green_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/blue_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/purple_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/pink_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/brown_grey
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Teshari cloaks crate"
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_beltcloaks_b_vr
|
||||
name = "Teshari cloaks (belted, black)"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_orange,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_grey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_midgrey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_lightgrey,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_white,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_red,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_yellow,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_green,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_blue,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_purple,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_pink,
|
||||
/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_brown
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Teshari cloaks crate"
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_hoodcloaks_vr
|
||||
name = "Teshari cloaks (hooded)"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/orange_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/lightgrey_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/white_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/red_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/orange,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/yellow_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/green_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/blue_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/purple_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/pink_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/brown_grey
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Teshari cloaks crate"
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_hoodcloaks_b_vr
|
||||
name = "Teshari cloaks (hooded, black)"
|
||||
num_contained = 4
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/storage/hooded/teshari,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_orange,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_grey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_midgrey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_lightgrey,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_white,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_red,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_yellow,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_green,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_blue,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_purple,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_pink,
|
||||
/obj/item/clothing/suit/storage/hooded/teshari/standard/black_brown
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate
|
||||
@@ -262,7 +373,7 @@
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate
|
||||
containername = "Saddlebags crate"
|
||||
|
||||
|
||||
/datum/supply_pack/costumes/knights_gear
|
||||
name = "Knights Gear"
|
||||
contains = list(
|
||||
|
||||
@@ -84,7 +84,8 @@
|
||||
/obj/item/toy/plushie/borgplushie/scrubpuppy,
|
||||
/obj/item/toy/plushie/foxbear,
|
||||
/obj/item/toy/plushie/nukeplushie,
|
||||
/obj/item/toy/plushie/otter)
|
||||
/obj/item/toy/plushie/otter,
|
||||
/obj/item/toy/plushie/vox)
|
||||
//VOREStation Add End
|
||||
name = "Plushies Crate"
|
||||
cost = 15
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Frontier phaser (station-locked) crate"
|
||||
contains = list(
|
||||
/obj/item/weapon/gun/energy/locked/frontier = 2,
|
||||
/obj/item/weapon/gun/energy/locked/frontier/holdout = 1,
|
||||
/obj/item/weapon/gun/energy/locked/frontier/holdout = 2,
|
||||
)
|
||||
cost = 35
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
|
||||
@@ -18,3 +18,5 @@
|
||||
name = "Void cell"
|
||||
path = /obj/item/weapon/cell/device/weapon/recharge/alien/hybrid
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
This type comes with a directional shield projector, a supressive fire energy weapon, \
|
||||
a stunbaton, handcuffs, an agent ID, energy sword, pinpointer, and a jetpack."
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5
|
||||
antag_roles = list("mercenary")
|
||||
antag_roles = list("mercenary", "ert") //VOREStation Edit
|
||||
path = /obj/item/weapon/antag_spawner/syndicate_drone/protector
|
||||
|
||||
/datum/uplink_item/item/backup/syndicate_drone_combat_medic
|
||||
@@ -21,7 +21,7 @@
|
||||
a powerful hypospray that can create many potent chemicals, an agent ID, energy \
|
||||
sword, pinpointer, and a jetpack."
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5
|
||||
antag_roles = list("mercenary")
|
||||
antag_roles = list("mercenary", "ert") //VOREStation Edit
|
||||
path = /obj/item/weapon/antag_spawner/syndicate_drone/combat_medic
|
||||
|
||||
/datum/uplink_item/item/backup/syndicate_drone_mechanist
|
||||
@@ -31,5 +31,5 @@
|
||||
a cryptographic sequencer, an AI detector, the ability to analyze and repair full-body prosthetics, \
|
||||
a set of construction materials, an ionic rapier, an agent ID, energy sword, pinpointer, and a jetpack."
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5
|
||||
antag_roles = list("mercenary")
|
||||
antag_roles = list("mercenary", "ert") //VOREStation Edit
|
||||
path = /obj/item/weapon/antag_spawner/syndicate_drone/mechanist
|
||||
@@ -100,3 +100,66 @@
|
||||
name = "Healing Nanite pill bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/storage/pill_bottle/healing_nanites
|
||||
|
||||
/datum/uplink_item/item/medical/vermicetol
|
||||
name = "Vermicetol Bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/vermicetol
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/dermaline
|
||||
name = "Dermaline Bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/dermaline
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/carthatoline
|
||||
name = "Carthatoline Bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/carthatoline
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/dexalinp
|
||||
name = "Dexalin Plus Bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/dexalinp
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/tramadol
|
||||
name = "Tramadol Bottle"
|
||||
item_cost = 30
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/tramadol
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/arithrazine
|
||||
name = "Arithrazine Bottle"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/arithrazine
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/corophizine
|
||||
name = "Corophizine Bottle"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/corophizine
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/rezadone
|
||||
name = "Rezadone Bottle"
|
||||
item_cost = 50
|
||||
path = /obj/item/weapon/reagent_containers/glass/bottle/rezadone
|
||||
antag_roles = list("ert")
|
||||
blacklisted = 1
|
||||
|
||||
/datum/uplink_item/item/medical/defib
|
||||
name = "Combat Defibrilator"
|
||||
item_cost = 90
|
||||
path = /obj/item/device/defib_kit/compact/combat
|
||||
antag_roles = list("mercenary", "ert")
|
||||
blacklisted = 1
|
||||
|
||||
@@ -92,6 +92,12 @@
|
||||
desc = "A device which is capable of disrupting subspace communications, preventing the use of headsets, PDAs, and communicators within \
|
||||
a radius of seven meters. It runs off weapon cells, which can be replaced as needed. One cell will last for approximately ten minutes."
|
||||
|
||||
/datum/uplink_item/item/tools/wall_elecrtifier
|
||||
name = "Wall Electrifier"
|
||||
item_cost = 10
|
||||
path = /obj/item/weapon/cell/spike
|
||||
desc = "A modified powercell which will electrify walls and reinforced floors in a 3x3 tile range around it. Always active."
|
||||
|
||||
/datum/uplink_item/item/tools/emag
|
||||
name = "Cryptographic Sequencer"
|
||||
item_cost = 30
|
||||
|
||||
@@ -26,6 +26,11 @@
|
||||
item_cost = 5
|
||||
path = /obj/item/device/survivalcapsule
|
||||
|
||||
/datum/uplink_item/item/tools/popcabin
|
||||
name = "Cabin Capsule"
|
||||
item_cost = 5
|
||||
path = /obj/item/device/survivalcapsule/popcabin
|
||||
|
||||
/datum/uplink_item/item/tools/nanopaste
|
||||
name = "Nanopaste (Advanced)"
|
||||
item_cost = 10
|
||||
@@ -41,6 +46,16 @@
|
||||
item_cost = 15
|
||||
path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
|
||||
|
||||
/datum/uplink_item/item/tools/metal
|
||||
name = "Metal (50 sheets)"
|
||||
item_cost = 15
|
||||
path = /obj/fiftyspawner/steel
|
||||
|
||||
/datum/uplink_item/item/tools/glass
|
||||
name = "Glass (50 sheets)"
|
||||
item_cost = 15
|
||||
path = /obj/fiftyspawner/glass
|
||||
|
||||
/datum/uplink_item/item/tools/elitelaptop
|
||||
name = "Laptop (Advanced)"
|
||||
item_cost = 20
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
name = "Anti-Materiel Rifle (14.5mm)"
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
|
||||
path = /obj/item/weapon/gun/projectile/heavysniper
|
||||
antag_roles = list("mercenary")
|
||||
antag_roles = list("mercenary", "ert") //VOREStation Edit
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/heavysnipertraitor
|
||||
name = "Anti-Materiel Rifle (14.5mm)"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/wires/mines
|
||||
wire_count = 6
|
||||
wire_count = 7
|
||||
randomize = TRUE
|
||||
holder_type = /obj/effect/mine
|
||||
proper_name = "Explosive Wires"
|
||||
@@ -7,6 +7,7 @@
|
||||
/datum/wires/mines/New(atom/_holder)
|
||||
wires = list(WIRE_EXPLODE, WIRE_EXPLODE_DELAY, WIRE_DISARM, WIRE_BADDISARM)
|
||||
return ..()
|
||||
#define WIRE_TRAP 64
|
||||
|
||||
/datum/wires/mines/get_status()
|
||||
. = ..()
|
||||
@@ -29,7 +30,13 @@
|
||||
|
||||
if(WIRE_DISARM)
|
||||
C.visible_message("[bicon(C)] *click!*", "[bicon(C)] *click!*")
|
||||
new C.mineitemtype(get_turf(C))
|
||||
var/obj/effect/mine/MI = new C.mineitemtype(get_turf(C))
|
||||
|
||||
if(C.trap)
|
||||
MI.trap = C.trap
|
||||
C.trap = null
|
||||
MI.trap.forceMove(MI)
|
||||
|
||||
spawn(0)
|
||||
qdel(C)
|
||||
|
||||
@@ -37,6 +44,15 @@
|
||||
C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*")
|
||||
spawn(20)
|
||||
C.explode()
|
||||
|
||||
if(WIRE_TRAP)
|
||||
C.visible_message("[bicon(C)] *click!*", "[bicon(C)] *click!*")
|
||||
|
||||
if(mend)
|
||||
C.visible_message("[bicon(C)] - The mine recalibrates[C.camo_net ? ", revealing \the [C.trap] inside." : "."]")
|
||||
|
||||
C.alpha = 255
|
||||
|
||||
..()
|
||||
|
||||
/datum/wires/mines/on_pulse(wire)
|
||||
@@ -57,6 +73,10 @@
|
||||
|
||||
if(WIRE_BADDISARM)
|
||||
C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
|
||||
|
||||
if(WIRE_TRAP)
|
||||
C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*")
|
||||
|
||||
..()
|
||||
|
||||
/datum/wires/mines/interactable(mob/user)
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
|
||||
/obj/item/weapon/storage/part_replacer
|
||||
name = "rapid part exchange device"
|
||||
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
|
||||
desc = "A special mechanical module made to store, sort, and apply standard machine parts."
|
||||
icon_state = "RPED"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
can_hold = list(/obj/item/weapon/stock_parts)
|
||||
@@ -311,10 +311,11 @@
|
||||
max_storage_space = 100
|
||||
drop_sound = 'sound/items/drop/device.ogg'
|
||||
pickup_sound = 'sound/items/pickup/device.ogg'
|
||||
var/panel_req = TRUE
|
||||
|
||||
/obj/item/weapon/storage/part_replacer/adv
|
||||
name = "advanced rapid part exchange device"
|
||||
desc = "Special mechanical module made to store, sort, and apply standard machine parts. This one has a greatly upgraded storage capacity"
|
||||
desc = "A special mechanical module made to store, sort, and apply standard machine parts. This one has a greatly upgraded storage capacity."
|
||||
icon_state = "RPED"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
can_hold = list(/obj/item/weapon/stock_parts)
|
||||
@@ -327,6 +328,31 @@
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
max_storage_space = 400
|
||||
|
||||
/obj/item/weapon/storage/part_replacer/adv/discount_bluespace
|
||||
name = "discount bluespace rapid part exchange device"
|
||||
desc = "A special mechanical module made to store, sort, and apply standard machine parts. This one has a further increased storage capacity, \
|
||||
and the ability to work on machines with closed maintenance panels."
|
||||
storage_slots = 400
|
||||
max_storage_space = 800
|
||||
panel_req = FALSE
|
||||
|
||||
/obj/item/weapon/storage/part_replacer/drop_contents() // hacky-feeling tier-based drop system
|
||||
hide_from(usr)
|
||||
var/turf/T = get_turf(src)
|
||||
var/lowest_rating = INFINITY // We want the lowest-part tier rating in the RPED so we only drop the lowest-tier parts.
|
||||
/*
|
||||
* Why not just use the stock part's rating variable?
|
||||
* Future-proofing for a potential future where stock parts aren't the only thing that can fit in an RPED.
|
||||
* see: /tg/ and /vg/'s RPEDs fitting power cells, beakers, etc.
|
||||
*/
|
||||
for(var/obj/item/B in contents)
|
||||
if(B.rped_rating() < lowest_rating)
|
||||
lowest_rating = B.rped_rating()
|
||||
for(var/obj/item/B in contents)
|
||||
if(B.rped_rating() > lowest_rating)
|
||||
continue
|
||||
remove_from_storage(B, T)
|
||||
|
||||
/obj/item/weapon/stock_parts
|
||||
name = "stock part"
|
||||
desc = "What?"
|
||||
@@ -342,6 +368,9 @@
|
||||
src.pixel_y = rand(-5.0, 5)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/stock_parts/get_rating()
|
||||
return rating
|
||||
|
||||
//Rank 1
|
||||
|
||||
/obj/item/weapon/stock_parts/console_screen
|
||||
|
||||
@@ -68,7 +68,7 @@ var/datum/antagonist/rogue_ai/malf
|
||||
sleep(50)
|
||||
to_chat(malf, "<B>MEMCHCK</B> Corrupted sectors confirmed. Reccomended solution: Delete. Proceed? Y/N: Y")
|
||||
sleep(10)
|
||||
// this is so Travis doesn't complain about the backslash-B. Fixed at compile time (or should be).
|
||||
// this is so CI doesn't complain about the backslash-B. Fixed at compile time (or should be).
|
||||
to_chat(malf, "<span class='notice'>Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\" + "backups.dat</span>")
|
||||
sleep(20)
|
||||
to_chat(malf, "<span class='notice'><b>CAUTION:</b> Law database not found! User database not found! Unable to restore backups. Activating failsafe AI shutd3wn52&&$#!##</span>")
|
||||
|
||||
@@ -6,6 +6,12 @@
|
||||
|
||||
//Rouguelike Mining
|
||||
/area/asteroid/rogue
|
||||
has_gravity = 0
|
||||
requires_power = 1
|
||||
always_unpowered = 1
|
||||
power_light = 0
|
||||
power_equip = 0
|
||||
power_environ = 0
|
||||
var/asteroid_spawns = list()
|
||||
var/mob_spawns = list()
|
||||
var/shuttle_area //It would be neat if this were more dynamic, but eh.
|
||||
|
||||
+41
-31
@@ -42,20 +42,29 @@
|
||||
#define DNA_UI_TAIL2_R 23
|
||||
#define DNA_UI_TAIL2_G 24
|
||||
#define DNA_UI_TAIL2_B 25
|
||||
#define DNA_UI_EARS_R 26
|
||||
#define DNA_UI_EARS_G 27
|
||||
#define DNA_UI_EARS_B 28
|
||||
#define DNA_UI_EARS2_R 29
|
||||
#define DNA_UI_EARS2_G 30
|
||||
#define DNA_UI_EARS2_B 31
|
||||
#define DNA_UI_WING_STYLE 32
|
||||
#define DNA_UI_WING_R 33
|
||||
#define DNA_UI_WING_G 34
|
||||
#define DNA_UI_WING_B 35
|
||||
#define DNA_UI_WING2_R 36
|
||||
#define DNA_UI_WING2_G 37
|
||||
#define DNA_UI_WING2_B 38 // VOREStation snippet end.
|
||||
#define DNA_UI_LENGTH 38 // VOREStation Edit - Needs to match the highest number above.
|
||||
#define DNA_UI_TAIL3_R 26
|
||||
#define DNA_UI_TAIL3_G 27
|
||||
#define DNA_UI_TAIL3_B 28
|
||||
#define DNA_UI_EARS_R 29
|
||||
#define DNA_UI_EARS_G 30
|
||||
#define DNA_UI_EARS_B 31
|
||||
#define DNA_UI_EARS2_R 32
|
||||
#define DNA_UI_EARS2_G 33
|
||||
#define DNA_UI_EARS2_B 34
|
||||
#define DNA_UI_EARS3_R 35
|
||||
#define DNA_UI_EARS3_G 36
|
||||
#define DNA_UI_EARS3_B 37
|
||||
#define DNA_UI_WING_STYLE 38
|
||||
#define DNA_UI_WING_R 39
|
||||
#define DNA_UI_WING_G 40
|
||||
#define DNA_UI_WING_B 41
|
||||
#define DNA_UI_WING2_R 42
|
||||
#define DNA_UI_WING2_G 43
|
||||
#define DNA_UI_WING2_B 44
|
||||
#define DNA_UI_WING3_R 45
|
||||
#define DNA_UI_WING3_G 46
|
||||
#define DNA_UI_WING3_B 47 // VOREStation snippet end.
|
||||
#define DNA_UI_LENGTH 47 // VOREStation Edit - Needs to match the highest number above.
|
||||
|
||||
#define DNA_SE_LENGTH 49 // VOREStation Edit (original was UI+11)
|
||||
// For later:
|
||||
@@ -193,23 +202,9 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
|
||||
// Technically custom_species is not part of the UI, but this place avoids merge problems.
|
||||
src.custom_species = character.custom_species
|
||||
if(istype(character.species,/datum/species/custom))
|
||||
var/datum/species/custom/CS = character.species
|
||||
src.species_traits = CS.traits.Copy()
|
||||
src.base_species = CS.base_species
|
||||
src.blood_color = CS.blood_color
|
||||
|
||||
if(istype(character.species,/datum/species/xenochimera))
|
||||
var/datum/species/xenochimera/CS = character.species
|
||||
//src.species_traits = CS.traits.Copy() //No traits
|
||||
src.base_species = CS.base_species
|
||||
src.blood_color = CS.blood_color
|
||||
|
||||
if(istype(character.species,/datum/species/alraune))
|
||||
var/datum/species/alraune/CS = character.species
|
||||
//src.species_traits = CS.traits.Copy() //No traits
|
||||
src.base_species = CS.base_species
|
||||
src.blood_color = CS.blood_color
|
||||
src.base_species = character.species.base_species
|
||||
src.blood_color = character.species.blood_color
|
||||
src.species_traits = character.species.traits.Copy()
|
||||
|
||||
// +1 to account for the none-of-the-above possibility
|
||||
SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1)
|
||||
@@ -225,6 +220,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
SetUIValueRange(DNA_UI_TAIL2_G, character.g_tail2, 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL2_B, character.b_tail2, 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_TAIL3_R, character.r_tail3, 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL3_G, character.g_tail3, 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL3_B, character.b_tail3, 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_WING_R, character.r_wing, 255, 1)
|
||||
SetUIValueRange(DNA_UI_WING_G, character.g_wing, 255, 1)
|
||||
SetUIValueRange(DNA_UI_WING_B, character.b_wing, 255, 1)
|
||||
@@ -233,6 +232,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
SetUIValueRange(DNA_UI_WING2_G, character.g_wing2, 255, 1)
|
||||
SetUIValueRange(DNA_UI_WING2_B, character.b_wing2, 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_WING3_R, character.r_wing3, 255, 1)
|
||||
SetUIValueRange(DNA_UI_WING3_G, character.g_wing3, 255, 1)
|
||||
SetUIValueRange(DNA_UI_WING3_B, character.b_wing3, 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_EARS_R, character.r_ears, 255, 1)
|
||||
SetUIValueRange(DNA_UI_EARS_G, character.g_ears, 255, 1)
|
||||
SetUIValueRange(DNA_UI_EARS_B, character.b_ears, 255, 1)
|
||||
@@ -241,6 +244,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
SetUIValueRange(DNA_UI_EARS2_G, character.g_ears2, 255, 1)
|
||||
SetUIValueRange(DNA_UI_EARS2_B, character.b_ears2, 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_EARS3_R, character.r_ears3, 255, 1)
|
||||
SetUIValueRange(DNA_UI_EARS3_G, character.g_ears3, 255, 1)
|
||||
SetUIValueRange(DNA_UI_EARS3_B, character.b_ears3, 255, 1)
|
||||
|
||||
// VORE Station Edit End
|
||||
|
||||
SetUIValueRange(DNA_UI_HAIR_R, character.r_hair, 255, 1)
|
||||
@@ -294,6 +301,9 @@ var/global/list/datum/dna/gene/dna_genes[0]
|
||||
if (block<=0) return
|
||||
ASSERT(maxvalue<=4095)
|
||||
var/range = (4095 / maxvalue)
|
||||
if(value == 0) //VOREStation Edit
|
||||
SetUIValue(block,0,defer)
|
||||
return
|
||||
if(value)
|
||||
SetUIValue(block,round(value * range),defer)
|
||||
|
||||
|
||||
@@ -189,6 +189,10 @@
|
||||
H.r_ears2 = dna.GetUIValueRange(DNA_UI_EARS2_R, 255)
|
||||
H.g_ears2 = dna.GetUIValueRange(DNA_UI_EARS2_G, 255)
|
||||
H.b_ears2 = dna.GetUIValueRange(DNA_UI_EARS2_B, 255)
|
||||
H.r_ears3 = dna.GetUIValueRange(DNA_UI_EARS3_R, 255)
|
||||
H.g_ears3 = dna.GetUIValueRange(DNA_UI_EARS3_G, 255)
|
||||
H.b_ears3 = dna.GetUIValueRange(DNA_UI_EARS3_B, 255)
|
||||
|
||||
|
||||
//Tail
|
||||
var/tail = dna.GetUIValueRange(DNA_UI_TAIL_STYLE, tail_styles_list.len + 1) - 1
|
||||
@@ -208,6 +212,12 @@
|
||||
H.r_wing = dna.GetUIValueRange(DNA_UI_WING_R, 255)
|
||||
H.g_wing = dna.GetUIValueRange(DNA_UI_WING_G, 255)
|
||||
H.b_wing = dna.GetUIValueRange(DNA_UI_WING_B, 255)
|
||||
H.r_wing2 = dna.GetUIValueRange(DNA_UI_WING2_R, 255)
|
||||
H.g_wing2 = dna.GetUIValueRange(DNA_UI_WING2_G, 255)
|
||||
H.b_wing2 = dna.GetUIValueRange(DNA_UI_WING2_B, 255)
|
||||
H.r_wing3 = dna.GetUIValueRange(DNA_UI_WING3_R, 255)
|
||||
H.g_wing3 = dna.GetUIValueRange(DNA_UI_WING3_G, 255)
|
||||
H.b_wing3 = dna.GetUIValueRange(DNA_UI_WING3_B, 255)
|
||||
|
||||
// Playerscale
|
||||
var/size = dna.GetUIValueRange(DNA_UI_PLAYERSCALE, player_sizes_list.len)
|
||||
@@ -221,23 +231,15 @@
|
||||
H.r_tail2 = dna.GetUIValueRange(DNA_UI_TAIL2_R, 255)
|
||||
H.g_tail2 = dna.GetUIValueRange(DNA_UI_TAIL2_G, 255)
|
||||
H.b_tail2 = dna.GetUIValueRange(DNA_UI_TAIL2_B, 255)
|
||||
H.r_tail3 = dna.GetUIValueRange(DNA_UI_TAIL3_R, 255)
|
||||
H.g_tail3 = dna.GetUIValueRange(DNA_UI_TAIL3_G, 255)
|
||||
H.b_tail3 = dna.GetUIValueRange(DNA_UI_TAIL3_B, 255)
|
||||
|
||||
// Technically custom_species is not part of the UI, but this place avoids merge problems.
|
||||
H.custom_species = dna.custom_species
|
||||
if(istype(H.species,/datum/species/custom))
|
||||
var/datum/species/custom/CS = H.species
|
||||
var/datum/species/custom/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src)
|
||||
new_CS.blood_color = dna.blood_color
|
||||
|
||||
if(istype(H.species,/datum/species/xenochimera))
|
||||
var/datum/species/xenochimera/CS = H.species
|
||||
var/datum/species/xenochimera/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src)
|
||||
new_CS.blood_color = dna.blood_color
|
||||
|
||||
if(istype(H.species,/datum/species/alraune))
|
||||
var/datum/species/alraune/CS = H.species
|
||||
var/datum/species/alraune/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src)
|
||||
new_CS.blood_color = dna.blood_color
|
||||
H.species.blood_color = dna.blood_color
|
||||
var/datum/species/S = H.species
|
||||
S.produceCopy(dna.base_species,dna.species_traits,src)
|
||||
// VOREStation Edit End
|
||||
|
||||
H.force_update_organs() //VOREStation Add - Gotta do this too
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
alt_titles = list("Intern" = /datum/alt_title/intern,
|
||||
"Apprentice Engineer" = /datum/alt_title/intern_eng,
|
||||
"Medical Intern" = /datum/alt_title/intern_med,
|
||||
"Lab Assistant" = /datum/alt_title/intern_sci,
|
||||
"Research Intern" = /datum/alt_title/intern_sci,
|
||||
"Security Cadet" = /datum/alt_title/intern_sec,
|
||||
"Jr. Cargo Tech" = /datum/alt_title/intern_crg,
|
||||
"Jr. Explorer" = /datum/alt_title/intern_exp,
|
||||
@@ -34,7 +34,7 @@
|
||||
/datum/alt_title/intern_eng
|
||||
title = "Apprentice Engineer"
|
||||
title_blurb = "An Apprentice Engineer attempts to provide whatever the Engineering department needs. They are not proper Engineers, and are \
|
||||
often in training to become an Engineer. A Technical Assistant has no real authority."
|
||||
often in training to become an Engineer. An Apprentice Engineer has no real authority."
|
||||
title_outfit = /decl/hierarchy/outfit/job/assistant/engineer
|
||||
|
||||
/datum/alt_title/intern_med
|
||||
@@ -44,9 +44,9 @@
|
||||
title_outfit = /decl/hierarchy/outfit/job/assistant/medic
|
||||
|
||||
/datum/alt_title/intern_sci
|
||||
title = "Lab Assistant"
|
||||
title_blurb = "A Lab Assistant attempts to provide whatever the Research department needs. They are not proper Scientists, and are \
|
||||
often in training to become a Scientist. A Lab Assistant has no real authority."
|
||||
title = "Research Intern"
|
||||
title_blurb = "A Research Intern attempts to provide whatever the Research department needs. They are not proper Scientists, and are \
|
||||
often in training to become a Scientist. A Research Intern has no real authority."
|
||||
title_outfit = /decl/hierarchy/outfit/job/assistant/scientist
|
||||
|
||||
/datum/alt_title/intern_sec
|
||||
@@ -72,11 +72,6 @@
|
||||
title_blurb = "A Server helps out kitchen and diner staff with various tasks, primarily food delivery. A Server has no real authority."
|
||||
title_outfit = /decl/hierarchy/outfit/job/service/server
|
||||
|
||||
|
||||
//////////////////////////////////
|
||||
// Visitor
|
||||
//////////////////////////////////
|
||||
|
||||
/datum/job/intern/New()
|
||||
..()
|
||||
if(config)
|
||||
@@ -89,11 +84,17 @@
|
||||
else
|
||||
return list()
|
||||
|
||||
|
||||
//////////////////////////////////
|
||||
// Visitor
|
||||
//////////////////////////////////
|
||||
|
||||
/datum/job/assistant // Visitor
|
||||
title = USELESS_JOB
|
||||
supervisors = "nobody! You don't work here"
|
||||
job_description = "A Visitor is just there to visit the place. They have no real authority or responsibility."
|
||||
timeoff_factor = 0
|
||||
alt_titles = list("Guest" = /datum/alt_title/guest, "Traveler" = /datum/alt_title/traveler)
|
||||
|
||||
/datum/job/assistant/New()
|
||||
..()
|
||||
@@ -103,3 +104,9 @@
|
||||
|
||||
/datum/job/assistant/get_access()
|
||||
return list()
|
||||
|
||||
/datum/alt_title/guest
|
||||
title = "Guest"
|
||||
|
||||
/datum/alt_title/traveler
|
||||
title = "Traveler"
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
disallow_jobhop = TRUE
|
||||
pto_type = PTO_CIVILIAN
|
||||
dept_time_required = 80 //Pending something more complicated
|
||||
alt_titles = list("Overseer"= /datum/alt_title/overseer, "Facility Director" = /datum/alt_title/facility_director, "Chief Supervisor" = /datum/alt_title/chief_supervisor)
|
||||
|
||||
/datum/alt_title/facility_director
|
||||
title = "Facility Director"
|
||||
|
||||
/datum/alt_title/chief_supervisor
|
||||
title = "Chief Supervisor"
|
||||
|
||||
|
||||
/datum/job/hop
|
||||
disallow_jobhop = TRUE
|
||||
@@ -10,8 +18,8 @@
|
||||
departments_managed = list(DEPARTMENT_CIVILIAN, DEPARTMENT_CARGO, DEPARTMENT_PLANET)
|
||||
dept_time_required = 60
|
||||
|
||||
alt_titles = list("Crew Resources Officer" = /datum/alt_title/cro,
|
||||
"Deputy Director" = /datum/alt_title/deputy_director)
|
||||
alt_titles = list("Crew Resources Officer" = /datum/alt_title/cro, "Deputy Manager" = /datum/alt_title/deputy_manager, "Staff Manager" = /datum/alt_title/staff_manager,
|
||||
"Facility Steward" = /datum/alt_title/facility_steward)
|
||||
|
||||
access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
|
||||
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
|
||||
@@ -26,9 +34,30 @@
|
||||
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
|
||||
access_hop, access_RC_announce, access_keycard_auth)
|
||||
|
||||
/datum/alt_title/deputy_director
|
||||
title = "Deputy Director"
|
||||
/datum/alt_title/deputy_manager
|
||||
title = "Deputy Manager"
|
||||
|
||||
/datum/alt_title/staff_manager
|
||||
title = "Staff Manager"
|
||||
|
||||
/datum/alt_title/facility_steward
|
||||
title = "Facility Steward"
|
||||
|
||||
|
||||
/datum/job/secretary
|
||||
disallow_jobhop = TRUE
|
||||
pto_type = PTO_CIVILIAN
|
||||
pto_type = PTO_CIVILIAN
|
||||
alt_titles = list("Command Liaison" = /datum/alt_title/command_liaison, "Bridge Secretary" = /datum/alt_title/bridge_secretary,
|
||||
"Command Assistant" = /datum/alt_title/command_assistant, "Command Intern" = /datum/alt_title/command_intern)
|
||||
|
||||
/datum/alt_title/command_liaison
|
||||
title = "Command Liaison"
|
||||
|
||||
/datum/alt_title/bridge_secretary
|
||||
title = "Bridge Secretary"
|
||||
|
||||
/datum/alt_title/command_assistant
|
||||
title = "Command Assistant"
|
||||
|
||||
/datum/alt_title/command_intern
|
||||
title = "Command Intern"
|
||||
@@ -1,34 +1,104 @@
|
||||
/datum/job/bartender
|
||||
pto_type = PTO_CIVILIAN
|
||||
alt_titles = list("Barkeeper" = /datum/alt_title/barkeeper, "Barmaid" = /datum/alt_title/barmaid, "Barista" = /datum/alt_title/barista, "Mixologist" = /datum/alt_title/mixologist)
|
||||
|
||||
/datum/alt_title/barkeeper
|
||||
title = "Barkeeper"
|
||||
|
||||
/datum/alt_title/barmaid
|
||||
title = "Barmaid"
|
||||
|
||||
/datum/alt_title/mixologist
|
||||
title = "Mixologist"
|
||||
|
||||
|
||||
/datum/job/chef
|
||||
total_positions = 2 //IT TAKES A LOT TO MAKE A STEW
|
||||
spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO
|
||||
pto_type = PTO_CIVILIAN
|
||||
alt_titles = list("Sous-chef" = /datum/alt_title/souschef,"Cook" = /datum/alt_title/cook, "Kitchen Worker" = /datum/alt_title/kitchen_worker)
|
||||
|
||||
/datum/alt_title/souschef
|
||||
title = "Sous-chef"
|
||||
|
||||
/datum/alt_title/kitchen_worker
|
||||
title = "Kitchen Worker"
|
||||
title_blurb = "A Kitchen Worker has the same duties, though they may be less experienced."
|
||||
|
||||
|
||||
/datum/job/hydro
|
||||
spawn_positions = 2
|
||||
pto_type = PTO_CIVILIAN
|
||||
alt_titles = list("Hydroponicist" = /datum/alt_title/hydroponicist, "Cultivator" = /datum/alt_title/cultivator, "Farmer" = /datum/alt_title/farmer,
|
||||
"Gardener" = /datum/alt_title/gardener, "Florist" = /datum/alt_title/florsit)
|
||||
|
||||
/datum/alt_title/hydroponicist
|
||||
title = "Hydroponicist"
|
||||
|
||||
/datum/alt_title/cultivator
|
||||
title = "Cultivator"
|
||||
|
||||
/datum/alt_title/farmer
|
||||
title = "Farmer"
|
||||
|
||||
/datum/alt_title/florsit
|
||||
title = "Florist"
|
||||
title_blurb = "A Florist may be less professional than their counterparts, and are more likely to tend to the public gardens if they aren't needed elsewhere."
|
||||
|
||||
|
||||
/datum/job/qm
|
||||
pto_type = PTO_CARGO
|
||||
dept_time_required = 20
|
||||
alt_titles = list("Supply Chief" = /datum/alt_title/supply_chief, "Logistics Manager" = /datum/alt_title/logistics_manager)
|
||||
|
||||
/datum/alt_title/logistics_manager
|
||||
title = "Logistics Manager"
|
||||
|
||||
|
||||
/datum/job/cargo_tech
|
||||
total_positions = 3
|
||||
spawn_positions = 3
|
||||
pto_type = PTO_CARGO
|
||||
alt_titles = list("Cargo Loader" = /datum/alt_title/cargo_loader, "Cargo Handler" = /datum/alt_title/cargo_handler, "Supply Courier" = /datum/alt_title/supply_courier,
|
||||
"Disposals Sorter" = /datum/alt_title/disposal_sorter)
|
||||
|
||||
/datum/alt_title/supply_courier
|
||||
title = "Supply Courier"
|
||||
title_blurb = "A Supply Courier is usually tasked with devlivering packages or cargo directly to whoever requires it."
|
||||
|
||||
/datum/alt_title/cargo_loader
|
||||
title = "Cargo Loader"
|
||||
title_blurb = "A Cargo Loader is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle."
|
||||
|
||||
/datum/alt_title/cargo_handler
|
||||
title = "Cargo Handler"
|
||||
title_blurb = "A Cargo Loader is usually tasked with more menial labor within Supply department, such as loading and unloading supply shuttle."
|
||||
|
||||
/datum/alt_title/disposal_sorter
|
||||
title = "Disposals Sorter"
|
||||
title_blurb = "A Disposals Sorter is usually tasked with operating disposals delivery system, sorting the trash and tagging parcels for delivery."
|
||||
|
||||
|
||||
/datum/job/mining
|
||||
total_positions = 4
|
||||
spawn_positions = 4
|
||||
pto_type = PTO_CARGO
|
||||
alt_titles = list("Deep Space Miner" = /datum/alt_title/deep_space_miner, "Drill Technician" = /datum/alt_title/drill_tech, "Prospector" = /datum/alt_title/prospector)
|
||||
|
||||
/datum/alt_title/deep_space_miner
|
||||
title = "Deep Space Miner"
|
||||
title_blurb = "A Deep Space Miner specializes primarily in mining operations in zero-g environments, mostly in asteroid and debris fields."
|
||||
|
||||
/datum/alt_title/prospector
|
||||
title = "Prospector"
|
||||
|
||||
|
||||
/datum/job/janitor //Lots of janitor substations on station.
|
||||
total_positions = 3
|
||||
spawn_positions = 3
|
||||
alt_titles = list("Custodian" = /datum/alt_title/custodian, "Sanitation Technician" = /datum/alt_title/sanitation_tech, "Maid" = /datum/alt_title/maid)
|
||||
pto_type = PTO_CIVILIAN
|
||||
alt_titles = list("Custodian" = /datum/alt_title/custodian, "Sanitation Technician" = /datum/alt_title/sanitation_tech,
|
||||
"Maid" = /datum/alt_title/maid, "Garbage Collector" = /datum/alt_title/garbage_collector)
|
||||
|
||||
/datum/alt_title/sanitation_tech
|
||||
title = "Sanitation Technician"
|
||||
@@ -36,26 +106,73 @@
|
||||
/datum/alt_title/maid
|
||||
title = "Maid"
|
||||
|
||||
/datum/alt_title/garbage_collector
|
||||
title = "Garbage Collector"
|
||||
title_blurb = "A Garbage Collector keeps the station clean, though focuses moreso on collecting larger trash, with wet cleaning being secondary task."
|
||||
|
||||
|
||||
/datum/job/librarian
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
alt_titles = list("Journalist" = /datum/alt_title/journalist, "Writer" = /datum/alt_title/writer, "Historian" = /datum/alt_title/historian, "Professor" = /datum/alt_title/professor)
|
||||
alt_titles = list("Journalist" = /datum/alt_title/journalist, "Reporter" = /datum/alt_title/reporter, "Writer" = /datum/alt_title/writer,
|
||||
"Historian" = /datum/alt_title/historian, "Archivist" = /datum/alt_title/archivist, "Professor" = /datum/alt_title/professor,
|
||||
"Academic" = /datum/alt_title/academic, "Philosopher" = /datum/alt_title/philosopher)
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
/datum/alt_title/reporter
|
||||
title = "Reporter"
|
||||
title_blurb = "The Reporter uses the Library as a base of operations, from which they can report the news and goings-on on the station with their camera."
|
||||
|
||||
/datum/alt_title/historian
|
||||
title = "Historian"
|
||||
title_blurb = "The Historian uses the Library as a base of operation to record any important events occuring on station."
|
||||
|
||||
/datum/alt_title/archivist
|
||||
title = "Archivist"
|
||||
title_blurb = "The Archivist uses the Library as a base of operation to record any important events occuring on station."
|
||||
|
||||
/datum/alt_title/professor
|
||||
title = "Professor"
|
||||
title_blurb = "The Professor uses the Library as a base of operations to share their vast knowledge with the crew."
|
||||
|
||||
/datum/alt_title/academic
|
||||
title = "Academic"
|
||||
title_blurb = "The Academic uses the Library as a base of operations to share their vast knowledge with the crew."
|
||||
|
||||
/datum/alt_title/philosopher
|
||||
title = "Philosopher"
|
||||
title_blurb = "The Philosopher uses the Library as a base of operation to ruminate on nature of life and other great questions, and share their opinions with the crew."
|
||||
|
||||
|
||||
/datum/job/lawyer
|
||||
disallow_jobhop = TRUE
|
||||
pto_type = PTO_CIVILIAN
|
||||
alt_titles = list("Internal Affairs Liaison" = /datum/alt_title/ia_liaison, "Internal Affairs Delegate" = /datum/alt_title/ia_delegate,
|
||||
"Internal Affairs Investigator" = /datum/alt_title/ia_investigator)
|
||||
|
||||
/datum/alt_title/ia_liaison
|
||||
title = "Internal Affairs Liaison"
|
||||
|
||||
/datum/alt_title/ia_delegate
|
||||
title = "Internal Affairs Delegate"
|
||||
|
||||
/datum/alt_title/ia_investigator
|
||||
title = "Internal Affairs Investigator"
|
||||
|
||||
|
||||
/datum/job/chaplain
|
||||
pto_type = PTO_CIVILIAN
|
||||
alt_titles = list("Missionary" = /datum/alt_title/missionary, "Preacher" = /datum/alt_title/preacher, "Counselor" = /datum/alt_title/counselor, "Guru" = /datum/alt_title/guru)
|
||||
|
||||
/datum/alt_title/guru
|
||||
title = "Guru"
|
||||
title_blurb = "The Guru primarily tries to offer spiritual guidance to those who come seeking it."
|
||||
|
||||
/datum/alt_title/missionary
|
||||
title = "Missionary"
|
||||
|
||||
/datum/alt_title/preacher
|
||||
title = "Preacher"
|
||||
|
||||
|
||||
|
||||
@@ -79,17 +196,43 @@
|
||||
|
||||
outfit_type = /decl/hierarchy/outfit/job/assistant
|
||||
job_description = "An entertainer does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic."
|
||||
alt_titles = list("Performer" = /datum/alt_title/performer, "Musician" = /datum/alt_title/musician, "Stagehand" = /datum/alt_title/stagehand)
|
||||
alt_titles = list("Performer" = /datum/alt_title/performer, "Musician" = /datum/alt_title/musician, "Stagehand" = /datum/alt_title/stagehand,
|
||||
"Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer,
|
||||
"Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian)
|
||||
|
||||
// Entertainer Alt Titles
|
||||
/datum/alt_title/actor
|
||||
title = "Actor"
|
||||
title_blurb = "An Actor is someone who acts out a role! Whatever sort of character it is, get into it and impress people with power of comedy and tragedy!"
|
||||
|
||||
/datum/alt_title/performer
|
||||
title = "Performer"
|
||||
title_blurb = "A Performer is someone who performs! Acting, dancing, wrestling, etc!"
|
||||
title_blurb = "A Performer is someone who performs! Whatever sort of performance will come to your mind, the world's a stage!"
|
||||
|
||||
/datum/alt_title/musician
|
||||
title = "Musician"
|
||||
title_blurb = "A Musician is someone who makes music! Singing, playing instruments, slam poetry, it's your call!"
|
||||
title_blurb = "A Musician is someone who makes music with a wide variety of musical instruments!"
|
||||
|
||||
/datum/alt_title/stagehand
|
||||
title = "Stagehand"
|
||||
title_blurb = "A Stagehand typically performs everything the rest of the entertainers don't. Operate lights, shutters, windows, or narrate through your voicebox!"
|
||||
title_blurb = "A Stagehand typically performs everything the rest of the entertainers don't. Operate lights, shutters, windows, or narrate through your voicebox!"
|
||||
|
||||
/datum/alt_title/dancer
|
||||
title = "Dancer"
|
||||
title_blurb = "A Dancer is someone who impresses people through power of their own body! From waltz to breakdance, as long as crowd as cheering!"
|
||||
|
||||
/datum/alt_title/singer
|
||||
title = "Singer"
|
||||
title_blurb = "A Singer is someone with gift of melodious voice! Impress people with your vocal range!"
|
||||
|
||||
/datum/alt_title/magician
|
||||
title = "Magician"
|
||||
title_blurb = "A Magician is someone who awes those around them with impossible! Show off your repertoire of magic tricks, while keeping the secret hidden!"
|
||||
|
||||
/datum/alt_title/comedian
|
||||
title = "Comedian"
|
||||
title_blurb = "A Comedian will focus on making people laugh with the power of wit! Telling jokes, stand-up comedy, you are here to make others smile!"
|
||||
|
||||
/datum/alt_title/tragedian
|
||||
title = "Tragedian"
|
||||
title_blurb = "A Tragedian will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?"
|
||||
@@ -12,10 +12,38 @@
|
||||
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
|
||||
access_heads, access_construction,
|
||||
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
|
||||
alt_titles = list("Head Engineer" = /datum/alt_title/head_engineer, "Foreman" = /datum/alt_title/foreman, "Maintenance Manager" = /datum/alt_title/maintenance_manager)
|
||||
|
||||
/datum/alt_title/head_engineer
|
||||
title = "Head Engineer"
|
||||
|
||||
/datum/alt_title/foreman
|
||||
title = "Foreman"
|
||||
|
||||
/datum/alt_title/maintenance_manager
|
||||
title = "Maintenance Manager"
|
||||
|
||||
|
||||
/datum/job/engineer
|
||||
pto_type = PTO_ENGINEERING
|
||||
alt_titles = list("Maintenance Technician" = /datum/alt_title/maint_tech, "Engine Technician" = /datum/alt_title/engine_tech,
|
||||
"Electrician" = /datum/alt_title/electrician, "Construction Engineer" = /datum/alt_title/construction_engi)
|
||||
|
||||
/datum/alt_title/construction_engi
|
||||
title = "Construction Engineer"
|
||||
title_blurb = "A Construction Engineer fulfills similar duties to other engineers, but usually occupies spare time with construction of extra facilities in dedicated areas or \
|
||||
as additions to station layout."
|
||||
|
||||
|
||||
|
||||
/datum/job/atmos
|
||||
spawn_positions = 3
|
||||
pto_type = PTO_ENGINEERING
|
||||
pto_type = PTO_ENGINEERING
|
||||
alt_titles = list("Atmospherics Maintainer" = /datum/alt_title/atmos_maint, "Disposals Technician" = /datum/alt_title/disposals_tech)
|
||||
|
||||
/datum/alt_title/atmos_maint
|
||||
title = "Atmospherics Maintainer"
|
||||
|
||||
/datum/alt_title/disposals_tech
|
||||
title = "Disposals Technician"
|
||||
title_blurb = "A Disposals Technician is an Atmospheric Technician still and can fulfill all the same duties, although specializes more in disposals delivery system's operations and configurations."
|
||||
@@ -29,6 +29,8 @@ var/const/SAR =(1<<14)
|
||||
color = "#bab421"
|
||||
sorting_order = 2 // Same as cargo in importance.
|
||||
|
||||
|
||||
|
||||
/datum/job/pathfinder
|
||||
title = "Pathfinder"
|
||||
flag = PATHFINDER
|
||||
@@ -50,9 +52,14 @@ var/const/SAR =(1<<14)
|
||||
minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway)
|
||||
outfit_type = /decl/hierarchy/outfit/job/pathfinder
|
||||
job_description = "The Pathfinder's job is to lead and manage expeditions, and is the primary authority on all off-station expeditions."
|
||||
alt_titles = list("Expedition Lead" = /datum/alt_title/expedition_lead, "Exploration Manager" = /datum/alt_title/exploration_manager)
|
||||
|
||||
/datum/alt_title/expedition_lead
|
||||
title = "Expedition Lead"
|
||||
|
||||
/datum/alt_title/exploration_manager
|
||||
title = "Exploration Manager"
|
||||
|
||||
/datum/alt_title/pathfinder
|
||||
title = "Pathfinder"
|
||||
|
||||
/datum/job/pilot
|
||||
title = "Pilot"
|
||||
@@ -71,9 +78,15 @@ var/const/SAR =(1<<14)
|
||||
minimal_access = list(access_pilot)
|
||||
outfit_type = /decl/hierarchy/outfit/job/pilot
|
||||
job_description = "A Pilot flies the various shuttles in the Virgo-Erigone System."
|
||||
alt_titles = list("Co-Pilot" = /datum/alt_title/co_pilot, "Navigator" = /datum/alt_title/navigator)
|
||||
|
||||
/datum/alt_title/co_pilot
|
||||
title = "Co-Pilot"
|
||||
title_blurb = "A Co-Pilot is there primarily to assist main pilot as well as learn from them"
|
||||
|
||||
/datum/alt_title/navigator
|
||||
title = "Navigator"
|
||||
|
||||
/datum/alt_title/pilot
|
||||
title = "Pilot"
|
||||
|
||||
/datum/job/explorer
|
||||
title = "Explorer"
|
||||
@@ -91,9 +104,14 @@ var/const/SAR =(1<<14)
|
||||
minimal_access = list(access_explorer, access_external_airlocks, access_eva)
|
||||
outfit_type = /decl/hierarchy/outfit/job/explorer2
|
||||
job_description = "An Explorer searches for interesting things, and returns them to the station."
|
||||
alt_titles = list("Surveyor" = /datum/alt_title/surveyor, "Offsite Scout" = /datum/alt_title/offsite_scout)
|
||||
|
||||
/datum/alt_title/surveyor
|
||||
title = "Surveyor"
|
||||
|
||||
/datum/alt_title/offsite_scout
|
||||
title = "Offsite Scout"
|
||||
|
||||
/datum/alt_title/explorer
|
||||
title = "Explorer"
|
||||
|
||||
/datum/job/sar
|
||||
title = "Field Medic"
|
||||
@@ -112,25 +130,7 @@ var/const/SAR =(1<<14)
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_pilot)
|
||||
outfit_type = /decl/hierarchy/outfit/job/medical/sar
|
||||
job_description = "A Field medic works as the field doctor of expedition teams."
|
||||
alt_titles = list("Expedition Medic" = /datum/alt_title/expedition_medic)
|
||||
|
||||
/datum/alt_title/field_medic
|
||||
title = "Field Medic"
|
||||
|
||||
/datum/job/offduty_exploration
|
||||
title = "Off-duty Explorer"
|
||||
latejoin_only = TRUE
|
||||
timeoff_factor = -1
|
||||
total_positions = -1
|
||||
faction = "Station"
|
||||
departments = list(DEPARTMENT_OFFDUTY)
|
||||
supervisors = "nobody! Enjoy your time off"
|
||||
selection_color = "#999440"
|
||||
access = list(access_maint_tunnels, access_external_airlocks)
|
||||
minimal_access = list(access_maint_tunnels, access_external_airlocks)
|
||||
outfit_type = /decl/hierarchy/outfit/job/assistant/explorer
|
||||
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
|
||||
pto_type = PTO_EXPLORATION
|
||||
economic_modifier = 5
|
||||
|
||||
/datum/alt_title/offduty_exp
|
||||
title = "Off-duty Explorer"
|
||||
/datum/alt_title/expedition_medic
|
||||
title = "Expedition Medic"
|
||||
|
||||
@@ -10,16 +10,71 @@
|
||||
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
|
||||
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
|
||||
access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels)
|
||||
alt_titles = list("Chief Physician" = /datum/alt_title/chief_physician, "Medical Director" = /datum/alt_title/medical_director, "Healthcare Manager" = /datum/alt_title/healthcare_manager)
|
||||
|
||||
/datum/alt_title/chief_physician
|
||||
title = "Chief Physician"
|
||||
|
||||
/datum/alt_title/medical_director
|
||||
title = "Medical Director"
|
||||
|
||||
/datum/alt_title/healthcare_manager
|
||||
title = "Healthcare Manager"
|
||||
|
||||
|
||||
/datum/job/doctor
|
||||
spawn_positions = 5
|
||||
pto_type = PTO_MEDICAL
|
||||
alt_titles = list("Physician" = /datum/alt_title/physician, "Medical Practitioner" = /datum/alt_title/medical_practitioner, "Surgeon" = /datum/alt_title/surgeon,
|
||||
"Emergency Physician" = /datum/alt_title/emergency_physician, "Nurse" = /datum/alt_title/nurse, "Orderly" = /datum/alt_title/orderly,
|
||||
"Virologist" = /datum/alt_title/virologist)
|
||||
|
||||
|
||||
/datum/alt_title/physician
|
||||
title = "Physician"
|
||||
|
||||
/datum/alt_title/medical_practitioner
|
||||
title = "Medical Practitioner"
|
||||
|
||||
/datum/alt_title/orderly
|
||||
title = "Orderly"
|
||||
title_blurb = "An Orderly acts as Medbay's general helping hand, assisting any doctor that might need some form of help, as well as handling manual \
|
||||
and dirty labor around the department."
|
||||
title_outfit = /decl/hierarchy/outfit/job/medical/doctor/nurse
|
||||
|
||||
|
||||
/datum/job/chemist
|
||||
pto_type = PTO_MEDICAL
|
||||
alt_titles = list("Pharmacist" = /datum/alt_title/pharmacist, "Pharmacologist" = /datum/alt_title/pharmacologist)
|
||||
|
||||
/datum/alt_title/pharmacologist
|
||||
title = "Pharmacologist"
|
||||
title_blurb = "A Pharmacologist focuses on the chemical needs of the Medical Department, primarily specializing in producing more advanced forms of medicine."
|
||||
|
||||
|
||||
/datum/job/psychiatrist
|
||||
pto_type = PTO_MEDICAL
|
||||
alt_titles = list("Psychologist" = /datum/alt_title/psychologist, "Psychoanalyst" = /datum/alt_title/psychoanalyst, "Psychotherapist" = /datum/alt_title/psychotherapist)
|
||||
|
||||
/datum/alt_title/psychoanalyst
|
||||
title = "Psychoanalyst"
|
||||
title_blurb = "A Psychoanalyst provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \
|
||||
called upon to determine whatever ails the mentally unwell, frequently under Security supervision."
|
||||
title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
|
||||
|
||||
/datum/alt_title/psychotherapist
|
||||
title = "Psychotherapist"
|
||||
title_blurb = "A Psychotherapist provides mental health services to crew members in need, focusing more on therapy than medication. They may also be \
|
||||
called upon to determine whatever ails the mentally unwell, frequently under Security supervision."
|
||||
title_outfit = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
|
||||
|
||||
|
||||
/datum/job/paramedic
|
||||
pto_type = PTO_MEDICAL
|
||||
pto_type = PTO_MEDICAL
|
||||
alt_titles = list("Emergency Medical Technician" = /datum/alt_title/emt, "Medical Responder" = /datum/alt_title/medical_responder)
|
||||
|
||||
/datum/alt_title/medical_responder
|
||||
title = "Medical Responder"
|
||||
title_blurb = "A Medical Responder is primarily concerned with the recovery of patients who are unable to make it to the Medical Department on their \
|
||||
own. They are capable of keeping a patient stabilized until they reach the hands of someone with more training."
|
||||
title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt
|
||||
@@ -18,9 +18,6 @@
|
||||
pto_type = PTO_CIVILIAN
|
||||
economic_modifier = 2
|
||||
|
||||
/datum/alt_title/offduty_civ
|
||||
title = "Off-duty Worker"
|
||||
|
||||
/datum/job/offduty_cargo
|
||||
title = "Off-duty Cargo"
|
||||
latejoin_only = TRUE
|
||||
@@ -37,9 +34,6 @@
|
||||
pto_type = PTO_CARGO
|
||||
economic_modifier = 2
|
||||
|
||||
/datum/alt_title/offduty_crg
|
||||
title = "Off-duty Cargo"
|
||||
|
||||
/datum/job/offduty_engineering
|
||||
title = "Off-duty Engineer"
|
||||
latejoin_only = TRUE
|
||||
@@ -56,9 +50,6 @@
|
||||
pto_type = PTO_ENGINEERING
|
||||
economic_modifier = 5
|
||||
|
||||
/datum/alt_title/offduty_eng
|
||||
title = "Off-duty Engineer"
|
||||
|
||||
/datum/job/offduty_medical
|
||||
title = "Off-duty Medic"
|
||||
latejoin_only = TRUE
|
||||
@@ -75,9 +66,6 @@
|
||||
pto_type = PTO_MEDICAL
|
||||
economic_modifier = 5
|
||||
|
||||
/datum/alt_title/offduty_med
|
||||
title = "Off-duty Medic"
|
||||
|
||||
/datum/job/offduty_science
|
||||
title = "Off-duty Scientist"
|
||||
latejoin_only = TRUE
|
||||
@@ -94,9 +82,6 @@
|
||||
pto_type = PTO_SCIENCE
|
||||
economic_modifier = 5
|
||||
|
||||
/datum/alt_title/offduty_sci
|
||||
title = "Off-duty Scientist"
|
||||
|
||||
/datum/job/offduty_security
|
||||
title = "Off-duty Officer"
|
||||
latejoin_only = TRUE
|
||||
@@ -113,5 +98,18 @@
|
||||
pto_type = PTO_SECURITY
|
||||
economic_modifier = 4
|
||||
|
||||
/datum/alt_title/offduty_sec
|
||||
title = "Off-duty Officer"
|
||||
/datum/job/offduty_exploration
|
||||
title = "Off-duty Explorer"
|
||||
latejoin_only = TRUE
|
||||
timeoff_factor = -1
|
||||
total_positions = -1
|
||||
faction = "Station"
|
||||
departments = list(DEPARTMENT_OFFDUTY)
|
||||
supervisors = "nobody! Enjoy your time off"
|
||||
selection_color = "#999440"
|
||||
access = list(access_maint_tunnels, access_external_airlocks)
|
||||
minimal_access = list(access_maint_tunnels, access_external_airlocks)
|
||||
outfit_type = /decl/hierarchy/outfit/job/assistant/explorer
|
||||
job_description = "Off-duty crew has no responsibilities or authority and is just there to spend their well-deserved time off."
|
||||
pto_type = PTO_EXPLORATION
|
||||
economic_modifier = 5
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
access_tox_storage, access_teleporter, access_sec_doors,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network)
|
||||
alt_titles = list("Research Supervisor")
|
||||
|
||||
minimum_character_age = 25
|
||||
minimal_player_age = 14
|
||||
|
||||
@@ -11,30 +11,77 @@
|
||||
access_tox_storage, access_teleporter,
|
||||
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
|
||||
access_RC_announce, access_keycard_auth, access_tcomsat, access_xenoarch, access_eva, access_network, access_xenobotany)
|
||||
alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor, "Research Manager" = /datum/alt_title/research_manager,
|
||||
"Head of Development" = /datum/alt_title/head_of_development,"Head Scientist" = /datum/alt_title/head_scientist)
|
||||
|
||||
/datum/alt_title/research_manager
|
||||
title = "Research Manager"
|
||||
|
||||
/datum/alt_title/head_of_development
|
||||
title = "Head of Development"
|
||||
|
||||
/datum/alt_title/head_scientist
|
||||
title = "Head Scientist"
|
||||
|
||||
|
||||
/datum/job/scientist
|
||||
spawn_positions = 5
|
||||
pto_type = PTO_SCIENCE
|
||||
alt_titles = list("Xenoarchaeologist" = /datum/alt_title/xenoarch, "Anomalist" = /datum/alt_title/anomalist, \
|
||||
"Phoron Researcher" = /datum/alt_title/phoron_research, "Circuit Designer" = /datum/alt_title/circuit_designer)
|
||||
alt_titles = list("Lab Assistant" = /datum/alt_title/lab_assistant, "Xenoarchaeologist" = /datum/alt_title/xenoarch, "Xenopaleontologist" = /datum/alt_title/xenopaleontologist, \
|
||||
"Anomalist" = /datum/alt_title/anomalist, "Phoron Researcher" = /datum/alt_title/phoron_research, "Gas Physicist" = /datum/alt_title/gas_physicist, \
|
||||
"Circuit Designer" = /datum/alt_title/circuit_designer, "Circuit Programmer" = /datum/alt_title/circuit_programmer)
|
||||
|
||||
|
||||
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch, access_xenobotany)
|
||||
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) // Unchanged (for now?), mostly here for reference
|
||||
|
||||
/datum/alt_title/lab_assistant
|
||||
title = "Lab Assistant"
|
||||
title_blurb = "A Lab Assistant is a lower-level member of research staff, whose main purpose is to help scientists with their specialized work in more menial fashion, while also \
|
||||
learning the specializations in process."
|
||||
|
||||
/datum/alt_title/xenopaleontologist
|
||||
title = "Xenopaleontologist"
|
||||
title_blurb = "A Xenopaleontologist enters digsites in search of fossils and other ancient remants of alien life. These digsites are frequently in vacuum or other inhospitable \
|
||||
locations, and as such a Xenopaleontologist should be prepared to handle hostile evironmental conditions."
|
||||
|
||||
/datum/alt_title/gas_physicist
|
||||
title = "Gas Physicist"
|
||||
title_blurb = "A Gas Physicist is a specialist in various practical applications of gasses, but currently focuses their attention on phoron, and has knowledge of its practical uses and dangers. \
|
||||
Many Gas Physicists are interested in the combustability and explosive properties of gaseous phoron, as well as the specific hazards \
|
||||
of working with the substance in that state."
|
||||
|
||||
/datum/alt_title/circuit_designer
|
||||
title = "Circuit Designer"
|
||||
title_blurb = "A Circuit Designer is a Scientist whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
|
||||
They work to create various useful devices using the capabilities of integrated circuitry."
|
||||
|
||||
/datum/alt_title/circuit_programmer
|
||||
title = "Circuit Programmer"
|
||||
title_blurb = "A Circuit Programmer is a Scientist whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
|
||||
They work to create various useful devices using the capabilities of integrated circuitry."
|
||||
|
||||
|
||||
/datum/job/xenobiologist
|
||||
spawn_positions = 3
|
||||
pto_type = PTO_SCIENCE
|
||||
alt_titles = list("Xenozoologist" = /datum/alt_title/xenozoologist, "Xenoanthropologist" = /datum/alt_title/xenoanthropologist)
|
||||
|
||||
/datum/alt_title/xenozoologist
|
||||
title = "Xenozoologist"
|
||||
|
||||
/datum/alt_title/xenoanthropologist
|
||||
title = "Xenoanthropologist"
|
||||
title_blurb = "Xenoanthropologist still heavily focuses their study on alien lifeforms, but their specialty leans more towards fellow sapient beings than simple animals."
|
||||
|
||||
|
||||
/datum/job/roboticist
|
||||
total_positions = 3
|
||||
pto_type = PTO_SCIENCE
|
||||
alt_titles = list("Assembly Technician" = /datum/alt_title/assembly_tech, "Biomechanical Engineer" = /datum/alt_title/biomech, "Mechatronic Engineer" = /datum/alt_title/mech_tech)
|
||||
|
||||
/datum/alt_title/assembly_tech
|
||||
title = "Assembly Technician"
|
||||
|
||||
//////////////////////////////////
|
||||
// Xenobotanist
|
||||
@@ -59,3 +106,7 @@
|
||||
outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
|
||||
job_description = "A Xenobotanist grows and cares for a variety of abnormal, custom made, and frequently dangerous plant life. When the products of these plants \
|
||||
are both safe and beneficial to the station, they may choose to introduce it to the rest of the crew."
|
||||
alt_titles = list("Xenoflorist" = /datum/alt_title/xenoflorist)
|
||||
|
||||
/datum/alt_title/xenoflorist
|
||||
title = "Xenoflorist"
|
||||
|
||||
@@ -11,15 +11,47 @@
|
||||
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
|
||||
access_construction,
|
||||
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_external_airlocks)
|
||||
alt_titles = list("Security Commander" = /datum/alt_title/sec_commander, "Chief of Security" = /datum/alt_title/sec_chief, "Security Manager" = /datum/alt_title/security_manager)
|
||||
|
||||
/datum/alt_title/security_manager
|
||||
title = "Security Manager"
|
||||
|
||||
|
||||
/datum/job/warden
|
||||
pto_type = PTO_SECURITY
|
||||
dept_time_required = 20
|
||||
alt_titles = list("Brig Sentry" = /datum/alt_title/brig_sentry, "Armory Superintendent" = /datum/alt_title/armory_superintendent)
|
||||
|
||||
/datum/alt_title/brig_sentry
|
||||
title = "Brig Sentry"
|
||||
|
||||
/datum/alt_title/armory_superintendent
|
||||
title = "Armory Superintendent"
|
||||
|
||||
|
||||
/datum/job/detective
|
||||
pto_type = PTO_SECURITY
|
||||
alt_titles = list("Investigator" = /datum/alt_title/investigator, "Security Inspector" = /datum/alt_title/security_inspector, "Forensic Technician" = /datum/alt_title/forensic_tech)
|
||||
|
||||
/datum/alt_title/investigator
|
||||
title = "Investigator"
|
||||
|
||||
/datum/alt_title/security_inspector
|
||||
title = "Security Inspector"
|
||||
|
||||
|
||||
/datum/job/officer
|
||||
total_positions = 5
|
||||
spawn_positions = 5
|
||||
pto_type = PTO_SECURITY
|
||||
pto_type = PTO_SECURITY
|
||||
alt_titles = list("Patrol Officer" = /datum/alt_title/patrol_officer, "Security Guard" = /datum/alt_title/security_guard,
|
||||
"Security Deputy" = /datum/alt_title/security_guard, "Junior Officer" = /datum/alt_title/junior_officer)
|
||||
|
||||
/datum/alt_title/patrol_officer
|
||||
title = "Patrol Officer"
|
||||
|
||||
/datum/alt_title/security_guard
|
||||
title = "Security Guard"
|
||||
|
||||
/datum/alt_title/security_deputy
|
||||
title = "Security Deputy"
|
||||
@@ -24,47 +24,31 @@
|
||||
get_access()
|
||||
return get_all_accesses().Copy()
|
||||
|
||||
/*/datum/job/centcom_visitor //For Pleasure // You mean for admin abuse... -Ace
|
||||
title = "CentCom Visitor"
|
||||
department = "Civilian"
|
||||
head_position = 1
|
||||
/datum/job/emergency_responder //For staff managing/leading ERTs
|
||||
title = "Emergency Responder"
|
||||
departments = list("Central Command")
|
||||
department_accounts = list(DEPARTMENT_COMMAND, DEPARTMENT_ENGINEERING, DEPARTMENT_MEDICAL, DEPARTMENT_RESEARCH, DEPARTMENT_SECURITY, DEPARTMENT_CARGO, DEPARTMENT_PLANET, DEPARTMENT_CIVILIAN)
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 1
|
||||
supervisors = "company officials and Corporate Regulations"
|
||||
selection_color = "#1D1D4F"
|
||||
idtype = /obj/item/weapon/card/id/centcom
|
||||
access = list()
|
||||
minimal_access = list()
|
||||
minimal_player_age = 14
|
||||
economic_modifier = 20
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/emergency_responder
|
||||
job_description = "Emergency Responders are usually called in to deal with on-station emergencies that the crew require assistance to deal with."
|
||||
|
||||
minimum_character_age = 25
|
||||
ideal_character_age = 40
|
||||
minimum_character_age = 18
|
||||
ideal_character_age = 30
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(H), slot_l_ear)
|
||||
switch(H.backbag)
|
||||
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
|
||||
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
|
||||
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom, slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/centcom(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(H), slot_gloves)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/centcom/officer(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/omnihud(H), slot_l_store)
|
||||
|
||||
H.implant_loyalty()
|
||||
|
||||
return 1
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
get_access()
|
||||
var/access = get_all_accesses()
|
||||
return access*/
|
||||
return get_all_accesses().Copy()
|
||||
|
||||
/datum/job/clown
|
||||
title = "Clown"
|
||||
@@ -78,18 +62,18 @@
|
||||
selection_color = "#515151"
|
||||
economic_modifier = 1
|
||||
job_description = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!"
|
||||
alt_titles = list("Clown" = /datum/alt_title/clown, "Jester" = /datum/alt_title/jester)
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/clown
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
/datum/alt_title/clown
|
||||
title = "Clown"
|
||||
alt_titles = list("Jester" = /datum/alt_title/jester, "Fool" = /datum/alt_title/fool)
|
||||
|
||||
/datum/alt_title/jester
|
||||
title = "Jester"
|
||||
|
||||
/datum/alt_title/fool
|
||||
title = "Fool"
|
||||
|
||||
/datum/job/clown/get_access()
|
||||
if(config.assistant_maint)
|
||||
return list(access_maint_tunnels, access_entertainment)
|
||||
@@ -108,17 +92,14 @@
|
||||
selection_color = "#515151"
|
||||
economic_modifier = 1
|
||||
job_description = "A Mime is there to entertain the crew and keep high morale using unbelievable performances and acting skills!"
|
||||
alt_titles = list("Mime" = /datum/alt_title/mime, "Interpretive Dancer" = /datum/alt_title/interpretive_dancer)
|
||||
alt_titles = list("Poseur" = /datum/alt_title/poseur)
|
||||
whitelist_only = 1
|
||||
latejoin_only = 1
|
||||
outfit_type = /decl/hierarchy/outfit/job/mime
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
/datum/alt_title/mime
|
||||
title = "Mime"
|
||||
|
||||
/datum/alt_title/interpretive_dancer
|
||||
title = "Interpretive Dancer"
|
||||
/datum/alt_title/poseur
|
||||
title = "Poseur"
|
||||
|
||||
/datum/job/mime/get_access()
|
||||
if(config.assistant_maint)
|
||||
|
||||
@@ -16,9 +16,3 @@
|
||||
|
||||
/obj/machinery/button/attackby(obj/item/weapon/W, mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
// VOREStation Edit Begin
|
||||
/obj/machinery/button/attack_hand(obj/item/weapon/W, mob/user as mob)
|
||||
if(..()) return 1
|
||||
playsound(src, 'sound/machines/button.ogg', 100, 1)
|
||||
// VOREStation Edit End
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/obj/machinery/button/attack_hand(obj/item/weapon/W, mob/user as mob)
|
||||
if(..()) return 1
|
||||
playsound(src, 'sound/machines/button.ogg', 100, 1)
|
||||
|
||||
/obj/machinery/button/windowtint/multitint
|
||||
name = "tint control"
|
||||
desc = "A remote control switch for polarized windows and doors."
|
||||
|
||||
/obj/machinery/button/windowtint/multitint/toggle_tint()
|
||||
use_power(5)
|
||||
active = !active
|
||||
update_icon()
|
||||
|
||||
var/in_range = range(src,range)
|
||||
for(var/obj/structure/window/reinforced/polarized/W in in_range)
|
||||
if(W.id == src.id || !W.id)
|
||||
spawn(0)
|
||||
W.toggle()
|
||||
for(var/obj/machinery/door/D in in_range)
|
||||
if(D.icon_tinted)
|
||||
if(D.id_tint == src.id || !D.id_tint)
|
||||
spawn(0)
|
||||
D.toggle()
|
||||
@@ -30,7 +30,7 @@
|
||||
// If it's a generic arcade machine, pick a random arcade
|
||||
// circuit board for it and make the new machine
|
||||
if(!circuit)
|
||||
var/choice = pick(typesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade)
|
||||
var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade/clawmachine)
|
||||
var/obj/item/weapon/circuitboard/CB = new choice()
|
||||
new CB.build_path(loc, CB)
|
||||
qdel(src)
|
||||
@@ -1072,3 +1072,250 @@
|
||||
#undef ORION_STATUS_NORMAL
|
||||
#undef ORION_STATUS_GAMEOVER
|
||||
#undef ORION_STATUS_MARKET
|
||||
|
||||
//////////////////
|
||||
// Claw Machine //
|
||||
//////////////////
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine
|
||||
name = "AlliCo Grab-a-Gift"
|
||||
desc = "Show off your arcade skills for that special someone!"
|
||||
icon_state = "clawmachine"
|
||||
icon_keyboard = null
|
||||
icon_screen = null
|
||||
circuit = /obj/item/weapon/circuitboard/arcade/clawmachine
|
||||
prizes = list(/obj/random/plushie)
|
||||
var/wintick = 0
|
||||
var/winprob = 0
|
||||
var/instructions = "Insert 1 thaler or swipe a card to play!"
|
||||
var/gameStatus = "CLAWMACHINE_NEW"
|
||||
var/gamepaid = 0
|
||||
var/gameprice = 1
|
||||
var/winscreen = ""
|
||||
|
||||
/// Payment
|
||||
/obj/machinery/computer/arcade/clawmachine/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(gamepaid == 0 && vendor_account && !vendor_account.suspended)
|
||||
var/paid = 0
|
||||
var/obj/item/weapon/card/id/W = I.GetID()
|
||||
if(W) //for IDs and PDAs and wallets with IDs
|
||||
paid = pay_with_card(W,I)
|
||||
else if(istype(I, /obj/item/weapon/spacecash/ewallet))
|
||||
var/obj/item/weapon/spacecash/ewallet/C = I
|
||||
paid = pay_with_ewallet(C)
|
||||
else if(istype(I, /obj/item/weapon/spacecash))
|
||||
var/obj/item/weapon/spacecash/C = I
|
||||
paid = pay_with_cash(C, user)
|
||||
if(paid)
|
||||
gamepaid = 1
|
||||
instructions = "Hit start to play!"
|
||||
return
|
||||
return
|
||||
|
||||
////// Cash
|
||||
/obj/machinery/computer/arcade/clawmachine/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
|
||||
if(!emagged)
|
||||
if(gameprice > cashmoney.worth)
|
||||
|
||||
// This is not a status display message, since it's something the character
|
||||
// themselves is meant to see BEFORE putting the money in
|
||||
to_chat(usr, "[bicon(cashmoney)] <span class='warning'>That is not enough money.</span>")
|
||||
return 0
|
||||
|
||||
if(istype(cashmoney, /obj/item/weapon/spacecash))
|
||||
|
||||
visible_message("<span class='info'>\The [usr] inserts some cash into \the [src].</span>")
|
||||
cashmoney.worth -= gameprice
|
||||
|
||||
if(cashmoney.worth <= 0)
|
||||
usr.drop_from_inventory(cashmoney)
|
||||
qdel(cashmoney)
|
||||
else
|
||||
cashmoney.update_icon()
|
||||
|
||||
// Machine has no idea who paid with cash
|
||||
credit_purchase("(cash)")
|
||||
return 1
|
||||
if(emagged)
|
||||
playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||
to_chat(user, "<span class='info'>It doesn't seem to accept that! Seem you'll need to swipe a valid ID.</span>")
|
||||
|
||||
|
||||
///// Ewallet
|
||||
/obj/machinery/computer/arcade/clawmachine/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet)
|
||||
if(!emagged)
|
||||
visible_message("<span class='info'>\The [usr] swipes \the [wallet] through \the [src].</span>")
|
||||
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
|
||||
if(gameprice > wallet.worth)
|
||||
visible_message("<span class='info'>Insufficient funds.</span>")
|
||||
return 0
|
||||
else
|
||||
wallet.worth -= gameprice
|
||||
credit_purchase("[wallet.owner_name] (chargecard)")
|
||||
return 1
|
||||
if(emagged)
|
||||
playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||
to_chat(usr, "<span class='info'>It doesn't seem to accept that! Seem you'll need to swipe a valid ID.</span>")
|
||||
|
||||
///// ID
|
||||
/obj/machinery/computer/arcade/clawmachine/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/obj/item/ID_container)
|
||||
if(I==ID_container || ID_container == null)
|
||||
visible_message("<span class='info'>\The [usr] swipes \the [I] through \the [src].</span>")
|
||||
else
|
||||
visible_message("<span class='info'>\The [usr] swipes \the [ID_container] through \the [src].</span>")
|
||||
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
|
||||
var/datum/money_account/customer_account = get_account(I.associated_account_number)
|
||||
if(!customer_account)
|
||||
visible_message("<span class='info'>Error: Unable to access account. Please contact technical support if problem persists.</span>")
|
||||
return 0
|
||||
|
||||
if(customer_account.suspended)
|
||||
visible_message("<span class='info'>Unable to access account: account suspended.</span>")
|
||||
return 0
|
||||
|
||||
// Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is
|
||||
// empty at high security levels
|
||||
if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
|
||||
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
|
||||
customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
|
||||
|
||||
if(!customer_account)
|
||||
visible_message("<span class='info'>Unable to access account: incorrect credentials.</span>")
|
||||
return 0
|
||||
|
||||
if(gameprice > customer_account.money)
|
||||
visible_message("<span class='info'>Insufficient funds in account.</span>")
|
||||
return 0
|
||||
else
|
||||
// Okay to move the money at this point
|
||||
if(emagged)
|
||||
gameprice = customer_account.money
|
||||
// debit money from the purchaser's account
|
||||
customer_account.money -= gameprice
|
||||
|
||||
// create entry in the purchaser's account log
|
||||
var/datum/transaction/T = new()
|
||||
T.target_name = "[vendor_account.owner_name] (via [name])"
|
||||
T.purpose = "Purchase of arcade game([name])"
|
||||
if(gameprice > 0)
|
||||
T.amount = "([gameprice])"
|
||||
else
|
||||
T.amount = "[gameprice]"
|
||||
T.source_terminal = name
|
||||
T.date = current_date_string
|
||||
T.time = stationtime2text()
|
||||
customer_account.transaction_log.Add(T)
|
||||
|
||||
// Give the vendor the money. We use the account owner name, which means
|
||||
// that purchases made with stolen/borrowed card will look like the card
|
||||
// owner made them
|
||||
credit_purchase(customer_account.owner_name)
|
||||
return 1
|
||||
|
||||
/// Add to vendor account
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/proc/credit_purchase(var/target as text)
|
||||
vendor_account.money += gameprice
|
||||
|
||||
var/datum/transaction/T = new()
|
||||
T.target_name = target
|
||||
T.purpose = "Purchase of arcade game([name])"
|
||||
T.amount = "[gameprice]"
|
||||
T.source_terminal = name
|
||||
T.date = current_date_string
|
||||
T.time = stationtime2text()
|
||||
vendor_account.transaction_log.Add(T)
|
||||
|
||||
/// End Payment
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/New()
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/living/user)
|
||||
if(..())
|
||||
return
|
||||
tgui_interact(user)
|
||||
|
||||
/// TGUI Stuff
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "ClawMachine", name, 300, 400, master_ui, state)
|
||||
ui.autoupdate = TRUE
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
|
||||
data["wintick"] = wintick
|
||||
data["instructions"] = instructions
|
||||
data["gameStatus"] = gameStatus
|
||||
data["winscreen"] = winscreen
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/tgui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(action == "newgame" && gamepaid == 0)
|
||||
playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||
|
||||
if(action == "newgame" && gamepaid == 1)
|
||||
gameStatus = "CLAWMACHINE_ON"
|
||||
icon_state = "clawmachine_move"
|
||||
instructions = "Guide the claw to the prize you want!"
|
||||
wintick = 0
|
||||
|
||||
if(action == "return" && gameStatus == "CLAWMACHINE_END")
|
||||
gameStatus = "CLAWMACHINE_NEW"
|
||||
|
||||
if(action == "pointless" && wintick < 10)
|
||||
wintick += 1
|
||||
|
||||
if(action == "pointless" && wintick >= 10)
|
||||
instructions = "Insert 1 thaler or swipe a card to play!"
|
||||
clawvend()
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/proc/clawvend() /// True to a real claw machine, it's NEARLY impossible to win.
|
||||
winprob += 1 /// Yeah.
|
||||
|
||||
if(prob(winprob)) /// YEAH.
|
||||
if(!emagged)
|
||||
prizevend()
|
||||
winscreen = "You won!"
|
||||
else if(emagged)
|
||||
gameprice = 1
|
||||
emagged = 0
|
||||
winscreen = "You won...?"
|
||||
var/obj/item/weapon/grenade/G = new /obj/item/weapon/grenade/explosive(get_turf(src)) /// YEAAAAAAAAAAAAAAAAAAH!!!!!!!!!!
|
||||
G.activate()
|
||||
G.throw_at(get_turf(usr),10,10) /// Play stupid games, win stupid prizes.
|
||||
|
||||
playsound(src, 'sound/arcade/Ori_win.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||
winprob = 0
|
||||
|
||||
else
|
||||
playsound(src, 'sound/arcade/Ori_fail.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||
winscreen = "Aw, shucks. Try again!"
|
||||
wintick = 0
|
||||
gamepaid = 0
|
||||
icon_state = "clawmachine"
|
||||
gameStatus = "CLAWMACHINE_END"
|
||||
|
||||
/obj/machinery/computer/arcade/clawmachine/emag_act(mob/user)
|
||||
if(!emagged)
|
||||
to_chat(user, "<span class='info'>You modify the claw of the machine. The next one is sure to win! You just have to pay...</span>")
|
||||
name = "AlliCo Snag-A-Prize"
|
||||
desc = "Get some goodies, all for you!"
|
||||
instructions = "Swipe a card to play!"
|
||||
winprob = 100
|
||||
gamepaid = 0
|
||||
wintick = 0
|
||||
gameStatus = "CLAWMACHINE_NEW"
|
||||
emagged = 1
|
||||
return 1
|
||||
@@ -0,0 +1,26 @@
|
||||
/obj/machinery/computer/security/abductor
|
||||
name = "camera uplink"
|
||||
desc = "Used for hacking into camera networks"
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "camera"
|
||||
network = list( "Mercenary",
|
||||
"Cargo",
|
||||
"Circuits",
|
||||
"Civilian",
|
||||
"Command",
|
||||
"Engine",
|
||||
"Engineering",
|
||||
"Exploration",
|
||||
"Medical",
|
||||
"Mining Outpost",
|
||||
"Outside",
|
||||
"Research",
|
||||
"Research Outpost",
|
||||
"Robots",
|
||||
"Security",
|
||||
"Telecommunications",
|
||||
"Tether",
|
||||
"TalonShip",
|
||||
"Entertainment",
|
||||
"Communicators"
|
||||
)
|
||||
@@ -168,9 +168,9 @@
|
||||
if(reas)
|
||||
reason = reas
|
||||
if("duration")
|
||||
var/dur = input("Duration (in minutes) during which pass is valid (up to 120 minutes).", "Duration") as num|null
|
||||
var/dur = input("Duration (in minutes) during which pass is valid (up to 360 minutes).", "Duration") as num|null //VOREStation Edit
|
||||
if(dur)
|
||||
if(dur > 0 && dur <= 120)
|
||||
if(dur > 0 && dur <= 360) //VOREStation Edit
|
||||
duration = dur
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Invalid duration.</span>")
|
||||
|
||||
@@ -30,14 +30,15 @@
|
||||
if(..()) return
|
||||
if(stat & (NOPOWER|BROKEN)) return
|
||||
|
||||
if(!inserted) // No point in giving you an option what to do if there's no ID to do things with.
|
||||
to_chat(user, "<span class='notice'>No ID is inserted.</span>")
|
||||
return
|
||||
|
||||
var/choice = alert(user,"What do you want to do?","[src]","Restore ID access","Eject ID","Cancel")
|
||||
if(user.incapacitated() || (get_dist(src, user) > 1))
|
||||
return
|
||||
switch(choice)
|
||||
if("Restore ID access")
|
||||
if(!inserted)
|
||||
to_chat(user, "<span class='notice'>No ID is inserted.</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!(istype(H)))
|
||||
to_chat(user, "<span class='warning'>Invalid user detected. Access denied.</span>")
|
||||
@@ -66,9 +67,6 @@
|
||||
flick(icon_fail, src)
|
||||
return
|
||||
if("Eject ID")
|
||||
if(!inserted)
|
||||
to_chat(user, "<span class='notice'>No ID is inserted.</span>")
|
||||
return
|
||||
if(ishuman(user))
|
||||
inserted.forceMove(get_turf(src))
|
||||
if(!user.get_active_hand())
|
||||
|
||||
@@ -317,16 +317,16 @@
|
||||
if(!length(t1))
|
||||
return
|
||||
|
||||
for(var/datum/data/record/R in data_core.security)
|
||||
if(t1 == lowertext(R.fields["name"]) || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))
|
||||
active2 = R
|
||||
for(var/datum/data/record/R in data_core.general)
|
||||
if(t1 == lowertext(R.fields["name"]) || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["fingerprint"]))
|
||||
active1 = R
|
||||
break
|
||||
if(!active2)
|
||||
set_temp("Security record not found. You must enter the person's exact name, ID or DNA.", "danger")
|
||||
if(!active1)
|
||||
set_temp("Security record not found. You must enter the person's exact name, ID, or fingerprint.", "danger")
|
||||
return
|
||||
for(var/datum/data/record/E in data_core.general)
|
||||
if(E.fields["name"] == active2.fields["name"] && E.fields["id"] == active2.fields["id"])
|
||||
active1 = E
|
||||
for(var/datum/data/record/E in data_core.security)
|
||||
if(E.fields["name"] == active1.fields["name"] && E.fields["id"] == active1.fields["id"])
|
||||
active2 = E
|
||||
break
|
||||
screen = SEC_DATA_RECORD
|
||||
if("print_p")
|
||||
|
||||
@@ -1,111 +1,8 @@
|
||||
/*
|
||||
CONTAINS:
|
||||
Deployable items
|
||||
Barricades
|
||||
*/
|
||||
|
||||
//Barricades!
|
||||
/obj/structure/barricade
|
||||
name = "barricade"
|
||||
desc = "This space is blocked off by a barricade."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "barricade"
|
||||
anchored = 1.0
|
||||
density = 1.0
|
||||
var/health = 100
|
||||
var/maxhealth = 100
|
||||
var/datum/material/material
|
||||
|
||||
/obj/structure/barricade/New(var/newloc, var/material_name)
|
||||
..(newloc)
|
||||
if(!material_name)
|
||||
material_name = "wood"
|
||||
material = get_material_by_name("[material_name]")
|
||||
if(!material)
|
||||
qdel(src)
|
||||
return
|
||||
name = "[material.display_name] barricade"
|
||||
desc = "This space is blocked off by a barricade made of [material.display_name]."
|
||||
color = material.icon_colour
|
||||
maxhealth = material.integrity
|
||||
health = maxhealth
|
||||
|
||||
/obj/structure/barricade/get_material()
|
||||
return material
|
||||
|
||||
/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob)
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
if(istype(W, /obj/item/stack))
|
||||
var/obj/item/stack/D = W
|
||||
if(D.get_material_name() != material.name)
|
||||
return //hitting things with the wrong type of stack usually doesn't produce messages, and probably doesn't need to.
|
||||
if(health < maxhealth)
|
||||
if(D.get_amount() < 1)
|
||||
to_chat(user, "<span class='warning'>You need one sheet of [material.display_name] to repair \the [src].</span>")
|
||||
return
|
||||
visible_message("<span class='notice'>[user] begins to repair \the [src].</span>")
|
||||
if(do_after(user,20) && health < maxhealth)
|
||||
if(D.use(1))
|
||||
health = maxhealth
|
||||
visible_message("<span class='notice'>[user] repairs \the [src].</span>")
|
||||
return
|
||||
return
|
||||
else
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
health -= W.force * 1
|
||||
if("brute")
|
||||
health -= W.force * 0.75
|
||||
if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
CheckHealth()
|
||||
..()
|
||||
|
||||
/obj/structure/barricade/proc/CheckHealth()
|
||||
if(health <= 0)
|
||||
dismantle()
|
||||
return
|
||||
|
||||
/obj/structure/barricade/take_damage(var/damage)
|
||||
health -= damage
|
||||
CheckHealth()
|
||||
return
|
||||
|
||||
/obj/structure/barricade/attack_generic(var/mob/user, var/damage, var/attack_verb)
|
||||
visible_message("<span class='danger'>[user] [attack_verb] the [src]!</span>")
|
||||
if(material == get_material_by_name("resin"))
|
||||
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD)))
|
||||
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
|
||||
user.do_attack_animation(src)
|
||||
health -= damage
|
||||
CheckHealth()
|
||||
return
|
||||
|
||||
/obj/structure/barricade/proc/dismantle()
|
||||
material.place_dismantled_product(get_turf(src))
|
||||
visible_message("<span class='danger'>\The [src] falls apart!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/structure/barricade/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
dismantle()
|
||||
if(2.0)
|
||||
health -= 25
|
||||
CheckHealth()
|
||||
|
||||
/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Actual Deployable machinery stuff
|
||||
/obj/machinery/deployable
|
||||
name = "deployable"
|
||||
desc = "deployable"
|
||||
|
||||
@@ -20,3 +20,15 @@
|
||||
req_one_access = list()
|
||||
normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside.
|
||||
hackProof = TRUE //VOREStation Edit - No borgos
|
||||
|
||||
/obj/machinery/door/airlock/glass_security/polarized
|
||||
name = "Electrochromic Security Airlock"
|
||||
icon_tinted = 'icons/obj/doors/Doorsectinted_vr.dmi'
|
||||
|
||||
/obj/machinery/door/airlock/glass_medical/polarized
|
||||
name = "Electrochromic Medical Airlock"
|
||||
icon_tinted = 'icons/obj/doors/doormedtinted_vr.dmi'
|
||||
|
||||
/obj/machinery/door/airlock/glass_command/polarized
|
||||
name = "Electrochormic Command Airlock"
|
||||
icon_tinted = 'icons/obj/doors/Doorcomtinted_vr.dmi'
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
|
||||
/obj/machinery/door
|
||||
var/reinforcing = 0 //vorestation addition
|
||||
var/tintable = 0
|
||||
var/icon_tinted
|
||||
var/id_tint
|
||||
|
||||
/obj/machinery/door/firedoor
|
||||
heat_proof = 1
|
||||
@@ -102,4 +105,29 @@
|
||||
/obj/machinery/door/blast/regular/
|
||||
heat_proof = 1 //just so repairing them doesn't try to fireproof something that never takes fire damage
|
||||
|
||||
/obj/machinery/door/proc/toggle()
|
||||
if(glass)
|
||||
icon = icon_tinted
|
||||
glass = 0
|
||||
if(!operating && density)
|
||||
set_opacity(1)
|
||||
else
|
||||
icon = initial(icon)
|
||||
glass = 1
|
||||
if(!operating)
|
||||
set_opacity(0)
|
||||
|
||||
/obj/machinery/button/windowtint/doortint
|
||||
name = "door tint control"
|
||||
desc = "A remote control switch for polarized glass doors."
|
||||
|
||||
/obj/machinery/button/windowtint/doortint/toggle_tint()
|
||||
use_power(5)
|
||||
active = !active
|
||||
update_icon()
|
||||
|
||||
for(var/obj/machinery/door/D in range(src,range))
|
||||
if(D.icon_tinted && (D.id_tint == src.id || !D.id_tint))
|
||||
spawn(0)
|
||||
D.toggle()
|
||||
return
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/machinery/door/airlock/multi_tile/glass/polarized
|
||||
name = "Electrochromic Glass Airlock"
|
||||
icon_tinted = 'icons/obj/doors/Door2x1tinted_vr.dmi'
|
||||
|
||||
/obj/machinery/door/airlock/multi_tile/glass/polarized/New()
|
||||
..()
|
||||
create_fillers()
|
||||
|
||||
/obj/machinery/door/airlock/multi_tile/glass/polarized/toggle()
|
||||
. = ..()
|
||||
if(!operating)
|
||||
if(filler1)
|
||||
filler1.set_opacity(opacity)
|
||||
if(filler2)
|
||||
filler2.set_opacity(opacity)
|
||||
|
||||
/obj/machinery/door/airlock/multi_tile/glass/polarized/close()
|
||||
. = ..()
|
||||
if(filler1)
|
||||
filler1.set_opacity(!glass)
|
||||
if(filler2)
|
||||
filler2.set_opacity(!glass)
|
||||
@@ -0,0 +1,10 @@
|
||||
/obj/structure/event/stage
|
||||
name = "stage"
|
||||
desc = "It's a stage!"
|
||||
icon = 'icons/misc/event/stage.dmi'
|
||||
icon_state = "stage1"
|
||||
anchored = 1.0
|
||||
density = 0
|
||||
pixel_y = -224
|
||||
pixel_x = -224
|
||||
plane = -44
|
||||
@@ -327,7 +327,10 @@ Class Procs:
|
||||
return 0
|
||||
if(!component_parts)
|
||||
return 0
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='notice'>Following parts detected in [src]:</span>")
|
||||
for(var/obj/item/C in component_parts)
|
||||
to_chat(user, "<span class='notice'> [C.name]</span>")
|
||||
if(panel_open || !R.panel_req)
|
||||
var/obj/item/weapon/circuitboard/CB = circuit
|
||||
var/P
|
||||
for(var/obj/item/weapon/stock_parts/A in component_parts)
|
||||
@@ -347,10 +350,6 @@ Class Procs:
|
||||
break
|
||||
update_icon()
|
||||
RefreshParts()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>Following parts detected in the machine:</span>")
|
||||
for(var/var/obj/item/C in component_parts) //var/var/obj/item/C?
|
||||
to_chat(user, "<span class='notice'> [C.name]</span>")
|
||||
return 1
|
||||
|
||||
// Default behavior for wrenching down machines. Supports both delay and instant modes.
|
||||
@@ -426,6 +425,9 @@ Class Procs:
|
||||
|
||||
/obj/machinery/proc/dismantle()
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
for(var/obj/I in contents)
|
||||
if(istype(I,/obj/item/weapon/card/id))
|
||||
I.forceMove(src.loc)
|
||||
//TFF 3/6/19 - port Cit RP fix of infinite frames. If it doesn't have a circuit board, don't create a frame. Return a smack instead. BONK!
|
||||
if(!circuit)
|
||||
return 0
|
||||
|
||||
@@ -1,6 +1,28 @@
|
||||
/obj/machinery/porta_turret/stationary/CIWS
|
||||
name = "CIWS turret"
|
||||
desc = "A ship weapons turret designed for light defense."
|
||||
req_one_access = list(access_cent_general)
|
||||
health = 200
|
||||
maxhealth = 200
|
||||
enabled = TRUE
|
||||
lethal = TRUE
|
||||
check_weapons = TRUE
|
||||
can_salvage = FALSE
|
||||
|
||||
/obj/machinery/porta_turret/stationary/syndie/CIWS
|
||||
name = "mercenary CIWS turret"
|
||||
desc = "A ship weapons turret designed for light defense."
|
||||
req_one_access = list(access_syndicate)
|
||||
health = 200
|
||||
maxhealth = 200
|
||||
enabled = TRUE
|
||||
lethal = TRUE
|
||||
check_weapons = TRUE
|
||||
can_salvage = FALSE
|
||||
|
||||
/obj/machinery/porta_turret/industrial/military
|
||||
name = "military CIWS turret"
|
||||
desc = "A ship-grade weapons turret designed for anti-fighter defense."
|
||||
desc = "A ship weapons turret designed for anti-fighter defense."
|
||||
req_one_access = list(access_cent_general)
|
||||
installation = /obj/item/weapon/gun/energy/lasercannon
|
||||
health = 500
|
||||
@@ -9,17 +31,4 @@
|
||||
lethal = TRUE
|
||||
check_weapons = TRUE
|
||||
auto_repair = TRUE
|
||||
can_salvage = FALSE
|
||||
|
||||
/obj/machinery/porta_turret/stationary/syndie/CIWS
|
||||
name = "mercenary CIWS turret"
|
||||
desc = "A ship-grade weapons turret designed for anti-fighter defense."
|
||||
req_one_access = list(access_syndicate)
|
||||
installation = /obj/item/weapon/gun/energy/lasercannon
|
||||
health = 500
|
||||
maxhealth = 500
|
||||
enabled = TRUE
|
||||
lethal = TRUE
|
||||
check_weapons = TRUE
|
||||
auto_repair = TRUE
|
||||
can_salvage = FALSE
|
||||
@@ -87,25 +87,44 @@
|
||||
else if(ishuman(occupant))
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
|
||||
// In case they somehow end up with positive values for otherwise unobtainable damage...
|
||||
if(H.getToxLoss() > 0)
|
||||
H.adjustToxLoss(-(rand(1,3)))
|
||||
if(H.getOxyLoss() > 0)
|
||||
H.adjustOxyLoss(-(rand(1,3)))
|
||||
if(H.getCloneLoss() > 0)
|
||||
H.adjustCloneLoss(-(rand(1,3)))
|
||||
if(H.getBrainLoss() > 0)
|
||||
H.adjustBrainLoss(-(rand(1,3)))
|
||||
if(H.isSynthetic())
|
||||
// In case they somehow end up with positive values for otherwise unobtainable damage...
|
||||
if(H.getToxLoss() > 0)
|
||||
H.adjustToxLoss(-(rand(1,3)))
|
||||
if(H.getOxyLoss() > 0)
|
||||
H.adjustOxyLoss(-(rand(1,3)))
|
||||
if(H.getCloneLoss() > 0)
|
||||
H.adjustCloneLoss(-(rand(1,3)))
|
||||
if(H.getBrainLoss() > 0)
|
||||
H.adjustBrainLoss(-(rand(1,3)))
|
||||
|
||||
// Also recharge their internal battery.
|
||||
if(H.isSynthetic() && H.nutrition < 500) //VOREStation Edit
|
||||
H.nutrition = min(H.nutrition+10, 500) //VOREStation Edit
|
||||
cell.use(7000/450*10)
|
||||
// Also recharge their internal battery.
|
||||
if(H.isSynthetic() && H.nutrition < 500) //VOREStation Edit
|
||||
H.nutrition = min(H.nutrition+10, 500) //VOREStation Edit
|
||||
cell.use(7000/450*10)
|
||||
|
||||
// And clear up radiation
|
||||
if(H.radiation > 0)
|
||||
H.radiation = max(H.radiation - rand(5, 15), 0)
|
||||
// And clear up radiation
|
||||
if(H.radiation > 0)
|
||||
H.radiation = max(H.radiation - rand(5, 15), 0)
|
||||
|
||||
if(H.wearing_rig) // stepping into a borg charger to charge your rig and fix your shit
|
||||
var/obj/item/weapon/rig/wornrig = H.get_rig()
|
||||
if(wornrig) // just to make sure
|
||||
for(var/obj/item/rig_module/storedmod in wornrig.installed_modules)
|
||||
if(weld_rate && storedmod.damage && cell.checked_use(weld_power_use * weld_rate * CELLRATE))
|
||||
to_chat(H, "<span class='notice'>[storedmod] is repaired!</span>")
|
||||
storedmod.damage = 0
|
||||
if(wornrig.chest)
|
||||
var/obj/item/clothing/suit/space/rig/rigchest = wornrig.chest
|
||||
if(weld_rate && rigchest.damage && cell.checked_use(weld_power_use * weld_rate * CELLRATE))
|
||||
rigchest.breaches = list()
|
||||
rigchest.calc_breach_damage()
|
||||
to_chat(H, "<span class='notice'>[rigchest] is repaired!</span>")
|
||||
if(wornrig.cell)
|
||||
var/obj/item/weapon/cell/rigcell = wornrig.cell
|
||||
var/diff = min(rigcell.maxcharge - rigcell.charge, charging_power * CELLRATE) // Capped by charging_power / tick
|
||||
var/charge_used = cell.use(diff)
|
||||
rigcell.give(charge_used)
|
||||
|
||||
/obj/machinery/recharge_station/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -237,7 +256,7 @@
|
||||
|
||||
else if(istype(L, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.isSynthetic())
|
||||
if(H.isSynthetic() || H.wearing_rig)
|
||||
add_fingerprint(H)
|
||||
H.reset_view(src)
|
||||
H.forceMove(src)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
updateUsrDialog()
|
||||
return
|
||||
var/mob/M = locate(href_list["traitormob"])
|
||||
if(M.mind.special_role || jobban_isbanned(M, "Syndicate"))
|
||||
if(M.mind.tcrystals > 0 || jobban_isbanned(M, "Syndicate"))
|
||||
temptext = "<i>We have no need for you at this time. Have a pleasant day.</i><br>"
|
||||
updateUsrDialog()
|
||||
return
|
||||
@@ -33,7 +33,9 @@
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/N = M
|
||||
to_chat(N, "<B>Access granted, here are the supplies!</B>")
|
||||
traitors.equip(N)
|
||||
traitors.spawn_uplink(N)
|
||||
N.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
|
||||
N.mind.accept_tcrystals = 1
|
||||
message_admins("[N]/([N.ckey]) has recieved an uplink and telecrystals from the syndicate beacon.")
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -233,17 +233,19 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
||||
|
||||
if(is_freq_listening(signal)) // detect subspace signals
|
||||
|
||||
signal.data["done"] = 1 // mark the signal as being broadcasted
|
||||
//signal.data["done"] = 1 // mark the signal as being broadcasted since we're a broadcaster
|
||||
signal.data["compression"] = 0
|
||||
|
||||
/*
|
||||
// Search for the original signal and mark it as done as well
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if(original)
|
||||
original.data["done"] = 1
|
||||
*/
|
||||
|
||||
// For some reason level is both used as a list and not a list, and now it needs to be a list.
|
||||
// Because this is a 'all in one' machine, we're gonna just cheat.
|
||||
signal.data["level"] = using_map.contact_levels.Copy()
|
||||
//signal.data["level"] = using_map.contact_levels.Copy()
|
||||
|
||||
if(signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"]) // simulate the network lag if necessary
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
//ERT version with unlimited range (doesn't even check) and uses no power, to enable ert comms to work anywhere.
|
||||
/obj/machinery/telecomms/allinone/ert
|
||||
use_power = USE_POWER_OFF
|
||||
idle_power_usage = 0
|
||||
|
||||
/obj/machinery/telecomms/allinone/ert/receive_signal(datum/signal/signal)
|
||||
if(!on) // has to be on to receive messages
|
||||
return
|
||||
|
||||
if(is_freq_listening(signal)) // detect subspace signals
|
||||
|
||||
//signal.data["done"] = 1 // mark the signal as being broadcasted since we're a broadcaster
|
||||
signal.data["compression"] = 0
|
||||
|
||||
/*
|
||||
// Search for the original signal and mark it as done as well
|
||||
var/datum/signal/original = signal.data["original"]
|
||||
if(original)
|
||||
original.data["done"] = 1
|
||||
*/
|
||||
|
||||
// For some reason level is both used as a list and not a list, and now it needs to be a list.
|
||||
// Because this is a 'all in one' machine, we're gonna just cheat.
|
||||
//signal.data["level"] = using_map.contact_levels.Copy()
|
||||
|
||||
if(signal.data["slow"] > 0)
|
||||
sleep(signal.data["slow"]) // simulate the network lag if necessary
|
||||
|
||||
/* ###### Broadcast a message using signal.data ###### */
|
||||
|
||||
var/datum/radio_frequency/connection = signal.data["connection"]
|
||||
|
||||
var/list/forced_radios
|
||||
for(var/weakref/wr in linked_radios_weakrefs)
|
||||
var/obj/item/device/radio/R = wr.resolve()
|
||||
if(istype(R))
|
||||
LAZYDISTINCTADD(forced_radios, R)
|
||||
|
||||
if(connection.frequency in CENT_FREQS) // if ert broadcast, just
|
||||
Broadcast_Message(signal.data["connection"], signal.data["mob"],
|
||||
signal.data["vmask"], signal.data["vmessage"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"], signal.data["vname"], DATA_NORMAL,
|
||||
signal.data["compression"], list(0), connection.frequency,
|
||||
signal.data["verb"], forced_radios)
|
||||
@@ -458,13 +458,9 @@ GLOBAL_LIST_EMPTY(vending_products)
|
||||
|
||||
if(!can_buy(R, usr))
|
||||
return
|
||||
|
||||
vend_ready = FALSE // From this point onwards, vendor is locked to performing this transaction only, until it is resolved.
|
||||
|
||||
if(R.price <= 0)
|
||||
vend(R, usr)
|
||||
add_fingerprint(usr)
|
||||
vend_ready = TRUE
|
||||
return TRUE
|
||||
|
||||
if(issilicon(usr)) //If the item is not free, provide feedback if a synth is trying to buy something.
|
||||
@@ -473,6 +469,9 @@ GLOBAL_LIST_EMPTY(vending_products)
|
||||
if(!ishuman(usr))
|
||||
return
|
||||
|
||||
|
||||
vend_ready = FALSE // From this point onwards, vendor is locked to performing this transaction only, until it is resolved.
|
||||
|
||||
var/mob/living/carbon/human/H = usr
|
||||
var/obj/item/weapon/card/id/C = H.GetIdCard()
|
||||
|
||||
|
||||
@@ -753,7 +753,9 @@
|
||||
/obj/item/toy/plushie/borgplushie/scrubpuppy = 1,
|
||||
/obj/item/toy/plushie/foxbear = 1,
|
||||
/obj/item/toy/plushie/nukeplushie = 1,
|
||||
/obj/item/toy/plushie/otter = 1)
|
||||
/obj/item/toy/plushie/otter = 1,
|
||||
/obj/item/toy/plushie/vox = 1,
|
||||
/obj/item/toy/mistletoe = 1)
|
||||
//VOREStation Add End
|
||||
premium = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 1,
|
||||
/obj/item/weapon/storage/trinketbox = 2)
|
||||
@@ -793,7 +795,9 @@
|
||||
/obj/item/toy/plushie/borgplushie/scrubpuppy = 50,
|
||||
/obj/item/toy/plushie/foxbear = 50,
|
||||
/obj/item/toy/plushie/nukeplushie = 50,
|
||||
/obj/item/toy/plushie/otter = 50)
|
||||
/obj/item/toy/plushie/otter = 50,
|
||||
/obj/item/toy/plushie/vox = 50,
|
||||
/obj/item/toy/mistletoe = 50)
|
||||
//VOREStation Add End
|
||||
|
||||
|
||||
|
||||
@@ -84,6 +84,158 @@
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/mysterysoup = 10)
|
||||
vend_delay = 15
|
||||
|
||||
//Specific food vending machines for events that want them!
|
||||
|
||||
/obj/machinery/vending/fooditalian
|
||||
name = "Italian Imports"
|
||||
desc = "You wanted some italian food? Well here's some imported from the local pizza place!"
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pastatomato = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatball = 15
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza = 1)
|
||||
vend_delay = 10
|
||||
|
||||
/obj/machinery/vending/foodfast
|
||||
name = "United Grills"
|
||||
desc = "Not sure how they're united but man is this grilled food delicious! Though it seems to just be a lot of fast food..."
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/monkeyburger = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheeseburger = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/fishburger = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/clownburger = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/mimeburger = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/superbiteburger = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/burger/bacon = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/hotdog = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chickenfillet = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/fries = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesyfries = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chilicheesefries = 10
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/ghostburger = 3,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tofuburger = 5)
|
||||
vend_delay = 10
|
||||
|
||||
/obj/machinery/vending/foodmeat
|
||||
name = "Meaty Marvels"
|
||||
desc = "What's a marvel is how you're not ordering from this machine yet!"
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/ribplate = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat_pocket = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatpie = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bacon_flatbread = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/roastbeef = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/stuffed_meatball = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatsteak = 20
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight = 5)
|
||||
vend_delay = 10
|
||||
|
||||
/obj/machinery/vending/foodasian
|
||||
name = "Authenticate Asian"
|
||||
desc = "Some good ol' Sol food!"
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chawanmushi = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/generalschicken = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chickenkatsu = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sweet_and_sour = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bibimbap = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/milosoup = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/lomein = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/friedrice = 10
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/monkeyburger = 1)
|
||||
vend_delay = 10
|
||||
|
||||
/obj/machinery/vending/foodfish
|
||||
name = "Fishy Food"
|
||||
desc = "Don't mind the name, this is 100% fish!"
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/grilled_carp = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/kudzudonburi = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/zestfish = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/lobstercooked = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sashimi = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sharkmeatcooked = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sharkmeatdip = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sharkmeatcubes = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkfishcooked = 10
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish = 1)
|
||||
vend_delay = 10
|
||||
|
||||
/obj/machinery/vending/foodveggie
|
||||
name = "Veggie Varieties"
|
||||
desc = "Even vegitarians have their own vending machines! How thoughtful."
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/beetsoup = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/eggplantparm = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/eggbowl = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/flowerchildsalad = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tossedsalad = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/fruitsalad = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grilledcheese = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/tofurkey = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/stuffing = 10
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1)
|
||||
vend_delay = 10
|
||||
|
||||
/obj/machinery/vending/fooddessert
|
||||
name = "Delightful Desserts"
|
||||
desc = "Even if you've stuffed your face with a pizza or two, you ALWAYS have room for dessert!"
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/applepie = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cherrypie = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/keylimepie = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pie = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/berryclafoutis = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/funnelcake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cookie = 15,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/brownies = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 10,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece = 20
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/donut/chaos = 10)
|
||||
vend_delay = 10
|
||||
|
||||
/obj/machinery/vending/foodstuffing
|
||||
name = "Stuffing Site"
|
||||
desc = "Is... is it just full of stuffing? No wait, there's turkey in there too."
|
||||
icon_state = "hotfood"
|
||||
products = list(/obj/item/weapon/reagent_containers/food/snacks/stuffing = 50,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey= 20
|
||||
)
|
||||
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/tofurkey = 10)
|
||||
vend_delay = 10
|
||||
|
||||
//End of food event machines
|
||||
|
||||
/* For later, then
|
||||
/obj/machinery/vending/weapon_machine
|
||||
name = "Frozen Star Guns&Ammo"
|
||||
@@ -1456,6 +1608,30 @@
|
||||
req_log_access = access_cmo
|
||||
has_logs = 1
|
||||
|
||||
/obj/machinery/vending/abductor
|
||||
name = "Abduct-U"
|
||||
desc = "A mysterious machine which can fabricate many tools for acquiring test subjects."
|
||||
icon = 'icons/obj/abductor_vr.dmi'
|
||||
icon_state = "dispenser_2way"
|
||||
products = list(/obj/item/weapon/card/id/syndicate/station_access = 1,
|
||||
/obj/item/weapon/storage/box/syndie_kit/chameleon = 1,
|
||||
/obj/item/clothing/mask/bandana = 1,
|
||||
/obj/item/clothing/glasses/sunglasses = 1,
|
||||
/obj/item/device/radio/headset/syndicate/alt = 1,
|
||||
/obj/item/device/pda = 1,
|
||||
/obj/item/device/communicator = 1,
|
||||
/obj/item/weapon/tape_roll = 2,
|
||||
/obj/item/weapon/handcuffs = 4,
|
||||
/obj/item/weapon/handcuffs/legcuffs = 4,
|
||||
/obj/item/weapon/cell/device/weapon/recharge/alien = 2,
|
||||
/obj/item/device/chameleon = 1,
|
||||
/obj/item/weapon/storage/mre/menu11 = 2,
|
||||
/obj/item/device/flash = 2,
|
||||
/obj/item/weapon/pen/reagent/paralysis = 4,
|
||||
/obj/item/device/perfect_tele/alien = 1
|
||||
)
|
||||
vend_delay = 15
|
||||
|
||||
/obj/machinery/vending/loadout
|
||||
name = "Fingers and Toes"
|
||||
desc = "A special vendor for gloves and shoes!"
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
|
||||
defence_mode_possible = 1
|
||||
|
||||
icon_scale_x = 1.5
|
||||
icon_scale_y = 1.5
|
||||
|
||||
/*
|
||||
/obj/mecha/combat/durand/New()
|
||||
..()
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
icon_state = ""
|
||||
initial_icon = ""
|
||||
|
||||
dir_in = null //Don't reset direction when empty
|
||||
|
||||
step_in = 2 //Fast
|
||||
|
||||
health = 400
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
|
||||
overload_possible = 1
|
||||
|
||||
icon_scale_x = 1.35
|
||||
icon_scale_y = 1.35
|
||||
|
||||
//Not quite sure how to move those yet.
|
||||
/obj/mecha/combat/gygax/get_commands()
|
||||
var/output = {"<div class='wr'>
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
|
||||
)
|
||||
|
||||
icon_scale_x = 1.5
|
||||
icon_scale_y = 1.5
|
||||
|
||||
/obj/mecha/combat/marauder/seraph
|
||||
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
|
||||
name = "Seraph"
|
||||
|
||||
@@ -49,6 +49,9 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/add_equip_overlay(obj/mecha/M as obj)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page()
|
||||
if(chassis)
|
||||
send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list())
|
||||
|
||||
@@ -26,9 +26,10 @@
|
||||
pr_repair_droid = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj)
|
||||
/obj/item/mecha_parts/mecha_equipment/repair_droid/add_equip_overlay(obj/mecha/M as obj)
|
||||
..()
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid")
|
||||
if(!droid_overlay)
|
||||
droid_overlay = new(src.icon, icon_state = "repair_droid")
|
||||
M.add_overlay(droid_overlay)
|
||||
return
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
// concept borrowed from vgstation-coders/vgstation13#26316 on GitHub
|
||||
/obj/item/mecha_parts/mecha_equipment/runningboard
|
||||
name = "hacked powered exosuit running board"
|
||||
desc = "A running board with a power-lifter attachment, to quickly catapult exosuit pilots into the cockpit. Fits any exosuit."
|
||||
icon_state = "mecha_runningboard"
|
||||
origin_tech = list(TECH_MATERIAL = 6)
|
||||
equip_type = EQUIP_HULL
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/runningboard/limited
|
||||
name = "powered exosuit running board"
|
||||
desc = "A running board with a power-lifter attachment, to quickly catapult exosuit pilots into the cockpit. Only fits to working exosuits."
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/runningboard/limited/can_attach(obj/mecha/M)
|
||||
if(istype(M, /obj/mecha/working)) // is this a ripley?
|
||||
. = ..()
|
||||
else
|
||||
return FALSE
|
||||
@@ -37,15 +37,19 @@
|
||||
my_shield = null
|
||||
..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/add_equip_overlay(obj/mecha/M as obj)
|
||||
..()
|
||||
if(!drone_overlay)
|
||||
drone_overlay = new(src.icon, icon_state = "shield_droid")
|
||||
M.overlays += drone_overlay
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/attach(obj/mecha/M as obj)
|
||||
..()
|
||||
if(chassis)
|
||||
my_shield.shield_health = 0
|
||||
my_shield.my_mecha = chassis
|
||||
my_shield.forceMove(chassis)
|
||||
|
||||
drone_overlay = new(src.icon, icon_state = "shield_droid")
|
||||
M.overlays += drone_overlay
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/combat_shield/detach()
|
||||
|
||||
@@ -467,11 +467,15 @@
|
||||
if(enabled)
|
||||
set_ready_state(0)
|
||||
log_message("Activated.")
|
||||
chassis.overlays += drone_overlay
|
||||
else
|
||||
set_ready_state(1)
|
||||
log_message("Deactivated.")
|
||||
chassis.overlays -= drone_overlay
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone/add_equip_overlay(obj/mecha/M as obj)
|
||||
..()
|
||||
if(enabled)
|
||||
M.add_overlay(drone_overlay)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
+28
-21
@@ -208,6 +208,7 @@
|
||||
for(var/path in starting_equipment)
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new path(src)
|
||||
ME.attach(src)
|
||||
update_transform()
|
||||
|
||||
/obj/mecha/drain_power(var/drain_check)
|
||||
|
||||
@@ -1576,11 +1577,12 @@
|
||||
src.verbs += /obj/mecha/verb/eject
|
||||
src.Entered(mmi_as_oc)
|
||||
src.Move(src.loc)
|
||||
src.icon_state = src.reset_icon()
|
||||
update_icon()
|
||||
set_dir(dir_in)
|
||||
src.log_message("[mmi_as_oc] moved in as pilot.")
|
||||
if(!hasInternalDamage())
|
||||
src.occupant << sound('sound/mecha/nominal.ogg',volume=50)
|
||||
update_icon()
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
@@ -1803,6 +1805,14 @@
|
||||
set src in oview(1)
|
||||
move_inside()
|
||||
|
||||
//returns an equipment object if we have one of that type, useful since is_type_in_list won't return the object
|
||||
//since is_type_in_list uses caching, this is a slower operation, so only use it if needed
|
||||
/obj/mecha/proc/get_equipment(var/equip_type)
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
|
||||
if(istype(ME,equip_type))
|
||||
return ME
|
||||
return null
|
||||
|
||||
/obj/mecha/proc/move_inside()
|
||||
if (usr.stat || !ishuman(usr))
|
||||
return
|
||||
@@ -1843,18 +1853,22 @@
|
||||
return
|
||||
|
||||
// to_chat(usr, "You start climbing into [src.name]")
|
||||
|
||||
visible_message("<span class='notice'>\The [usr] starts to climb into [src.name]</span>")
|
||||
|
||||
if(enter_after(40,usr))
|
||||
if(!src.occupant)
|
||||
moved_inside(usr)
|
||||
if(ishuman(occupant)) //Aeiou
|
||||
GrantActions(occupant, 1)
|
||||
else if(src.occupant!=usr)
|
||||
to_chat(usr, "[src.occupant] was faster. Try better next time, loser.")
|
||||
if(get_equipment(/obj/item/mecha_parts/mecha_equipment/runningboard))
|
||||
visible_message("<span class='notice'>\The [usr] is instantly lifted into [src.name] by the running board!</span>")
|
||||
moved_inside(usr)
|
||||
if(ishuman(occupant))
|
||||
GrantActions(occupant, 1)
|
||||
else
|
||||
to_chat(usr, "You stop entering the exosuit.")
|
||||
visible_message("<span class='notice'>\The [usr] starts to climb into [src.name]</span>")
|
||||
if(enter_after(40,usr))
|
||||
if(!src.occupant)
|
||||
moved_inside(usr)
|
||||
if(ishuman(occupant)) //Aeiou
|
||||
GrantActions(occupant, 1)
|
||||
else if(src.occupant!=usr)
|
||||
to_chat(usr, "[src.occupant] was faster. Try better next time, loser.")
|
||||
else
|
||||
to_chat(usr, "You stop entering the exosuit.")
|
||||
return
|
||||
|
||||
/obj/mecha/proc/moved_inside(var/mob/living/carbon/human/H as mob)
|
||||
@@ -1871,7 +1885,7 @@
|
||||
src.forceMove(src.loc)
|
||||
src.verbs += /obj/mecha/verb/eject
|
||||
src.log_append_to_last("[H] moved in as pilot.")
|
||||
src.icon_state = src.reset_icon()
|
||||
update_icon()
|
||||
//VOREStation Edit Add
|
||||
if(occupant.hud_used)
|
||||
minihud = new (occupant.hud_used, src)
|
||||
@@ -1991,7 +2005,7 @@
|
||||
occupant.clear_alert("mech damage")
|
||||
occupant.in_enclosed_vehicle = 0
|
||||
occupant = null
|
||||
icon_state = src.reset_icon()+"-open"
|
||||
update_icon()
|
||||
set_dir(dir_in)
|
||||
verbs -= /obj/mecha/verb/eject
|
||||
|
||||
@@ -2651,13 +2665,6 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/mecha/proc/reset_icon()
|
||||
if (initial_icon)
|
||||
icon_state = initial_icon
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
return icon_state
|
||||
|
||||
//This is for mobs mostly.
|
||||
/obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message)
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
|
||||
|
||||
/obj/mecha
|
||||
// Show the pilot.
|
||||
var/show_pilot = FALSE
|
||||
|
||||
// The state of the 'face', or the thing that overlays on the pilot. If this isn't set, it will probably look really weird.
|
||||
var/face_state = null
|
||||
var/icon/face_overlay
|
||||
|
||||
var/icon/pilot_image
|
||||
|
||||
// How many pixels do we bump the pilot upward?
|
||||
var/pilot_lift = 0
|
||||
|
||||
/obj/mecha/update_transform()
|
||||
// Now for the regular stuff.
|
||||
var/matrix/M = matrix()
|
||||
M.Scale(icon_scale_x, icon_scale_y)
|
||||
M.Translate(0, 16*(icon_scale_y-1))
|
||||
animate(src, transform = M, time = 10)
|
||||
return
|
||||
|
||||
/obj/mecha/update_icon()
|
||||
if(!initial_icon)
|
||||
initial_icon = initial(icon_state)
|
||||
|
||||
if(occupant)
|
||||
icon_state = initial_icon
|
||||
else
|
||||
icon_state = "[initial_icon]-open"
|
||||
|
||||
cut_overlays()
|
||||
|
||||
if(show_pilot)
|
||||
if(occupant)
|
||||
pilot_image = getCompoundIcon(occupant)
|
||||
|
||||
if(!istype(occupant, /mob/living/carbon/brain))
|
||||
|
||||
var/icon/Cutter
|
||||
|
||||
if("[initial_icon]_cutter" in icon_states(icon))
|
||||
Cutter = new(src.icon, "[initial_icon]_cutter")
|
||||
|
||||
if(Cutter)
|
||||
pilot_image.Blend(Cutter, ICON_MULTIPLY, y = (-1 * pilot_lift))
|
||||
|
||||
var/image/Pilot = image(pilot_image)
|
||||
|
||||
Pilot.pixel_y = pilot_lift
|
||||
|
||||
add_overlay(Pilot)
|
||||
else
|
||||
pilot_image = null
|
||||
|
||||
if(face_state && !face_overlay)
|
||||
face_overlay = new(src.icon, icon_state = face_state)
|
||||
|
||||
if(face_overlay)
|
||||
add_overlay(face_overlay)
|
||||
|
||||
for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment)
|
||||
ME.add_equip_overlay(src)
|
||||
return
|
||||
@@ -17,6 +17,9 @@
|
||||
step_energy_drain = 6
|
||||
var/obj/item/clothing/glasses/hud/health/mech/hud
|
||||
|
||||
icon_scale_x = 1.2
|
||||
icon_scale_y = 1.2
|
||||
|
||||
/obj/mecha/medical/odysseus/New()
|
||||
..()
|
||||
hud = new /obj/item/clothing/glasses/hud/health/mech(src)
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
/obj/item/mecha_parts/component/electrical
|
||||
)
|
||||
|
||||
icon_scale_x = 1.2
|
||||
icon_scale_y = 1.2
|
||||
|
||||
/obj/mecha/working/ripley/Destroy()
|
||||
for(var/atom/movable/A in src.cargo)
|
||||
A.loc = loc
|
||||
@@ -92,6 +95,20 @@
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily
|
||||
qdel (B)
|
||||
|
||||
/obj/mecha/working/ripley/antique
|
||||
name = "APLU \"Geiger\""
|
||||
desc = "You can't beat the classics."
|
||||
icon_state = "ripley-old"
|
||||
initial_icon = "ripley-old"
|
||||
|
||||
show_pilot = TRUE
|
||||
pilot_lift = 5
|
||||
|
||||
max_utility_equip = 1
|
||||
max_universal_equip = 3
|
||||
|
||||
icon_scale_x = 1
|
||||
icon_scale_y = 1
|
||||
|
||||
//Vorestation Edit Start
|
||||
|
||||
|
||||
@@ -86,3 +86,23 @@
|
||||
icon_state = "dwposter11"
|
||||
name = "Secgun"
|
||||
desc = "A striking, wordless advertisement for NanoTrasen's security department. It wasn't very effective and just seems to be used as a warning sign."
|
||||
/datum/poster/vore_25
|
||||
icon_state = "sbsposter14"
|
||||
name = "Awoo"
|
||||
desc = "A top contender for 'images you can hear'."
|
||||
/datum/poster/vore_26
|
||||
icon_state = "sbsposter15"
|
||||
name = "LikeEmSmall"
|
||||
desc = "An advertisement for a defunct dating service for normal-sized individuals to find micro partners."
|
||||
/datum/poster/vore_27
|
||||
icon_state = "sbsposter16"
|
||||
name = "Borgar"
|
||||
desc = "What do you want from Space McDonalds?"
|
||||
/datum/poster/vore_28
|
||||
icon_state = "sbsposter17"
|
||||
name = "DiveIn"
|
||||
desc = "A limited edition holographic poster that seems to feature subliminal suggestions and conditioning."
|
||||
/datum/poster/vore_29
|
||||
icon_state = "sbsposter18"
|
||||
name = "Perdition"
|
||||
desc = "You get the feeling that whomever made this intended for you to feel very differently than you do when you look at it."
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/obj/effect/landmark
|
||||
var/abductor = 0
|
||||
|
||||
/obj/effect/landmark/late_antag
|
||||
name = "Antag Latespawn"
|
||||
var/antag_id
|
||||
|
||||
@@ -7,16 +7,32 @@
|
||||
icon_state = "uglymine"
|
||||
var/triggered = 0
|
||||
var/smoke_strength = 3
|
||||
var/mineitemtype = /obj/item/weapon/mine
|
||||
var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine
|
||||
var/panel_open = 0
|
||||
var/datum/wires/mines/wires = null
|
||||
register_as_dangerous_object = TRUE
|
||||
|
||||
var/camo_net = FALSE // Will the mine 'cloak' on deployment?
|
||||
|
||||
// The trap item will be triggered in some manner when detonating. Default only checks for grenades.
|
||||
var/obj/item/trap = null
|
||||
|
||||
/obj/effect/mine/New()
|
||||
icon_state = "uglyminearmed"
|
||||
wires = new(src)
|
||||
|
||||
if(ispath(trap))
|
||||
trap = new trap(src)
|
||||
|
||||
/obj/effect/mine/Initialize()
|
||||
..()
|
||||
|
||||
if(camo_net)
|
||||
alpha = 50
|
||||
|
||||
/obj/effect/mine/Destroy()
|
||||
if(trap)
|
||||
QDEL_NULL(trap)
|
||||
qdel_null(wires)
|
||||
return ..()
|
||||
|
||||
@@ -25,11 +41,33 @@
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks.
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/proc/trigger_trap(var/mob/living/victim)
|
||||
if(istype(trap, /obj/item/weapon/grenade))
|
||||
var/obj/item/weapon/grenade/G = trap
|
||||
trap = null
|
||||
G.forceMove(get_turf(src))
|
||||
if(victim.ckey)
|
||||
msg_admin_attack("[key_name_admin(victim)] stepped on \a [src.name], triggering [trap]")
|
||||
G.activate()
|
||||
|
||||
if(istype(trap, /obj/item/device/transfer_valve))
|
||||
var/obj/item/device/transfer_valve/TV = trap
|
||||
trap = null
|
||||
TV.forceMove(get_turf(src))
|
||||
TV.toggle_valve()
|
||||
|
||||
/obj/effect/mine/bullet_act()
|
||||
if(prob(50))
|
||||
explode()
|
||||
@@ -63,6 +101,9 @@
|
||||
"<span class='notice'>You very carefully screw the mine's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
|
||||
// Panel open, stay uncloaked, or uncloak if already cloaked. If you don't cloak on place, ignore it and just be normal alpha.
|
||||
alpha = camo_net ? (panel_open ? 255 : 50) : 255
|
||||
|
||||
else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open)
|
||||
interact(user)
|
||||
else
|
||||
@@ -74,6 +115,9 @@
|
||||
user.set_machine(src)
|
||||
wires.Interact(user)
|
||||
|
||||
/obj/effect/mine/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/dnascramble
|
||||
mineitemtype = /obj/item/weapon/mine/dnascramble
|
||||
|
||||
@@ -193,6 +237,9 @@
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/emp/camo
|
||||
camo_net = TRUE
|
||||
|
||||
/obj/effect/mine/incendiary
|
||||
mineitemtype = /obj/item/weapon/mine/incendiary
|
||||
|
||||
@@ -208,6 +255,26 @@
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mine/gadget
|
||||
mineitemtype = /obj/item/weapon/mine/gadget
|
||||
|
||||
/obj/effect/mine/gadget/explode(var/mob/living/M)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread()
|
||||
triggered = 1
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
if(trap)
|
||||
trigger_trap(M)
|
||||
visible_message("\The [src.name] flashes as it is triggered!")
|
||||
|
||||
else
|
||||
explosion(loc, 0, 0, 2, 2)
|
||||
visible_message("\The [src.name] detonates!")
|
||||
|
||||
qdel(s)
|
||||
qdel(src)
|
||||
|
||||
/////////////////////////////////////////////
|
||||
// The held item version of the above mines
|
||||
/////////////////////////////////////////////
|
||||
@@ -219,6 +286,10 @@
|
||||
var/countdown = 10
|
||||
var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime.
|
||||
|
||||
var/obj/item/trap = null
|
||||
|
||||
var/list/allowed_gadgets = null
|
||||
|
||||
/obj/item/weapon/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times
|
||||
add_fingerprint(user)
|
||||
msg_admin_attack("[key_name_admin(user)] primed \a [src]")
|
||||
@@ -231,11 +302,39 @@
|
||||
prime(user, TRUE)
|
||||
return
|
||||
|
||||
/obj/item/weapon/mine/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(W.is_screwdriver() && trap)
|
||||
to_chat(user, "<span class='notice'>You begin removing \the [trap].</span>")
|
||||
if(do_after(user, 10 SECONDS))
|
||||
to_chat(user, "<span class='notice'>You finish disconnecting the mine's trigger.</span>")
|
||||
trap.forceMove(get_turf(src))
|
||||
trap = null
|
||||
return
|
||||
|
||||
if(LAZYLEN(allowed_gadgets) && !trap)
|
||||
var/allowed = FALSE
|
||||
|
||||
for(var/path in allowed_gadgets)
|
||||
if(istype(W, path))
|
||||
allowed = TRUE
|
||||
break
|
||||
|
||||
if(allowed)
|
||||
user.drop_from_inventory(W)
|
||||
W.forceMove(src)
|
||||
trap = W
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/weapon/mine/proc/prime(mob/user as mob, var/explode_now = FALSE)
|
||||
visible_message("\The [src.name] beeps as the priming sequence completes.")
|
||||
var/obj/effect/mine/R = new minetype(get_turf(src))
|
||||
src.transfer_fingerprints_to(R)
|
||||
R.add_fingerprint(user)
|
||||
if(trap)
|
||||
R.trap = trap
|
||||
trap = null
|
||||
R.trap.forceMove(R)
|
||||
if(explode_now)
|
||||
R.explode(user)
|
||||
spawn(0)
|
||||
@@ -286,8 +385,14 @@
|
||||
desc = "A small explosive mine with a fire symbol on the side."
|
||||
minetype = /obj/effect/mine/incendiary
|
||||
|
||||
/obj/item/weapon/mine/gadget
|
||||
name = "gadget mine"
|
||||
desc = "A small pressure-triggered device. If no component is added, the internal release bolts will detonate in unison when triggered."
|
||||
|
||||
allowed_gadgets = list(/obj/item/weapon/grenade, /obj/item/device/transfer_valve)
|
||||
|
||||
// This tells AI mobs to not be dumb and step on mines willingly.
|
||||
/obj/item/weapon/mine/is_safe_to_step(mob/living/L)
|
||||
if(!L.hovering)
|
||||
return FALSE
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -942,3 +942,12 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
|
||||
|
||||
/obj/item/proc/openTip(location, control, params, user)
|
||||
openToolTip(user, src, params, title = name, content = desc)
|
||||
|
||||
// These procs are for RPEDs and part ratings. The concept for this was borrowed from /vg/station.
|
||||
// Gets the rating of the item, used in stuff like machine construction.
|
||||
/obj/item/proc/get_rating()
|
||||
return FALSE
|
||||
|
||||
// Like the above, but used for RPED sorting of parts.
|
||||
/obj/item/proc/rped_rating()
|
||||
return get_rating()
|
||||
@@ -509,8 +509,8 @@
|
||||
return // Still no brain.
|
||||
|
||||
// If the brain'd `defib_timer` var gets below this number, brain damage will happen at a linear rate.
|
||||
// This is measures in `Life()` ticks. E.g. 10 minute defib timer = 6000 world.time units = 3000 `Life()` ticks.
|
||||
var/brain_damage_timer = ((config.defib_timer MINUTES) / 2) - ((config.defib_braindamage_timer MINUTES) / 2)
|
||||
// This is measures in `Life()` ticks. E.g. 10 minute defib timer = 300 `Life()` ticks. // Original math was VERY off. Life() tick occurs every ~2 seconds, not every 2 world.time ticks.
|
||||
var/brain_damage_timer = ((config.defib_timer MINUTES) / 20) - ((config.defib_braindamage_timer MINUTES) / 20)
|
||||
|
||||
if(brain.defib_timer > brain_damage_timer)
|
||||
return // They got revived before brain damage got a chance to set in.
|
||||
|
||||
@@ -88,6 +88,14 @@
|
||||
if(get_dist(user, src) == 0)
|
||||
. += "It has a tiny camera inside. Needs to be both configured and brought in contact with monitor device to be fully functional."
|
||||
|
||||
/obj/item/device/camerabug/update_icon()
|
||||
..()
|
||||
|
||||
if(anchored) // Standard versions are relatively obvious if not hidden in a container. Anchoring them is advised, to disguise them.
|
||||
alpha = 50
|
||||
else
|
||||
alpha = 255
|
||||
|
||||
/obj/item/device/camerabug/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
if(istype(W, /obj/item/device/bug_monitor))
|
||||
var/obj/item/device/bug_monitor/SM = W
|
||||
@@ -101,6 +109,15 @@
|
||||
linkedmonitor = null
|
||||
else
|
||||
to_chat(user, "Error: The device is linked to another monitor.")
|
||||
|
||||
else if(W.is_wrench() && user.a_intent != I_HURT)
|
||||
if(isturf(loc))
|
||||
anchored = !anchored
|
||||
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "" : "un"]secure \the [src].</span>")
|
||||
|
||||
update_icon()
|
||||
return
|
||||
else
|
||||
if(W.force >= 5)
|
||||
visible_message("\The [src] lens shatters!")
|
||||
|
||||
@@ -92,11 +92,11 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/perfect_tele/proc/unload_ammo(mob/user)
|
||||
/obj/item/device/perfect_tele/proc/unload_ammo(mob/user, var/ignore_inactive_hand_check = 0)
|
||||
if(battery_lock)
|
||||
to_chat(user,"<span class='notice'>[src] does not have a battery port.</span>")
|
||||
return
|
||||
if(user.get_inactive_hand() == src && power_source)
|
||||
if((user.get_inactive_hand() == src || ignore_inactive_hand_check) && power_source)
|
||||
to_chat(user,"<span class='notice'>You eject \the [power_source] from \the [src].</span>")
|
||||
user.put_in_hands(power_source)
|
||||
power_source = null
|
||||
@@ -111,7 +111,7 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/perfect_tele/attack_self(mob/user)
|
||||
/obj/item/device/perfect_tele/attack_self(mob/user, var/radial_menu_anchor = src)
|
||||
if(loc_network)
|
||||
for(var/obj/item/device/perfect_tele_beacon/stationary/nb in premade_tele_beacons)
|
||||
if(nb.tele_network == loc_network)
|
||||
@@ -124,8 +124,7 @@
|
||||
and tele-vore. Make sure you carefully examine someone's OOC prefs before teleporting them if you are \
|
||||
going to use this device for ERP purposes. This device records all warnings given and teleport events for \
|
||||
admin review in case of pref-breaking, so just don't do it.","OOC WARNING")
|
||||
|
||||
var/choice = show_radial_menu(user, src, radial_images, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
var/choice = show_radial_menu(user, radial_menu_anchor, radial_images, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
|
||||
if(!choice)
|
||||
return
|
||||
@@ -281,7 +280,7 @@
|
||||
//Seems okay to me!
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/perfect_tele/afterattack(mob/living/target, mob/living/user, proximity)
|
||||
/obj/item/device/perfect_tele/afterattack(mob/living/target, mob/living/user, proximity, var/ignore_fail_chance = 0)
|
||||
//No, you can't teleport people from over there.
|
||||
if(!proximity)
|
||||
return
|
||||
@@ -312,11 +311,12 @@
|
||||
R.force_dismount(rider)
|
||||
|
||||
//Failure chance
|
||||
if(prob(failure_chance) && beacons.len >= 2)
|
||||
var/list/wrong_choices = beacons - destination.tele_name
|
||||
var/wrong_name = pick(wrong_choices)
|
||||
destination = beacons[wrong_name]
|
||||
to_chat(user,"<span class='warning'>\The [src] malfunctions and sends you to the wrong beacon!</span>")
|
||||
if (!ignore_fail_chance)
|
||||
if(prob(failure_chance) && beacons.len >= 2)
|
||||
var/list/wrong_choices = beacons - destination.tele_name
|
||||
var/wrong_name = pick(wrong_choices)
|
||||
destination = beacons[wrong_name]
|
||||
to_chat(user,"<span class='warning'>\The [src] malfunctions and sends you to the wrong beacon!</span>")
|
||||
|
||||
//Destination beacon vore checking
|
||||
var/turf/dT = get_turf(destination)
|
||||
|
||||
@@ -112,6 +112,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink)
|
||||
/obj/item/device/uplink/hidden/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
|
||||
if(!active)
|
||||
toggle()
|
||||
uses = user.mind.tcrystals
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "Uplink", "Remote Uplink")
|
||||
|
||||
@@ -241,7 +241,7 @@
|
||||
M.initial_icon = new_icon
|
||||
if(new_icon_file)
|
||||
M.icon = new_icon_file
|
||||
M.reset_icon()
|
||||
M.update_icon()
|
||||
use(1, user)
|
||||
|
||||
/obj/mecha/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
|
||||
@@ -31,8 +31,8 @@
|
||||
return 1
|
||||
|
||||
/obj/item/borg/upgrade/bellysizeupgrade
|
||||
name = "robotic Hound process capacity upgrade Module"
|
||||
desc = "Used to upgrade a hound belly capacity. This only affects total volume and such, you won't be able to support more than one patient. Usable once."
|
||||
name = "robohound capacity expansion module"
|
||||
desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once."
|
||||
icon_state = "cyborg_upgrade2"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
@@ -56,3 +56,6 @@
|
||||
name = "Bandage Synthesizer"
|
||||
max_energy = 10
|
||||
recharge_rate = 1
|
||||
|
||||
/datum/matter_synth/cloth
|
||||
name = "Cloth Synthesizer"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user