This commit is contained in:
SweetBlueSylveon
2021-02-04 21:33:26 -08:00
582 changed files with 174283 additions and 101435 deletions
+2 -2
View File
@@ -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.
+39
View File
@@ -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
+69
View File
@@ -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"
+26 -9
View File
@@ -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
View File
@@ -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)"
-2
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
/obj/machinery/atmospherics/pipe/tank/phoron/full
start_pressure = 15000
/obj/machinery/atmospherics/pipe/tank/air/full
start_pressure = 15000
+1 -14
View File
@@ -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
View File
@@ -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"
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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.
+2 -2
View File
@@ -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:
+1 -1
View File
@@ -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
+71 -23
View File
@@ -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
+1 -1
View File
@@ -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.)
+14 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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 -2
View File
@@ -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"
+5 -10
View File
@@ -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
+5
View File
@@ -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>")
+1 -1
View File
@@ -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
View File
@@ -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:
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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()
+6
View File
@@ -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
+5
View File
@@ -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
+3 -3
View File
@@ -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
+15
View File
@@ -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
+158 -47
View File
@@ -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(
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2
View File
@@ -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
+3 -3
View File
@@ -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
+63
View File
@@ -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
+6
View File
@@ -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
+15
View File
@@ -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
+1 -1
View File
@@ -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)"
+22 -2
View File
@@ -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)
+31 -2
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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)
+16 -14
View File
@@ -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
+17 -10
View File
@@ -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"
+34 -5
View File
@@ -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"
+149 -6
View File
@@ -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?"
+29 -1
View File
@@ -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."
+27 -27
View File
@@ -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"
+56 -1
View File
@@ -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
+15 -17
View File
@@ -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
-1
View File
@@ -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
+53 -2
View File
@@ -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"
+33 -1
View File
@@ -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"
+17 -36
View File
@@ -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)
-6
View File
@@ -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
+23
View File
@@ -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()
+248 -1
View File
@@ -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
+26
View File
@@ -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"
)
+2 -2
View File
@@ -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())
+8 -8
View File
@@ -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")
-103
View File
@@ -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"
+12
View File
@@ -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'
+28
View File
@@ -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)
+10
View File
@@ -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
+7 -5
View File
@@ -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
+23 -14
View File
@@ -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
+36 -17
View File
@@ -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)
+4 -2
View File
@@ -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()
+4 -2
View File
@@ -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)
+3 -4
View File
@@ -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()
+6 -2
View File
@@ -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
+176
View File
@@ -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!"
+3
View File
@@ -33,6 +33,9 @@
defence_mode_possible = 1
icon_scale_x = 1.5
icon_scale_y = 1.5
/*
/obj/mecha/combat/durand/New()
..()
+2
View File
@@ -13,6 +13,8 @@
icon_state = ""
initial_icon = ""
dir_in = null //Don't reset direction when empty
step_in = 2 //Fast
health = 400
+3
View File
@@ -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'>
+3
View File
@@ -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
+7 -3
View File
@@ -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
View File
@@ -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)
+65
View File
@@ -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
+3
View File
@@ -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)
+17
View File
@@ -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
+109 -4
View File
@@ -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 ..()
+9
View File
@@ -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()
+2 -2
View File
@@ -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")
+1 -1
View File
@@ -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