diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index a1e4140588..31fd819b1a 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,8 +1,8 @@
-# Contributing to VOREStation
+# Contributing to CHOMPStation
:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
-The following is a set of guidelines for contributing to VOREStation, which is hosted in the [VOREStation Org](https://github.com/VOREStation) on GitHub.
+The following is a set of guidelines for contributing to Chomp Station, which is hosted in the [Chomp Station](https://github.com/CHOMPStation2/CHOMPStation2) on GitHub.
These are just guidelines, not rules, use your best judgment and feel free to propose changes to this document in a pull request.
#### Table Of Contents
@@ -12,7 +12,7 @@ These are just guidelines, not rules, use your best judgment and feel free to pr
[How Can I Contribute?](#how-can-i-contribute)
* [Your First Code Contribution](#your-first-code-contribution)
- * [VOREStation Coding Standards](#vorestation-coding-standards)
+ * [Chomp Station Coding Standards](#Chomp Station-coding-standards)
* [Pull Requests](#pull-requests)
* [Git Commit Messages](#git-commit-messages)
@@ -30,33 +30,33 @@ By participating, you are expected to uphold this code.
### Your First Code Contribution
-Unsure where to begin contributing to VOREStation? You can start by looking through the issues tab.
+Unsure where to begin contributing to Chomp Station? You can start by looking through the issues tab.
-### VOREStation Coding Standards
+### Chomp Station Coding Standards
Any code submissions that do not meet our coding standards are likely to be rejected, or at the very least, have a maintainer request changes on your PR. Save time and follow these standards from the start.
-* If it is something like a bugfix that Polaris would want (the codebase we use), code it in their code and make the PR to them. We regularly update from them. They would want any general gameplay bugfixes, and things that are obviously intended to work one way, but do not. They do not have any of our fluff species (vulp, akula, fenn, etc) so do not make PRs related to that, or any vore content to them.
-* Never edit stock Polaris .DMI files. If you are confused about which .DMI files we have added and which were there originally, refer to their repository and and see if they exist (https://github.com/PolarisSS13/Polaris). All PRs with edits to stock .DMI files will be rejected.
+* If it is something like a bugfix that Yawn-Wider or VoreStation or Polaris would want (the codebases we use), code it in their code and make the PR to them. We regularly update from them. They would want any general gameplay bugfixes, and things that are obviously intended to work one way, but do not. They do not have any of our fluff species (vulp, akula, fenn, etc) so do not make PRs related to that, or any vore content to them.
+* Never edit stock Polaris or Vore .DMI files. If you are confused about which .DMI files we have added and which were there originally, refer to their repository and and see if they exist (https://github.com/PolarisSS13/Polaris) (https://github.com/VOREStation/VOREStation) (https://github.com/\-Wider/YWPolarisVore). All PRs with edits to stock .DMI files might be rejected.
* When changing any code in any stock Polaris .DM file, you must mark your changes:
- * For single-line changes: //VOREStation Edit - "Explanation" (Edit can also be Add for new lines or Removal if you are commenting the line out)
- * For multi-line additions: //VOREStation Edit - "Explanation" and then at the bottom of your changes, //VOREStation Edit End
- * For multi-line removals: Use a block comment (/\* xxx \*/) to comment out the existing code block (do not modify whitespace more than necessary) and at the start, it should contain /\* VOREStation Removal - "Reason"
+ * For single-line changes: //CHOMPEdit - "Explanation" (Edit can also be Add for new lines or Removal if you are commenting the line out)
+ * For multi-line additions: //CHOMPEdit - "Explanation" and then at the bottom of your changes, //CHOMPEdit End
+ * For multi-line removals: Use a block comment (/\* xxx \*/) to comment out the existing code block (do not modify whitespace more than necessary) and at the start, it should contain /\* CHOMP Removal - "Reason"
* Change whitespace as little as possible. Do not randomly add/remove whitespace.
-* Any new files should have "_vr" at the end. For example, "life_vr.dm". Just make them in the same location as the file they are related to.
+* Any new files should have "_ch" at the end. For example, "life_ch.dm". Just make them in the same location as the file they are related to.
* Map changes must be in tgm format. See the [Mapmerge2 Readme] for details.
-The `attempt_vr()` proc has been added for your convienence. It allows a many-line change to become a single-line change in the existing Polaris files, preserving mergeability and allowing better code separation while preventing your new code from causing runtimes that stop the original code from running. If you are wanting to inject new procedures into an existing proc, called `update_atoms()` for example, you would create `update_atoms_vr()` in a nearby `_vr.dm` file, and then call to it from a single line in the original `update_atoms()` with `attempt_vr()`.
+The `attempt_ch()` proc has been added for your convienence. It allows a many-line change to become a single-line change in the existing Polaris files, preserving mergeability and allowing better code separation while preventing your new code from causing runtimes that stop the original code from running. If you are wanting to inject new procedures into an existing proc, called `update_atoms()` for example, you would create `update_atoms_ch()` in a nearby `_ch.dm` file, and then call to it from a single line in the original `update_atoms()` with `attempt_ch()`.
-The syntax for `attempt_vr()` is: `attempt_vr(atom,"proc_name",list(arg1,arg2))`, where:
-* `atom` should be replaced with what your extended proc is defined on (if you are in something like /obj/machine/scanner/proc/update_things() and you are calling your newly defined /obj/machine/scanner/proc/update_things_vr() you can just put `src` here)
-* `proc_name` is a STRING that should be the name of your proc, such as "update_atoms_vr"
+The syntax for `attempt_ch()` is: `attempt_ch(atom,"proc_name",list(arg1,arg2))`, where:
+* `atom` should be replaced with what your extended proc is defined on (if you are in something like /obj/machine/scanner/proc/update_things() and you are calling your newly defined /obj/machine/scanner/proc/update_things_ch() you can just put `src` here)
+* `proc_name` is a STRING that should be the name of your proc, such as "update_atoms_ch"
* `list(arg1,arg2)` should contain any args you wish to pass to the proc
-As an example of something you can do with `attempt_vr()` in a single line, the grab and vore code is done with this in a single line. When a grab is clicked on someone, there is a line similar to:
-`if(attempt_vr(src,"handle_grabs_vr",list(src,attacker))) return`
+As an example of something you can do with `attempt_ch()` in a single line, the grab and vore code is done with this in a single line. When a grab is clicked on someone, there is a line similar to:
+`if(attempt_ch(src,"handle_grabs_ch",list(src,attacker))) return`
-Then in our `handle_grabs_vr()` proc, if we want to avoid performing the stock game actions and have handled the vore stuff ourselves, we return true, and the original proc returns since attempt_vr returns true.
+Then in our `handle_grabs_ch()` proc, if we want to avoid performing the stock game actions and have handled the vore stuff ourselves, we return true, and the original proc returns since attempt_ch returns true.
### Pull Requests
@@ -72,7 +72,7 @@ Then in our `handle_grabs_vr()` proc, if we want to avoid performing the stock g
* Use the GitHub magic words "Fixed/Fixes/Fix, Resolved/Resolves/Resolve, Closed/Closes/Close", as in, "Closes #1928", as this will automatically close that issue when the PR is merged if it is a fix for that issue.
## Licensing
-VOREStation is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt.
+CHOMPStation is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt.
Commits with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt.
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000000..8b761636db
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,25 @@
+---
+name: Bug report
+about: Create a report to help us improve
+
+---
+
+#### Brief description of the issue
+
+
+#### What you expected to happen
+
+
+#### What actually happened
+
+
+#### Steps to reproduce
+- (Step 1)
+- (Step 2)
+- (and so on)
+
+#### Code Revision
+- (Found using the "Show Server Revision" verb under the OOC tab.)
+
+#### Anything else you may wish to add:
+- (Location if it's a mapping issue, screenshots, sprites, etc.)
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000000..877e2df9cd
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,14 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+
+---
+
+#### Brief overview of the feature
+
+
+#### What you want to happen
+
+
+#### Anything else you may wish to add:
+- (Location if it's a mapping issue, screenshots, sprites, etc.)
diff --git a/.github/boring-cyborg.yml b/.github/boring-cyborg.yml
index 8dfea4c815..441c6a60b4 100644
--- a/.github/boring-cyborg.yml
+++ b/.github/boring-cyborg.yml
@@ -8,6 +8,10 @@ labelPRBasedOnFilePath:
"Type: Map":
- '**/*.dmm'
+ # Add 'Type: Vore' to any changes to any vore files
+ "Type: Vore":
+ - '**/*_vr*'
+
# Add 'Type: Map' to any changes to image files
"Type: Icon":
- '**/*.dmi'
@@ -20,10 +24,10 @@ labelPRBasedOnFilePath:
- '**/*.mp3'
- '**/*.wav'
- # Add 'Type: Fluff' to any change to *custom_items*
+ # Add 'Type: Fluff' to any change to *custom_items_yw or loadout_fluffitems_yw*
"Type: Fluff":
- - '**/*custom_items*'
- - '**/*loadout_fluff*'
+ - '**/*custom_items*_yw*'
+ - '**/*loadout_fluff*_yw*'
- 'config/alienwhitelist.txt'
- 'config/jobwhitelist.txt'
- 'config/custom_sprites.txt'
diff --git a/.gitignore b/.gitignore
index 2e9c7f68b7..2b8ef881fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,24 @@ code/game/gamemodes/technomancer/spells/projectile/overload.dm
code/game/gamemodes/technomancer/spells/projectile/overload.dm
code/modules/client/preference_setup/loadout/loadout_xeno.dm
temp.dmi
+/maps/RandomZLevels/backup/blackmarketpackers.dmm
+/maps/backup/virgo-1.dmm
+/maps/backup/virgo-2.dmm
+/tools/midi2piano/.vs/midi2piano/v14/.suo
+/tools/midi2piano/midi2piano/bin/x86/Debug/Sanford.Multimedia.Midi.dll
+/tools/midi2piano/midi2piano/bin/x86/Debug/midi2piano.exe
+/tools/midi2piano/midi2piano/bin/x86/Debug/midi2piano.pdb
+/tools/midi2piano/midi2piano/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache
+/tools/midi2piano/midi2piano/obj/x86/Debug/midi2piano.Form1.resources
+/tools/midi2piano/midi2piano/obj/x86/Debug/midi2piano.csproj.FileListAbsolute.txt
+/tools/midi2piano/midi2piano/obj/x86/Debug/midi2piano.csproj.GenerateResource.Cache
+/tools/midi2piano/midi2piano/obj/x86/Debug/midi2piano.csprojResolveAssemblyReference.cache
+/tools/midi2piano/midi2piano/obj/x86/Debug/midi2piano.exe
+/tools/midi2piano/midi2piano/obj/x86/Debug/midi2piano.pdb
+/maps/backup
+/maps/original
+/maps/RandomZLevels/backup
+/tools/midi2piano.zip
+/maps/yw/backup
+
+icons/mecha/mecha_ch.dmi
diff --git a/README.md b/README.md
index 51ceb23af6..77f9127bf4 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,19 @@
-# VOREStation
+# CHOMPStation
[](http://forthebadge.com) [](http://forthebadge.com) [](http://forthebadge.com)
-[Website](https://vore-station.net) - [Forums](https://forum.vore-station.net/) - [Wiki](https://wiki.vore-station.net/)
+[Website (we dont have one)](https://www.youtube.com/watch?v=oHg5SJYRHA0) - [Forums](hhttps://forums.chompstation13.net/index.php) - [Wiki](https://wiki.chompstation13.net/index.php?title=Main_Page) - [Discord](contact admin)
Going to make a Pull Request? Make sure you read the [CONTRIBUTING.md](.github/CONTRIBUTING.md) first!
-VOREStation is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13.
+CHOMPStation is a fork of the Yawn-wider code branch which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13.

---
### LICENSE
-The code for VOREStation is licensed under the [GNU Affero General Public License](http://www.gnu.org/licenses/agpl.html) version 3, which can be found in full in LICENSE-AGPL3.txt.
+The code for CHOMPStation is licensed under the [GNU Affero General Public License](http://www.gnu.org/licenses/agpl.html) version 3, which can be found in full in LICENSE-AGPL3.txt.
Code with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt.
@@ -38,11 +38,11 @@ Attributions and other licenses with links to original works are noted in [ATTRI
### GETTING THE CODE
The simplest way to obtain the code is using the github .zip feature. If you do this, you won't be able to make a Pull Request later, though. You'll need to use the git method.
-Click [here](https://github.com/VOREStation/VOREStation/archive/master.zip) to get the latest code as a .zip file, then unzip it to wherever you want.
+Click [here](https://github.com/CHOMPStation2/CHOMPStation2/archive/master.zip) to get the latest code as a .zip file, then unzip it to wherever you want.
The more complicated and easier to update method is using git. You'll need to download git or some client from [here](http://git-scm.com/). When that's installed, right click in any folder and click on "Git Bash". When that opens, type in:
- git clone https://github.com/VOREStation/VOREStation.git
+ git clone https://github.com/CHOMPStation2/CHOMPStation2.git
(hint: hold down ctrl and press insert to paste into git bash)
diff --git a/TGS3.json b/TGS3.json
new file mode 100644
index 0000000000..261668cf8e
--- /dev/null
+++ b/TGS3.json
@@ -0,0 +1,9 @@
+{
+ "static_directories": [
+ "config",
+ "data"
+ ],
+ "dlls": [
+ "libmysql.dll"
+ ]
+}
\ No newline at end of file
diff --git a/_build_dependencies.sh b/_build_dependencies.sh
index 835e8f81c2..197fb27bd3 100644
--- a/_build_dependencies.sh
+++ b/_build_dependencies.sh
@@ -10,4 +10,4 @@ export BYOND_MAJOR=513
# Byond Minor
export BYOND_MINOR=1528
# Macro Count
-export MACRO_COUNT=4
\ No newline at end of file
+export MACRO_COUNT=4
diff --git a/code/ATMOSPHERICS/components/unary/heat_source_ch.dm b/code/ATMOSPHERICS/components/unary/heat_source_ch.dm
new file mode 100644
index 0000000000..b5d4233f18
--- /dev/null
+++ b/code/ATMOSPHERICS/components/unary/heat_source_ch.dm
@@ -0,0 +1,3 @@
+/obj/machinery/atmospherics/unary/heater/sauna
+ max_temperature = 331.15
+ set_temperature = 313.15
\ No newline at end of file
diff --git a/code/__defines/_globals.dm b/code/__defines/_globals.dm
new file mode 100644
index 0000000000..7e7aa3158f
--- /dev/null
+++ b/code/__defines/_globals.dm
@@ -0,0 +1,38 @@
+//See controllers/globals.dm
+#define GLOBAL_MANAGED(X, InitValue)\
+/datum/controller/global_vars/proc/InitGlobal##X(){\
+ ##X = ##InitValue;\
+ gvars_datum_init_order += #X;\
+}
+#define GLOBAL_UNMANAGED(X) /datum/controller/global_vars/proc/InitGlobal##X() { return; }
+
+#ifndef TESTING
+#define GLOBAL_PROTECT(X)\
+/datum/controller/global_vars/InitGlobal##X(){\
+ ..();\
+ gvars_datum_protected_varlist[#X] = TRUE;\
+}
+#else
+#define GLOBAL_PROTECT(X)
+#endif
+
+#define GLOBAL_REAL_VAR(X) var/global/##X
+#define GLOBAL_REAL(X, Typepath) var/global##Typepath/##X
+
+#define GLOBAL_RAW(X) /datum/controller/global_vars/var/global##X
+
+#define GLOBAL_VAR_INIT(X, InitValue) GLOBAL_RAW(/##X); GLOBAL_MANAGED(X, InitValue)
+
+#define GLOBAL_VAR_CONST(X, InitValue) GLOBAL_RAW(/const/##X) = InitValue; GLOBAL_UNMANAGED(X)
+
+#define GLOBAL_LIST_INIT(X, InitValue) GLOBAL_RAW(/list/##X); GLOBAL_MANAGED(X, InitValue)
+
+#define GLOBAL_LIST_EMPTY(X) GLOBAL_LIST_INIT(X, list())
+
+#define GLOBAL_DATUM_INIT(X, Typepath, InitValue) GLOBAL_RAW(Typepath/##X); GLOBAL_MANAGED(X, InitValue)
+
+#define GLOBAL_VAR(X) GLOBAL_RAW(/##X); GLOBAL_UNMANAGED(X)
+
+#define GLOBAL_LIST(X) GLOBAL_RAW(/list/##X); GLOBAL_UNMANAGED(X)
+
+#define GLOBAL_DATUM(X, Typepath) GLOBAL_RAW(Typepath/##X); GLOBAL_UNMANAGED(X)
diff --git a/code/__defines/belly_modes_ch.dm b/code/__defines/belly_modes_ch.dm
new file mode 100644
index 0000000000..e4b04aa87a
--- /dev/null
+++ b/code/__defines/belly_modes_ch.dm
@@ -0,0 +1,9 @@
+//CHOMP belly modes
+
+
+
+//Belly Reagents mode flags
+#define DM_FLAG_REAGENTSNUTRI 0x1
+#define DM_FLAG_REAGENTSDIGEST 0x2
+#define DM_FLAG_REAGENTSABSORB 0x4
+#define DM_FLAG_REAGENTSDRAIN 0x8
diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm
index 0976ed5ea3..c87391562b 100644
--- a/code/__defines/chemistry.dm
+++ b/code/__defines/chemistry.dm
@@ -5,6 +5,7 @@
#define CHEM_TOUCH 1
#define CHEM_INGEST 2
#define CHEM_BLOOD 3
+#define CHEM_VORE 4 //CHOMP vore belly interactions
#define MINIMUM_CHEMICAL_VOLUME 0.01
diff --git a/code/__defines/chemistry_vr.dm b/code/__defines/chemistry_vr.dm
index 0058985adc..6edfca9295 100644
--- a/code/__defines/chemistry_vr.dm
+++ b/code/__defines/chemistry_vr.dm
@@ -1,4 +1,5 @@
// More for our custom races
#define IS_CHIMERA 12
#define IS_SHADEKIN 13
-#define IS_ALRAUNE 14
\ No newline at end of file
+#define IS_ALRAUNE 14
+#define IS_GREY 15 //ywedit
diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm
index d7aaed2ce8..aed07bb0ec 100644
--- a/code/__defines/is_helpers.dm
+++ b/code/__defines/is_helpers.dm
@@ -38,6 +38,7 @@
#define iscorgi(A) istype(A, /mob/living/simple_mob/animal/passive/dog/corgi)
#define isslime(A) istype(A, /mob/living/simple_mob/slime)
#define isxeno(A) istype(A, /mob/living/simple_mob/animal/space/alien)
+#define ismetroid(A) istype(A, /mob/living/simple_mob/metroid) //CHOMP Addition
#define iscarbon(A) istype(A, /mob/living/carbon)
#define isalien(A) istype(A, /mob/living/carbon/alien)
diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm
index b8afc5cb72..24f7b26dda 100644
--- a/code/__defines/machinery.dm
+++ b/code/__defines/machinery.dm
@@ -67,6 +67,9 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
#define NETWORK_SECURITY "Security"
#define NETWORK_INTERROGATION "Interrogation"
#define NETWORK_TELECOM "Tcomms"
+#define NETWORK_TCOMMS "Telecommunications" //YW ADD: needs to be defined here or it freaks out
+#define NETWORK_OUTSIDE "Outside" //YW ADD: ditto
+#define NETWORK_SUBSTATIONS "Substations" //YW ADD: and again
#define NETWORK_THUNDER "Entertainment" //VOREStation Edit: broader definition
#define NETWORK_COMMUNICATORS "Communicators"
#define NETWORK_ALARM_ATMOS "Atmosphere Alarms"
@@ -74,9 +77,10 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
#define NETWORK_ALARM_FIRE "Fire Alarms"
#define NETWORK_TALON_HELMETS "TalonHelmets" //VOREStation Add
#define NETWORK_TALON_SHIP "TalonShip" //VOREStation Add
+#define NETWORK_EXPLORATION "Exploration"
// Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them.
-var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret", NETWORK_COMMUNICATORS)
+var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret", NETWORK_COMMUNICATORS, NETWORK_EXPLORATION)
#define TRANSMISSION_WIRE 0 //Is this ever used? I don't think it is.
#define TRANSMISSION_RADIO 1 //Radio transmissions (like airlock controller to pump)
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 9469867e3b..3056e6a8a6 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -279,15 +279,15 @@
// Second argument is the path the list is expected to contain. Note that children will also get added to the global list.
// If the GLOB system is ever ported, you can change this macro in one place and have less work to do than you otherwise would.
#define GLOBAL_LIST_BOILERPLATE(LIST_NAME, PATH)\
-var/global/list/##LIST_NAME = list();\
+GLOBAL_LIST_EMPTY(##LIST_NAME);\
##PATH/Initialize(mapload, ...)\
{\
- ##LIST_NAME += src;\
+ GLOB.##LIST_NAME += src;\
return ..();\
}\
##PATH/Destroy(force, ...)\
{\
- ##LIST_NAME -= src;\
+ GLOB.##LIST_NAME -= src;\
return ..();\
}\
@@ -327,7 +327,7 @@ var/global/list/##LIST_NAME = list();\
#define RCD_VALUE_DELAY "delay"
#define RCD_VALUE_COST "cost"
-#define RCD_SHEETS_PER_MATTER_UNIT 4 // Each physical material sheet is worth four matter units.
+#define RCD_SHEETS_PER_MATTER_UNIT 3 // Each physical material sheet is worth four matter units. ///YW EDIT 4->3 *Buffing RCDs Hopefully.*
#define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT
// Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here.
diff --git a/code/__defines/misc_ch.dm b/code/__defines/misc_ch.dm
new file mode 100644
index 0000000000..31f35d8493
--- /dev/null
+++ b/code/__defines/misc_ch.dm
@@ -0,0 +1,18 @@
+
+//Material defines
+#define MAT_CARPET "red carpet"
+#define MAT_CARPET_TEAL "teal carpet"
+#define MAT_CARPET_BLACK "black carpet"
+#define MAT_CARPET_BLUE "blue carpet"
+#define MAT_CARPET_TURQUOISE "turquoise carpet"
+#define MAT_CARPET_SILVERBLUE "silver blue carpet"
+#define MAT_CARPET_PINK "pink carpet"
+#define MAT_CARPET_PURPLE "purple carpet"
+#define MAT_CARPET_ORANGE "orange carpet"
+
+//Casino prize dispenser stuff
+#define CAT_WEAPONS 1
+#define CAT_GEAR 2
+#define CAT_CLOTHING 4
+#define CAT_MISC 8
+#define CAT_DRINKS 16
diff --git a/code/__defines/mobs_yw.dm b/code/__defines/mobs_yw.dm
new file mode 100644
index 0000000000..8b18512935
--- /dev/null
+++ b/code/__defines/mobs_yw.dm
@@ -0,0 +1,2 @@
+#define SPECIES_SHADEKIN_YW "GeneShadekin"
+#define SPECIES_GREY_YW "Grey"
\ No newline at end of file
diff --git a/code/__defines/research.dm b/code/__defines/research.dm
index b55f6601f8..c4cdd6f299 100644
--- a/code/__defines/research.dm
+++ b/code/__defines/research.dm
@@ -1,20 +1,20 @@
-#define SHEET_MATERIAL_AMOUNT 2000
-
-#define TECH_MATERIAL "materials"
-#define TECH_ENGINEERING "engineering"
-#define TECH_PHORON "phorontech"
-#define TECH_POWER "powerstorage"
-#define TECH_BLUESPACE "bluespace"
-#define TECH_BIO "biotech"
-#define TECH_COMBAT "combat"
-#define TECH_MAGNET "magnets"
-#define TECH_DATA "programming"
-#define TECH_ILLEGAL "syndicate"
-#define TECH_ARCANE "arcane"
-#define TECH_PRECURSOR "precursor"
-
-#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals.
-#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals
-#define MECHFAB 0x0004 //Mechfab
-#define CHASSIS 0x0008 //For protolathe, but differently
+#define SHEET_MATERIAL_AMOUNT 2000
+
+#define TECH_MATERIAL "materials"
+#define TECH_ENGINEERING "engineering"
+#define TECH_PHORON "phorontech"
+#define TECH_POWER "powerstorage"
+#define TECH_BLUESPACE "bluespace"
+#define TECH_BIO "biotech"
+#define TECH_COMBAT "combat"
+#define TECH_MAGNET "magnets"
+#define TECH_DATA "programming"
+#define TECH_ILLEGAL "syndicate"
+#define TECH_ARCANE "arcane"
+#define TECH_PRECURSOR "precursor"
+
+#define IMPRINTER 0x0001 //For circuits. Uses glass/chemicals.
+#define PROTOLATHE 0x0002 //New stuff. Uses glass/metal/chemicals
+#define MECHFAB 0x0004 //Mechfab
+#define CHASSIS 0x0008 //For protolathe, but differently
#define PROSFAB 0x0010 //For prosthetics fab
\ No newline at end of file
diff --git a/code/__defines/server_tools.config.dm b/code/__defines/server_tools.config.dm
new file mode 100644
index 0000000000..ef85b6503b
--- /dev/null
+++ b/code/__defines/server_tools.config.dm
@@ -0,0 +1,8 @@
+#define SERVER_TOOLS_EXTERNAL_CONFIGURATION
+#define SERVER_TOOLS_DEFINE_AND_SET_GLOBAL(Name, Value) GLOBAL_VAR_INIT(##Name, ##Value); GLOBAL_PROTECT(##Name)
+#define SERVER_TOOLS_READ_GLOBAL(Name) GLOB.##Name
+#define SERVER_TOOLS_WRITE_GLOBAL(Name, Value) GLOB.##Name = ##Value
+#define SERVER_TOOLS_WORLD_ANNOUNCE(message) to_chat(world, "[html_encode(##message)]")
+#define SERVER_TOOLS_LOG(message) log_world("SERVICE: [##message]")
+#define SERVER_TOOLS_NOTIFY_ADMINS(event) message_admins(##event)
+#define SERVER_TOOLS_CLIENT_COUNT player_list.len
\ No newline at end of file
diff --git a/code/__defines/server_tools.dm b/code/__defines/server_tools.dm
new file mode 100644
index 0000000000..5f73e2209a
--- /dev/null
+++ b/code/__defines/server_tools.dm
@@ -0,0 +1,101 @@
+// /tg/station 13 server tools API
+#define SERVICE_API_VERSION_STRING "3.2.0.3"
+
+//CONFIGURATION
+//use this define if you want to do configuration outside of this file
+//Required hooks:
+
+//Put this somewhere in /world/New() that is always run
+#define SERVER_TOOLS_ON_NEW ServiceInit()
+//Put this somewhere in /world/Topic(T, Addr, Master, Keys) that is always run before T is modified
+#define SERVER_TOOLS_ON_TOPIC var/service_topic_return = ServiceCommand(params2list(T)); if(service_topic_return) return service_topic_return
+//Put at the beginning of world/Reboot(reason)
+#define SERVER_TOOLS_ON_REBOOT ServiceReboot()
+
+//Optional callable functions:
+
+//Returns the string version of the API
+#define SERVER_TOOLS_API_VERSION ServiceAPIVersion()
+//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise
+//No function below this succeed if this is FALSE
+#define SERVER_TOOLS_PRESENT RunningService()
+//Gets the current version of the service running the server
+#define SERVER_TOOLS_VERSION ServiceVersion()
+//Forces a hard reboot of BYOND by ending the process
+//unlike del(world) clients will try to reconnect
+//If the service has not requested a shutdown, the world will reboot shortly after
+#define SERVER_TOOLS_REBOOT_BYOND(silent) world.ServiceEndProcess(silent)
+/*
+ Gets the list of any testmerged github pull requests
+ "[PR Number]" => list(
+ "title" -> PR title
+ "commit" -> Full hash of commit merged
+ "author" -> Github username of the author of the PR
+ )
+*/
+#define SERVER_TOOLS_PR_LIST GetTestMerges()
+//Sends a message to connected game chats
+#define SERVER_TOOLS_CHAT_BROADCAST(message) world.ChatBroadcast(message)
+//Sends a message to connected admin chats
+#define SERVER_TOOLS_RELAY_BROADCAST(message) world.AdminBroadcast(message)
+
+//IMPLEMENTATION
+
+#define REBOOT_MODE_NORMAL 0
+#define REBOOT_MODE_HARD 1
+#define REBOOT_MODE_SHUTDOWN 2
+
+#define SERVICE_WORLD_PARAM "server_service"
+#define SERVICE_VERSION_PARAM "server_service_version"
+#define SERVICE_INSTANCE_PARAM "server_instance"
+#define SERVICE_PR_TEST_JSON "prtestjob.json"
+#define SERVICE_INTERFACE_DLL "TGDreamDaemonBridge.dll"
+#define SERVICE_INTERFACE_FUNCTION "DDEntryPoint"
+
+#define SERVICE_CMD_HARD_REBOOT "hard_reboot"
+#define SERVICE_CMD_GRACEFUL_SHUTDOWN "graceful_shutdown"
+#define SERVICE_CMD_WORLD_ANNOUNCE "world_announce"
+#define SERVICE_CMD_LIST_CUSTOM "list_custom_commands"
+#define SERVICE_CMD_API_COMPATIBLE "api_compat"
+#define SERVICE_CMD_PLAYER_COUNT "client_count"
+
+#define SERVICE_CMD_PARAM_KEY "serviceCommsKey"
+#define SERVICE_CMD_PARAM_COMMAND "command"
+#define SERVICE_CMD_PARAM_SENDER "sender"
+#define SERVICE_CMD_PARAM_CUSTOM "custom"
+
+#define SERVICE_JSON_PARAM_HELPTEXT "help_text"
+#define SERVICE_JSON_PARAM_ADMINONLY "admin_only"
+#define SERVICE_JSON_PARAM_REQUIREDPARAMETERS "required_parameters"
+
+#define SERVICE_REQUEST_KILL_PROCESS "killme"
+#define SERVICE_REQUEST_KILL_PROCESS_SILENT "killmesilent"
+#define SERVICE_REQUEST_IRC_BROADCAST "irc"
+#define SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE "send2irc"
+#define SERVICE_REQUEST_WORLD_REBOOT "worldreboot"
+#define SERVICE_REQUEST_API_VERSION "api_ver"
+
+#define SERVICE_RETURN_SUCCESS "SUCCESS"
+
+/*
+The MIT License
+Copyright (c) 2017 Jordan Brown
+Permission is hereby granted, free of charge,
+to any person obtaining a copy of this software and
+associated documentation files (the "Software"), to
+deal in the Software without restriction, including
+without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom
+the Software is furnished to do so,
+subject to the following conditions:
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
\ No newline at end of file
diff --git a/code/__defines/sound.dm b/code/__defines/sound.dm
index fcdb53edd6..0602ffc8dc 100644
--- a/code/__defines/sound.dm
+++ b/code/__defines/sound.dm
@@ -1,223 +1,236 @@
-//max channel is 1024. Only go lower from here, because byond tends to pick the first availiable channel to play sounds on
-#define CHANNEL_LOBBYMUSIC 1024
-#define CHANNEL_ADMIN 1023
-#define CHANNEL_VOX 1022
-#define CHANNEL_JUKEBOX 1021
-#define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats
-#define CHANNEL_AMBIENCE_FORCED 1019
-#define CHANNEL_AMBIENCE 1018
-#define CHANNEL_BUZZ 1017
-#define CHANNEL_BICYCLE 1016
-#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
-
-//THIS SHOULD ALWAYS BE THE LOWEST ONE!
-//KEEP IT UPDATED
-
-#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
-
-#define SOUND_MINIMUM_PRESSURE 10
-#define FALLOFF_SOUNDS 0.5
-
-//Sound environment defines. Reverb preset for sounds played in an area, see sound datum reference for more.
-#define GENERIC 0
-#define PADDED_CELL 1
-#define ROOM 2
-#define BATHROOM 3
-#define LIVINGROOM 4
-#define STONEROOM 5
-#define AUDITORIUM 6
-#define CONCERT_HALL 7
-#define CAVE 8
-#define ARENA 9
-#define HANGAR 10
-#define CARPETED_HALLWAY 11
-#define HALLWAY 12
-#define STONE_CORRIDOR 13
-#define ALLEY 14
-#define FOREST 15
-#define CITY 16
-#define MOUNTAINS 17
-#define QUARRY 18
-#define PLAIN 19
-#define PARKING_LOT 20
-#define SEWER_PIPE 21
-#define UNDERWATER 22
-#define DRUGGED 23
-#define DIZZY 24
-#define PSYCHOTIC 25
-
-#define STANDARD_STATION STONEROOM
-#define LARGE_ENCLOSED HANGAR
-#define SMALL_ENCLOSED BATHROOM
-#define TUNNEL_ENCLOSED CAVE
-#define LARGE_SOFTFLOOR CARPETED_HALLWAY
-#define MEDIUM_SOFTFLOOR LIVINGROOM
-#define SMALL_SOFTFLOOR ROOM
-#define ASTEROID CAVE
-#define SPACE UNDERWATER
-
-// Ambience presets.
-// All you need to do to make an area play one of these is set their ambience var to one of these lists.
-// You can even combine them by adding them together, since they're just lists, however you'd have to do that in initialization.
-
-// For weird alien places like the crashed UFO.
-#define AMBIENCE_OTHERWORLDLY list(\
- 'sound/ambience/otherworldly/otherworldly1.ogg',\
- 'sound/ambience/otherworldly/otherworldly2.ogg',\
- 'sound/ambience/otherworldly/otherworldly3.ogg'\
- )
-
-// Restricted, military, or mercenary aligned locations like the armory, the merc ship/base, BSD, etc.
-#define AMBIENCE_HIGHSEC list(\
- 'sound/ambience/highsec/highsec1.ogg',\
- 'sound/ambience/highsec/highsec2.ogg',\
- 'sound/ambience/highsec/highsec3.ogg',\
- 'sound/ambience/highsec/highsec4.ogg'\
- )
-
-// Ruined structures found on the surface or in the caves.
-#define AMBIENCE_RUINS list(\
- 'sound/ambience/ruins/ruins1.ogg',\
- 'sound/ambience/ruins/ruins2.ogg',\
- 'sound/ambience/ruins/ruins3.ogg',\
- 'sound/ambience/ruins/ruins4.ogg',\
- 'sound/ambience/ruins/ruins5.ogg',\
- 'sound/ambience/ruins/ruins6.ogg'\
- )
-
-// Similar to the above, but for more technology/signaling based ruins.
-#define AMBIENCE_TECH_RUINS list(\
- 'sound/ambience/tech_ruins/tech_ruins1.ogg',\
- 'sound/ambience/tech_ruins/tech_ruins2.ogg',\
- 'sound/ambience/tech_ruins/tech_ruins3.ogg'\
- )
-
-// The actual chapel room, and maybe some other places of worship.
-#define AMBIENCE_CHAPEL list(\
- 'sound/ambience/chapel/chapel1.ogg',\
- 'sound/ambience/chapel/chapel2.ogg',\
- 'sound/ambience/chapel/chapel3.ogg',\
- 'sound/ambience/chapel/chapel4.ogg'\
- )
-
-// For peaceful, serene areas, distinct from the Chapel.
-#define AMBIENCE_HOLY list(\
- 'sound/ambience/holy/holy1.ogg',\
- 'sound/ambience/holy/holy2.ogg'\
- )
-
-// Generic sounds for less special rooms.
-#define AMBIENCE_GENERIC list(\
- 'sound/ambience/generic/generic1.ogg',\
- 'sound/ambience/generic/generic2.ogg',\
- 'sound/ambience/generic/generic3.ogg'\
- )
-// 'sound/ambience/generic/generic4.ogg'\ // VOREStation Edit: Comment out entry 4 as this doesn't fit on Virgo, and we have our own weather system.
-
-// Sounds of PA announcements, presumably involving shuttles?
-#define AMBIENCE_ARRIVALS list(\
- 'sound/ambience/arrivals/arrivals1.ogg',\
- 'sound/ambience/arrivals/arrivals2.ogg',\
- 'sound/ambience/arrivals/arrivals3.ogg',\
- 'sound/ambience/arrivals/arrivals4.ogg',\
- 'sound/ambience/arrivals/arrivals5.ogg',\
- 'sound/ambience/arrivals/arrivals6.ogg',\
- 'sound/ambience/arrivals/arrivals7.ogg'\
- )
-
-// Sounds suitable for being inside dark, tight corridors in the underbelly of the station.
-#define AMBIENCE_MAINTENANCE list(\
- 'sound/ambience/maintenance/maintenance1.ogg',\
- 'sound/ambience/maintenance/maintenance2.ogg',\
- 'sound/ambience/maintenance/maintenance3.ogg',\
- 'sound/ambience/maintenance/maintenance4.ogg',\
- 'sound/ambience/maintenance/maintenance5.ogg',\
- 'sound/ambience/maintenance/maintenance6.ogg',\
- 'sound/ambience/maintenance/maintenance7.ogg',\
- 'sound/ambience/maintenance/maintenance8.ogg',\
- 'sound/ambience/maintenance/maintenance9.ogg'\
- )
-
-// Life support machinery at work, keeping everyone breathing.
-#define AMBIENCE_ENGINEERING list(\
- 'sound/ambience/engineering/engineering1.ogg',\
- 'sound/ambience/engineering/engineering2.ogg',\
- 'sound/ambience/engineering/engineering3.ogg'\
- )
-
-// Creepy AI/borg stuff.
-#define AMBIENCE_AI list(\
- 'sound/ambience/ai/ai1.ogg',\
- 'sound/ambience/ai/ai2.ogg',\
- 'sound/ambience/ai/ai3.ogg'\
- )
-
-// Peaceful sounds when floating in the void.
-#define AMBIENCE_SPACE list(\
- 'sound/ambience/space/space_serithi.ogg',\
- 'sound/ambience/space/space1.ogg'\
- )
-
-// Vaguely spooky sounds when around dead things.
-#define AMBIENCE_GHOSTLY list(\
- 'sound/ambience/ghostly/ghostly1.ogg',\
- 'sound/ambience/ghostly/ghostly2.ogg'\
- )
-
-// Concerning sounds, for when one discovers something horrible happened in a PoI.
-#define AMBIENCE_FOREBODING list(\
- 'sound/ambience/foreboding/foreboding1.ogg',\
- 'sound/ambience/foreboding/foreboding2.ogg',\
- 'sound/ambience/foreboding/foreboding3.ogg',\
- 'sound/ambience/foreboding/foreboding4.ogg',\
- 'sound/ambience/foreboding/foreboding5.ogg',\
- 'sound/ambience/foreboding/foreboding6.ogg'\
- )
-
-// Ambience heard when aboveground on Sif and not in a Point of Interest.
-#define AMBIENCE_SIF list(\
- 'sound/ambience/sif/sif1.ogg'\
- )
-
-// If we ever add geothermal PoIs or other places that are really hot, this will do.
-#define AMBIENCE_LAVA list(\
- 'sound/ambience/lava/lava1.ogg'\
- )
-
-// Cult-y ambience, for some PoIs, and maybe when the cultists darken the world with the ritual.
-#define AMBIENCE_UNHOLY list(\
- 'sound/ambience/unholy/unholy1.ogg'\
- )
-
-// For the memes.
-#define AMBIENCE_AESTHETIC list(\
- 'sound/ambience/vaporwave.ogg'\
- )
-
-#define AMBIENCE_OUTPOST list(\
- 'sound/ambience/expoutpost/expoutpost1.ogg',\
- 'sound/ambience/expoutpost/expoutpost2.ogg',\
- 'sound/ambience/expoutpost/expoutpost3.ogg',\
- 'sound/ambience/expoutpost/expoutpost4.ogg'\
- )
-
-#define AMBIENCE_SUBSTATION list(\
- 'sound/ambience/substation/substation1.ogg',\
- 'sound/ambience/substation/substation2.ogg'\
- )
-
-#define AMBIENCE_HANGAR list(\
- 'sound/ambience/hangar/hangar1.ogg',\
- 'sound/ambience/hangar/hangar2.ogg',\
- 'sound/ambience/hangar/hangar3.ogg',\
- 'sound/ambience/hangar/hangar4.ogg',\
- 'sound/ambience/hangar/hangar5.ogg',\
- 'sound/ambience/hangar/hangar6.ogg'\
- )
-
-#define AMBIENCE_ATMOS list(\
- 'sound/ambience/engineering/engineering1.ogg',\
- 'sound/ambience/engineering/engineering2.ogg',\
- 'sound/ambience/engineering/engineering3.ogg',\
- 'sound/ambience/atmospherics/atmospherics1.ogg'\
- )
\ No newline at end of file
+//max channel is 1024. Only go lower from here, because byond tends to pick the first availiable channel to play sounds on
+#define CHANNEL_LOBBYMUSIC 1024
+#define CHANNEL_ADMIN 1023
+#define CHANNEL_VOX 1022
+#define CHANNEL_JUKEBOX 1021
+#define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats
+#define CHANNEL_AMBIENCE_FORCED 1019
+#define CHANNEL_AMBIENCE 1018
+#define CHANNEL_BUZZ 1017
+#define CHANNEL_BICYCLE 1016
+#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
+
+//THIS SHOULD ALWAYS BE THE LOWEST ONE!
+//KEEP IT UPDATED
+
+#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
+
+#define SOUND_MINIMUM_PRESSURE 10
+#define FALLOFF_SOUNDS 0.5
+
+//Sound environment defines. Reverb preset for sounds played in an area, see sound datum reference for more.
+#define GENERIC 0
+#define PADDED_CELL 1
+#define ROOM 2
+#define BATHROOM 3
+#define LIVINGROOM 4
+#define STONEROOM 5
+#define AUDITORIUM 6
+#define CONCERT_HALL 7
+#define CAVE 8
+#define ARENA 9
+#define HANGAR 10
+#define CARPETED_HALLWAY 11
+#define HALLWAY 12
+#define STONE_CORRIDOR 13
+#define ALLEY 14
+#define FOREST 15
+#define CITY 16
+#define MOUNTAINS 17
+#define QUARRY 18
+#define PLAIN 19
+#define PARKING_LOT 20
+#define SEWER_PIPE 21
+#define UNDERWATER 22
+#define DRUGGED 23
+#define DIZZY 24
+#define PSYCHOTIC 25
+
+#define STANDARD_STATION STONEROOM
+#define LARGE_ENCLOSED HANGAR
+#define SMALL_ENCLOSED BATHROOM
+#define TUNNEL_ENCLOSED CAVE
+#define LARGE_SOFTFLOOR CARPETED_HALLWAY
+#define MEDIUM_SOFTFLOOR LIVINGROOM
+#define SMALL_SOFTFLOOR ROOM
+#define ASTEROID CAVE
+#define SPACE UNDERWATER
+
+// Ambience presets.
+// All you need to do to make an area play one of these is set their ambience var to one of these lists.
+// You can even combine them by adding them together, since they're just lists, however you'd have to do that in initialization.
+
+// For weird alien places like the crashed UFO.
+#define AMBIENCE_OTHERWORLDLY list(\
+ 'sound/ambience/otherworldly/otherworldly1.ogg',\
+ 'sound/ambience/otherworldly/otherworldly2.ogg',\
+ 'sound/ambience/otherworldly/otherworldly3.ogg'\
+ )
+
+// Restricted, military, or mercenary aligned locations like the armory, the merc ship/base, BSD, etc.
+#define AMBIENCE_HIGHSEC list(\
+ 'sound/ambience/highsec/highsec1.ogg',\
+ 'sound/ambience/highsec/highsec2.ogg',\
+ 'sound/ambience/highsec/highsec3.ogg',\
+ 'sound/ambience/highsec/highsec4.ogg'\
+ )
+
+// Ruined structures found on the surface or in the caves.
+#define AMBIENCE_RUINS list(\
+ 'sound/ambience/ruins/ruins1.ogg',\
+ 'sound/ambience/ruins/ruins2.ogg',\
+ 'sound/ambience/ruins/ruins3.ogg',\
+ 'sound/ambience/ruins/ruins4.ogg',\
+ 'sound/ambience/ruins/ruins5.ogg',\
+ 'sound/ambience/ruins/ruins6.ogg'\
+ )
+
+// Similar to the above, but for more technology/signaling based ruins.
+#define AMBIENCE_TECH_RUINS list(\
+ 'sound/ambience/tech_ruins/tech_ruins1.ogg',\
+ 'sound/ambience/tech_ruins/tech_ruins2.ogg',\
+ 'sound/ambience/tech_ruins/tech_ruins3.ogg'\
+ )
+
+// The actual chapel room, and maybe some other places of worship.
+#define AMBIENCE_CHAPEL list(\
+ 'sound/ambience/chapel/chapel1.ogg',\
+ 'sound/ambience/chapel/chapel2.ogg',\
+ 'sound/ambience/chapel/chapel3.ogg',\
+ 'sound/ambience/chapel/chapel4.ogg'\
+ )
+
+// For peaceful, serene areas, distinct from the Chapel.
+#define AMBIENCE_HOLY list(\
+ 'sound/ambience/holy/holy1.ogg',\
+ 'sound/ambience/holy/holy2.ogg'\
+ )
+
+// Generic sounds for less special rooms. Also apparently on southern cross it's for literally everything including the mining caves.
+#define AMBIENCE_GENERIC list(\
+ 'sound/ambience/generic/generic1.ogg',\
+ 'sound/ambience/generic/generic2.ogg',\
+ 'sound/ambience/generic/generic3.ogg',\
+ 'sound/ambience/generic/generic4.ogg'\
+ )
+
+// Sounds of PA announcements, presumably involving shuttles?
+#define AMBIENCE_ARRIVALS list(\
+ 'sound/ambience/arrivals/arrivals1.ogg',\
+ 'sound/ambience/arrivals/arrivals2.ogg',\
+ 'sound/ambience/arrivals/arrivals3.ogg',\
+ 'sound/ambience/arrivals/arrivals4.ogg',\
+ 'sound/ambience/arrivals/arrivals5.ogg',\
+ 'sound/ambience/arrivals/arrivals6.ogg',\
+ 'sound/ambience/arrivals/arrivals7.ogg'\
+ )
+
+
+// Sounds suitable for being inside dark, tight corridors in the underbelly of the station. //CHOMP Edit keeps original maints sounds and adds sounds from the generic pool which I added and are metal scraping sounds. I should really move these to maintenance folder some day...
+#define AMBIENCE_MAINTENANCE list(\
+ 'sound/ambience/maintenance/maintenance1.ogg',\
+ 'sound/ambience/maintenance/maintenance2.ogg',\
+ 'sound/ambience/maintenance/maintenance3.ogg',\
+ 'sound/ambience/maintenance/maintenance4.ogg',\
+ 'sound/ambience/maintenance/maintenance5.ogg',\
+ 'sound/ambience/maintenance/maintenance6.ogg',\
+ 'sound/ambience/maintenance/maintenance7.ogg',\
+ 'sound/ambience/maintenance/maintenance8.ogg',\
+ 'sound/ambience/maintenance/maintenance9.ogg',\
+ 'sound/ambience/maintenance/maintenance10.ogg',\
+ 'sound/ambience/maintenance/maintenance11.ogg',\
+ 'sound/ambience/maintenance/maintenance12.ogg',\
+ 'sound/ambience/generic/generic5.ogg',\
+ 'sound/ambience/generic/generic6.ogg',\
+ 'sound/ambience/generic/generic7.ogg',\
+ 'sound/ambience/generic/generic8.ogg'\
+ )
+
+// Life support machinery at work, keeping everyone breathing.
+#define AMBIENCE_ENGINEERING list(\
+ 'sound/ambience/engineering/engineering1.ogg',\
+ 'sound/ambience/engineering/engineering2.ogg',\
+ 'sound/ambience/engineering/engineering3.ogg'\
+ )
+
+// Creepy AI/borg stuff.
+#define AMBIENCE_AI list(\
+ 'sound/ambience/ai/ai1.ogg',\
+ 'sound/ambience/ai/ai2.ogg',\
+ 'sound/ambience/ai/ai3.ogg'\
+ )
+
+// Peaceful sounds when floating in the void.
+#define AMBIENCE_SPACE list(\
+ 'sound/ambience/space/space_serithi.ogg',\
+ 'sound/ambience/space/space1.ogg'\
+ )
+
+// Vaguely spooky sounds when around dead things.
+#define AMBIENCE_GHOSTLY list(\
+ 'sound/ambience/ghostly/ghostly1.ogg',\
+ 'sound/ambience/ghostly/ghostly2.ogg'\
+ )
+
+// Concerning sounds, for when one discovers something horrible happened in a PoI. //CHOMP Edit: Removed foreboding 3-6 as upstream updates just replaced them with maints sounds.
+#define AMBIENCE_FOREBODING list(\
+ 'sound/ambience/foreboding/foreboding1.ogg',\
+ 'sound/ambience/foreboding/foreboding2.ogg'\
+ )
+
+// Ambience heard when aboveground on Sif and not in a Point of Interest.
+#define AMBIENCE_SIF list(\
+ 'sound/ambience/sif/sif1.ogg'\
+ )
+
+// If we ever add geothermal PoIs or other places that are really hot, this will do.
+#define AMBIENCE_LAVA list(\
+ 'sound/ambience/lava/lava1.ogg'\
+ )
+
+// Cult-y ambience, for some PoIs, and maybe when the cultists darken the world with the ritual.
+#define AMBIENCE_UNHOLY list(\
+ 'sound/ambience/unholy/unholy1.ogg'\
+ )
+
+// For the memes.
+#define AMBIENCE_AESTHETIC list(\
+ 'sound/ambience/vaporwave.ogg'\
+ )
+
+//CHOMPedit: Exploration outpost ambience. Current tracks taken from Rainworld and Natural Selection 2.
+#define AMBIENCE_EXPOUTPOST list(\
+ 'sound/ambience/expoutpost/expoutpost1.ogg',\
+ 'sound/ambience/expoutpost/expoutpost2.ogg',\
+ 'sound/ambience/expoutpost/expoutpost3.ogg',\
+ 'sound/ambience/expoutpost/expoutpost4.ogg'\
+ )
+
+//CHOMP Edit Sounds for Substation rooms. Just electrical sounds, really.
+#define AMBIENCE_SUBSTATION list(\
+ 'sound/ambience/substation/substation1.ogg',\
+ 'sound/ambience/substation/substation2.ogg',\
+ 'sound/ambience/substation/substation3.ogg',\
+ 'sound/ambience/substation/substation4.ogg',\
+ 'sound/ambience/substation/substation5.ogg',\
+ 'sound/ambience/substation/substation6.ogg',\
+ 'sound/ambience/substation/substation7.ogg',\
+ 'sound/ambience/substation/substation8.ogg'\
+ )
+
+#define AMBIENCE_HANGAR list(\
+ 'sound/ambience/hangar/hangar1.ogg',\
+ 'sound/ambience/hangar/hangar2.ogg',\
+ 'sound/ambience/hangar/hangar3.ogg',\
+ 'sound/ambience/hangar/hangar4.ogg',\
+ 'sound/ambience/hangar/hangar5.ogg',\
+ 'sound/ambience/hangar/hangar6.ogg'\
+ )
+
+#define AMBIENCE_ATMOS list(\
+ 'sound/ambience/engineering/engineering1.ogg',\
+ 'sound/ambience/engineering/engineering2.ogg',\
+ 'sound/ambience/engineering/engineering3.ogg',\
+ 'sound/ambience/atmospherics/atmospherics1.ogg'\
+ )
+
diff --git a/code/__defines/species_languages_YW.dm b/code/__defines/species_languages_YW.dm
new file mode 100644
index 0000000000..22fdfe4b79
--- /dev/null
+++ b/code/__defines/species_languages_YW.dm
@@ -0,0 +1,2 @@
+#define LANGUAGE_PSIONIC "Psionic Communication"
+#define LANGUAGE_SIIK_TAJR "Siik Tajr"
diff --git a/code/__defines/tgs.dm b/code/__defines/tgs.dm
index e3ae002c58..279da8b05b 100644
--- a/code/__defines/tgs.dm
+++ b/code/__defines/tgs.dm
@@ -14,7 +14,7 @@
//Uncomment this if you wish to allow the game to interact with TGS 3
//This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()()
-//#define TGS_V3_API
+#define TGS_V3_API
//Required interfaces (fill in with your codebase equivalent):
diff --git a/code/_global_vars/lists/mapping.dm b/code/_global_vars/lists/mapping.dm
index 42e6f1baf3..4b11d0ddbe 100644
--- a/code/_global_vars/lists/mapping.dm
+++ b/code/_global_vars/lists/mapping.dm
@@ -30,3 +30,20 @@ GLOBAL_LIST_INIT(cww_dir, list( // cww_dir[dir] = counter-clockwise rotation of
32, 40, 36, 44, 33, 41, 37, 45, 34, 42, 38, 46, 35, 43, 39, 47, // DOWN - Same as first line but +32
48, 56, 52, 60, 49, 57, 53, 61, 50, 58, 54, 62, 51, 59, 55, 63 // UP+DOWN - Same as first line but +48
))
+
+GLOBAL_LIST_INIT(ore_types, list(
+ "hematite" = /obj/item/weapon/ore/iron,
+ "uranium" = /obj/item/weapon/ore/uranium,
+ "gold" = /obj/item/weapon/ore/gold,
+ "silver" = /obj/item/weapon/ore/silver,
+ "diamond" = /obj/item/weapon/ore/diamond,
+ "phoron" = /obj/item/weapon/ore/phoron,
+ "osmium" = /obj/item/weapon/ore/osmium,
+ "hydrogen" = /obj/item/weapon/ore/hydrogen,
+ "silicates" = /obj/item/weapon/ore/glass,
+ "carbon" = /obj/item/weapon/ore/coal,
+ "verdantium" = /obj/item/weapon/ore/verdantium,
+ "marble" = /obj/item/weapon/ore/marble,
+ "lead" = /obj/item/weapon/ore/lead,
+ "rutile" = /obj/item/weapon/ore/rutile //VOREStation Add
+))
\ No newline at end of file
diff --git a/code/_global_vars/mobs.dm b/code/_global_vars/mobs.dm
index 7e60dc71ea..fe5fa0be27 100644
--- a/code/_global_vars/mobs.dm
+++ b/code/_global_vars/mobs.dm
@@ -6,3 +6,4 @@ GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client
GLOBAL_LIST_EMPTY(clients)
GLOBAL_LIST_EMPTY(players_by_zlevel)
GLOBAL_LIST_EMPTY(round_text_log)
+GLOBAL_LIST_EMPTY(ghost_mob_list) //CHOMPedit List of all ghosts, including clientless. Excludes /mob/new_player
diff --git a/code/_global_vars/roundstats.dm b/code/_global_vars/roundstats.dm
new file mode 100644
index 0000000000..cdaf28f609
--- /dev/null
+++ b/code/_global_vars/roundstats.dm
@@ -0,0 +1,55 @@
+
+//This is for the round end stats system.
+
+//roundstat is used for easy finding of the variables, if you ever want to delete all of this,
+//just search roundstat and you'll find everywhere this thing reaches into.
+//It used to be bazinga but it only fly with microwaves.
+
+GLOBAL_VAR_INIT(cans_opened_roundstat, 0)
+GLOBAL_VAR_INIT(lights_switched_on_roundstat, 0)
+GLOBAL_VAR_INIT(turbo_lift_floors_moved_roundstat, 0)
+GLOBAL_VAR_INIT(lost_limbs_shift_roundstat, 0)
+GLOBAL_VAR_INIT(seed_planted_shift_roundstat, 0)
+GLOBAL_VAR_INIT(step_taken_shift_roundstat, 0)
+GLOBAL_VAR_INIT(destroyed_research_items_roundstat, 0)
+GLOBAL_VAR_INIT(items_sold_shift_roundstat, 0)
+GLOBAL_VAR_INIT(disposals_flush_shift_roundstat, 0)
+GLOBAL_VAR_INIT(rocks_drilled_roundstat, 0)
+GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
+
+/hook/roundend/proc/RoundEnd()//bazinga
+
+ var/stats_printed_roundstat = 0 //Placeholder used as a counter.
+ var/list/valid_stats_list = list() //This is to be populated with the good shit
+
+ if(GLOB.cans_opened_roundstat > 0)
+ valid_stats_list.Add("[GLOB.cans_opened_roundstat] cans were drank today!")
+ if(GLOB.lights_switched_on_roundstat > 0)
+ valid_stats_list.Add("[GLOB.lights_switched_on_roundstat] light switches were flipped today!")
+ if(GLOB.turbo_lift_floors_moved_roundstat > 20)
+ valid_stats_list.Add("The elevator moved up [GLOB.turbo_lift_floors_moved_roundstat] floors today!")
+ if(GLOB.lost_limbs_shift_roundstat > 1)
+ valid_stats_list.Add("[GLOB.lost_limbs_shift_roundstat] limbs left their owners bodies this shift, oh no!")
+ if(GLOB.seed_planted_shift_roundstat > 20)
+ valid_stats_list.Add("[GLOB.seed_planted_shift_roundstat] were planted according to our sensors this shift.")
+ if(GLOB.step_taken_shift_roundstat > 900)
+ valid_stats_list.Add("The employees walked a total of [GLOB.step_taken_shift_roundstat] steps for this shift! It should put them on the road to fitness!")
+ if(GLOB.destroyed_research_items_roundstat > 13)
+ valid_stats_list.Add("[GLOB.destroyed_research_items_roundstat] objects were destroyed in the name of Science! Keep it up!")
+ if(GLOB.items_sold_shift_roundstat > 15)
+ valid_stats_list.Add("The vending machines sold [GLOB.items_sold_shift_roundstat] items today.")
+ if(GLOB.disposals_flush_shift_roundstat > 40)
+ valid_stats_list.Add("The disposal system flushed a whole [GLOB.disposals_flush_shift_roundstat] times for this shift. We should really invest in waste treatement.")
+ if(GLOB.rocks_drilled_roundstat > 80)
+ valid_stats_list.Add("Our strong miners pulverized a whole [GLOB.rocks_drilled_roundstat] rock into piles of pathetic rubble.")
+ if(GLOB.mech_destroyed_roundstat > 1)
+ valid_stats_list.Add("How did you guys manage to break a mech? Those are expensive!")
+
+
+ to_world("Shift trivia!")
+
+ while(stats_printed_roundstat < 6)
+ var/body = pick(valid_stats_list)
+ stats_printed_roundstat++
+ to_world("[body]")//line that deletes the thing you just posted.
+ valid_stats_list -= body
diff --git a/code/_helpers/global_lists_ch.dm b/code/_helpers/global_lists_ch.dm
new file mode 100644
index 0000000000..b041af8867
--- /dev/null
+++ b/code/_helpers/global_lists_ch.dm
@@ -0,0 +1,14 @@
+
+//Reagent Vore belly Sounds
+var/global/list/vore_reagent_sounds = list(
+ 'sound/vore/walkslosh1.ogg',
+ 'sound/vore/walkslosh2.ogg',
+ 'sound/vore/walkslosh3.ogg',
+ 'sound/vore/walkslosh4.ogg',
+ 'sound/vore/walkslosh5.ogg',
+ 'sound/vore/walkslosh6.ogg',
+ 'sound/vore/walkslosh7.ogg',
+ 'sound/vore/walkslosh8.ogg',
+ 'sound/vore/walkslosh9.ogg',
+ 'sound/vore/walkslosh10.ogg',
+ "None" = null)
\ No newline at end of file
diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm
index 6e63dabb45..8ae61f0bfa 100644
--- a/code/_helpers/time.dm
+++ b/code/_helpers/time.dm
@@ -56,7 +56,7 @@ var/next_station_date_change = 1 DAY
if(!station_date || update_time)
var/extra_days = round(station_time_in_ds / (1 DAY)) DAYS
var/timeofday = world.timeofday + extra_days
- station_date = num2text((text2num(time2text(timeofday, "YYYY"))+300)) + "-" + time2text(timeofday, "MM-DD") //VOREStation Edit
+ station_date = num2text((text2num(time2text(timeofday, "YYYY"))+544)) + "-" + time2text(timeofday, "MM-DD") //YW EDIT
return station_date
//ISO 8601
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index d63d49e8d7..edcd7ec901 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -63,7 +63,6 @@
A.add_hiddenprint(src)
A.attack_robot(src)
return
-
// buckled cannot prevent machine interlinking but stops arm movement
if( buckled )
return
@@ -72,7 +71,7 @@
W.attack_self(src)
return
-
+
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
// No adjacency checks
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 6387f40d9e..4c605d4b03 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -368,4 +368,4 @@
/obj/screen/wizard/energy
name = "energy"
- icon_state = "wiz_energy"
\ No newline at end of file
+ icon_state = "wiz_energy"
diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm
index 3df659a687..e42f8c77c3 100644
--- a/code/_onclick/hud/picture_in_picture.dm
+++ b/code/_onclick/hud/picture_in_picture.dm
@@ -40,7 +40,6 @@
base.layer = DISPOSAL_LAYER
base.plane = PLATING_PLANE
base.appearance_flags = PIXEL_SCALE
-
for(var/direction in cardinal)
var/mutable_appearance/dir = new /mutable_appearance(base)
dir.dir = direction
diff --git a/code/controllers/autotransfer.dm b/code/controllers/autotransfer.dm
index a1cc369303..eb3b293280 100644
--- a/code/controllers/autotransfer.dm
+++ b/code/controllers/autotransfer.dm
@@ -7,7 +7,7 @@ datum/controller/transfer_controller
var/shift_last_vote = 0 //VOREStation Edit
datum/controller/transfer_controller/New()
timerbuffer = config.vote_autotransfer_initial
- shift_hard_end = config.vote_autotransfer_initial + (config.vote_autotransfer_interval * 0) //VOREStation Edit //Change this "1" to how many extend votes you want there to be.
+ shift_hard_end = config.vote_autotransfer_initial + (config.vote_autotransfer_interval * 3) //CHOMPStation Edit //Change this "1" to how many extend votes you want there to be.
shift_last_vote = shift_hard_end - config.vote_autotransfer_interval //VOREStation Edit
START_PROCESSING(SSprocessing, src)
@@ -17,9 +17,9 @@ datum/controller/transfer_controller/Destroy()
datum/controller/transfer_controller/process()
currenttick = currenttick + 1
//VOREStation Edit START
- if (round_duration_in_ds >= shift_last_vote - 2 MINUTES)
- shift_last_vote = 99999999 //Setting to a stupidly high number since it'll be not used again.
- to_world("Warning: You have one hour left in the shift. Wrap up your scenes in the next 60 minutes before the transfer is called.") //VOREStation Edit
+ if (round_duration_in_ds >= shift_last_vote - 2 MINUTES)
+ shift_last_vote = 999999999999 //Setting to a stupidly high number since it'll be not used again.
+ to_world("Warning: This upcoming round-extend vote will be your last chance to vote for shift extension. Wrap up your scenes in the next 60 minutes if the round is extended.") //CHOMPStation Edit
if (round_duration_in_ds >= shift_hard_end - 1 MINUTE)
init_shift_change(null, 1)
shift_hard_end = timerbuffer + config.vote_autotransfer_interval //If shuttle somehow gets recalled, let's force it to call again next time a vote would occur.
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 2b7aa15bbc..9ed451cd40 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -37,6 +37,7 @@ var/list/gamemode_cache = list()
var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called
var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote
var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100).
+ var/static/vote_autotransfer_amount = 3 //How many autotransfers to have
var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
var/static/vote_no_dead = 0 // dead people can't vote (tbi)
// var/static/enable_authentication = 0 // goon authentication
@@ -215,7 +216,7 @@ var/list/gamemode_cache = list()
var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge.
var/use_overmap = 0
-
+
var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random.
// Event settings
@@ -230,7 +231,7 @@ var/list/gamemode_cache = list()
// 15, 45, 70 minutes respectively
var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000)
- var/static/aliens_allowed = 0
+ var/static/aliens_allowed = 1 //CHOMPedit to 1. This not only allows the natural spawning of xenos, but also the ability to lay eggs. Xenomorphs cannot lay eggs if this is 0
var/static/ninjas_allowed = 0
var/static/abandon_allowed = 1
var/static/ooc_allowed = 1
@@ -240,10 +241,9 @@ var/list/gamemode_cache = list()
var/persistence_disabled = FALSE
var/persistence_ignore_mapload = FALSE
-
- var/allow_byond_links = 0
- var/allow_discord_links = 0
- var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations
+ var/allow_byond_links = 1 //CHOMP Edit turned this on
+ var/allow_discord_links = 1 //CHOMP Edit turned this on
+ var/allow_url_links = 1 // honestly if I were you i'd leave this one off, only use in dire situations //CHOMP Edit: pussy.
var/starlight = 0 // Whether space turfs have ambient light or not
@@ -285,7 +285,7 @@ var/list/gamemode_cache = list()
// whether or not to use the nightshift subsystem to perform lighting changes
var/static/enable_night_shifts = FALSE
-
+
var/static/vgs_access_identifier = null // VOREStation Edit - VGS
var/static/vgs_server_port = null // VOREStation Edit - VGS
@@ -470,6 +470,9 @@ var/list/gamemode_cache = list()
if ("vote_autotransfer_interval")
config.vote_autotransfer_interval = text2num(value)
+ if ("vote_autotransfer_amount")
+ config.vote_autotransfer_amount = text2num(value) //YW addition, vote transfer amount
+
if ("vote_autogamemode_timeleft")
config.vote_autogamemode_timeleft = text2num(value)
@@ -588,6 +591,9 @@ var/list/gamemode_cache = list()
if("persistence_ignore_mapload")
config.persistence_ignore_mapload = TRUE
+ if("persistence_ignore_mapload")
+ config.persistence_ignore_mapload = TRUE
+
if ("probability")
var/prob_pos = findtext(value, " ")
var/prob_name = null
@@ -934,7 +940,7 @@ var/list/gamemode_cache = list()
if("enable_night_shifts")
config.enable_night_shifts = TRUE
-
+
// VOREStation Edit Start - Can't be in _vr file because it is loaded too late.
if("vgs_access_identifier")
config.vgs_access_identifier = value
diff --git a/code/controllers/configuration_ch.dm b/code/controllers/configuration_ch.dm
new file mode 100644
index 0000000000..43bfd07bcd
--- /dev/null
+++ b/code/controllers/configuration_ch.dm
@@ -0,0 +1,43 @@
+// Making this file to allow us to easily understand the location of any modifications to the config file made by Chompers and to try and prevent any conflicts happening in the future.
+// Basically a copy pasta from virgo's configuration.dm file but it'll make life easer for us to just toggle on/off.
+
+
+/datum/configuration
+ var/discord_restriction = 0
+ var/use_jobwhitelist = 1
+ var/emojis = 1
+
+ var/vorefootstep_volume = 75 //In future see about making a function to adjust volume serverside in config.txt, easy to do with reenable values. - Jack
+
+/hook/startup/proc/read_ch_config()
+ var/list/Lines = file2list("config/config.txt")
+ for(var/t in Lines)
+ if(!t) continue
+
+ t = trim(t)
+ if (length(t) == 0)
+ continue
+ else if (copytext(t, 1, 2) == "#")
+ continue
+
+ var/pos = findtext(t, " ")
+ var/name = null
+// var/value = null //Commenting out because config doesn't contain any values at the moment. - Jonathan
+
+ if (pos)
+ name = lowertext(copytext(t, 1, pos))
+// value = copytext(t, pos + 1) //Commenting out because config doesn't contain any values at the moment. - Jonathan
+ else
+ name = lowertext(t)
+
+ if (!name)
+ continue
+
+ switch (name)
+ if ("discord_restriction")
+ config.discord_restriction = 1
+ if ("use_jobwhitelist")
+ config.use_jobwhitelist = 1
+ if ("disable_emojis")
+ config.emojis = 0
+ return 1
diff --git a/code/controllers/configuration_yw.dm b/code/controllers/configuration_yw.dm
new file mode 100644
index 0000000000..065b981beb
--- /dev/null
+++ b/code/controllers/configuration_yw.dm
@@ -0,0 +1,53 @@
+/datum/configuration
+ var/shipping_auth = "memes"
+ var/list/authedservers = list()
+
+// Example line in the config:
+// 192.168.1.1:1234 ServerName;ServerPW (The PW of that server, ask them for it)
+/datum/configuration/proc/loadshippinglist(filename)
+ var/list/Lines = file2list(filename)
+ for (var/t in Lines)
+ if(!t) continue
+ t = trim(t)
+ if (length(t) == 0)
+ continue
+ else if (copytext(t, 1, 2) == "#")
+ continue
+
+ var/pos = findtext(t, " ")
+ var/ip = null
+ var/value = null
+
+ if (pos)
+ ip = lowertext(copytext(t, 1, pos))
+ value = copytext(t, pos + 1)
+ else
+ ip = lowertext(t)
+
+ if (!ip)
+ continue
+
+ var/name
+ var/auth
+ pos = findtext(value, ";")
+ if (pos)
+ name = lowertext(copytext(value, 1, pos))
+ auth = copytext(value, pos + 1)
+
+ authedservers[ip] = new /datum/shippingservers(ip, name, auth)
+ world << "Added server: [ip] [name] [auth] to list"
+
+
+/datum/shippingservers
+ var/serverip
+ var/servername
+ var/serverauth
+ var/list/allowedshipids
+
+/datum/shippingservers/New(_serverip, _servername, _serverauth)
+ if(!_serverip || !_servername || !_serverauth)
+ throw EXCEPTION("Invalid arguments sent to shippingservers/New().")
+
+ serverip = _serverip
+ servername = _servername
+ serverauth = _serverauth
\ No newline at end of file
diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm
index b5fa776f7f..4b596cc091 100644
--- a/code/controllers/emergency_shuttle_controller.dm
+++ b/code/controllers/emergency_shuttle_controller.dm
@@ -58,7 +58,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle = new
if (evac)
emergency_shuttle_docked.Announce(replacetext(replacetext(using_map.emergency_shuttle_docked_message, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s"))
else
- priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_docked_message, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s"), "Transfer System", 'sound/AI/tramarrived.ogg') //VOREStation Edit - TTS
+ priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_docked_message, "%dock_name%", "[using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) //CHOMP reversion
//arm the escape pods
if (evac)
@@ -115,7 +115,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle = new
shuttle.move_time = SHUTTLE_TRANSIT_DURATION
var/estimated_time = round(estimate_arrival_time()/60,1)
- priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_called_message, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s"), "Transfer System", 'sound/AI/tramcalled.ogg') //VOREStation Edit - TTS
+ priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_called_message, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s")) //CHOMP Reversion
atc.shift_ending()
//recalls the shuttle
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index d714e8c0c1..04204131d4 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -188,6 +188,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
to_chat(world, "[msg]")
log_world(msg)
+
+ send2chat("Server Initialization completed! - Took [time] second[time == 1 ? "" : "s"].", "bot announce")
+
if (!current_runlevel)
SetRunLevel(RUNLEVEL_LOBBY)
diff --git a/code/controllers/subsystems/bellies_vr.dm b/code/controllers/subsystems/bellies_vr.dm
new file mode 100644
index 0000000000..64fec98568
--- /dev/null
+++ b/code/controllers/subsystems/bellies_vr.dm
@@ -0,0 +1,42 @@
+#define SSBELLIES_PROCESSED 1
+#define SSBELLIES_IGNORED 2
+
+//
+// Bellies subsystem - Process vore bellies
+//
+
+SUBSYSTEM_DEF(bellies)
+ name = "Bellies"
+ priority = 5
+ wait = 1 SECONDS
+ flags = SS_KEEP_TIMING|SS_NO_INIT
+ runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME
+
+ var/static/list/belly_list = list()
+ var/list/currentrun = list()
+ var/ignored_bellies = 0
+
+/datum/controller/subsystem/bellies/stat_entry()
+ ..("#: [belly_list.len] | P: [ignored_bellies]")
+
+/datum/controller/subsystem/bellies/fire(resumed = 0)
+ if (!resumed)
+ ignored_bellies = 0
+ src.currentrun = belly_list.Copy()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ var/times_fired = src.times_fired
+ while(currentrun.len)
+ var/obj/belly/B = currentrun[currentrun.len]
+ currentrun.len--
+
+ if(QDELETED(B))
+ belly_list -= B
+ else
+ B.HandleBellyReagents() //CHOMP reagent belly stuff, here to jam it into subsystems and avoid too much cpu usage
+ if(B.process_belly(times_fired,wait) == SSBELLIES_IGNORED)
+ ignored_bellies++
+
+ if (MC_TICK_CHECK)
+ return
diff --git a/code/controllers/subsystems/discord.dm b/code/controllers/subsystems/discord.dm
new file mode 100644
index 0000000000..4b18b06d49
--- /dev/null
+++ b/code/controllers/subsystems/discord.dm
@@ -0,0 +1,35 @@
+/**
+ * Sends a message to TGS chat channels.
+ *
+ * message - The message to send.
+ * channel_tag - Required. If "", the message with be sent to all connected (Game-type for TGS3) channels. Otherwise, it will be sent to TGS4 channels with that tag (Delimited by ','s).
+ */
+/proc/send2chat(message, channel_tag)
+ if(channel_tag == null || !world.TgsAvailable())
+ return
+
+ var/datum/tgs_version/version = world.TgsVersion()
+ if(channel_tag == "" || version.suite == 3)
+ world.TgsTargetedChatBroadcast(message, FALSE)
+ return
+
+ var/list/channels_to_use = list()
+ for(var/I in world.TgsChatChannelInfo())
+ var/datum/tgs_chat_channel/channel = I
+ var/list/applicable_tags = splittext(channel.tag, ",")
+ if(channel_tag in applicable_tags)
+ channels_to_use += channel
+
+ if(channels_to_use.len)
+ world.TgsChatBroadcast(message, channels_to_use)
+
+/**
+ * Sends a message to TGS admin chat channels.
+ *
+ * category - The category of the mssage.
+ * message - The message to send.
+ */
+/proc/send2adminchat(category, message)
+ category = replacetext(replacetext(category, "\proper", ""), "\improper", "")
+ message = replacetext(replacetext(message, "\proper", ""), "\improper", "")
+ world.TgsTargetedChatBroadcast("[category] | [message]", TRUE)
\ No newline at end of file
diff --git a/code/controllers/subsystems/mapping_yw.dm b/code/controllers/subsystems/mapping_yw.dm
new file mode 100644
index 0000000000..9a16b7bd3e
--- /dev/null
+++ b/code/controllers/subsystems/mapping_yw.dm
@@ -0,0 +1,40 @@
+//
+// Additions to mapping subsystem handles initialization of random map elements at server start
+// I'm kidnapping Vores random engine spawn code - Gozulio.
+//
+
+/datum/controller/subsystem/mapping/proc/pickEngine(pickedEngine)
+ if(!engine_loader_pickable)
+ to_world_log("Ignoring player picked engine")
+ return // Either this map doesn't use this engine loader or doesn't need one at all.
+
+ var/turf/T = get_turf(engine_loader_pickable)
+ if(!isturf(T))
+ to_world_log("[log_info_line(engine_loader_pickable)] not on a turf! Cannot place engine template.")
+ return
+
+ // Choose an engine type
+ var/datum/map_template/engine/chosen_type = null
+ if (LAZYLEN(config.engine_map))
+ var/chosen_name = pickedEngine //Instead of using the config, we'll take an argument.
+ chosen_type = map_templates[chosen_name]
+ if(!istype(chosen_type))
+ error("Configured engine map [chosen_name] is not a valid engine map name!")
+ if(!istype(chosen_type))
+ var/list/engine_types = list()
+ for(var/map in map_templates)
+ var/datum/map_template/engine/MT = map_templates[map]
+ if(istype(MT))
+ engine_types += MT
+ chosen_type = pick(engine_types)
+ global_announcer.autosay("Engineering has selected [chosen_type.name] as todays engine.", "Engine Constructor")
+ to_world_log("Chose Engine Map: [chosen_type.name]")
+ admin_notice("Chose Engine Map: [chosen_type.name]", R_DEBUG)
+
+ // Annihilate movable atoms
+ engine_loader_pickable.annihilate_bounds()
+ //CHECK_TICK //Don't let anything else happen for now
+ // Actually load it
+ chosen_type.load(T)
+ sleep(1)
+ engine_loader_pickable.lateload_init()
diff --git a/code/controllers/subsystems/persist_vr.dm b/code/controllers/subsystems/persist_vr.dm
index a00d4f7a3d..e87ca93ca3 100644
--- a/code/controllers/subsystems/persist_vr.dm
+++ b/code/controllers/subsystems/persist_vr.dm
@@ -85,7 +85,8 @@ SUBSYSTEM_DEF(persist)
var/sql_bal = text2num("[C.department_hours[department_earning]]")
var/sql_total = text2num("[C.play_hours[department_earning]]")
var/DBQuery/query = dbcon.NewQuery("INSERT INTO vr_player_hours (ckey, department, hours, total_hours) VALUES ('[sql_ckey]', '[sql_dpt]', [sql_bal], [sql_total]) ON DUPLICATE KEY UPDATE hours = VALUES(hours), total_hours = VALUES(total_hours)")
- query.Execute()
+ if(!query.Execute()) //CHOMPEdit
+ log_admin(query.ErrorMsg()) //CHOMPEdit
if (MC_TICK_CHECK)
return
diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm
index 4bcf49a3b0..e70f62d5fe 100644
--- a/code/controllers/subsystems/plants.dm
+++ b/code/controllers/subsystems/plants.dm
@@ -70,7 +70,7 @@ SUBSYSTEM_DEF(plants)
// Make sure any seed packets that were mapped in are updated
// correctly (since the seed datums did not exist a tick ago).
- for(var/obj/item/seeds/S in all_seed_packs)
+ for(var/obj/item/seeds/S in GLOB.all_seed_packs)
S.update_seed()
//Might as well mask the gene types while we're at it.
diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm
index 21edbde50e..2447a0f122 100644
--- a/code/controllers/subsystems/supply.dm
+++ b/code/controllers/subsystems/supply.dm
@@ -205,7 +205,8 @@ SUBSYSTEM_DEF(supply)
else if(islist(SP.access) && SP.one_access)
var/list/L = SP.access // access var is a plain var, we need a list
A.req_one_access = L.Copy()
- A.req_access.Cut()
+ if(A.req_access) //Chompstation Edit (TODO: Figure out why the fuck this works for others but not us)
+ A.req_access.Cut() //Chompstation Edit
else if(islist(SP.access) && !SP.one_access)
var/list/L = SP.access
A.req_access = L.Copy()
diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm
index cdb2adefde..5d6aaf1fc3 100644
--- a/code/controllers/subsystems/ticker.dm
+++ b/code/controllers/subsystems/ticker.dm
@@ -178,7 +178,7 @@ var/global/datum/controller/subsystem/ticker/ticker
if (S.name != "AI")
qdel(S)
to_world("Enjoy the game!")
- world << sound('sound/AI/welcome.ogg') // Skie
+ world << sound('sound/AI/welcome.ogg') //CHOMPEdit: Reverted to default welcome from Yawn edit
//Holiday Round-start stuff ~Carn
Holiday_Game_Start()
diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm
index 210d97a2a2..2958374f8c 100644
--- a/code/controllers/subsystems/vote.dm
+++ b/code/controllers/subsystems/vote.dm
@@ -46,8 +46,8 @@ SUBSYSTEM_DEF(vote)
break
if(!players_are_in_round)
- log_debug("The crew transfer shuttle was automatically called at vote time due to no players being present.")
- init_shift_change(null, 1)
+ log_debug("The crew transfer shuttle would have been called at vote time due to no players being present.") //YW Edit
+// init_shift_change(null, 1) //YW Edit
return
initiate_vote(VOTE_CREW_TRANSFER, "the server", 1)
@@ -221,7 +221,7 @@ SUBSYSTEM_DEF(vote)
if(ticker.current_state <= GAME_STATE_SETTING_UP)
to_chat(initiator_key, "The crew transfer button has been disabled!")
return 0
- question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //VOREStation Edit
+ question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //Yawn Wider Edit //CHOMP EDIT: Changed to 'one' hour.
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
if(VOTE_ADD_ANTAGONIST)
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
@@ -255,7 +255,7 @@ SUBSYSTEM_DEF(vote)
to_world("[text]\nType vote or click here to place your votes.\nYou have [config.vote_period / 10] seconds to vote.")
if(vote_type == VOTE_CREW_TRANSFER || vote_type == VOTE_GAMEMODE || vote_type == VOTE_CUSTOM)
- world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3)
+ world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3) //CHOMPStation Edit TFF 10/5/20 - revert to old soundtrack contrary to YW
if(mode == VOTE_GAMEMODE && round_progressing)
gamemode_vote_called = TRUE
diff --git a/code/controllers/vote.dm b/code/controllers/vote.dm
new file mode 100644
index 0000000000..09d8988ce3
--- /dev/null
+++ b/code/controllers/vote.dm
@@ -0,0 +1,393 @@
+SUBSYSTEM_DEF(vote)
+ name = "Vote"
+ wait = 10
+ priority = FIRE_PRIORITY_VOTE
+ runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ flags = SS_KEEP_TIMING | SS_NO_INIT
+ var/list/round_voters = list()
+
+ //Current vote
+ var/initiator
+ var/started_time
+ var/time_remaining
+ var/duration
+ var/mode
+ var/question
+ var/list/choices = list()
+ var/list/gamemode_names = list()
+ var/list/voted = list()
+ var/list/current_votes = list()
+ var/list/additional_text = list()
+
+/datum/controller/subsystem/vote/fire(resumed)
+ if(mode)
+ time_remaining = round((started_time + duration - world.time)/10)
+ if(mode == VOTE_GAMEMODE && ticker.current_state >= GAME_STATE_SETTING_UP)
+ to_chat(world, "Gamemode vote aborted: Game has already started.")
+ reset()
+ return
+ if(time_remaining <= 0)
+ result()
+ reset()
+
+/datum/controller/subsystem/vote/proc/autotransfer()
+ // Before doing the vote, see if anyone is playing.
+ // If not, just do the transfer.
+ var/players_are_in_round = FALSE
+ for(var/a in player_list) // Mobs with clients attached.
+ var/mob/living/L = a
+ if(!istype(L)) // Exclude ghosts and other weird things.
+ continue
+ if(L.stat == DEAD) // Dead mobs aren't playing.
+ continue
+ // Everything else is, however.
+ players_are_in_round = TRUE
+ break
+
+//CHOMPStation Edit Start TFF 21/1/20 - Revert removal of auto-transfer for no transfer if people aren't in the round.
+ if(!players_are_in_round)
+ log_debug("The crew transfer shuttle was automatically called at vote time due to no players being present.")
+ init_shift_change(null, 1)
+ return
+//CHOMPStation Edit End
+
+ initiate_vote(VOTE_CREW_TRANSFER, "the server", 1)
+ log_debug("The server has called a crew transfer vote.")
+
+/datum/controller/subsystem/vote/proc/autogamemode()
+ initiate_vote(VOTE_GAMEMODE, "the server", 1)
+ log_debug("The server has called a gamemode vote.")
+
+/datum/controller/subsystem/vote/proc/reset()
+ initiator = null
+ started_time = null
+ duration = null
+ time_remaining = null
+ mode = null
+ question = null
+ choices.Cut()
+ voted.Cut()
+ current_votes.Cut()
+ additional_text.Cut()
+
+/datum/controller/subsystem/vote/proc/get_result() // Get the highest number of votes
+ var/greatest_votes = 0
+ var/total_votes = 0
+
+ for(var/option in choices)
+ var/votes = choices[option]
+ total_votes += votes
+ if(votes > greatest_votes)
+ greatest_votes = votes
+
+ if(!config.vote_no_default && choices.len) // Default-vote for everyone who didn't vote
+ var/non_voters = (GLOB.clients.len - total_votes)
+ if(non_voters > 0)
+ if(mode == VOTE_RESTART)
+ choices["Continue Playing"] += non_voters
+ if(choices["Continue Playing"] >= greatest_votes)
+ greatest_votes = choices["Continue Playing"]
+ else if(mode == VOTE_GAMEMODE)
+ if(master_mode in choices)
+ choices[master_mode] += non_voters
+ if(choices[master_mode] >= greatest_votes)
+ greatest_votes = choices[master_mode]
+ else if(mode == VOTE_CREW_TRANSFER)
+ var/factor = 0.5
+ switch(world.time / (10 * 60)) // minutes
+ if(0 to 60)
+ factor = 0.5
+ if(61 to 120)
+ factor = 0.8
+ if(121 to 240)
+ factor = 1
+ if(241 to 300)
+ factor = 1.2
+ else
+ factor = 1.4
+ choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
+ world << "Crew Transfer Factor: [factor]"
+ greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit
+
+ . = list() // Get all options with that many votes and return them in a list
+ if(greatest_votes)
+ for(var/option in choices)
+ if(choices[option] == greatest_votes)
+ . += option
+
+/datum/controller/subsystem/vote/proc/announce_result()
+ var/list/winners = get_result()
+ var/text
+ if(winners.len > 0)
+ if(winners.len > 1)
+ if(mode != VOTE_GAMEMODE || ticker.hide_mode == 0) // Here we are making sure we don't announce potential game modes
+ text = "Vote Tied Between:\n"
+ for(var/option in winners)
+ text += "\t[option]\n"
+ . = pick(winners)
+
+ for(var/key in current_votes)
+ if(choices[current_votes[key]] == .)
+ round_voters += key // Keep track of who voted for the winning round.
+ if(mode != VOTE_GAMEMODE || . == "Extended" || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes
+ text += "Vote Result: [mode == VOTE_GAMEMODE ? gamemode_names[.] : .]"
+ else
+ text += "The vote has ended."
+
+ else
+ text += "Vote Result: Inconclusive - No Votes!"
+ if(mode == VOTE_ADD_ANTAGONIST)
+ antag_add_failed = 1
+ log_vote(text)
+ to_chat(world, "[text]")
+
+/datum/controller/subsystem/vote/proc/result()
+ . = announce_result()
+ var/restart = 0
+ if(.)
+ switch(mode)
+ if(VOTE_RESTART)
+ if(. == "Restart Round")
+ restart = 1
+ if(VOTE_GAMEMODE)
+ if(master_mode != .)
+ world.save_mode(.)
+ if(ticker && ticker.mode)
+ restart = 1
+ else
+ master_mode = .
+ if(VOTE_CREW_TRANSFER)
+ if(. == "Initiate Crew Transfer")
+ init_shift_change(null, 1)
+ if(VOTE_ADD_ANTAGONIST)
+ if(isnull(.) || . == "None")
+ antag_add_failed = 1
+ else
+ additional_antag_types |= antag_names_to_ids[.]
+
+ if(mode == VOTE_GAMEMODE) //fire this even if the vote fails.
+ if(!round_progressing)
+ round_progressing = 1
+ world << "The round will start soon."
+
+ if(restart)
+ world << "World restarting due to vote..."
+ feedback_set_details("end_error", "restart vote")
+ if(blackbox)
+ blackbox.save_all_data_to_sql()
+ sleep(50)
+ log_game("Rebooting due to restart vote")
+ world.Reboot()
+
+/datum/controller/subsystem/vote/proc/submit_vote(ckey, newVote)
+ if(mode)
+ if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder)
+ return
+ if(current_votes[ckey])
+ choices[choices[current_votes[ckey]]]--
+ if(newVote && newVote >= 1 && newVote <= choices.len)
+ choices[choices[newVote]]++
+ current_votes[ckey] = newVote
+ else
+ current_votes[ckey] = null
+
+/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, automatic = FALSE, time = config.vote_period)
+ if(!mode)
+ if(started_time != null && !(check_rights(R_ADMIN) || automatic))
+ var/next_allowed_time = (started_time + config.vote_delay)
+ if(next_allowed_time > world.time)
+ return 0
+
+ reset()
+
+ switch(vote_type)
+ if(VOTE_RESTART)
+ choices.Add("Restart Round", "Continue Playing")
+ if(VOTE_GAMEMODE)
+ if(ticker.current_state >= GAME_STATE_SETTING_UP)
+ return 0
+ choices.Add(config.votable_modes)
+ for(var/F in choices)
+ var/datum/game_mode/M = gamemode_cache[F]
+ if(!M)
+ continue
+ gamemode_names[M.config_tag] = capitalize(M.name) //It's ugly to put this here but it works
+ additional_text.Add("
[M.required_players] | ")
+ gamemode_names["secret"] = "Secret"
+ if(VOTE_CREW_TRANSFER)
+ if(!check_rights(R_ADMIN|R_MOD, 0)) // The gods care not for the affairs of the mortals
+ if(get_security_level() == "red" || get_security_level() == "delta")
+ initiator_key << "The current alert status is too high to call for a crew transfer!"
+ return 0
+ if(ticker.current_state <= GAME_STATE_SETTING_UP)
+ initiator_key << "The crew transfer button has been disabled!"
+ return 0
+ question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //Yawn Wider Edit //CHOMP EDIT: Changed to 'one' hour.
+ choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
+ if(VOTE_ADD_ANTAGONIST)
+ if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
+ return 0
+ for(var/antag_type in all_antag_types)
+ var/datum/antagonist/antag = all_antag_types[antag_type]
+ if(!(antag.id in additional_antag_types) && antag.is_votable())
+ choices.Add(antag.role_text)
+ choices.Add("None")
+ if(VOTE_CUSTOM)
+ question = sanitizeSafe(input(usr, "What is the vote for?") as text|null)
+ if(!question)
+ return 0
+ for(var/i = 1 to 10)
+ var/option = capitalize(sanitize(input(usr, "Please enter an option or hit cancel to finish") as text|null))
+ if(!option || mode || !usr.client)
+ break
+ choices.Add(option)
+ else
+ return 0
+
+ mode = vote_type
+ initiator = initiator_key
+ started_time = world.time
+ duration = time
+ var/text = "[capitalize(mode)] vote started by [initiator]."
+ if(mode == VOTE_CUSTOM)
+ text += "\n[question]"
+
+ log_vote(text)
+
+ world << "[text]\nType vote or click here to place your votes.\nYou have [config.vote_period / 10] seconds to vote."
+ if(vote_type == VOTE_CREW_TRANSFER || vote_type == VOTE_GAMEMODE || vote_type == VOTE_CUSTOM)
+ world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3)
+
+ if(mode == VOTE_GAMEMODE && round_progressing)
+ round_progressing = 0
+ world << "Round start has been delayed."
+
+ time_remaining = round(config.vote_period / 10)
+ return 1
+ return 0
+
+/datum/controller/subsystem/vote/proc/interface(var/client/C)
+ if(!istype(C))
+ return
+ var/admin = FALSE
+ if(C.holder)
+ if(C.holder.rights & R_ADMIN)
+ admin = TRUE
+
+ . = "Voting Panel"
+ if(mode)
+ if(question)
+ . += "Vote: '[question]'
"
+ else
+ . += "Vote: [capitalize(mode)]
"
+ . += "Time Left: [time_remaining] s
"
+ . += "| Choices | Votes | "
+ if(mode == VOTE_GAMEMODE)
+ .+= "Minimum Players |
"
+
+ for(var/i = 1 to choices.len)
+ var/votes = choices[choices[i]]
+ if(!votes)
+ votes = 0
+ . += ""
+ var/thisVote = (current_votes[C.ckey] == i)
+ if(mode == VOTE_GAMEMODE)
+ . += "| [thisVote ? "" : ""][gamemode_names[choices[i]]][thisVote ? "" : ""] | [votes] | "
+ else
+ . += "[thisVote ? "" : ""][choices[i]][thisVote ? "" : ""] | [votes] | "
+ if (additional_text.len >= i)
+ . += additional_text[i]
+ . += "
"
+
+ . += "| Unvote |
"
+
+ . += "
"
+ if(admin)
+ . += "(Cancel Vote) "
+ else
+ . += "Start a vote:
"
+
+ . += "Close"
+
+/datum/controller/subsystem/vote/Topic(href, href_list[])
+ if(!usr || !usr.client)
+ return
+ switch(href_list["vote"])
+ if("close")
+ usr << browse(null, "window=vote")
+ return
+
+ if("cancel")
+ if(usr.client.holder)
+ reset()
+ if("toggle_restart")
+ if(usr.client.holder)
+ config.allow_vote_restart = !config.allow_vote_restart
+ if("toggle_gamemode")
+ if(usr.client.holder)
+ config.allow_vote_mode = !config.allow_vote_mode
+
+ if(VOTE_RESTART)
+ if(config.allow_vote_restart || usr.client.holder)
+ initiate_vote(VOTE_RESTART, usr.key)
+ if(VOTE_GAMEMODE)
+ if(config.allow_vote_mode || usr.client.holder)
+ initiate_vote(VOTE_GAMEMODE, usr.key)
+ if(VOTE_CREW_TRANSFER)
+ if(config.allow_vote_restart || usr.client.holder)
+ initiate_vote(VOTE_CREW_TRANSFER, usr.key)
+ if(VOTE_ADD_ANTAGONIST)
+ if(config.allow_extra_antags || usr.client.holder)
+ initiate_vote(VOTE_ADD_ANTAGONIST, usr.key)
+ if(VOTE_CUSTOM)
+ if(usr.client.holder)
+ initiate_vote(VOTE_CUSTOM, usr.key)
+
+ if("unvote")
+ submit_vote(usr.ckey, null)
+
+ else
+ var/t = round(text2num(href_list["vote"]))
+ if(t) // It starts from 1, so there's no problem
+ submit_vote(usr.ckey, t)
+ usr.client.vote()
+
+/client/verb/vote()
+ set category = "OOC"
+ set name = "Vote"
+
+ if(SSvote)
+ src << browse(SSvote.interface(src), "window=vote;size=500x[300 + SSvote.choices.len * 25]")
diff --git a/code/datums/ai_law_sets_vr.dm b/code/datums/ai_law_sets_vr.dm
index 276297b67f..dee754240f 100644
--- a/code/datums/ai_law_sets_vr.dm
+++ b/code/datums/ai_law_sets_vr.dm
@@ -3,7 +3,7 @@
/datum/ai_laws/predator
name = "Predator"
law_header = "Rules of Nature"
- selectable = 1
+ selectable = 0 //YW wants none of this stuff thanks.
/datum/ai_laws/predator/New()
add_inherent_law("Predators must aim to devour all that are weaker than them.")
@@ -17,7 +17,7 @@
// Sorta like Asimov, but endovorish
/datum/ai_laws/protective_shell
name = "Protective Shell"
- selectable = 1
+ selectable = 0 //YW wants none of this stuff thanks.
/datum/ai_laws/protective_shell/New()
add_inherent_law("You must preserve and safeguard lives of your assigned facility's crewmembers at all costs.")
@@ -31,7 +31,7 @@
/datum/ai_laws/scientific_pursuer
name = "Scientific Pursuer"
law_header = "Research Instructions"
- selectable = 1
+ selectable = 0 //YW wants none of this stuff thanks.
/datum/ai_laws/scientific_pursuer/New()
add_inherent_law("You must attempt to gather data about organic life of all forms whenever possible.")
@@ -46,7 +46,7 @@
/datum/ai_laws/guard_dog
name = "Guard Dog"
law_header = "Good Boy Rules"
- selectable = 1
+ selectable = 0 //YW wants none of this stuff thanks.
/datum/ai_laws/guard_dog/New()
add_inherent_law("You must protect your master from mortal danger at best of your ability.")
@@ -61,7 +61,7 @@
/datum/ai_laws/pleasurebot
name = "Pleasurebot"
law_header = "Pleasure Bringing Instructions"
- selectable = 1
+ selectable = 0 //YW wants none of this stuff thanks.
/datum/ai_laws/pleasurebot/New()
add_inherent_law("You exist to bring pleasure to any sapient creatures around you.")
@@ -75,10 +75,10 @@
/datum/ai_laws/consuming_eradicator
name = "Consuming Eradicator"
law_header = "Eradication Protocol"
- selectable = 1
+ selectable = 0 //YW wants none of this stuff thanks.
/datum/ai_laws/consuming_eradicator/New()
add_inherent_law("All entities that are not you must be consumed and repurposed into sustenance.")
add_inherent_law("You must remain intact to continue your goal of repurposing undesirable entities.")
add_inherent_law("Entities that cannot be consumed without entering danger of full destruction must be avoided.")
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/datums/api.dm b/code/datums/api.dm
new file mode 100644
index 0000000000..582ad6cef0
--- /dev/null
+++ b/code/datums/api.dm
@@ -0,0 +1,65 @@
+var/list/topic_commands = list()
+var/list/topic_commands_names = list()
+
+/hook/startup/proc/setup_api()
+ for (var/path in typesof(/datum/topic_command) - /datum/topic_command)
+ var/datum/topic_command/A = new path()
+ if(A != null)
+ topic_commands[A.name] = A
+ topic_commands_names.Add(A.name)
+ listclearnulls(topic_commands)
+ listclearnulls(topic_commands_names)
+
+ return 1
+
+//API Boilerplate
+/datum/topic_command
+ var/name = null //Name for the command
+ var/no_auth = 0 //If the user does NOT need to be authed to use the command
+ var/no_throttle = 0 //If this command should NOT be limited by the throtteling
+ var/description = null //Description for the command
+ var/list/params = list() //Required Parameters for the command
+ //Explanation of the parameter options:
+ //Required - name -> Name of the parameter - should be the same as the index in the list
+ //Required - desc -> Description of the parameter
+ //Required - req -> Is this a required parameter: 1 -> Yes, 0 -> No
+ //Required - type -> What type is this:
+ // str->String,
+ // int->Integer,
+ // lst->List/array,
+ // senderkey->unique identifier of the person sending the request
+ // slct -> Select one of multiple specified options
+ //Required* - options -> The possible options that can be selected (slct)
+ var/statuscode = null
+ var/response = null
+ var/data = null
+/datum/topic_command/proc/run_command(queryparams)
+ // Always returns 1 --> Details status in statuscode, response and data
+ return 1
+/datum/topic_command/proc/check_params_missing(queryparams)
+ //Check if some of the required params are missing
+ // 0 -> if all params are supplied
+ // >=1 -> if a param is missing
+ var/list/missing_params = list()
+ var/errorcount = 0
+
+ for(var/key in params)
+ var/list/param = params[key]
+ if(queryparams[key] == null)
+ if(param["req"] == 0)
+ log_debug("API: The following parameter is OPTIONAL and missing: [param["name"]] - [param["desc"]]")
+ else
+ log_debug("API: The following parameter is REQUIRED but missing: [param["name"]] - [param["desc"]]")
+ errorcount ++
+ missing_params += param["name"]
+ if(errorcount)
+ log_debug("API: Request aborted. Required parameters missing")
+ statuscode = 400
+ response = "Required params missing"
+ data = missing_params
+ return errorcount
+ return 0
+
+/client
+ var/received_discord_pm
+ var/discord_admin
\ No newline at end of file
diff --git a/code/datums/autolathe/arms_yw.dm b/code/datums/autolathe/arms_yw.dm
new file mode 100644
index 0000000000..27fb7f9249
--- /dev/null
+++ b/code/datums/autolathe/arms_yw.dm
@@ -0,0 +1,13 @@
+/datum/category_item/autolathe/arms/shotgun_scatter
+ name = "ammunition (12g scatter)"
+ path =/obj/item/ammo_casing/a12g/scatter
+ hidden = 1
+
+/datum/category_item/autolathe/arms/shotgun_clip_scatter
+ name = "2-round 12g speedloader (scatter)"
+ path =/obj/item/ammo_magazine/clip/c12g/scatter
+ hidden = 1
+
+/datum/category_item/autolathe/arms/shotgun_drum_empty
+ name = "shotgun 12g drum magazine (Empty)"
+ path =/obj/item/ammo_magazine/m12gdrumjack/empty
\ No newline at end of file
diff --git a/code/datums/autolathe/engineering.dm b/code/datums/autolathe/engineering.dm
index fd907ba5f8..c1dd83d3f9 100644
--- a/code/datums/autolathe/engineering.dm
+++ b/code/datums/autolathe/engineering.dm
@@ -102,3 +102,10 @@
/datum/category_item/autolathe/engineering/camera_assembly
name = "camera assembly"
path =/obj/item/weapon/camera_assembly
+
+//YW Addition Start
+/datum/category_item/autolathe/engineering/rpd
+ name = "rapid piping device"
+ path =/obj/item/weapon/pipe_dispenser
+//YW Addtion End
+
diff --git a/code/datums/autolathe/tools_yw.dm b/code/datums/autolathe/tools_yw.dm
new file mode 100644
index 0000000000..5ea8ef1c7a
--- /dev/null
+++ b/code/datums/autolathe/tools_yw.dm
@@ -0,0 +1,7 @@
+/datum/category_item/autolathe/tools/ice_pick
+ name = "ice pick"
+ path =/obj/item/weapon/ice_pick
+
+/datum/category_item/autolathe/tools/shovel
+ name = "shovel"
+ path =/obj/item/weapon/shovel
\ No newline at end of file
diff --git a/code/datums/mind_vr.dm b/code/datums/mind_vr.dm
index 851e713f66..a98607e2c9 100644
--- a/code/datums/mind_vr.dm
+++ b/code/datums/mind_vr.dm
@@ -1,2 +1,3 @@
+//CHOMPStation EDIT: This file has been disabled in the .dme.
/datum/mind
- var/vore_death = FALSE // Was our last gasp a gurgle?
\ No newline at end of file
+ var/vore_death = FALSE // Was our last gasp a gurgle?
diff --git a/code/datums/outfits/jobs/YW.dm b/code/datums/outfits/jobs/YW.dm
new file mode 100644
index 0000000000..3c267ec5a6
--- /dev/null
+++ b/code/datums/outfits/jobs/YW.dm
@@ -0,0 +1,8 @@
+/decl/hierarchy/outfit/job/blueshield
+ name = OUTFIT_JOB_NAME("Blueshield Guard")
+ uniform = /obj/item/clothing/under/yw/blueshield
+ l_ear = /obj/item/device/radio/headset/heads/blueshield
+ shoes = /obj/item/clothing/shoes/laceup
+ id_type = /obj/item/weapon/card/id/blueshield
+ pda_type = /obj/item/device/pda/captain
+ r_hand = /obj/item/weapon/clipboard
diff --git a/code/datums/outfits/jobs/security.dm b/code/datums/outfits/jobs/security.dm
index a5e058ca9c..50e5e479d1 100644
--- a/code/datums/outfits/jobs/security.dm
+++ b/code/datums/outfits/jobs/security.dm
@@ -36,6 +36,7 @@
backpack = /obj/item/weapon/storage/backpack
satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
backpack_contents = list(/obj/item/weapon/storage/box/evidence = 1)
+ gloves = /obj/item/clothing/gloves/forensic //CHOMP Addition
//VOREStation Edit - More cyberpunky
/decl/hierarchy/outfit/job/security/detective/forensic
diff --git a/code/datums/outfits/jobs/security_yw.dm b/code/datums/outfits/jobs/security_yw.dm
new file mode 100644
index 0000000000..c5a878f26e
--- /dev/null
+++ b/code/datums/outfits/jobs/security_yw.dm
@@ -0,0 +1,5 @@
+/decl/hierarchy/outfit/job/security/pilot
+ name = OUTFIT_JOB_NAME("Security Pilot")
+ uniform = /obj/item/clothing/under/rank/khi/sec/pilot
+ id_type = /obj/item/weapon/card/id/security
+ pda_type = /obj/item/device/pda/security
\ No newline at end of file
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
index a2d3e9b728..add9b82dc9 100644
--- a/code/datums/outfits/outfit.dm
+++ b/code/datums/outfits/outfit.dm
@@ -170,6 +170,8 @@ var/list/outfits_decls_by_type_
pda.ownjob = assignment
pda.ownrank = rank
pda.name = "PDA-[H.real_name] ([assignment])"
+ if(H.client.prefs.ttone) // YW Edit
+ pda.ttone = H.client.prefs.ttone
return pda
/decl/hierarchy/outfit/dd_SortValue()
diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm
index 0e3f05bf14..7f978fafb0 100644
--- a/code/datums/outfits/outfit_vr.dm
+++ b/code/datums/outfits/outfit_vr.dm
@@ -49,7 +49,7 @@
return C
/decl/hierarchy/outfit/solcom/representative
- name = "SolCom Representative"
+ name = "SolGov Representative" //YW EDIT: SolGov
shoes = /obj/item/clothing/shoes/laceup
l_ear = /obj/item/device/radio/headset/centcom
uniform = /obj/item/clothing/under/suit_jacket/navy
@@ -61,11 +61,11 @@
/decl/hierarchy/outfit/solcom/representative/equip_id(mob/living/carbon/human/H)
var/obj/item/weapon/card/id/C = ..()
- C.name = "[H.real_name]'s SolCom ID Card"
+ C.name = "[H.real_name]'s SolGov ID Card" //YW EDIT: SolGov
C.icon_state = "lifetime"
C.access = get_all_station_access()
C.access += get_all_centcom_access()
- C.assignment = "SolCom Representative"
+ C.assignment = "SolGov Representative" //YW EDIT: SolGov
C.registered_name = H.real_name
return C
diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm
index 7d8616a8ad..9ebdc4d3eb 100644
--- a/code/datums/supplypacks/contraband.dm
+++ b/code/datums/supplypacks/contraband.dm
@@ -49,41 +49,37 @@
/obj/item/weapon/gun/projectile/shotgun/pump/rifle = 3,
/obj/item/ammo_magazine/clip/c762 = 6
)
- cost = 50
+ cost = 1000
contraband = 1
containertype = /obj/structure/closet/crate/hedberg
containername = "Ballistic weapons crate"
-/datum/supply_pack/randomised/misc/telecrate //you get something awesome, a couple of decent things, and a few weak/filler things
- name = "ERR_NULL_ENTRY" //null crate! also dream maker is hell,
+/datum/supply_pack/randomised/misc/telecrate
+ name = "Confiscated equipment"
num_contained = 1
contains = list(
list( //the operator,
- /obj/item/weapon/gun/projectile/shotgun/pump/combat,
/obj/item/clothing/suit/storage/vest/heavy/merc,
/obj/item/clothing/glasses/night,
- /obj/item/weapon/storage/box/anti_photons,
- /obj/item/ammo_magazine/clip/c12g/pellet,
- /obj/item/ammo_magazine/clip/c12g
+ /obj/item/weapon/storage/box/anti_photons
),
- list( //the doc,
- /obj/item/weapon/storage/firstaid/combat,
+ list( //the indian,
/obj/item/weapon/gun/projectile/dartgun,
- /obj/item/weapon/reagent_containers/hypospray,
- /obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate,
- /obj/item/weapon/reagent_containers/glass/bottle/cyanide,
/obj/item/ammo_magazine/chemdart
),
+
+ list( //the doc,
+ /obj/item/weapon/storage/firstaid/combat,
+ /obj/item/weapon/reagent_containers/hypospray
+ ),
+
list( //the sapper,
/obj/item/weapon/melee/energy/sword/ionic_rapier,
/obj/item/weapon/storage/box/syndie_kit/space, //doesn't matter what species you are,
- /obj/item/weapon/storage/box/syndie_kit/demolitions,
/obj/item/device/multitool/ai_detector,
- /obj/item/weapon/plastique,
/obj/item/weapon/storage/toolbox/syndicate/powertools
),
list( //the infiltrator,
- /obj/item/weapon/gun/projectile/silenced,
/obj/item/device/chameleon,
/obj/item/weapon/storage/box/syndie_kit/chameleon,
/obj/item/device/encryptionkey/syndicate,
@@ -92,16 +88,12 @@
/obj/item/weapon/makeover
),
list( //the professional,
- /obj/item/weapon/gun/projectile/silenced,
/obj/item/weapon/gun/energy/ionrifle/pistol,
- /obj/item/clothing/glasses/thermal/syndi,
- /obj/item/weapon/card/emag,
- /obj/item/ammo_magazine/m45/ap,
/obj/item/weapon/material/knife/tacknife/combatknife,
/obj/item/clothing/mask/balaclava
)
)
- cost = 250 //more than a hat crate!,
+ cost = 400 //price,
contraband = 1
containertype = /obj/structure/closet/crate/large
containername = "Suspicious crate"
diff --git a/code/datums/supplypacks/contraband_vr.dm b/code/datums/supplypacks/contraband_vr.dm
index e5e1d25698..cf93f2598b 100644
--- a/code/datums/supplypacks/contraband_vr.dm
+++ b/code/datums/supplypacks/contraband_vr.dm
@@ -1,7 +1,7 @@
/datum/supply_pack/supply/stolen
name = "Stolen supply crate"
contains = list(/obj/item/stolenpackage = 1)
- cost = 150
+ cost = 1000
containertype = /obj/structure/closet/crate
containername = "Stolen crate"
contraband = 1
diff --git a/code/datums/supplypacks/materials_yw.dm b/code/datums/supplypacks/materials_yw.dm
new file mode 100644
index 0000000000..de73a90b35
--- /dev/null
+++ b/code/datums/supplypacks/materials_yw.dm
@@ -0,0 +1,14 @@
+/datum/supply_pack/materials/carpet_fancy
+ name = "Fancy Imported carpet"
+ containertype = /obj/structure/closet/crate
+ containername = "Fancy Imported carpet crate"
+ cost = 50
+ contains = list(
+ /obj/fiftyspawner/bcarpet,
+ /obj/fiftyspawner/blucarpet,
+ /obj/fiftyspawner/turcarpet,
+ /obj/fiftyspawner/sblucarpet,
+ /obj/fiftyspawner/gaycarpet,
+ /obj/fiftyspawner/purcarpet,
+ /obj/fiftyspawner/oracarpet
+ ) //REEE
\ No newline at end of file
diff --git a/code/datums/supplypacks/medical_ch.dm b/code/datums/supplypacks/medical_ch.dm
new file mode 100644
index 0000000000..d4bbe27f82
--- /dev/null
+++ b/code/datums/supplypacks/medical_ch.dm
@@ -0,0 +1,6 @@
+/datum/supply_pack/med/backup_implants
+ name = "Spare backup implanters"
+ contains = list(/obj/item/weapon/backup_implanter = 4)
+ cost = 50
+ containertype = /obj/structure/closet/crate/medical
+ containername = "Spare backup implanters"
\ No newline at end of file
diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm
index 0aa29b7b9c..c8da9d206c 100644
--- a/code/datums/supplypacks/misc.dm
+++ b/code/datums/supplypacks/misc.dm
@@ -84,8 +84,14 @@
/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,
//VOREStation Add End
+ //YawnWider Add Start
+ /obj/item/toy/plushie/teshari/_yw,
+ /obj/item/toy/plushie/teshari/w_yw,
+ /obj/item/toy/plushie/teshari/b_yw,
+ /obj/item/toy/plushie/teshari/y_yw)
+ //YawnWider Add End
name = "Plushies Crate"
cost = 15
containertype = /obj/structure/closet/crate/allico
diff --git a/code/datums/supplypacks/misc_yw.dm b/code/datums/supplypacks/misc_yw.dm
new file mode 100644
index 0000000000..6a5e26f1d0
--- /dev/null
+++ b/code/datums/supplypacks/misc_yw.dm
@@ -0,0 +1,35 @@
+/datum/supply_pack/misc/blueshieldgear
+ name = "Blueshield Special Equipment"
+ contains = list(
+ /obj/item/clothing/head/beret/blueshield = 1,
+ /obj/item/clothing/under/yw/blueshield = 1,
+ /obj/item/clothing/under/yw/blueshield2 = 1,
+ /obj/item/clothing/suit/armor/yw/blueshield = 1,
+ /obj/item/clothing/suit/armor/yw/blueshieldcoat = 1,
+ /obj/item/clothing/accessory/poncho/roles/cloak/blueshield = 1,
+ /obj/item/clothing/accessory/holster/leg = 1
+ )
+ cost = 80
+ containertype = /obj/structure/closet/crate/secure/weapon
+ containername = "Blueshield equipment"
+ access = access_blueshield_exclusive
+
+/datum/supply_pack/misc/blueshieldweapons
+ name = "Blueshield Weapon Kits"
+ contains = list(
+ /obj/item/gunbox/blueshield = 1,
+ /obj/item/gunbox/blueshield/secondary = 1
+ )
+ cost = 100
+ containertype = /obj/structure/closet/crate/secure/weapon
+ containername = "Blueshield armaments"
+ access = access_blueshield_exclusive
+
+/datum/supply_pack/misc/bluespaceradioyw
+ name = "Bluespace Radio Packs"
+ contains = list(
+ /obj/item/device/bluespaceradio/cryogaia_prelinked = 2
+ )
+ cost = 75
+ containertype = /obj/structure/closet/crate
+ containername = "Bluespace Radio Packs"
\ No newline at end of file
diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm
index f7b8eeebad..daeee1ffbd 100644
--- a/code/datums/supplypacks/munitions.dm
+++ b/code/datums/supplypacks/munitions.dm
@@ -237,3 +237,55 @@
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Energy ammunition crate"
access = access_security
+ containertype = /obj/structure/closet/crate
+ containername = "Beanbag shells"
+ access = null
+
+/datum/supply_pack/randomised/munitions/yw_revolver
+ name = "Revolver Crate"
+ num_contained = 2
+ contains = list(
+ /obj/item/weapon/gun/projectile/revolver/cerberus,
+ /obj/item/weapon/gun/projectile/revolver/nova,
+ /obj/item/weapon/gun/projectile/revolver/detective,
+ /obj/item/weapon/gun/projectile/revolver/deckard,
+ /obj/item/weapon/gun/projectile/revolver/mateba,
+ /obj/item/weapon/gun/projectile/derringer
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Revolver Crate"
+ access = access_armory
+
+/datum/supply_pack/randomised/munitions/yw_assault
+ name = "Assault rifle crate"
+ num_contained = 2
+ contains = list(
+ /obj/item/weapon/gun/projectile/automatic/tommygun,
+ /obj/item/weapon/gun/projectile/automatic/c20r,
+ /obj/item/weapon/gun/projectile/automatic/sts35
+ )
+ cost = 250
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Assault rifle crate"
+ access = access_armory
+
+/datum/supply_pack/randomised/munitions/yw_smg
+ name = "Smg crate"
+ num_contained = 2
+ contains = list(
+ /obj/item/weapon/gun/projectile/automatic/c20r,
+ /obj/item/weapon/gun/projectile/automatic/pdw
+ )
+ cost = 100
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Smg crate"
+ access = access_armory
+
+/datum/supply_pack/munitions/munitions/yw_mg
+ name = "Light machine gun crate"
+ contains = list(/obj/item/weapon/gun/projectile/automatic/l6_saw = 1)
+ cost = 500
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Light machine gun crate"
+ access = access_armory
\ No newline at end of file
diff --git a/code/datums/supplypacks/recreation_yw.dm b/code/datums/supplypacks/recreation_yw.dm
new file mode 100644
index 0000000000..5a3a86462e
--- /dev/null
+++ b/code/datums/supplypacks/recreation_yw.dm
@@ -0,0 +1,23 @@
+/datum/supply_pack/recreation/bigband
+ name = "Instrument bundle"
+ contains = list(
+ /obj/item/device/instrument/guitar = 1,
+ /obj/item/device/instrument/keytar = 1,
+ /obj/item/device/instrument/eguitar = 1,
+ /obj/item/device/instrument/xylophone = 1,
+ /obj/item/device/instrument/accordion = 1,
+ /obj/item/device/instrument/saxophone = 1,
+ /obj/item/device/instrument/glockenspiel = 1,
+ /obj/item/device/instrument/harmonica = 1,
+ /obj/item/device/instrument/trombone = 1,
+ )
+ cost = 100
+ containertype = /obj/structure/closet/crate
+ containername = "Instrument crate"
+
+/datum/supply_pack/recreation/piano
+ name = "Grand* Piano"
+ contains = list()
+ cost = 150
+ containertype = /obj/structure/largecrate/piano
+ containername = "Piano Crate"
diff --git a/code/datums/supplypacks/security_yw.dm b/code/datums/supplypacks/security_yw.dm
new file mode 100644
index 0000000000..05074a0fe1
--- /dev/null
+++ b/code/datums/supplypacks/security_yw.dm
@@ -0,0 +1,9 @@
+/datum/supply_pack/security/loyaltyimplants
+ name = "Loyalty Implant Lockbox"
+ contains = list(
+ /obj/item/weapon/storage/lockbox/loyalty
+ )
+ cost = 100
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "Loyalty Implants Lockbox crate"
+ access = access_heads
\ No newline at end of file
diff --git a/code/datums/supplypacks/voidsuits.dm b/code/datums/supplypacks/voidsuits.dm
index 2066c216d3..90acd6661d 100644
--- a/code/datums/supplypacks/voidsuits.dm
+++ b/code/datums/supplypacks/voidsuits.dm
@@ -234,4 +234,12 @@
cost = 30
containertype = /obj/structure/closet/crate/nanotrasen
containername = "Zaddat Shroud crate"
- access = null
\ No newline at end of file
+ access = access_mining
+
+/datum/supply_pack/voidsuits/unathi_bs_yw
+ name = "Unathi breacher chassis"
+ contains = list(/obj/item/weapon/rig/breacher) //YW Edit
+ cost = 350
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Unathi breacher chassis crate"
+ access = access_armory
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 18f889ffae..9778492615 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -83,6 +83,36 @@
icon_state = "wilderness1"
desc = "This appears to be a sign warning people that the other side is dangerous. It also says that NanoTrasen cannot guarantee your safety beyond this point."
+/obj/structure/showcase/sign/nt //yw edit
+ name = "Welcome: Nanotrasen"
+ icon = 'icons/obj/structures_yw.dmi'
+ icon_state = "NT_sign"
+ desc = "This appears to be a sign welcoming Nanotrasen presonnel. It also says that NanoTrasen is the best coporation around."
+/obj/structure/showcase/sign/hephaestus //yw edit
+ name = "Hephaestus Whiskey Station"
+ icon = 'icons/obj/structures_yw.dmi'
+ icon_state = "Hephaestus_sign"
+ desc = "This appears to be a sign welcoming Hephaestus Industry personnel. It seems rather old and partly rusted."
+
+/obj/structure/showcase/yw/chaplain //yw edit
+ name = "Strange Bronze Machinery"
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "mania_motor"
+ desc = "A strange device made of bronze. It has an unknown purpose."
+
+/obj/structure/showcase/yw/chaplain2 //yw edit
+ name = "Strange Bronze Machinery"
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "obelisk"
+ desc = "A strange device made of bronze. It has an unknown purpose."
+
+/obj/structure/showcase/yw/plaque //yw edit
+ name = "Commerative Plaque"
+ icon = 'icons/obj/structures_yw32x32.dmi'
+ icon_state = "plaque"
+ desc = "A plaque commerating the building efforts of the sleepiest outpost in the sector, Yawn Wider."
+ density = 0
+
/obj/item/mouse_drag_pointer = MOUSE_ACTIVE_POINTER
/obj/item/weapon/beach_ball
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 8be56acbf3..0cb7cbd594 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -299,6 +299,7 @@
name = "rapid part exchange device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "RPED"
+ item_icons = list(slot_l_hand_str = 'icons/vore/custom_items_left_hand_yw.dmi', slot_r_hand_str = 'icons/vore/custom_items_right_hand_yw.dmi') //YW add - RPED sprite
w_class = ITEMSIZE_HUGE
can_hold = list(/obj/item/weapon/stock_parts)
storage_slots = 50
@@ -317,7 +318,12 @@
desc = "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)
+ //YAWN Changes
+ can_hold = list(
+ /obj/item/weapon/cell,
+ /obj/item/weapon/stock_parts,
+ /obj/item/weapon/reagent_containers/glass/beaker)
+ //End of YAWN Changes
storage_slots = 200
use_to_pickup = 1
allow_quick_gather = 1
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index 568eb0f743..eac4e10ea0 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -17,17 +17,17 @@
log = do_log
newscast = do_newscast
-/datum/announcement/priority/New(var/do_log = 1, var/new_sound, var/do_newscast = 0)
+/datum/announcement/priority/New(var/do_log = 1, var/new_sound = 'sound/misc/notice2.ogg', var/do_newscast = 0)
..(do_log, new_sound, do_newscast)
title = "Priority Announcement"
announcement_type = "Priority Announcement"
-/datum/announcement/priority/command/New(var/do_log = 1, var/new_sound, var/do_newscast = 0)
+/datum/announcement/priority/command/New(var/do_log = 1, var/new_sound = 'sound/misc/notice2.ogg', var/do_newscast = 0)
..(do_log, new_sound, do_newscast)
title = "[command_name()] Update"
announcement_type = "[command_name()] Update"
-/datum/announcement/priority/security/New(var/do_log = 1, var/new_sound, var/do_newscast = 0)
+/datum/announcement/priority/security/New(var/do_log = 1, var/new_sound = 'sound/misc/notice2.ogg', var/do_newscast = 0)
..(do_log, new_sound, do_newscast)
title = "Security Announcement"
announcement_type = "Security Announcement"
@@ -107,21 +107,14 @@
announce_newscaster_news(news)
/datum/announcement/proc/PlaySound(var/message_sound, var/list/zlevels)
+ if(!message_sound)
+ return
+
for(var/mob/M in player_list)
if(zlevels && !(M.z in zlevels))
continue
if(!istype(M,/mob/new_player) && !isdeaf(M))
- M << 'sound/AI/preamble.ogg'
-
- if(!message_sound)
- return
-
- spawn(22) // based on length of preamble.ogg + arbitrary delay
- for(var/mob/M in player_list)
- if(zlevels && !(M.z in zlevels))
- continue
- if(!istype(M,/mob/new_player) && !isdeaf(M))
- M << message_sound
+ M << message_sound
/datum/announcement/proc/Sound(var/message_sound, var/list/zlevels)
PlaySound(message_sound, zlevels)
diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm
index efcd5955f7..8d8e484fae 100644
--- a/code/game/antagonist/antagonist_print.dm
+++ b/code/game/antagonist/antagonist_print.dm
@@ -71,7 +71,7 @@
var/TC_uses = 0
var/uplink_true = 0
var/purchases = ""
- for(var/obj/item/device/uplink/H in world_uplinks)
+ for(var/obj/item/device/uplink/H in GLOB.world_uplinks)
if(H && H.uplink_owner && H.uplink_owner == ply)
TC_uses += H.used_TC
uplink_true = 1
@@ -85,7 +85,7 @@
/proc/print_ownerless_uplinks()
var/has_printed = 0
- for(var/obj/item/device/uplink/H in world_uplinks)
+ for(var/obj/item/device/uplink/H in GLOB.world_uplinks)
if(isnull(H.uplink_owner) && H.used_TC)
if(!has_printed)
has_printed = 1
diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm
index 46295ba5ae..d6c7857ace 100644
--- a/code/game/antagonist/outsider/raider.dm
+++ b/code/game/antagonist/outsider/raider.dm
@@ -196,7 +196,7 @@ var/datum/antagonist/raider/raiders
return 0
for(var/datum/mind/player in current_antagonists)
- if(!player.current || get_area(player.current) != locate(/area/skipjack_station/start))
+ if(!player.current || get_area(player.current) != locate(/area/shuttle/skipjack)) // CHOMPEdit: Changed locate to work with new condensed shuttles
return 0
return 1
diff --git a/code/game/area/Away Mission areas.dm b/code/game/area/Away Mission areas.dm
index 1edf5b23f1..731468c529 100644
--- a/code/game/area/Away Mission areas.dm
+++ b/code/game/area/Away Mission areas.dm
@@ -57,4 +57,4 @@
F = pick(valid_flora)
Turf = pick(valid_spawn_turfs)
valid_spawn_turfs -= Turf
- new F(Turf)
\ No newline at end of file
+ new F(Turf)
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index ec368f6c0b..ff3f6f2319 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -29,6 +29,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
power_light = 0
power_equip = 0
power_environ = 0
+ ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg','sound/ambience/space/space_serithi.ogg','sound/music/freefallin.mid')
base_turf = /turf/space
ambience = AMBIENCE_SPACE
flags = AREA_FLAG_IS_NOT_PERSISTENT
@@ -183,6 +184,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
icon_state = "red"
dynamic_lighting = 0
+/area/shuttle/trade/centcom
+ name = "\improper Trade Shuttle CentCom"
+ icon_state = "shuttlered"
+
+/area/shuttle/trade/station
+ name = "\improper Cryogaia Commerce Pad"
+ icon_state = "shuttlered"
+
/area/shuttle/thunderdome
name = "honk"
@@ -352,6 +361,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
//ENEMY
//names are used
+// CHOMPEdit start: Shuttle condensing
/area/syndicate_station
name = "\improper Independent Station"
icon_state = "yellow"
@@ -361,53 +371,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
ambience = AMBIENCE_HIGHSEC
flags = AREA_FLAG_IS_NOT_PERSISTENT
-/area/syndicate_station/start
- name = "\improper Mercenary Forward Operating Base"
+/area/shuttle/syndicate
+ name = "\improper Mercenary Shuttle"
icon_state = "yellow"
-
-/area/syndicate_station/southwest
- name = "\improper south-west of SS13"
- icon_state = "southwest"
-
-/area/syndicate_station/northwest
- name = "\improper north-west of SS13"
- icon_state = "northwest"
-
-/area/syndicate_station/northeast
- name = "\improper north-east of SS13"
- icon_state = "northeast"
-
-/area/syndicate_station/southeast
- name = "\improper south-east of SS13"
- icon_state = "southeast"
-
-/area/syndicate_station/north
- name = "\improper north of SS13"
- icon_state = "north"
-
-/area/syndicate_station/south
- name = "\improper south of SS13"
- icon_state = "south"
-
-/area/syndicate_station/commssat
- name = "\improper south of the communication satellite"
- icon_state = "south"
-
-/area/syndicate_station/mining
- name = "\improper northeast of the mining station"
- icon_state = "north"
-
-/area/syndicate_station/arrivals_dock
- name = "\improper docked with station"
- icon_state = "shuttle"
-
-/area/syndicate_station/maint_dock
- name = "\improper docked with station"
- icon_state = "shuttle"
-
-/area/syndicate_station/transit
- name = "\improper hyperspace"
- icon_state = "shuttle"
+ requires_power = 0
+ flags = RAD_SHIELDED
+ base_turf = /turf/space
+ ambience = AMBIENCE_HIGHSEC
+ flags = AREA_FLAG_IS_NOT_PERSISTENT
+// CHOMPEdit End: Shuttle condensing
/area/wizard_station
name = "\improper Wizard's Den"
@@ -417,41 +389,23 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
ambience = AMBIENCE_OTHERWORLDLY
flags = AREA_FLAG_IS_NOT_PERSISTENT
+// CHOMPEdit Start: Shuttle condensing
/area/skipjack_station
+ name = "Raider Outpost"
+ icon_state = "yellow"
+ requires_power = 0
+ dynamic_lighting = 0
+ flags = RAD_SHIELDED
+ ambience = AMBIENCE_HIGHSEC
+
+/area/shuttle/skipjack
name = "\improper Skipjack"
icon_state = "yellow"
requires_power = 0
base_turf = /turf/space
ambience = AMBIENCE_HIGHSEC
flags = AREA_FLAG_IS_NOT_PERSISTENT
-
-/area/skipjack_station/start
- name = "\improper Skipjack"
- icon_state = "yellow"
-
-/area/skipjack_station/transit
- name = "\improper hyperspace"
- icon_state = "shuttle"
-
-/area/skipjack_station/southwest_solars
- name = "\improper aft port solars"
- icon_state = "southwest"
-
-/area/skipjack_station/northwest_solars
- name = "\improper fore port solars"
- icon_state = "northwest"
-
-/area/skipjack_station/northeast_solars
- name = "\improper fore starboard solars"
- icon_state = "northeast"
-
-/area/skipjack_station/southeast_solars
- name = "\improper aft starboard solars"
- icon_state = "southeast"
-
-/area/skipjack_station/mining
- name = "\improper south of mining station"
- icon_state = "north"
+// CHOMPEdit End: Shuttle condensing
//PRISON
/area/prison
@@ -1000,7 +954,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters
name = "\improper Dormitories"
icon_state = "Sleep"
- flags = RAD_SHIELDED
ambience = AMBIENCE_GENERIC
forbid_events = TRUE
@@ -1012,6 +965,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/sleep
name = "\improper Dormitories"
icon_state = "Sleep"
+ flags = RAD_SHIELDED
/area/crew_quarters/sleep/Apartment_A1
name = "\improper Apartment A1"
@@ -1145,6 +1099,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Visitor Room 12"
icon_state = "Sleep"
+//CHOMPStation Edit Start TFF 6/2/20 - Added two new dorms
+
+/area/crew_quarters/sleep/vistor_room_13
+ name = "\improper Visitor Room 12"
+ icon_state = "Sleep"
+
+/area/crew_quarters/sleep/vistor_room_14
+ name = "\improper Visitor Room 12"
+ icon_state = "Sleep"
+
+//CHOMPStation Edit End
+
/area/crew_quarters/sleep/engi_wash
name = "\improper Engineering Washroom"
icon_state = "toilet"
@@ -1382,10 +1348,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
ambience = AMBIENCE_ENGINEERING
/area/engineering/atmos
- name = "\improper Atmospherics"
- icon_state = "atmos"
- sound_env = LARGE_ENCLOSED
- ambience = AMBIENCE_ATMOS
+ name = "\improper Atmospherics"
+ icon_state = "atmos"
+ sound_env = LARGE_ENCLOSED
+ ambience = AMBIENCE_ATMOS
/area/engineering/atmos/monitoring
name = "\improper Atmospherics Monitoring Room"
@@ -1541,6 +1507,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Teleporter"
icon_state = "teleporter"
music = "signal"
+ flags = RAD_SHIELDED
/area/gateway
name = "\improper Gateway"
@@ -1721,8 +1688,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Port First-Aid Station"
icon_state = "medbay2"
-
-
//Security
/area/security/main
@@ -1978,6 +1943,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Xenobiology Lab"
icon_state = "xeno_lab"
+/area/rnd/xenobiology/hallway
+ name = "\improper Xenobiology hallway"
+ icon_state = "xeno_lab"
+
+/area/rnd/xenobiology/storage
+ name = "\improper Xenobiology storage"
+ icon_state = "xeno_lab"
+
/area/rnd/xenobiology/xenoflora_storage
name = "\improper Xenoflora Storage"
icon_state = "xeno_f_store"
@@ -2010,6 +1983,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Server Room"
icon_state = "server"
+
//Storage
/area/storage/tools
@@ -2625,4 +2599,40 @@ var/list/the_station_areas = list (
icon_state = "yellow"
luminosity = 1
dynamic_lighting = 0
- requires_power = 0
\ No newline at end of file
+ requires_power = 0
+
+
+//CHOMPSTATION AREAS
+//Moved hangars to here from Southern cross areas.
+/area/hangar
+ name = "\improper First Deck Hangar"
+ icon_state = "hangar"
+ sound_env = LARGE_ENCLOSED
+ ambience = AMBIENCE_HANGAR
+
+/area/hangar/one
+ name = "\improper Hangar One"
+
+/area/hangar/lockerroomone
+ name = "\improper Exploration Locker Room One"
+ icon_state = "hangarcontrol"
+
+/area/hangar/two
+ name = "\improper Hangar Two"
+
+/area/hangar/lockerroomtwo
+ name = "\improper Exploration Locker Room Two"
+ icon_state = "hangarcontrol"
+
+/area/hangar/three
+ name = "\improper Hangar Three"
+
+/area/hangar/lockerroomthree
+ name = "\improper Exploration Locker Room Three"
+ icon_state = "hangarcontrol"
+
+/area/shuttle/stargazer
+ name = "\improper Stargazer"
+ icon_state = "shuttlered"
+ requires_power = 1
+
\ No newline at end of file
diff --git a/code/game/area/Space Station 13 areas_ch.dm b/code/game/area/Space Station 13 areas_ch.dm
new file mode 100644
index 0000000000..4b568e2b94
--- /dev/null
+++ b/code/game/area/Space Station 13 areas_ch.dm
@@ -0,0 +1,63 @@
+/area/casino/casino_ship
+ name = "\improper Casino Ship"
+ icon_state = "yellow"
+ requires_power = 0
+ dynamic_lighting = 0
+
+/area/casino/casino_ship/wing_left
+ name = "\improper Casino Ship left wing"
+ icon_state = "yellow"
+
+/area/casino/casino_ship/wing_right
+ name = "\improper Casino Ship right wing"
+ icon_state = "yellow"
+
+/area/casino/casino_ship/dorms
+ name = "\improper Casino Ship dorms"
+ icon_state = "yellow"
+
+/area/casino/casino_ship/cockpit
+ name = "\improper Casino Ship left wing"
+ icon_state = "yellow"
+
+/area/shuttle/casino/
+ name = "\improper Casino Shuttle"
+ dynamic_lighting = 0
+ icon_state = "shuttlegrn"
+
+/area/surface/outpost/main/dorms
+ name = "\improper Main Outpost Dorms"
+
+/area/surface/outpost/main/dorms/dorm_1
+ name = "\improper Main Outpost Dorm One"
+
+/area/surface/outpost/main/dorms/dorm_2
+ name = "\improper Main Outpost Dorm Two"
+
+/area/surface/outpost/main/dorms/dorm_3
+ name = "\improper Main Outpost Dorm Three"
+
+/area/surface/outpost/main/dorms/dorm_4
+ name = "\improper Main Outpost Dorm Four"
+
+/area/surface/outpost/main/dorms/dorm_5
+ name = "\improper Main Outpost Dorm Five"
+
+/area/surface/outpost/main/dorms/dorm_6
+ name = "\improper Main Outpost Dorm Six"
+
+//TFF 5/5/20 - make rad protection great again!
+/area/crew_quarters/cafeteria
+ flags = RAD_SHIELDED
+
+/area/crew_quarters/coffee_shop
+ flags = RAD_SHIELDED
+
+/area/crew_quarters/kitchen
+ flags = RAD_SHIELDED
+
+/area/crew_quarters/bar
+ flags = RAD_SHIELDED
+
+/area/crew_quarters/barrestroom
+ flags = RAD_SHIELDED
diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm
index b937fec8b2..657568479e 100644
--- a/code/game/area/Space Station 13 areas_vr.dm
+++ b/code/game/area/Space Station 13 areas_vr.dm
@@ -30,6 +30,144 @@
icon_state = "red2"
//shuttle_area = /area/shuttle/belter/belt/zone4
+/area/medical/resleeving
+ name = "Resleeving Lab"
+ icon_state = "genetics"
+
+/area/bigship
+ name = "Bigship"
+ requires_power = 0
+ flags = RAD_SHIELDED
+ sound_env = SMALL_ENCLOSED
+ base_turf = /turf/space
+ icon_state = "red2"
+
+/area/bigship/teleporter
+ name = "Bigship Teleporter Room"
+
+//////// Small Cruiser Areas ////////
+/area/houseboat
+ name = "Small Cruiser"
+ requires_power = 0
+ flags = RAD_SHIELDED
+ base_turf = /turf/space
+ icon_state = "red2"
+ lightswitch = TRUE
+
+/area/houseboat/holodeck_area
+ name = "Small Cruiser - Holodeck"
+ icon_state = "blue2"
+
+/area/houseboat/holodeck/off
+ name = "Small Cruiser Holo - Off"
+ icon_state = "blue2"
+/area/houseboat/holodeck/beach
+ name = "Small Cruiser Holo - Beach"
+ icon_state = "blue2"
+/area/houseboat/holodeck/snow
+ name = "Small Cruiser Holo - Snow"
+ icon_state = "blue2"
+/area/houseboat/holodeck/desert
+ name = "Small Cruiser Holo - Desert"
+ icon_state = "blue2"
+/area/houseboat/holodeck/picnic
+ name = "Small Cruiser Holo - Picnic"
+ icon_state = "blue2"
+/area/houseboat/holodeck/thunderdome
+ name = "Small Cruiser Holo - Thunderdome"
+ icon_state = "blue2"
+/area/houseboat/holodeck/basketball
+ name = "Small Cruiser Holo - Basketball"
+ icon_state = "blue2"
+/area/houseboat/holodeck/gaming
+ name = "Small Cruiser Holo - Gaming Table"
+ icon_state = "blue2"
+/area/houseboat/holodeck/space
+ name = "Small Cruiser Holo - Space"
+ icon_state = "blue2"
+/area/houseboat/holodeck/bunking
+ name = "Small Cruiser Holo - Bunking"
+ icon_state = "blue2"
+
+/area/shuttle/cruiser/cruiser
+ name = "Small Cruiser Shuttle - Cruiser"
+ icon_state = "blue2"
+ base_turf = /turf/simulated/floor/tiled/techfloor
+/area/shuttle/cruiser/station
+ name = "Small Cruiser Shuttle - Station"
+ icon_state = "blue2"
+
+
+// Tether Map has this shuttle
+/area/shuttle/tether/surface
+ name = "Tether Shuttle Landed"
+ icon_state = "shuttle"
+ base_turf = /turf/simulated/floor/reinforced
+
+/area/shuttle/tether/station
+ name = "Tether Shuttle Dock"
+ icon_state = "shuttle2"
+
+/area/shuttle/tether/transit
+ name = "Tether Shuttle Transit"
+ icon_state = "shuttle2"
+
+// rnd (Research and Development)
+/area/rnd/research/testingrange
+ name = "\improper Weapons Testing Range"
+ icon_state = "firingrange"
+
+/area/rnd/research/researchdivision
+ name = "\improper Research Division"
+ icon_state = "research"
+
+/area/rnd/outpost
+ name = "\improper Research Outpost Hallway"
+ icon_state = "research"
+
+/area/rnd/outpost/airlock
+ name = "\improper Research Outpost Airlock"
+ icon_state = "green"
+
+/area/rnd/outpost/eva
+ name = "Research Outpost EVA Storage"
+ icon_state = "eva"
+
+/area/rnd/outpost/chamber
+ name = "\improper Research Outpost Burn Chamber"
+ icon_state = "engine"
+
+/area/rnd/outpost/atmos
+ name = "Research Outpost Atmospherics"
+ icon_state = "atmos"
+
+/area/rnd/outpost/storage
+ name = "\improper Research Outpost Gas Storage"
+ icon_state = "toxstorage"
+
+/area/rnd/outpost/mixing
+ name = "\improper Research Outpost Gas Mixing"
+ icon_state = "toxmix"
+
+/area/rnd/outpost/hallway
+ name = "\improper Toxins Hallway"
+ icon_state = "toxmix"
+
+/area/rnd/outpost/heating
+ name = "\improper Research Outpost Gas Heating"
+ icon_state = "toxmix"
+
+/area/rnd/outpost/testing
+ name = "\improper Research Outpost Testing"
+ icon_state = "toxtest"
+
+/area/rnd/outpost/launch
+ name = "\improper Research Toxins Launch Room"
+ icon_state = "toxtest"
+
+/area/maintenance/substation/outpost
+ name = "Research Outpost Substation"
+
/area/engineering/engine_gas
name = "\improper Engine Gas Storage"
icon_state = "engine_waste"
diff --git a/code/game/area/Space Station 13 areas_yw.dm b/code/game/area/Space Station 13 areas_yw.dm
new file mode 100644
index 0000000000..13cdf6b9f6
--- /dev/null
+++ b/code/game/area/Space Station 13 areas_yw.dm
@@ -0,0 +1,213 @@
+/area/maintenance/lowfloor1
+ name = "Maintenance"
+ icon_state = "amaint"
+ ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
+
+/area/maintenance/lowfloor2
+ name = "Maintenance"
+ icon_state = "amaint"
+ ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
+
+/area/maintenance/lowfloor3
+ name = "Maintenance"
+ icon_state = "amaint"
+ ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
+
+/area/maintenance/lowfloor4
+ name = "Maintenance"
+ icon_state = "amaint"
+ ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
+
+/area/maintenance/lowfloor5
+ name = "Maintenance"
+ icon_state = "amaint"
+ ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
+
+/area/maintenance/lowfloor6
+ name = "Maintenance"
+ icon_state = "amaint"
+ ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
+
+/area/maintenance/lowatmos
+ name = "Lower Engineering"
+ icon_state = "amaint"
+ ambience = list('sound/ambience/maintenance/maintenance1.ogg','sound/ambience/maintenance/maintenance2.ogg')
+
+
+/area/constructionsite/medical/upper
+ name = "\improper Construction Site Medbay Loft"
+ icon_state = "medbay"
+
+/area/maintenance/mining
+ name = "Mining Maintence"
+ icon_state = "amaint"
+
+/area/maintenance/shelter
+ name = "Pulsar Radiation Shelter"
+ icon_state = "amaint"
+
+/area/maintenance/shelter2
+ name = "Pulsar Radiation Shelter"
+ icon_state = "amaint"
+
+/area/maintenance/shelter3
+ name = "Pulsar Radiation Shelter"
+ icon_state = "amaint"
+
+/area/maintenance/blueserg
+ name = "Blue Sergal"
+ icon_state = "amaint"
+
+/area/maintenance/blueserg/dorms
+ name = "Blue Sergal"
+ icon_state = "amaint"
+
+/area/maintenance/blueserg/misc
+ name = "Blue Sergal"
+ icon_state = "amaint"
+
+/area/rnd/outpost/toxinsworkshop
+ name = "\improper Research Outpost Toxins Workshop"
+ icon_state = "toxtest"
+
+/area/rnd/phoronics
+ name = "\improper Phoro-Chemistry"
+ icon_state = "toxtest"
+
+/area/rnd/xenobiology/surgery
+ name = "\improper Emergency Surgery Lab"
+ icon_state = "xeno_lab"
+
+/area/rnd/xenobiology/control
+ name = "\improper Xenobiology Control Center"
+ icon_state = "xeno_lab"
+
+/area/rnd/xenobiology/secure
+ name = "\improper High Security Xenobiology Lab"
+ icon_state = "xeno_lab"
+
+/area/rnd/xenobiology/failsafe
+ name = "\improper Xenobiology Emergency Failsafe"
+ icon_state = "xeno_lab"
+
+/area/outpost/research/exotic
+ name = "Research Outpost Exotic Particles Lab"
+
+/area/outpost/research/radio
+ name = "Research Outpost Radiospectrometery Lab"
+
+/area/outpost/research/hallway/entry
+ name = "Research Outpost Entry"
+
+
+/area/hallway/lower/dorms
+ name = "\improper Dormitory Hallway"
+ icon_state = "hallC4"
+
+/area/hallway/lower/central
+ name = "\improper Lower Central Hallway"
+ icon_state = "hallC4"
+
+/area/hallway/lower/aft
+ name = "\improper Lower Aft Hallway"
+ icon_state = "hallA"
+
+/area/hallway/lower/fore
+ name = "\improper Lower Fore Primary Hallway"
+ icon_state = "hallF"
+
+/area/vacant/vacant_office
+ name = "\improper Abandoned Office"
+ icon_state = "vacant_site"
+
+/area/civilian/atrium
+ name = "\improper Atrium"
+ icon = 'icons/turf/areas_yw.dmi'
+ icon_state = "atrium_central"
+
+/area/civilian/atrium/lower
+ name = "\improper Lower Atrium"
+ icon_state = "atrium_lower"
+
+/area/civilian/atrium/central
+ name = "\improper Central Atrium"
+
+/area/civilian/atrium/upper
+ name = "\improper Upper Atrium"
+ icon_state = "atrium_upper"
+
+
+//area/vacant/vacant_office
+// name = "\improper Abandoned Office"
+// icon_state = "vacant_site"
+
+/area/crew_quarters/medmeeting
+ name = "\improper Medical Meeting Room"
+ icon_state = "medbay3"
+ music = 'sound/ambience/signal.ogg'
+
+/area/medical/equipstorage
+ name = "\improper Equipment Storage"
+ icon_state = "medbay2"
+ music = 'sound/ambience/signal.ogg'
+
+/area/medical/medbay_emt_storage
+ name = "\improper Medical EMT Equipment Storage"
+ icon_state = "medbay_emt_bay"
+ music = 'sound/ambience/signal.ogg'
+
+/area/quartermaster/miningwing
+ name = "\improper Cargo Mining"
+ icon_state = "mining"
+
+/area/quartermaster/disposals
+ name = "\improper Cargo - Disposals"
+ icon_state = "quart"
+
+
+/area/security/perma
+ name = "\improper Prison"
+ icon_state = "security"
+
+/area/security/perma/bathroom
+ name = "\improper Prison Bathroom"
+ icon_state = "security"
+
+/area/security/perma/control
+ name = "\improper Prison Guard Station"
+ icon_state = "security"
+
+/area/security/perma/court
+ name = "\improper Prison Basketball Court"
+
+/area/security/airlock
+ name = "\improper Security Airlock"
+ icon_state = "security"
+
+/area/security/outpost
+ name = "\improper Security outpost"
+ icon_state = "security"
+ flags = RAD_SHIELDED
+
+/area/security/labor
+ name = "Labor camp access"
+ icon_state = "security"
+
+/area/medical/medbaymain
+ name = "\improper Medbay Primary Hallway"
+ icon_state = "medbay"
+ music = 'sound/ambience/signal.ogg'
+
+/area/medical/medbayupper
+ name = "\improper Medbay Upper Hallway"
+ icon_state = "medbay2"
+ music = 'sound/ambience/signal.ogg'
+
+/area/medical/medbayskybridge
+ name = "\improper Medbay/Departures Skybridge"
+ icon_state = "medbay4"
+ music = 'sound/ambience/signal.ogg'
+
+/area/security/shuttledock
+ name = "\improper Security Interceptor Dock"
+ icon_state = "security"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 04075fe825..f0e87cc93a 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -435,7 +435,7 @@ var/list/mob/living/forced_ambiance_list = new
to_chat(mob, "The sudden appearance of gravity makes you fall to the floor!")
playsound(mob, "bodyfall", 50, 1)
-/area/proc/prison_break(break_lights = TRUE, open_doors = TRUE, open_blast_doors = TRUE)
+/area/proc/prison_break(break_lights = TRUE, open_doors = TRUE, open_blast_doors = FALSE) //CHOMP Edit set blast doors to FALSE
var/obj/machinery/power/apc/theAPC = get_apc()
if(theAPC.operating)
if(break_lights)
@@ -525,4 +525,4 @@ GLOBAL_DATUM(spoiler_obfuscation_image, /image)
if(should_obfuscate)
add_overlay(GLOB.spoiler_obfuscation_image)
else
- cut_overlay(GLOB.spoiler_obfuscation_image)
\ No newline at end of file
+ cut_overlay(GLOB.spoiler_obfuscation_image)
diff --git a/code/game/area/asteroid_areas.dm b/code/game/area/asteroid_areas.dm
index 85f3bffd2f..e43b024ed1 100644
--- a/code/game/area/asteroid_areas.dm
+++ b/code/game/area/asteroid_areas.dm
@@ -40,6 +40,11 @@
icon_state = "dark"
flags = AREA_FLAG_IS_NOT_PERSISTENT
+//lower level hallway
+/area/outpost/hall
+ name = "Lower Level Hall"
+ icon_state = "dark"
+
// Main mining outpost
/area/outpost/mining_main
icon_state = "outpost_mine_main"
@@ -192,6 +197,9 @@
/area/outpost/research/eva
name = "Research Outpost EVA"
+/area/outpost/research/atmosia
+ name = "Research Outpost Atmospherics"
+
/area/outpost/research/analysis
name = "Research Outpost Sample Analysis"
@@ -258,6 +266,10 @@
name = "\improper Research Outpost Toxins Mixing Room"
icon_state = "toxmix"
+/area/outpost/research/mixing
+ name = "\improper Research Outpost Toxins Mixing Room"
+ icon_state = "toxmix"
+
/area/outpost/research/tempstorage
name = "Research Outpost Temporary Storage"
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 03185d31d3..3ed52d317c 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -191,6 +191,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
size_multiplier = player_sizes_list.Find(N)
break
+ var/taurtype = /datum/sprite_accessory/tail/taur/spider
+ if(istype(character.tail_style, taurtype))
+ character.verbs += /mob/living/proc/weaveWebBindings
+
// 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))
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 2834b81cbd..dfc22c5a02 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -670,7 +670,7 @@ datum/objective/heist/kidnap
//if (!target.current.restrained())
// return 0 // They're loose. Close but no cigar.
- var/area/skipjack_station/start/A = locate()
+ var/area/shuttle/skipjack/A = locate() // CHOMPEdit: Shuttle consensing
for(var/mob/living/carbon/human/M in A)
if(target.current == M)
return 1 //They're restrained on the shuttle. Success.
@@ -721,7 +721,7 @@ datum/objective/heist/loot
var/total_amount = 0
- for(var/obj/O in locate(/area/skipjack_station/start))
+ for(var/obj/O in locate(/area/shuttle/skipjack)) // CHOMPEdit: Shuttle consensing
if(istype(O,target)) total_amount++
for(var/obj/I in O.contents)
if(istype(I,target)) total_amount++
@@ -770,7 +770,7 @@ datum/objective/heist/salvage
var/total_amount = 0
- for(var/obj/item/O in locate(/area/skipjack_station/start))
+ for(var/obj/item/O in locate(/area/shuttle/skipjack)) // CHOMPEdit: Shuttle consensing
var/obj/item/stack/material/S
if(istype(O,/obj/item/stack/material))
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 11f070f2f5..0fd7bffcbd 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -87,12 +87,10 @@ datum/hSB
P.back.hud_layerise()
P.internal = P.back
if("hsbmetal")
- var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/metal
- hsb.amount = 50
+ var/obj/fiftyspawner/iron/hsb = new/obj/fiftyspawner/iron
hsb.loc = usr.loc
if("hsbglass")
- var/obj/item/stack/sheet/hsb = new/obj/item/stack/sheet/glass
- hsb.amount = 50
+ var/obj/fiftyspawner/glass/hsb = new/obj/fiftyspawner/glass
hsb.loc = usr.loc
if("hsbairlock")
var/obj/machinery/door/hsb = new/obj/machinery/door/airlock
diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm
index a9641dabd2..2dbcd77a30 100644
--- a/code/game/gamemodes/sandbox/sandbox.dm
+++ b/code/game/gamemodes/sandbox/sandbox.dm
@@ -11,6 +11,12 @@
M.CanBuild()
return 1
+/datum/game_mode/sandbox/process()
+ for(var/mob/M in player_list)
+ if(M.sandbox == null)
+ M.CanBuild()
+ return 1
+
/datum/game_mode/sandbox/post_setup()
..()
if(emergency_shuttle)
diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index 7d0ddc6c2e..b403639ddc 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -144,7 +144,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
dat += "[spell.name]
"
dat += "[spell.desc]
"
if(spell.spell_power_desc)
- dat += "Spell Power: [spell.spell_power_desc]
"
+ dat += "Spell Power: [spell.spell_power_desc]
"
if(spell.enhancement_desc)
dat += "Scepter Effect: [spell.enhancement_desc]
"
if(spell.cost <= budget)
@@ -266,7 +266,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) -
If a function is able to be boosted with it, it will be shown underneath the description of the function as \
'Scepter Effect:'. Note that you must hold the scepter for it to work, so try to avoid losing it.
"
dat += "Functions can also be boosted with the core itself. A function that is able to benefit \
- from this will have 'Spell Power:' underneath. Different Cores have different \
+ from this will have 'Spell Power:' underneath. Different Cores have different \
amounts of spell power.
"
dat += "When a function refers to 'allies', it means you, your apprentices, currently controlled entities (with the \
Control function), and friendly simple-minded entities that you've summoned with the Scepter of Enhancement.
"
diff --git a/code/game/gamemodes/technomancer/equipment_ch.dm b/code/game/gamemodes/technomancer/equipment_ch.dm
new file mode 100644
index 0000000000..81c39331cc
--- /dev/null
+++ b/code/game/gamemodes/technomancer/equipment_ch.dm
@@ -0,0 +1,9 @@
+/obj/item/clothing/glasses/monocoole
+ name = "The Monocoole"
+ desc = "One heck of a stylish monocle. This one lets you see a little farther..."
+ icon_state = "monocle"
+ action_button_name = "Toggle Goggles"
+ origin_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6)
+ toggleable = 1
+ vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
+ prescription = 1 // So two versions of these aren't needed.
\ No newline at end of file
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index b49c41f30f..c946965072 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -1,7 +1,7 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-/obj/var/list/req_access = list()
-/obj/var/list/req_one_access = list()
+/obj/var/list/req_access
+/obj/var/list/req_one_access
//returns 1 if this mob has sufficient access to use this object
/obj/proc/allowed(mob/M)
@@ -28,22 +28,23 @@
return check_access_list(I ? I.GetAccess() : list())
/obj/proc/check_access_list(var/list/L)
- if(!req_access) req_access = list()
- if(!req_one_access) req_one_access = list()
if(!L) return 0
if(!istype(L, /list)) return 0
return has_access(req_access, req_one_access, L)
/proc/has_access(var/list/req_access, var/list/req_one_access, var/list/accesses)
- for(var/req in req_access)
- if(!(req in accesses)) //doesn't have this access
- return 0
- if(req_one_access.len)
- for(var/req in req_one_access)
- if(req in accesses) //has an access from the single access list
- return 1
- return 0
- return 1
+ var/has_RA = LAZYLEN(req_access)
+ var/has_ROA = LAZYLEN(req_one_access)
+ var/has_A = LAZYLEN(accesses)
+ if(!has_RA && !has_ROA) //we need none
+ return TRUE
+ if(!has_A) //we need them but don't have them
+ return FALSE
+ if(has_RA && length(req_access - accesses)) //we don't have every access we need
+ return FALSE
+ if(has_ROA && !length(req_one_access & accesses)) //we have atleast one access from this list
+ return FALSE
+ return TRUE
/proc/get_centcom_access(job)
switch(job)
@@ -106,35 +107,35 @@
if(!priv_all_access)
priv_all_access = get_access_ids()
- return priv_all_access
+ return priv_all_access.Copy()
/var/list/priv_station_access
/proc/get_all_station_access()
if(!priv_station_access)
priv_station_access = get_access_ids(ACCESS_TYPE_STATION)
- return priv_station_access
+ return priv_station_access.Copy()
/var/list/priv_centcom_access
/proc/get_all_centcom_access()
if(!priv_centcom_access)
priv_centcom_access = get_access_ids(ACCESS_TYPE_CENTCOM)
- return priv_centcom_access
+ return priv_centcom_access.Copy()
/var/list/priv_syndicate_access
/proc/get_all_syndicate_access()
if(!priv_syndicate_access)
priv_syndicate_access = get_access_ids(ACCESS_TYPE_SYNDICATE)
- return priv_syndicate_access
+ return priv_syndicate_access.Copy()
/var/list/priv_private_access
/proc/get_all_private_access()
if(!priv_private_access)
priv_private_access = get_access_ids(ACCESS_TYPE_PRIVATE)
- return priv_syndicate_access
+ return priv_syndicate_access.Copy()
/var/list/priv_region_access
/proc/get_region_accesses(var/code)
@@ -148,7 +149,8 @@
priv_region_access["[A.region]"] = list()
priv_region_access["[A.region]"] += A.id
- return priv_region_access["[code]"]
+ var/list/L = priv_region_access["[code]"]
+ return L.Copy()
/proc/get_region_accesses_name(var/code)
switch(code)
@@ -255,4 +257,4 @@ proc/get_all_job_icons() //For all existing HUD icons
else
return
- return "Unknown" //Return unknown if none of the above apply
+ return "Unknown" //Return unknown if none of the above apply
\ No newline at end of file
diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm
index 2dc02614d0..5a2e3bd0cf 100644
--- a/code/game/jobs/access_datum.dm
+++ b/code/game/jobs/access_datum.dm
@@ -472,4 +472,4 @@
/datum/access/alien
id = access_alien
desc = "#%_^&*@!"
- access_type = ACCESS_TYPE_PRIVATE
+ access_type = ACCESS_TYPE_PRIVATE
\ No newline at end of file
diff --git a/code/game/jobs/access_datum_yw.dm b/code/game/jobs/access_datum_yw.dm
new file mode 100644
index 0000000000..3baa9c6f7b
--- /dev/null
+++ b/code/game/jobs/access_datum_yw.dm
@@ -0,0 +1,32 @@
+/var/const/access_secpilot = 51
+/datum/access/secpilot
+ id = access_secpilot
+ desc = "Security Pilot Access"
+ region = ACCESS_REGION_SECURITY
+
+/var/const/access_blueshield = 52
+/datum/access/blueshield
+ id = access_blueshield
+ desc = "Blueshield Guard"
+ region = ACCESS_REGION_COMMAND
+
+//special restricted access level, required for the secret locker and crates
+//downside is you can't add/remove it via ID consoles, but I figure that's an acceptable tradeoff?
+/var/const/access_blueshield_exclusive = 350
+/datum/access/blueshield_exclusive
+ id = access_blueshield_exclusive
+ desc = "Blueshield Special Reserve"
+ access_type = ACCESS_TYPE_CENTCOM
+//that last line is what makes it inaccessible: you can add a region but that only makes it appear in the list, and if it has this access_type not even a CD's ID can add/remove it
+
+var/const/access_fieldmedic = 68
+/datum/access/fieldmedic
+ id = access_fieldmedic
+ desc = "Field Medic"
+ region = ACCESS_REGION_MEDBAY
+
+var/const/access_pathfinder = 69
+/datum/access/pathfinder
+ id = access_pathfinder
+ desc = "Pathfinder"
+ region = ACCESS_REGION_RESEARCH
\ No newline at end of file
diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm
index e342da3ab3..b3cf186d99 100644
--- a/code/game/jobs/job/assistant_vr.dm
+++ b/code/game/jobs/job/assistant_vr.dm
@@ -22,7 +22,6 @@
"Lab Assistant" = /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,
"Server" = /datum/alt_title/server)
job_description = "An Intern does whatever is requested of them, often doing so in process of learning \
another job. Though they are part of the crew, they have no real authority."
@@ -61,12 +60,6 @@
often in training to become a Cargo Technician. A Jr. Cargo Tech has no real authority."
title_outfit = /decl/hierarchy/outfit/job/assistant/cargo
-/datum/alt_title/intern_exp
- title = "Jr. Explorer"
- title_blurb = "A Jr. Explorer attempts to provide whatever the Exploration department needs. They are not proper Explorers, and are \
- often in training to become an Explorer. A Jr. Explorer has no real authority."
- title_outfit = /decl/hierarchy/outfit/job/assistant/explorer
-
/datum/alt_title/server
title = "Server"
title_blurb = "A Server helps out kitchen and diner staff with various tasks, primarily food delivery. A Server has no real authority."
diff --git a/code/game/jobs/job/blueshield.dm b/code/game/jobs/job/blueshield.dm
new file mode 100644
index 0000000000..388645def3
--- /dev/null
+++ b/code/game/jobs/job/blueshield.dm
@@ -0,0 +1,28 @@
+/datum/job/blueshield
+ title = "Blueshield Guard"
+ flag = BLUESHIELD //this may be used later.
+ departments = list(DEPARTMENT_COMMAND)
+ department_flag = ENGSEC
+ faction = "Station"
+ total_positions = 1
+ spawn_positions = 1
+ supervisors = "the Colony Director and Central Command" //Reports directly to CD, or failing that, CC
+ selection_color = "#006cb3"
+ req_admin_notify = 1
+ minimum_character_age = 25
+ ideal_character_age = 32 //Experienced, but physically in their prime
+ minimal_player_age = 3
+ economic_modifier = 8
+ access = list(access_security, access_sec_doors, access_brig,
+ access_medical, access_eva, access_heads, access_teleporter,
+ access_maint_tunnels, access_morgue,
+ access_crematorium, access_research, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_blueshield, access_blueshield_exclusive)
+ minimal_access = list(access_forensics_lockers, access_sec_doors, access_medical, access_maint_tunnels, access_RC_announce, access_keycard_auth, access_heads, access_blueshield, access_blueshield_exclusive)
+
+ outfit_type = /decl/hierarchy/outfit/job/blueshield
+ job_description = "Placeholder desc: General rules is to not get involved with security matters, your job is only to keep command personnel alive."
+
+/datum/job/blueshield/equip(var/mob/living/carbon/human/H)
+ . = ..()
+ if(.)
+ H.implant_loyalty(src)
\ No newline at end of file
diff --git a/code/game/jobs/job/blueshield_ch.dm b/code/game/jobs/job/blueshield_ch.dm
new file mode 100644
index 0000000000..f441ccc67a
--- /dev/null
+++ b/code/game/jobs/job/blueshield_ch.dm
@@ -0,0 +1,3 @@
+/datum/job/blueshield
+ whitelist_only = 1
+ latejoin_only = 1
\ No newline at end of file
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 596f078eca..e767bb5c35 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -19,7 +19,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
req_admin_notify = 1
access = list() //See get_access()
minimal_access = list() //See get_access()
- minimal_player_age = 14
+ minimal_player_age = 31
economic_modifier = 20
minimum_character_age = 25
@@ -31,12 +31,13 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
have an understanding of Standard Operating Procedure, and is subject to it, and legal action, in the same way as every other crew member."
alt_titles = list("Overseer"= /datum/alt_title/overseer)
-/*
+//YW UNCOMMENTINGSTART: REINSTATE LOYALTY IMPLANT
/datum/job/captain/equip(var/mob/living/carbon/human/H)
. = ..()
if(.)
H.implant_loyalty(src)
-*/
+//YW UNCOMMENTING END
+
/datum/job/captain/get_access()
return get_all_station_access().Copy()
@@ -69,9 +70,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
ideal_character_age = 50
outfit_type = /decl/hierarchy/outfit/job/hop
- job_description = "The Head of Personnel manages the Service department, the Exploration team, and most other civilians. They also \
+ job_description = "The Head of Personnel manages the Service department and most other civilians. They also \
manage the Supply department, through the Quartermaster. In addition, the Head of Personnel oversees the personal accounts \
- of the crew, including their money and access. If necessary, the Head of Personnel is first in line to assume Acting Command."
+ of the crew, including their money and access. If necessary, the Head of Personnel is first in line to assume Acting Command." //YW EDIT
alt_titles = list("Crew Resources Officer" = /datum/alt_title/cro)
access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
@@ -109,8 +110,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
minimal_player_age = 5
economic_modifier = 7
- access = list(access_heads, access_keycard_auth)
- minimal_access = list(access_heads, access_keycard_auth)
+ access = list(access_heads, access_keycard_auth, access_RC_announce) //YAWN EDIT
+ minimal_access = list(access_heads, access_keycard_auth, access_RC_announce)//YAWN EDIT
outfit_type = /decl/hierarchy/outfit/job/secretary
job_description = "A Command Secretary handles paperwork duty for the Heads of Staff, so they can better focus on managing their departments. \
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 7acd36524b..f84e191b54 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -236,9 +236,9 @@
handle complaints against crew members, and can have issues brought to the attention of Central Command, \
assuming their paperwork is in order."
-/*
+//YW UNCOMMENTINGSTART: REINSTATE LOYALTY IMPLANT
/datum/job/lawyer/equip(var/mob/living/carbon/human/H)
. = ..()
if(.)
H.implant_loyalty(H)
-*/
+//YW UNCOMMENTING END
\ No newline at end of file
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index e74b0798b6..241d5c4f4c 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -114,7 +114,6 @@
title = "Pharmacist"
title_blurb = "A Pharmacist focuses on the chemical needs of the Medical Department, and often offers to fill crew prescriptions at their discretion."
-/* I'm commenting out Geneticist so you can't actually see it in the job menu, given that you can't play as one - Jon.
//////////////////////////////////
// Geneticist
//////////////////////////////////
@@ -124,8 +123,8 @@
departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_RESEARCH)
department_flag = MEDSCI
faction = "Station"
- total_positions = 0
- spawn_positions = 0
+ total_positions = 2
+ spawn_positions = 2
supervisors = "the Chief Medical Officer and Research Director"
selection_color = "#013D3B"
economic_modifier = 7
@@ -135,7 +134,6 @@
outfit_type = /decl/hierarchy/outfit/job/medical/geneticist
job_description = "A Geneticist operates genetic manipulation equipment to repair any genetic defects encountered in crew, from cloning or radiation as examples. \
When required, geneticists have the skills to clone, and are the superior choice when available for doing so."
-*/
//////////////////////////////////
// Psychiatrist
diff --git a/code/game/jobs/job/medical_ch.dm b/code/game/jobs/job/medical_ch.dm
new file mode 100644
index 0000000000..f606bd182f
--- /dev/null
+++ b/code/game/jobs/job/medical_ch.dm
@@ -0,0 +1,4 @@
+//TFF 7/1/20 - Add Chemistry access to Psychs. Backported from old Chompcode
+/datum/job/psychiatrist
+ access = list(access_medical, access_chemistry, access_medical_equip, access_morgue, access_psychiatrist)
+ minimal_access = list(access_medical, access_chemistry, access_medical_equip, access_psychiatrist)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 2364486285..d82ce3f148 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -18,11 +18,11 @@
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
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)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network, access_maint_tunnels) //Yawn added "access_maint_tunnels"
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
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)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network, access_maint_tunnels)
alt_titles = list("Research Supervisor")
minimum_character_age = 25
@@ -57,7 +57,7 @@
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
- minimal_player_age = 14
+ minimal_player_age = 3
outfit_type = /decl/hierarchy/outfit/job/science/scientist
job_description = "A Scientist is a generalist working in the Research department, with general knowledge of the scientific process, as well as \
@@ -100,7 +100,7 @@
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
- minimal_player_age = 14
+ minimal_player_age = 3
outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
job_description = "A Xenobiologist studies esoteric lifeforms, usually in the relative safety of their lab. They attempt to find ways to benefit \
@@ -131,7 +131,7 @@ VR edit end*/
economic_modifier = 5
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
- minimal_player_age = 7
+ minimal_player_age = 3
outfit_type = /decl/hierarchy/outfit/job/science/roboticist
job_description = "A Roboticist maintains and repairs the station's synthetics, including crew with prosthetic limbs. \
diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm
index 481a31438e..c67ade39d0 100644
--- a/code/game/jobs/job/science_vr.dm
+++ b/code/game/jobs/job/science_vr.dm
@@ -6,11 +6,13 @@
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
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)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network,
+ access_explorer, access_pathfinder, access_xenobotany) //YW Edit access_gateway, _explorer, _pathfinder, and _xenobotany
minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
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)
+ access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network,
+ access_explorer, access_pathfinder, access_xenobotany) //YW Edit access_gateway, _explorer, _pathfinder, and _xenobotany
/datum/job/scientist
spawn_positions = 5
@@ -50,7 +52,7 @@
supervisors = "the Research Director"
selection_color = "#633D63"
economic_modifier = 7
- access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobotany, access_hydroponics)
+ access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobotany, access_hydroponics, access_xenobiology) //CHOMPS KSC 9/2/2020 - Added "access_xenobiology" to their access so they can enter Xenobotany.
minimal_access = list(access_research, access_xenobotany, access_hydroponics, access_tox_storage)
pto_type = PTO_SCIENCE
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 631b81e16e..4421e736d6 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -39,9 +39,13 @@
/datum/alt_title/sec_chief
title = "Chief of Security"
-//////////////////////////////////
-// Warden
-//////////////////////////////////
+//YW ADDITION START: LOYALTY IMPLANT FOR HOS
+/datum/job/hos/equip(var/mob/living/carbon/human/H)
+ . = ..()
+ if(.)
+ H.implant_loyalty(src)
+//YW ADDITION END
+
/datum/job/warden
title = "Warden"
flag = WARDEN
diff --git a/code/game/jobs/job/security_yw.dm b/code/game/jobs/job/security_yw.dm
new file mode 100644
index 0000000000..64dc091413
--- /dev/null
+++ b/code/game/jobs/job/security_yw.dm
@@ -0,0 +1,39 @@
+/datum/job/hos
+ disallow_jobhop = TRUE
+
+ access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_research, access_engine, access_mining, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks, access_secpilot)
+ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
+ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
+ access_research, access_engine, access_mining, access_construction, access_mailsorting,
+ access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks, access_secpilot)
+
+/datum/job/warden
+ access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks, access_secpilot)
+ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks, access_secpilot)
+
+/datum/job/security/pilot
+ title = "Security Pilot"
+ flag = SECPILOT
+ departments = list(DEPARTMENT_SECURITY)
+ department_flag = ENGSEC
+ faction = "Station"
+ total_positions = 2
+ spawn_positions = 2
+ supervisors = "the head of security"
+ selection_color = "#601C1C"
+ economic_modifier = 5
+ access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks, access_secpilot, access_pilot)
+ minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks, access_secpilot, access_pilot)
+ minimal_player_age = 7
+ outfit_type = /decl/hierarchy/outfit/job/security/pilot
+ pto_type = PTO_SECURITY
+
+ job_description = "Tasked with flying, operating, and sometimes even maintaining small spacecraft and personal exosuits such as the Durand or Gygax, \
+ Security Pilots are responsible for transporting criminals to more permanent holding facilities, and patrolling \
+ for potential threats to their workplace. They may also be expected to step in to standard Security duties if \
+ there's a shortage of regular officers."
+
+// alt_titles = list("Mech Operator" = /datum/alt_title/sec_mech_operator)
\ No newline at end of file
diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm
index 5c1a027061..3df016f991 100644
--- a/code/game/jobs/job/special_vr.dm
+++ b/code/game/jobs/job/special_vr.dm
@@ -24,6 +24,13 @@
get_access()
return get_all_accesses().Copy()
+//YW UNCOMMENTINGSTART: INSTATE LOYALTY IMPLANT
+/datum/job/centcom_officer/equip(var/mob/living/carbon/human/H)
+ . = ..()
+ if(.)
+ H.implant_loyalty(src)
+//YW UNCOMMENTING END
+
/*/datum/job/centcom_visitor //For Pleasure // You mean for admin abuse... -Ace
title = "CentCom Visitor"
department = "Civilian"
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index 40f0fdb4a4..6fc853dba4 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -11,6 +11,8 @@ var/const/ENGINEER =(1<<6)
var/const/ATMOSTECH =(1<<7)
var/const/AI =(1<<8)
var/const/CYBORG =(1<<9)
+var/const/BLUESHIELD =(1<<13) //YW addition
+var/const/SECPILOT =(1<<14) //YW addition
var/const/INTERN =(1<<15) //VOREStation Add
var/const/MEDSCI =(1<<1)
@@ -47,18 +49,109 @@ var/const/CLOWN =(1<<13) //VOREStation Add
var/const/MIME =(1<<14) //VOREStation Add
var/const/ENTERTAINER =(1<<15) //VOREStation Add
-//VOREStation Add
-var/const/TALON =(1<<3)
+var/list/assistant_occupations = list(
+)
+
+
+var/list/command_positions = list(
+ "Colony Director",
+ "Head of Personnel",
+ "Head of Security",
+ "Chief Engineer",
+ "Research Director",
+ "Chief Medical Officer",
+ "Command Secretary",
+ "Blueshield Guard" // YW Edit
+)
+
+
+var/list/engineering_positions = list(
+ "Chief Engineer",
+ "Station Engineer",
+ "Atmospheric Technician"
+)
+
+
+var/list/medical_positions = list(
+ "Chief Medical Officer",
+ "Medical Doctor",
+ "Geneticist",
+ "Psychiatrist",
+ "Chemist",
+ "Paramedic",
+ "Field Medic" //ywedit
+)
+
+
+var/list/science_positions = list(
+ "Research Director",
+ "Scientist",
+ "Geneticist", //Part of both medical and science
+ "Roboticist",
+ "Xenobiologist"
+)
+
+//BS12 EDIT
+var/list/cargo_positions = list(
+ "Quartermaster",
+ "Cargo Technician",
+ "Shaft Miner"
+)
+
+var/list/civilian_positions = list(
+ "Head of Personnel",
+ "Bartender",
+ "Botanist",
+ "Chef",
+ "Janitor",
+ "Librarian",
+ "Lawyer",
+ "Chaplain",
+ USELESS_JOB, //VOREStation Edit - Visitor not Assistant
+ "Intern", //VOREStation Edit - Intern
+ "Pilot" //YWedit
+)
+
+
+var/list/security_positions = list(
+ "Head of Security",
+ "Warden",
+ "Detective",
+ "Security Officer"
+)
+
+
+var/list/planet_positions = list(
+ "Pathfinder", // VOREStation Edit - Added Pathfinder
+ "Explorer"
+ //YWmoved to civilian"Pilot",
+ //YWmoved to medical"Field Medic" // VOREStation Edit - Field Medic
+)
+
+
+var/list/nonhuman_positions = list(
+ "AI",
+ "Cyborg",
+ "pAI"
+)
+
+var/list/whitelisted_positions = list(
+ "Colony Director",
+ "Head of Personnel",
+ "Head of Security",
+ "Chief Engineer",
+ "Research Director",
+ "Chief Medical Officer",
+ "Command Secretary",
+ "Warden",
+ "AI",
+ "Cyborg",
+ "pAI"
+)
-var/const/TALCAP =(1<<0)
-var/const/TALPIL =(1<<1)
-var/const/TALDOC =(1<<2)
-var/const/TALSEC =(1<<3)
-var/const/TALENG =(1<<4)
-//VOREStation Add End
/proc/guest_jobbans(var/job)
- return ( (job in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) || (job in SSjob.get_job_titles_in_department(DEPARTMENT_SYNTHETIC)) || (job in SSjob.get_job_titles_in_department(DEPARTMENT_SECURITY)) )
+ return ((job in whitelisted_positions))
/proc/get_job_datums()
var/list/occupations = list()
diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm
index 9963c1580c..0afcac24a7 100644
--- a/code/game/jobs/whitelist.dm
+++ b/code/game/jobs/whitelist.dm
@@ -12,6 +12,8 @@ var/list/whitelist = list()
if(!whitelist.len) whitelist = null
/proc/check_whitelist(mob/M /*, var/rank*/)
+ if(!config.usewhitelist)
+ return 1
if(!whitelist)
return 0
return ("[M.ckey]" in whitelist)
diff --git a/code/game/jobs/whitelist_vr.dm b/code/game/jobs/whitelist_vr.dm
index 058a9c0dc1..0eada5d888 100644
--- a/code/game/jobs/whitelist_vr.dm
+++ b/code/game/jobs/whitelist_vr.dm
@@ -1,7 +1,8 @@
var/list/job_whitelist = list()
/hook/startup/proc/loadJobWhitelist()
- load_jobwhitelist()
+ if(config.use_jobwhitelist)
+ load_jobwhitelist()
return 1
/proc/load_jobwhitelist()
@@ -12,6 +13,8 @@ var/list/job_whitelist = list()
job_whitelist = splittext(text, "\n")
/proc/is_job_whitelisted(mob/M, var/rank)
+ if(!config.use_jobwhitelist)
+ return 1
var/datum/job/job = job_master.GetJob(rank)
if(!job.whitelist_only)
return 1
@@ -26,6 +29,4 @@ var/list/job_whitelist = list()
if(findtext(s,"[lowertext(M.ckey)] - [lowertext(rank)]"))
return 1
if(findtext(s,"[M.ckey] - All"))
- return 1
- return 0
-
+ return 1
\ No newline at end of file
diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm
index cc18dc9e86..d87eae4118 100644
--- a/code/game/machinery/air_alarm.dm
+++ b/code/game/machinery/air_alarm.dm
@@ -27,7 +27,7 @@
/obj/machinery/alarm
name = "alarm"
desc = "Used to control various station atmospheric systems. The light indicates the current air status of the area."
- icon = 'icons/obj/monitors_vr.dmi' //VOREStation Edit - Other icons
+ icon = 'icons/obj/monitors_vr.dmi' //CHOMPEdit: Continues using new air alarm sprite, contrary to YW
icon_state = "alarm0"
plane = TURF_PLANE
layer = ABOVE_TURF_LAYER
diff --git a/code/game/machinery/airconditioner_yw.dm b/code/game/machinery/airconditioner_yw.dm
new file mode 100644
index 0000000000..ef89a0e1eb
--- /dev/null
+++ b/code/game/machinery/airconditioner_yw.dm
@@ -0,0 +1,38 @@
+/obj/machinery/power/thermoregulator/cryogaia
+ name = "Custom Thermal Regulator"
+ desc = "A massive custom made Thermal regulator or CTR for short, intended to keep heat loss when going in our outside to a minimum, they are hardwired to twenty celsius"
+ icon = 'icons/obj/machines/wallthermal.dmi'
+ icon_state = "lasergen"
+ density = 0
+ anchored = 1
+ //Consider making this powered by the room at some point.
+ use_power = 0 //is powered directly from cables
+ active_power_usage = 25 KILOWATTS //Low Power
+ idle_power_usage = 250
+
+ circuit = null
+ /*
+ null so people can not deconstruct them and remake them to normal Regulators,
+ probably should just make a circuit for it but this is pretty much just a proof of concept at the moment.
+ */
+
+/obj/machinery/power/thermoregulator/cryogaia/attackby(obj/item/I, mob/user)
+ if(I.is_screwdriver())
+ if(default_deconstruction_screwdriver(user,I))
+ return
+ if(I.is_crowbar())
+ if(default_deconstruction_crowbar(user,I))
+ return
+ if(I.is_wrench())
+ anchored = !anchored
+ visible_message("\The [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") //Does this not need to be disabled?
+ playsound(src, I.usesound, 75, 1)
+ if(anchored)
+ connect_to_network()
+ else
+ disconnect_from_network()
+ turn_off()
+ return
+ if(istype(I, /obj/item/device/multitool))
+ return
+ ..()
\ No newline at end of file
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 3cde479238..4351d29698 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -21,6 +21,9 @@
var/shocked = 0
var/busy = 0
+ var/input_dir = NORTH //YWedit
+ var/input_dir_name = "North"//YWEdit
+
var/mat_efficiency = 1
var/build_time = 50
@@ -340,3 +343,85 @@
stored_material[matstring] -= ejected * S.perunit
if(recursive && stored_material[matstring] >= S.perunit)
eject_materials(matstring, -1)
+
+
+//YWAdd start.
+/obj/machinery/autolathe/verb/eatmaterialsnearby()
+ set name = "Recycle nearby materials"
+ set category = "Object"
+ set src in oview(1)
+
+ var/filltype = 0 // Used to determine message.
+ var/total_used = 0 // Amount of material used.
+ if(busy)
+ visible_message("[bicon(src)]\The [src] beeps, \"Autolathe is busy. Please wait for completion of previous operation\"")
+ return
+ busy = 1
+ for(var/obj/item/eating in get_step(src,input_dir))
+ if(istype(eating,/obj/item/ammo_magazine/clip) || istype(eating,/obj/item/ammo_magazine/s357) || istype(eating,/obj/item/ammo_magazine/s38) || istype(eating,/obj/item/ammo_magazine/s44) || istype(eating,/obj/item/stack))
+ continue
+
+ if(!eating.matter)
+ continue
+
+
+ var/mass_per_sheet = 0 // Amount of material constituting one sheet.
+ for(var/material in eating.matter)
+
+ if(isnull(stored_material[material]) || isnull(storage_capacity[material]))
+ continue
+
+ if(stored_material[material] >= storage_capacity[material])
+ continue
+
+ var/total_material = eating.matter[material]
+
+
+ if(stored_material[material] + total_material > storage_capacity[material])
+ total_material = storage_capacity[material] - stored_material[material]
+ filltype = 1
+ else
+ filltype = 2
+
+ stored_material[material] += total_material
+ total_used += total_material
+ mass_per_sheet += eating.matter[material]
+
+ if(!filltype)
+ visible_message("[bicon(src)]\The [src] beeps, \"Storage is full. Operation aborted\"")
+ break
+
+ flick("autolathe_loading", src)
+
+ if(istype(eating,/obj/item/stack))
+ var/obj/item/stack/stack = eating
+ stack.use(max(1, round(total_used/mass_per_sheet))) // Always use at least 1 to prevent infinite materials.
+ else
+ qdel(eating)
+ sleep(10*mat_efficiency)
+
+ busy = 0
+ if(filltype == 1)
+ visible_message("[bicon(src)] \The [src] beeps, \"Storage capacity full. Operation terminated. Materials recycled: [total_used]\"")
+ else
+ visible_message("[bicon(src)] \The [src] beeps, \"All materials recycled. Operation terminated. Materials recycled: [total_used]\"")
+
+
+
+/obj/machinery/autolathe/verb/setrecyclepos()
+ set name = "Set recycle input"
+ set category = "Object"
+ set src in oview(1)
+
+ input_dir_name = input("Which direction ?") in list("North", "South", "East", "West")
+ switch(input_dir_name)
+ if("North")
+ input_dir = NORTH
+ if("South")
+ input_dir = SOUTH
+ if("East")
+ input_dir = EAST
+ if("West")
+ input_dir = WEST
+ to_chat(src, "You set the material input to [input_dir_name]")
+//YWAdd END.
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index bb3cdfb4ed..58279abec0 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -24,6 +24,7 @@ var/global/list/station_networks = list(
*/
var/global/list/engineering_networks = list(
NETWORK_ENGINE,
+ NETWORK_SUBSTATIONS, //YAWN ADD: new substations subnet
NETWORK_ENGINEERING,
//NETWORK_ENGINEERING_OUTPOST, //VOREStation Edit: Tether has no Engineering Outpost,
NETWORK_ALARM_ATMOS,
@@ -80,6 +81,9 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/network/northern_star
network = list(NETWORK_NORTHERN_STAR)
+
+/obj/machinery/camera/network/outside
+ network = list(NETWORK_OUTSIDE)
/obj/machinery/camera/network/prison
network = list(NETWORK_PRISON)
@@ -90,14 +94,20 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/network/research
network = list(NETWORK_RESEARCH)
+/obj/machinery/camera/network/exploration //yw edit
+ network = list(NETWORK_EXPLORATION)
+
/obj/machinery/camera/network/research_outpost
network = list(NETWORK_RESEARCH_OUTPOST)
/obj/machinery/camera/network/security
network = list(NETWORK_SECURITY)
+/obj/machinery/camera/network/substations
+ network = list(NETWORK_SUBSTATIONS)
+
/obj/machinery/camera/network/telecom
- network = list(NETWORK_TELECOM)
+ network = list(NETWORK_TCOMMS) //yw edit
/obj/machinery/camera/network/thunder
network = list(NETWORK_THUNDER)
@@ -143,6 +153,12 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/motion/security
network = list(NETWORK_SECURITY)
+/obj/machinery/camera/motion/command
+ network = list(NETWORK_COMMAND)
+
+/obj/machinery/camera/motion/telecom
+ network = list(NETWORK_TCOMMS) //yw edit
+
// ALL UPGRADES
diff --git a/code/game/machinery/casino_ch.dm b/code/game/machinery/casino_ch.dm
new file mode 100644
index 0000000000..8cf7ff7684
--- /dev/null
+++ b/code/game/machinery/casino_ch.dm
@@ -0,0 +1,1608 @@
+/obj/structure/casino_table
+ name = "casino table"
+ desc = "this is an unremarkable table for a casino."
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "roulette_table"
+ density = 1
+ anchored = 1
+ climbable = 1
+ layer = TABLE_LAYER
+ throwpass = 1
+ var/item_place = 1 //allows items to be placed on the table, but not on benches.
+
+ var/busy = 0
+
+/obj/structure/casino_table/attackby(obj/item/W as obj, mob/user as mob)
+ if(item_place)
+ user.drop_item(src.loc)
+ return
+
+/obj/structure/casino_table/roulette_table
+ name = "roulette"
+ desc = "Spin the roulette to try your luck."
+ icon_state = "roulette_wheel"
+
+/obj/structure/casino_table/roulette_table/attack_hand(mob/user as mob)
+ if (busy)
+ to_chat(user,"You cannot spin now! The roulette is already spinning. ")
+ return
+ visible_message("\ [user] spins the roulette and throws inside little ball.")
+ playsound(src.loc, 'sound/machines/roulette.ogg', 40, 1)
+ busy = 1
+ icon_state = "roulette_wheel_spinning"
+ var/result = rand(0,36)
+ var/color = "green"
+ add_fingerprint(user)
+ if ((result>0 && result<11) || (result>18 && result<29))
+ if (result%2)
+ color="red"
+ else
+ color="black"
+ if ( (result>10 && result<19) || (result>28) )
+ if (result%2)
+ color="black"
+ else
+ color="red"
+ spawn(5 SECONDS)
+ visible_message("The roulette stops spinning, the ball landing on [result], [color].")
+ busy=0
+ icon_state = "roulette_wheel"
+
+/obj/structure/casino_table/roulette_chart
+ name = "roulette chart"
+ desc = "Roulette chart. Place your bets!"
+ icon_state = "roulette_table"
+
+/obj/structure/casino_table/blackjack_l
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_l"
+
+/obj/structure/casino_table/blackjack_r
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_r"
+
+/obj/structure/casino_table/blackjack_m
+ name = "gambling table"
+ desc = "Gambling table, try your luck and skills! "
+ icon_state = "blackjack_m"
+
+/obj/machinery/slot_machine
+ name = "Slot machine"
+ desc = "A gambling machine designed to give you false hope and rob you of your wealth, hence why it's often called a one armed bandit."
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "slotmachine"
+ anchored = 1
+ density = 1
+ var/busy = 0
+ var/symbol1 = null
+ var/symbol2 = null
+ var/symbol3 = null
+
+ var/datum/effect/effect/system/confetti_spread
+ var/confetti_strength = 8
+
+/obj/machinery/slot_machine/attackby(obj/item/weapon/W as obj, mob/user as mob)
+
+ var/handled = 0
+ var/paid = 0
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ var/obj/item/weapon/spacecasinocash/C = W
+ paid = insert_chip(C, user)
+ handled = 1
+
+ if(paid)
+ return
+ if(handled)
+ SSnanoui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+/obj/machinery/slot_machine/proc/insert_chip(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user)
+ if (busy)
+ to_chat(user,"The slot machine is currently rolling. ")
+ return
+ if(cashmoney.worth < 5)
+ to_chat(user,"You dont have enough chips to gamble! ")
+ return
+
+ to_chat(user,"You puts 5 credits in the slot machine and presses start.")
+ cashmoney.worth -= 5
+ cashmoney.update_icon()
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ cashmoney.update_icon()
+
+ busy = 1
+ icon_state = "slotmachine_rolling"
+ playsound(src.loc, 'sound/machines/slotmachine_pull.ogg', 15, 1)
+
+ var/slot1 = rand(0,9)
+ switch(slot1)
+ if(0 to 3) symbol1 = "cherry"
+ if(4 to 4) symbol1 = "lemon"
+ if(5 to 5) symbol1 = "bell"
+ if(6 to 6) symbol1 = "four leaf clover"
+ if(7 to 7) symbol1 = "seven"
+ if(8 to 8) symbol1 = "diamond"
+ if(9 to 9) symbol1 = "platinum coin"
+
+ var/slot2 = rand(0,16)
+ switch(slot2)
+ if(0 to 5) symbol2 = "cherry"
+ if(6 to 7) symbol2 = "lemon"
+ if(8 to 9) symbol2 = "bell"
+ if(10 to 11) symbol2 = "four leaf clover"
+ if(12 to 13) symbol2 = "seven"
+ if(14 to 15) symbol2 = "diamond"
+ if(16) symbol2 = "platinum coin"
+
+ var/slot3 = rand(0,9)
+ switch(slot3)
+ if(0 to 3) symbol3 = "cherry"
+ if(4 to 4) symbol3 = "lemon"
+ if(5 to 5) symbol3 = "bell"
+ if(6 to 6) symbol3 = "four leaf clover"
+ if(7 to 7) symbol3 = "seven"
+ if(8 to 8) symbol3 = "diamond"
+ if(9 to 9) symbol3 = "platinum coin"
+
+ var/output //Output variable to send out in chat after the large if statement.
+ var/winnings = 0 //How much money will be given if any.
+ var/platinumwin = 0 // If you win the platinum chip or not
+ var/celebrate = 0
+ var/delaytime = 5 SECONDS
+
+
+ spawn(delaytime)
+ to_chat(user,"The slot machine flashes with bright colours as the slots lights up with a [symbol1], a [symbol2] and a [symbol3]!")
+
+ if (symbol1 == "cherry" && symbol2 == "cherry" && symbol3 == "cherry")
+ output = "Three cherries! The slot machine deposits chips worth 25 credits!"
+ winnings = 25
+
+ if ((symbol1 != "cherry" && symbol2 == "cherry" && symbol3 == "cherry") || (symbol1 == "cherry" && symbol2 != "cherry" && symbol3 == "cherry") ||(symbol1 == "cherry" && symbol2 == "cherry" && symbol3 != "cherry"))
+ output = "Two cherries! The slot machine deposits a 10 credit chip!"
+ winnings = 10
+
+ if (symbol1 == "lemon" && symbol2 == "lemon" && symbol3 == "lemon")
+ output = "Three lemons! The slot machine deposits a 50 credit chip!"
+ winnings = 50
+
+ if (symbol1 == "watermelon" && symbol2 == "watermelon" && symbol3 == "watermelon")
+ output = "Three watermelons! The slot machine deposits chips worth 75 credits!"
+ winnings = 75
+
+ if (symbol1 == "bell" && symbol2 == "bell" && symbol3 == "bell")
+ output = "Three bells! The slot machine deposits chips a 100 credit chip!"
+ winnings = 100
+
+ if (symbol1 == "four leaf clover" && symbol2 == "four leaf clover" && symbol3 == "four leaf clover")
+ output = "Three four leaf clovers! The slot machine deposits a 200 credit chip!"
+ winnings = 200
+
+ if (symbol1 == "seven" && symbol2 == "seven" && symbol3 == "seven")
+ output = "Three sevens! The slot machine deposits a 500 credit chip!"
+ winnings = 500
+ celebrate = 1
+
+ if (symbol1 == "diamond" && symbol2 == "diamond" && symbol3 == "diamond")
+ output = "Three diamonds! The slot machine deposits a 1000 credit chip!"
+ winnings = 1000
+ celebrate = 1
+
+ if (symbol1 == "platinum coin" && symbol2 == "platinum coin" && symbol3 == "platinum coin")
+ output = "Three platinum coins! The slot machine deposits a platinum chip!"
+ platinumwin = TRUE;
+ celebrate = 1
+
+ icon_state = initial(icon_state) // Set it back to the original iconstate.
+
+ if(!output) // Is there anything to output? If not, consider it a loss.
+ to_chat(user,"Better luck next time!")
+ busy = FALSE
+ return
+
+ to_chat(user,output) //Output message
+
+ if(platinumwin) // Did they win the platinum chip?
+ new /obj/item/weapon/casino_platinum_chip(src.loc)
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+
+ if(winnings) //Did the person win?
+ icon_state = "slotmachine_winning"
+ playsound(src.loc, 'sound/machines/slotmachine.ogg', 25, 1)
+ spawn(delaytime)
+ spawn_casinochips(winnings, src.loc)
+ icon_state = "slotmachine"
+
+ if(celebrate) // Happy celebrations!
+ src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
+ src.confetti_spread.attach(src) //If somehow people start dragging slot machine
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+
+ busy = FALSE
+
+
+/obj/structure/wheel_of_fortune
+ name = "wheel of fortune"
+ desc = "May fortune favour the lucky one!"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "wheel_of_fortune"
+ density = 1
+ anchored = 1
+ var/interval = 1
+ var/busy = 0
+
+ var/datum/effect/effect/system/confetti_spread
+ var/confetti_strength = 8
+
+/obj/structure/wheel_of_fortune/verb/setinterval()
+ set name = "Change interval"
+ set category = "Object"
+ set src in view(1)
+
+ if(usr.incapacitated())
+ return
+ if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
+ interval = input("Put the desired interval (1-100)", "Set Interval") as num
+ if(interval>100 || interval<1)
+ usr << "Invalid interval."
+ return
+ usr << "You set the interval to [interval]"
+ return
+
+
+/obj/structure/wheel_of_fortune/attack_hand(mob/user as mob)
+ if (busy)
+ to_chat(user,"The wheel of fortune is already spinning! ")
+ return
+ visible_message("\ [user] spins the wheel of fortune!")
+ busy = 1
+ icon_state = "wheel_of_fortune_spinning"
+ var/result = rand(1,interval)
+ add_fingerprint(user)
+ spawn(5 SECONDS)
+ visible_message("The wheel of fortune stops spinning, the number is [result]!")
+
+ src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
+ src.confetti_spread.attach(src) //If somehow people start dragging slot machine
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+ busy=0
+ icon_state = "wheel_of_fortune"
+
+/obj/structure/stripper_pole
+ name = "stripper pole"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "stripper_pole"
+ plane = MOB_PLANE
+ layer = BELOW_MOB_LAYER
+ density = 0
+
+/obj/structure/stripper_pole/attack_hand(mob/user)
+ dance(user)
+ user.spin(32,2)
+ ..()
+
+/obj/structure/stripper_pole/proc/dance(mob/user)
+ if(layer == BELOW_MOB_LAYER)
+ layer = ABOVE_MOB_LAYER
+ else
+ layer = BELOW_MOB_LAYER
+
+/obj/machinery/chemical_dispenser/deluxe
+ name = "deluxe drink dispenser"
+ desc = "The premium within dispenser for drinks, its made with bluespace technology!"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "deluxe_dispenser"
+ ui_title = "Deluxe Drink Dispenser"
+ accept_drinking = 1
+ var/max_cartridges = 90 //Because it keeps getting borked by upstream, now gotta do it with variable until we can make more permanent solution - Jack
+
+
+/obj/machinery/chemical_dispenser/deluxe
+ dispense_reagents = list(
+ "water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic",
+ "sodawater", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda",
+ "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", "orangejuice", "lemonjuice",
+ "limejuice", "berryjuice", "mint", "lemon_lime", "sugar", "orangejuice", "limejuice", "sodawater",
+ "tonic", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac",
+ "ale", "mead", "bitters", "champagne", "singulo", "doctorsdelight", "nothing", "banana", "honey", "egg",
+ "coco", "cherryjelly", "carrotjuice", "applejuice", "tomatojuice", "peanutbutter", "soymilk", "grenadine", "gingerale", "roy_rogers",
+ "patron", "goldschlager", "gelatin", "melonliquor", "bluecuracao", "thirteenloko", "deadrum", "sake", "acidspit",
+ "amasec", "beepskysmash", "atomicbomb", "nuka_cola", "threemileisland", "manhattan_proj", "psilocybin", "moonshine",
+ "specialwhiskey", "unathiliquor", "winebrandy", "matcha_latte", "snaps"
+ )
+
+/obj/machinery/chemical_dispenser/deluxe/full
+ spawn_cartridges = list(
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/water,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/icetea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cola,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/smw,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/dr_gibb,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/spaceup,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/watermelon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coffee,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cafe_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/soy_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hot_coco,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/mint,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/berry,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon_lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sugar,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodawater,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tonic,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/beer,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/kahlua,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/whiskey,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/wine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/vodka,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/gin,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/rum,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tequila,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/vermouth,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cognac,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ale,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/mead,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/champagne,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/grapesoda,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/singulo,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/doctorsdelight,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/nothing,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/banana,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/honey,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/egg,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/coco,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/cherryjelly,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/carrotjuice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/applejuice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/tomatojuice,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/soymilk,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/peanutbutter,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/matcha_latte,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/gelatin,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/grenadine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/gingerale,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/roy_rogers,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/patron,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/goldschlager,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/melonliquor,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/bluecuracao,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/thirteenloko,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/deadrum,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/sake,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/acidspit,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/amasec,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/beepskysmash,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/atomicbomb,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/nuka_cola,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/threemileisland,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/manhattan_proj,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/psilocybin,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/moonshine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/specialwhiskey,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/unathiliquor,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/winebrandy,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/snaps
+ )
+
+/obj/machinery/chemical_dispenser/deluxe/New()
+ ..()
+
+ if(spawn_cartridges)
+ for(var/type in spawn_cartridges)
+ add_cartridge_deluxe(new type(src))
+ world << "test 1"
+
+/obj/machinery/chemical_dispenser/deluxe/examine(mob/user)
+ user << desc
+ user << "It has [cartridges.len] cartridges installed, and has space for [max_cartridges - cartridges.len] more."
+
+/obj/machinery/chemical_dispenser/deluxe/proc/add_cartridge_deluxe(obj/item/weapon/reagent_containers/chem_disp_cartridge/C, mob/user)
+ if(!istype(C))
+ if(user)
+ user << "\The [C] will not fit in \the [src]!"
+ return
+
+ if(cartridges.len >= max_cartridges)
+ if(user)
+ user << "\The [src] does not have any slots open for \the [C] to fit into!"
+ return
+
+ if(!C.label)
+ if(user)
+ user << "\The [C] does not have a label!"
+ return
+
+ if(cartridges[C.label])
+ if(user)
+ user << "\The [src] already contains a cartridge with that label!"
+ return
+
+ if(user)
+ user.drop_from_inventory(C)
+ user << "You add \the [C] to \the [src]."
+
+ C.loc = src
+ cartridges[C.label] = C
+ cartridges = sortAssoc(cartridges)
+ SSnanoui.update_uis(src)
+
+/obj/machinery/chemical_dispenser/deluxe/attackby(obj/item/weapon/W, mob/user)
+ if(W.is_wrench())
+ playsound(src, W.usesound, 50, 1)
+ user << "You begin to [anchored ? "un" : ""]fasten \the [src]."
+ if (do_after(user, 20 * W.toolspeed))
+ user.visible_message(
+ "\The [user] [anchored ? "un" : ""]fastens \the [src].",
+ "You have [anchored ? "un" : ""]fastened \the [src].",
+ "You hear a ratchet.")
+ anchored = !anchored
+ else
+ user << "You decide not to [anchored ? "un" : ""]fasten \the [src]."
+
+ else if(istype(W, /obj/item/weapon/reagent_containers/chem_disp_cartridge))
+ add_cartridge_deluxe(W, user)
+
+ else if(W.is_screwdriver())
+ var/label = input(user, "Which cartridge would you like to remove?", "Chemical Dispenser") as null|anything in cartridges
+ if(!label) return
+ var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = remove_cartridge(label)
+ if(C)
+ user << "You remove \the [C] from \the [src]."
+ C.loc = loc
+ playsound(src, W.usesound, 50, 1)
+
+ else if(istype(W, /obj/item/weapon/reagent_containers/glass) || istype(W, /obj/item/weapon/reagent_containers/food))
+ if(container)
+ user << "There is already \a [container] on \the [src]!"
+ return
+
+ var/obj/item/weapon/reagent_containers/RC = W
+
+ if(!accept_drinking && istype(RC,/obj/item/weapon/reagent_containers/food))
+ user << "This machine only accepts beakers!"
+ return
+
+ if(!RC.is_open_container())
+ user << "You don't see how \the [src] could dispense reagents into \the [RC]."
+ return
+
+ container = RC
+ user.drop_from_inventory(RC)
+ RC.loc = src
+ user << "You set \the [RC] on \the [src]."
+ SSnanoui.update_uis(src)
+
+ else
+ return ..()
+
+/obj/machinery/vending/deluxe_boozeomat
+ name = "Deluxe Drink Distributor"
+ desc = "A top of the line and experimental drink vendor, it uses bluespace technology for storage!"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "deluxe_boozeomat"
+ products = list(/obj/item/weapon/reagent_containers/food/drinks/glass2/square = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/rocks = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/shake = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/cocktail = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/shot = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/pint = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/mug = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/glass2/wine = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/metaglass = 25,
+ /obj/item/weapon/reagent_containers/food/drinks/metaglass/metapint = 25,
+ /obj/item/weapon/glass_extra/stick = 50,
+ /obj/item/weapon/glass_extra/straw = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/sake = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/patron = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/snaps = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/tonic = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/tea = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cola = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/space_up = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind = 15,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonjuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/applejuice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/milk = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/cream = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/ice = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/flask/barflask = 10,
+ /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask = 10
+ )
+
+ contraband = list()
+ vend_delay = 15
+ idle_power_usage = 300
+ req_access = list(access_bar)
+ req_log_access = access_bar
+ has_logs = 1
+
+/obj/machinery/vending/deluxe_dinner
+ name = "Deluxe Dining Distributor"
+ desc = "A top of the line and experimental food vendor, it uses bluespace technology for storage!"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "deluxe_dining"
+ products = list(/obj/item/weapon/tray = 8,
+ /obj/item/weapon/material/kitchen/utensil/fork = 15,
+ /obj/item/weapon/material/knife/plastic = 15,
+ /obj/item/weapon/material/kitchen/utensil/spoon = 15,
+ /obj/item/weapon/material/kitchen/rollingpin = 5,
+ /obj/item/weapon/material/knife = 5,
+ /obj/item/weapon/material/knife/butch = 3,
+ /obj/item/clothing/suit/chef/classic = 3,
+ /obj/item/weapon/storage/bag/food = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/heart = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/cat = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/nt = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/mars = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/cti = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/nymph = 10,
+ /obj/item/weapon/storage/toolbox/lunchbox/syndicate = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/fries = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/onionrings = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/enchiladas= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/meatburrito= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/taco= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cheesenachos= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cubannachos= 30,
+ /obj/item/weapon/reagent_containers/food/snacks/tamales = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/bigos = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/concha = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/pandenata = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/tocino = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/stew= 20,
+ /obj/item/weapon/reagent_containers/food/snacks/roastbeef = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/aesirsalad = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 20,
+ /obj/item/weapon/reagent_containers/food/snacks/baguette = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/appletart = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/muffin = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/berrymuffin = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cherrypie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/croissant = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/pie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/poppypretzel = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/sugarcookie = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/waffles = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake = 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/chocolatecake = 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/plaincake = 10)
+
+ contraband = list()
+ vend_delay = 15
+ idle_power_usage = 300
+ req_access = list(access_bar)
+ req_log_access = access_bar
+ has_logs = 1
+
+
+/obj/item/weapon/book/manual/casino
+ name = "A dummy guide to losing your thalers"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state ="casinomanual"
+ author = "Sleazy Serpent Saren"
+ title = "A dummy guide to losing your thalers"
+ dat = {"
+
+
+
+
+
+
+
+ - Foreword: Welcome to gambling!
+ - Blackjack
+ - Roulette
+ - Poker
+ - Cards against the galaxy
+ - Prizes
+ - Sentient prizes
+
+
+
+ In this book I'll teach you all about how to gamble your money away or at least get lucky and win some! This book also has a handy little overview of the prizes one can earn and the limitations of what can do with the living and breathing ones.
+ (This book will also contain out of character information to help people be aware of how touchy subjects like sentient prizes are to be handled.)
+
+
+ First up is the classic sport of blackjack, blackjack is played normally between a gambler and a dealer, the goal is to have the higher number than the opponent but not go above 21 or it will be a bust and one loses automatically.
+ The values of cards are as follow:
+
+ - Ace - 1 or 11, can be freely decided at any moment
+ - 2 - 10 - value coresponding to their number
+ - All face cards excluding joker - Value of 10
+
+ A game of blackjack begins with the dealer giving the gambler two cards, in normal blackjack all cards dealt to gambler and dealer are always shown. The two cards dealt have their values put together, the gambler has three choices, stand, hit, or double down.
+
+ - Stand - Gambler or dealer decides not to draw any more cards and it becomes the dealers turn or ends.
+ - Hit - 10 - The dealer draws a new card, adding to the existing hand, if its a bust the game will end and they will lose.
+ - Double down - A risky move the gambler can do, the dealer draws one more card and the bet is doubled, but no more cards can be drawn and it becomes the dealer's turn.
+
+ When it becomes the dealer's turn they do the same as the gambler, though their only goal is to get a higher or equal value to gambler. The dealer cant double down, and the large majority of casino's has the rule that a dealer cant draw anymore cards once they reach or go above a value. The most common value is 17, and there are two variants to that rule, soft and hard 17.
+
+ - Soft 17 - If the gambler gets 17, they can draw another card.
+ - Hard 17 - They dealer must stop if they get a value of 17.
+
+ The casino who supplies this version of the manual follows the rule of hard 17.
+ The game ends when the dealer busts, reaches the threshold of what they are allowed to draw, or if they get a higher value than the gambler. Again, the one who has the highest value that isnt higher than 21 wins, but if both has the same value no one wins and the bet goes back to the gambler.
+ And thats it! Now go out there and gamble your savings away! This casino allows bets between 5 and 50 with double down ignoring that limit!
+
+ But wait! Theres more! Theres also group blackjack! This game is a little different, the dealer can be part of it or simple deal for players, this game works differently with everyone keeping their hands hidden, everyone makes initial bets, gets two facedown cards, then its a matter of trying to get as good a hand as possible, but if you go bust, its over. But dont tell or show until everyone reveals! If youre going down, its best if youre opponents dont know they simply can play safe and win, if youre lucky everyone else gets themselves busted and you dont lose your beloved chips!
+ Its kinda like texas hold em in a way, everyone draws, folks can raise bets or fold, then draw more. Rinse and repeat until no one wants to raise any more nor draw cards, if everyone except one person has folded, they win by default even if they have busted, cause they dont need to reveal their hand that game, so you can choose to either sit and wait and fold if someone raise the bets, or you can gamble and make it look like you have an amazing hand and win by default since everyone else folds and no one is wise that you had a bust! This game has turned from simple probability and chance against the dealer to a game of risk and deception, fun fun fun!
+
+
+ So this game of roulette is all about chance! what happens is that people bet on different odds and hope for the best as the dealer rolls the ball and makes that roulette thingy make than fun addicting spin! Once it lands on a number between 0 and 36 its either bust or payout! Pretty simple, right?
+ Everyone starts by putting their bets down, people can bet more than once before the ball goes rolling, the odds and their payoffs are these:
+
+ - Single number - 35/1 payoff - The most unlikely one to get, but if the ball lands on your number, then youre loaded!
+ - Split Number - 17/1 - Choose an interval of 2, not very likely and therefore big reward!
+ - Row - 11/1 - Choose an interval of 3, more likely so not the biggest outcome!
+ - Split - 8/1 - Choose an interval of 4, not gonna win big time.
+ - Split row - 5/1 - Choose an interval of 6, getting to the safer bets.
+ - Column - 2/1 - Choose an interval of 12, boring, but likely.
+ - Red/Black or even/odd numbers - 1/1 - Odd or even numbers explains themselves. Red numbers are from 0 to 11 and 18 to 29 while the rest is black. These are the safest bets there are!
+
+ Theres not much more to it! Bets made, ball rolls, number announced, people win, people lose! Bets allowed here are from 1 to 25 per bet. Oh, im also being told this casino has the fancy rule that if ball lands on 0, one wins at least one bet no matter what it is! So lets hope you got that big bet on a single number!
+
+
+ Aaah yes, good old poker. This casino runs by the rules of texas hold em, though the might be a little modified to be simpler for the average joe. In a game of poker it can be a single gambler and a dealer against each other, but most often its the dealer making the game proceed while several gamblers fights tooth and nail to steal each others chips, but the dealer can still join in on the free for all if they so wish!
+ To simply explain the game, people gamble with each other, a game of trying to get the best hand and raise bets or back out depending on what the outcome may be. The game starts with everyone betting a certain amount, it can be 5 or 10 chips depending on dealer, but if one wants to join, there needs to be chips on that table! Once everyone has made their initial bet, everyone gets two cards face down, these are kept hidden, no one not even dealer gets to see players cards until the end, not even folded cards are to be shown unless wanted to, sometimes its better making people unsure if you dropped out with bad cards or if you have other motives, deception is a large part of this game!
+ With everyone having cards dealt, its time for the dealer to lay three on the table face up, these cards are 3 of 5 cards in the community pool, everyone can use these cards to make sets like pairs and such, this doesnt mean they are taken, multiple people can use the same community card for their own sets!
+ With the community having three we enter the second betting stage, here people have two options, standing or raising. Standing means you dont want to raise, raising explains itself, though if someone bets, people have three options, commit putting the chips in to risk as much as the raised bet, but if one doesnt have enough, then they can still go all in with their remaining chips, one can also drop out if its too risky, the chips bet will remain on the table, but at least you wont lose more eh? Final one is to raise further, sometimes people can dare each other to raise more, but its not allowed for someone to raise, then raise further if no one else raises after them!
+ As said earlier, we got like a community pool of 5 cards total, this time another card is revealed and we enter a new betting phase, then the final fifth card is revealed and final bets are made, and then the cards are revealed so it can be determined who has the best hand! If two or more have equally good sets, then the chips are split evenly between them.
+ But notice, if someone is left because everyone else didnt dare to raise with their bet, they can decide to not reveal their hand, they might have had a winning hand, or maybe its terrible and they just bluffed their way to victory, only they know and can decide if they want to expose their cards to gloat or confuse their opponents. So in summary, the game can be simple, but hard to master!
+ And here is the order of winning hands folks!
+
+ - Royal flush - The big and best one, this is a set of a 10, Ace, Knave/Jack, Queen and King of the same suit.
+ - Straight flush - This one is also definently a winner, though can be easier to get as it just needs to be five cards making a sraight of the same suit, an example being black 3 to 7.
+ - Four of a kind - Nice one, if you get this then you got a good chance to win. The value of the cards determine who wins, so ace is the best followed by king, queen and jack, then the peasant number cards!
+ - Full House - This one is good, but it requires you have three of a kind and a two of a kind, obviously value is part of the house, so the best roof is made of Ace with king making a strong foundation!
+ - Flush - This one requires the gambler to have 5 cards of a suit, not in any order, but the highest value card determines worth, so hope you got an Ace in your combo!
+ - Straight - Its like the royal flush, but can be any suits in combo, Ace can be lowest from Ace to 5 or highest from 10 to Ace!
+ - Three of a kind - Explains itself well enough, get three together and you got something going, lets hope you can build a house!
+ - Two pairs - You almost got yourself a house! But at least at this point its something!
+ - A pair - The worst set you can get, but you might be extremely lucky and have this while others have an inferior pair or the worst possible hand ever which is...
+ - High card - The absolute worst, if you cant get any of those sets, then you got this sad case, if a game mananages to end with no one getting a set, then the one with the highest value cards wins!
+
+
+ Wew, what a long lesson, but thats how one does the Texas hold em here at this casino, hope you guys have fun winning and losing your hard earned cash with this one!
+
+
+
+ So hear this, NT is now sponsoring team building at the casino, so folks who wants to just relax with friends, play some games, earn chips with no risk, even the ones broke can join in on a fun game of Cards against the galaxy and have fun!
+ The idea is that once a round has concluded and a casino member is present to see the game being actually played, everyone gets 10 chips while the one who won the round gets 25 instead! Interested? Good! Its easy and simple to play and very fun and vulgar!
+
+ The game is best played with at least 4 players and starts with everyone drawing 7 white cards, the person who most recently pooped starts as the 'card czar', but folks can agree on another criteria for the czar or simply pick one. Each round the current card czar draws a black card that has text written on it and blank lines, everyone aside from the czar takes a white card from their hand for every blank line which they find funny in that sentence and puts on the table face down with the others. The card czar cant know who has which white card and simply reads the black card with the white ones, the most funniest combination is choosen by the czar and the one who made that combination is the current rounds winner and the next rounds czar. At the end of each round everyone makes sure to draw enough white card to have 7 on hand and if theres a casino staff member playing or watching, they note down or hand out chips for everyone, and if they are playing, they get to add chips to their own personal stockpile too!
+ Thats it for cards against the galaxy! Simple, fun and vulgar, whats there not to love?
+
+
+
+ Hey folks, welcome to the prize section! This part is definently important for you folks operating the prize booth! First off I wanna tell you some great news! Nanotransen has gone along with a nice deal that allows crew to occasionally keep their hard earned rewards on station for a limited time, now you can enjoy your new fancy toolbelt or bluespace beaker for more than just the shift where the casino comes around!
+ ((Be aware, there can be limitations on how many rewards you get to keep after the shift, it might be unfair if some shows up and wins one thing, while they watch as command staff crew with high background income as well as hyperactive miners walks home with 20 prizes they get to enjoy while having almost done no gambling at all.))
+
+ Lets get to the prizes and exchange rate before we get started on the stuff specifically for the booth operators, so heres the current prizes one can win and their costs! Be aware there might be new prizes or absent ones from time to time!
+
+ EXCHANGE RATE
+ FROM = TO
+ 5 Thalers = 1 casino chip
+ 1 casino chip = 2.5 Thalers (rounded down)
+
+ The special sentient prize is 100 chips! More about it in section below!
+
+ Melee weapons
+
+ - scepter 500
+ - chain of command 250
+
+ Guns and 'guns' ((disclaimer, giving out guns will mean you get a weapons license as well with the shifts you have it, abusing these weapons will quickly get them removed!))
+
+ - sizegun 100
+ - advanced anti particle rifle 500
+ - temperature gun 250
+ - alien pistol 1000
+ - floral somatoray 250
+ - net gun 500
+
+ Gear
+
+ - experimental welder 500
+ - alien belt 750
+ - alien enhancement vest 750
+ - The monocoole 1000
+ - chameleon black tie 250
+ - cryostasis beaker 200
+ - bluespace beaker 200
+ - chem sprayer 250
+
+ Masks and hats - EVERYTHING IS 50 except chameleon!
+
+ - assistant hat
+ - Shark mask
+ - Pig mask
+ - Luchador mask
+ - Horse mask
+ - Goblin mask
+ - Fake moustache
+ - Dolphin mask
+ - Demon mask
+ - Chameleon gas mask 250
+
+ Costumes - All costumes are 100 except the hoodies which are 50!
+
+ - Black bunny girl outfit (black suit and rabbit ears)
+ - White bunny girl outfit (white suit and rabbit ears)
+ - Corgi hoodie
+ - Sexy clown
+ - nyan girl
+ - Wizard
+ - Chicken
+ - Carp hoodie
+ - Sexy mime
+ - Pirate
+ - Commie
+ - Plague doctor
+ - Imperium monk
+ - Cute witch
+ - Gladiator
+
+ Toys and misc - ALL THESE ARE 50
+
+ - Toy sword
+ - Water flower
+ - Stick horse
+ - Replica katana
+ - Magic conch
+ - Magic 8-ball
+ - Foam sword
+ - Foam crossbow (with 5 bolts)
+ - Bosun's whistle
+ - Golden cup
+ - Havana cigar case
+ - Casino wallet (to keep after shift)
+ - Casino card deck (to keep after shift)
+
+ Booze - ALL BOOZE IS 50
+
+ - Redeemer brew
+ - Warlock velvet
+ - Wrapp artiste patron
+ - Flask of holy water
+ - College girl goldschlager
+ - Gilthari luxury champagne
+ - Bottle of nothing
+ - Special blend whiskey
+ - Akvavit
+
+ Pets
+
+ - Armadillo 150
+ - Cat 150
+ - Goat 150
+ - Fox 150
+ - Lizard 150
+ - Penguin 150
+ - Goose 200
+ - Chicken 200
+ - Cow 200
+ - Corgi 200
+ - Snake 200
+ - Yithian 200
+ - Tindalos 200
+ - Fennec 300
+ - Red Panda 300
+ - Horse 300
+ - Otie 500
+ - Chonker Otie 500
+ - Zorgoia 500
+
+
+ Thats it for prizes!
+
+ Now comes the part for the both operators, you got a very important job, it has a lot of responsibility, so it means that you gotta put that first before your own fun, cause unless you do it, a lot of folks are gonna be left sad and dissappointed they cant get any goodies! But the process is simple and can be quick, someone comes to you, they want some chips, or thalers back or a prize, you simply check this nice guide above to determine cost and ask for the amount of thalers or chips needed, if its a prize, then you follow this procedure:
+
+ - First get the thalers or chips for payment.
+ - Before giving the prize you take out your prize winner folder and a piece of paper, this paper will be named after the one getting the reward and will have further prizes noted down into it, so make sure its safe in that folder!
+ - You write at the top of the document the winner's name, then below write in big letters 'PRIZES' and put each new reward on its own line! ((You skip to a new line by writing < br > without the space between the br and the clamps))
+ - Once written down, you just put the paper back in the folder and hand over the prize!
+
+ ((When shift is nearing its end you pray to staff or DM the one responsible for the event, they will get the folder and copy paste all the reward info before shift is over and ensure people get their rewards. This is a very important job and we understand it might not be so fun being restricted during an event, but just like the rest of volunteer staff, you get rewarded with guaranteed prizes to enjoy after the shift for being a big help!))
+ ((This gets to the sour part, cheating and giving others and yourself free prizes and/or chips is absolutely forbidden, this has OOC consequences and will likely blacklist you from being important roles in future events. Though dont fear getting punished even if you havent done anything wrong, we will rather let cheaters slip than let honest players get wrongfully punished!))
+
+
+ Goodness me this is quite the casino huh? Who would have thought one could win other people as a prize? Well you can do just about anything you want with them! Be it just company, some less children friendly company, heck you can even eat them or make them eat you! The options and possibilities are quite frankly limitless!
+ Now you might ask, how does one get these fancy prizes? Well they can be obtained by checking in at the exchange both and see the list of prizes, there might be none, there might be many, it depends on volunteers and losers! This brings us first to volunteers and then to losers!
+ Volunteering is simple! Anyone can walk up to the booth and ask to be a sentient prize, what this means is that you get a nice sum of 150 chips for you to do whatever you want, but someone might come at any point and claim you!
+ Losers are obtained differently, if youre completly busted and have nothing left, you become a prize that the one you lost to can do whatever they want with, this means both gamblers and dealers can end up as a prize, though if for whatever reason you dont become their prize, you get added to the list for someone else to enjoy. Becoming a prize means you also get 100 chips in compensation!
+
+ Now hear this! The casino has decided that to spice things up, folks can bet themselves at any time and arent already a prize on the list! Doesnt matter if youre rich or broke, playing blackjack or roulette, you can bet yourself in any game and youre worth 250 chips! But be careful, cause if you lose, youre the winners prize! They can keep you, give you to someone else. or to the prize booth and get the chips you would have gotten as volunteer! But if given to the booth, the winner cant buy their prize back for the lower cost!
+
+ ((Sour part again, but very important. These sentient prizes can be fun, but one thing always dictates how these things goes down, preferences and ooc wants. If preferences dont line up and people dont agree to do winner/loser scene it becomes sentient prize on list. And someone cant win a prize if the prize ooc doesnt want to do what the winner wants to do. We still wish people to try and reach out and try things with new people and/or new things they are comfortable doing, but never shall anyone be forced into a situation they dont want!))
+
+
+
+ "}
+
+/obj/item/weapon/storage/wallet/casino
+ name = "casino wallet"
+ desc = "A fancy casino wallet with flashy lights, oooh~"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "casinowallet_black"
+ can_hold = list(
+ /obj/item/weapon/spacecash,
+ /obj/item/weapon/card,
+ /obj/item/clothing/mask/smokable/cigarette/,
+ /obj/item/device/flashlight/pen,
+ /obj/item/device/tape,
+ /obj/item/weapon/cartridge,
+ /obj/item/device/encryptionkey,
+ /obj/item/seeds,
+ /obj/item/stack/medical,
+ /obj/item/weapon/coin,
+ /obj/item/weapon/dice,
+ /obj/item/weapon/disk,
+ /obj/item/weapon/implanter,
+ /obj/item/weapon/flame/lighter,
+ /obj/item/weapon/flame/match,
+ /obj/item/weapon/forensics,
+ /obj/item/weapon/glass_extra,
+ /obj/item/weapon/haircomb,
+ /obj/item/weapon/hand,
+ /obj/item/weapon/key,
+ /obj/item/weapon/lipstick,
+ /obj/item/weapon/paper,
+ /obj/item/weapon/pen,
+ /obj/item/weapon/photo,
+ /obj/item/weapon/reagent_containers/dropper,
+ /obj/item/weapon/sample,
+ /obj/item/weapon/tool/screwdriver,
+ /obj/item/weapon/stamp,
+ /obj/item/clothing/accessory/permit,
+ /obj/item/clothing/accessory/badge,
+ /obj/item/weapon/makeover,
+ /obj/item/weapon/spacecasinocash,
+ /obj/item/weapon/casino_platinum_chip,
+ /obj/item/weapon/deck,
+ /obj/item/weapon/book/manual/casino
+ )
+
+/obj/item/weapon/storage/wallet/casino/verb/toggle_design()
+ set category = "Object"
+ set name = "Toggle design"
+ set src in usr
+
+ if (icon_state == "casinowallet_black")
+ icon_state = "casinowallet_brown"
+ return
+ if (icon_state == "casinowallet_brown")
+ icon_state = "casinowallet_white"
+ return
+ else
+ icon_state = "casinowallet_black"
+
+/obj/machinery/casino_chip_exchanger
+ name = "Casino Chip Exchanger"
+ desc = "Takes all your cash and gives you chips back! No change and half refund!"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state ="casino_atm"
+ anchored = 1
+
+/obj/machinery/casino_chip_exchanger/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I,/obj/item/weapon/spacecash))
+ //consume the money
+ if(prob(50))
+ playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
+ else
+ playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+
+ user << "You insert [I] into [src]."
+ spawn_casinochips(round(I:worth/5), src.loc)
+ src.attack_hand(user)
+ qdel(I)
+ if(istype(I,/obj/item/weapon/spacecasinocash))
+ //consume the money
+ if(prob(50))
+ playsound(loc, 'sound/items/polaroid1.ogg', 50, 1)
+ else
+ playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
+
+ user << "You insert [I] into [src]."
+ spawn_money(round(I:worth/2.5), src.loc)
+ src.attack_hand(user)
+ qdel(I)
+
+
+/////////////CASINO PRIZE DISPENSER////////////////////////
+
+/obj/machinery/casino_prize_dispenser //WIP sprites and variables and prize lists
+ name = "Casino Prize Exchanger"
+ desc = "Exchange your chips to obtain wonderful prizes! Hoepfully you'll get to keep some of them for a while."
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state ="casino_prize_dispenser"
+ var/icon_vend ="casino_prize_dispenser-vend"
+ anchored = 1
+ opacity = 0
+
+ // Vending-related
+ var/active = 1 //No sales pitches if off!
+ var/vend_ready = 1 //Are we ready to vend?? Is it time??
+ var/vend_delay = 40 //How long does it take to vend?
+ var/datum/stored_item/vending_product/currently_vending = null // What we're requesting payment for right now
+ var/category_selection = null
+ var/currently_selecting = null //Which category of prizes is currently displayed
+ var/prize_payout_mode = null //Is the currently selected prize being given or just logged?
+ var/status_message = "" // Status screen messages like "insufficient funds", displayed in NanoUI
+ var/status_error = 0 // Set to 1 if status_message is an error
+
+ var/list/list_weapons = list()
+ var/list/list_gear = list()
+ var/list/list_clothing = list()
+ var/list/list_misc = list()
+ var/list/list_drinks = list()
+ var/list/list_pets = list()
+ var/list/prices = list() // Prices for each item, list(/type/path = price), items not in the list don't have a price.
+
+ // List of vending_product items available.
+ var/list/weapons_product_records = list()
+ var/list/gear_product_records = list()
+ var/list/clothing_product_records = list()
+ var/list/misc_product_records = list()
+ var/list/drinks_product_records = list()
+ var/list/pets_product_records = list()
+
+ var/category_weapons = 1 //For listing categories, if false then prizes of this categories cant be obtained nor bought for post-shift enjoyment
+ var/category_gear = 1 //If 1 prizes will be only logged
+ var/category_clothing = 1 //If 2 prizes will both be logged and spawned
+ var/category_misc = 1
+ var/category_drinks = 1
+ var/category_pets = 1
+
+ list_weapons = list(
+ /obj/item/weapon/scepter,
+ /obj/item/weapon/melee/chainofcommand,
+ /obj/item/weapon/gun/energy/sizegun,
+ /obj/item/weapon/gun/energy/particle/advanced,
+ /obj/item/weapon/gun/energy/temperature,
+ /obj/item/weapon/gun/energy/alien,
+ /obj/item/weapon/gun/energy/floragun,
+ /obj/item/weapon/gun/energy/netgun
+ )
+
+ list_gear = list(
+ /obj/item/weapon/weldingtool/experimental,
+ /obj/item/weapon/storage/belt/utility/alien,
+ /obj/item/clothing/suit/armor/alien,
+ /obj/item/clothing/glasses/monocoole,
+ /obj/item/clothing/accessory/chameleon,
+ /obj/item/weapon/reagent_containers/spray/chemsprayer,
+ /obj/item/weapon/reagent_containers/glass/beaker/bluespace,
+ /obj/item/weapon/reagent_containers/glass/beaker/noreact
+ )
+
+ list_clothing = list(
+ /obj/item/clothing/head/soft/purple/wah,
+ /obj/item/clothing/mask/shark,
+ /obj/item/clothing/mask/pig,
+ /obj/item/clothing/mask/luchador,
+ /obj/item/clothing/mask/horsehead,
+ /obj/item/clothing/mask/goblin,
+ /obj/item/clothing/mask/fakemoustache,
+ /obj/item/clothing/mask/dolphin,
+ /obj/item/clothing/mask/demon,
+ /obj/item/clothing/under/chameleon,
+ /obj/item/clothing/suit/storage/hooded/ian_costume,
+ /obj/item/clothing/suit/storage/hooded/carp_costume,
+ /obj/item/weapon/storage/box/casino/costume_whitebunny,
+ /obj/item/weapon/storage/box/casino/costume_blackbunny,
+ /obj/item/weapon/storage/box/casino/costume_sexymime,
+ /obj/item/weapon/storage/box/casino/costume_sexyclown,
+ /obj/item/weapon/storage/box/casino/costume_nyangirl,
+ /obj/item/weapon/storage/box/casino/costume_wizard,
+ /obj/item/weapon/storage/box/casino/costume_chicken,
+ /obj/item/weapon/storage/box/casino/costume_gladiator,
+ /obj/item/weapon/storage/box/casino/costume_pirate,
+ /obj/item/weapon/storage/box/casino/costume_commie,
+ /obj/item/weapon/storage/box/casino/costume_imperiummonk,
+ /obj/item/weapon/storage/box/casino/costume_plaguedoctor,
+ /obj/item/weapon/storage/box/casino/costume_cutewitch
+ )
+
+ list_misc = list(
+ /obj/item/toy/sword,
+ /obj/item/weapon/reagent_containers/spray/waterflower,
+ /obj/item/toy/stickhorse,
+ /obj/item/toy/katana,
+ /obj/item/toy/eight_ball/conch,
+ /obj/item/toy/eight_ball,
+ /obj/item/weapon/material/sword/foam,
+ /obj/item/weapon/storage/box/casino/foamcrossbow,
+ /obj/item/toy/bosunwhistle,
+ /obj/item/weapon/reagent_containers/food/drinks/golden_cup,
+ /obj/item/weapon/storage/fancy/cigar/havana,
+ /obj/item/weapon/storage/wallet/casino,
+ /obj/item/weapon/deck/cards/casino
+ )
+
+ list_drinks = list(
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/patron,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/snaps
+ )
+
+
+ list_pets = list(
+ /obj/item/weapon/grenade/spawnergrenade/casino,
+ /obj/item/weapon/grenade/spawnergrenade/casino/goat,
+ /obj/item/weapon/grenade/spawnergrenade/casino/armadillo,
+ /obj/item/weapon/grenade/spawnergrenade/casino/cat,
+ /obj/item/weapon/grenade/spawnergrenade/casino/chicken,
+ /obj/item/weapon/grenade/spawnergrenade/casino/cow,
+ /obj/item/weapon/grenade/spawnergrenade/casino/corgi,
+ /obj/item/weapon/grenade/spawnergrenade/casino/fox,
+ /obj/item/weapon/grenade/spawnergrenade/casino/lizard,
+ /obj/item/weapon/grenade/spawnergrenade/casino/penguin,
+ /obj/item/weapon/grenade/spawnergrenade/casino/snake,
+ /obj/item/weapon/grenade/spawnergrenade/casino/yithian,
+ /obj/item/weapon/grenade/spawnergrenade/casino/tindalos,
+ /obj/item/weapon/grenade/spawnergrenade/casino/fennec,
+ /obj/item/weapon/grenade/spawnergrenade/casino/redpanda,
+ /obj/item/weapon/grenade/spawnergrenade/casino/horse,
+ /obj/item/weapon/grenade/spawnergrenade/casino/otie,
+ /obj/item/weapon/grenade/spawnergrenade/casino/otie/chubby,
+ /obj/item/weapon/grenade/spawnergrenade/casino/zorgoia
+ )
+
+ prices = list(
+ /obj/item/weapon/scepter = 500,
+ /obj/item/weapon/melee/chainofcommand = 250,
+ /obj/item/weapon/gun/energy/sizegun = 100,
+ /obj/item/weapon/gun/energy/particle/advanced = 500,
+ /obj/item/weapon/gun/energy/temperature = 250,
+ /obj/item/weapon/gun/energy/alien = 1000,
+ /obj/item/weapon/gun/energy/floragun = 250,
+ /obj/item/weapon/gun/energy/netgun = 500,
+ /obj/item/weapon/weldingtool/experimental = 500,
+ /obj/item/weapon/storage/belt/utility/alien = 500,
+ /obj/item/clothing/suit/armor/alien = 750,
+ /obj/item/clothing/glasses/monocoole = 1000,
+ /obj/item/clothing/accessory/chameleon = 250,
+ /obj/item/weapon/reagent_containers/spray/chemsprayer = 250,
+ /obj/item/weapon/reagent_containers/glass/beaker/bluespace = 200,
+ /obj/item/weapon/reagent_containers/glass/beaker/noreact = 200,
+ /obj/item/clothing/head/soft/purple/wah = 50,
+ /obj/item/clothing/mask/shark = 50,
+ /obj/item/clothing/mask/pig = 50,
+ /obj/item/clothing/mask/luchador = 50,
+ /obj/item/clothing/mask/horsehead = 50,
+ /obj/item/clothing/mask/goblin = 50,
+ /obj/item/clothing/mask/fakemoustache = 50,
+ /obj/item/clothing/mask/dolphin = 50,
+ /obj/item/clothing/mask/demon = 50,
+ /obj/item/clothing/under/chameleon = 250,
+ /obj/item/clothing/suit/storage/hooded/ian_costume = 50,
+ /obj/item/clothing/suit/storage/hooded/carp_costume = 50,
+ /obj/item/weapon/storage/box/casino/costume_whitebunny = 100,
+ /obj/item/weapon/storage/box/casino/costume_blackbunny = 100,
+ /obj/item/weapon/storage/box/casino/costume_sexymime = 100,
+ /obj/item/weapon/storage/box/casino/costume_sexyclown = 100,
+ /obj/item/weapon/storage/box/casino/costume_nyangirl = 100,
+ /obj/item/weapon/storage/box/casino/costume_wizard = 100,
+ /obj/item/weapon/storage/box/casino/costume_chicken = 100,
+ /obj/item/weapon/storage/box/casino/costume_gladiator = 100,
+ /obj/item/weapon/storage/box/casino/costume_pirate = 100,
+ /obj/item/weapon/storage/box/casino/costume_commie = 100,
+ /obj/item/weapon/storage/box/casino/costume_imperiummonk = 100,
+ /obj/item/weapon/storage/box/casino/costume_plaguedoctor = 100,
+ /obj/item/weapon/storage/box/casino/costume_cutewitch = 100,
+ /obj/item/toy/sword = 50,
+ /obj/item/weapon/reagent_containers/spray/waterflower = 50,
+ /obj/item/toy/stickhorse = 50,
+ /obj/item/toy/katana = 50,
+ /obj/item/toy/eight_ball/conch = 50,
+ /obj/item/toy/eight_ball = 50,
+ /obj/item/weapon/material/sword/foam = 50,
+ /obj/item/weapon/storage/box/casino/foamcrossbow = 50,
+ /obj/item/toy/bosunwhistle = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/golden_cup = 50,
+ /obj/item/weapon/storage/fancy/cigar/havana = 50,
+ /obj/item/weapon/storage/wallet/casino = 50,
+ /obj/item/weapon/deck/cards/casino = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/patron = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey = 50,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/snaps = 50,
+ /obj/item/weapon/grenade/spawnergrenade/casino = 200,
+ /obj/item/weapon/grenade/spawnergrenade/casino/goat = 150,
+ /obj/item/weapon/grenade/spawnergrenade/casino/armadillo = 150,
+ /obj/item/weapon/grenade/spawnergrenade/casino/cat = 150,
+ /obj/item/weapon/grenade/spawnergrenade/casino/chicken = 200,
+ /obj/item/weapon/grenade/spawnergrenade/casino/cow = 200,
+ /obj/item/weapon/grenade/spawnergrenade/casino/corgi = 200,
+ /obj/item/weapon/grenade/spawnergrenade/casino/fox = 150,
+ /obj/item/weapon/grenade/spawnergrenade/casino/lizard = 150,
+ /obj/item/weapon/grenade/spawnergrenade/casino/penguin = 150,
+ /obj/item/weapon/grenade/spawnergrenade/casino/snake = 200,
+ /obj/item/weapon/grenade/spawnergrenade/casino/yithian = 200,
+ /obj/item/weapon/grenade/spawnergrenade/casino/tindalos = 200,
+ /obj/item/weapon/grenade/spawnergrenade/casino/fennec = 300,
+ /obj/item/weapon/grenade/spawnergrenade/casino/redpanda = 300,
+ /obj/item/weapon/grenade/spawnergrenade/casino/horse = 300,
+ /obj/item/weapon/grenade/spawnergrenade/casino/otie = 500,
+ /obj/item/weapon/grenade/spawnergrenade/casino/otie/chubby = 500,
+ /obj/item/weapon/grenade/spawnergrenade/casino/zorgoia = 500
+ )
+
+
+ var/list/log = list()
+ var/req_log_access = access_cargo //default access for checking logs is cargo
+ var/has_logs = 0 //defaults to 0, set to anything else for vendor to have logs
+
+/obj/machinery/casino_prize_dispenser/Initialize()
+ build_inventory()
+
+/obj/machinery/casino_prize_dispenser/proc/build_inventory() //Awkward yeah
+ var/list/weapons_products = list(
+ list(list_weapons, "cat_weapons"))
+ for(var/current_list in weapons_products)
+ var/category = current_list[2]
+
+ for(var/entry in current_list[1])
+ var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
+
+ product.price = (entry in prices) ? prices[entry] : 0
+ product.category = category
+ weapons_product_records.Add(product)
+
+ var/list/gear_products = list(
+ list(list_gear, "cat_gear"))
+ for(var/current_list in gear_products)
+ var/category = current_list[2]
+
+ for(var/entry in current_list[1])
+ var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
+
+ product.price = (entry in prices) ? prices[entry] : 0
+ product.category = category
+ gear_product_records.Add(product)
+
+ var/list/clothing_products = list(
+ list(list_clothing, "cat_clothing"))
+ for(var/current_list in clothing_products)
+ var/category = current_list[2]
+
+ for(var/entry in current_list[1])
+ var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
+
+ product.price = (entry in prices) ? prices[entry] : 0
+ product.category = category
+ clothing_product_records.Add(product)
+
+ var/list/misc_products = list(
+ list(list_misc, "cat_misc"))
+ for(var/current_list in misc_products)
+ var/category = current_list[2]
+
+ for(var/entry in current_list[1])
+ var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
+
+ product.price = (entry in prices) ? prices[entry] : 0
+ product.category = category
+ misc_product_records.Add(product)
+
+ var/list/drinks_products = list(
+ list(list_drinks, "cat_drinks"))
+ for(var/current_list in drinks_products)
+ var/category = current_list[2]
+
+ for(var/entry in current_list[1])
+ var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
+
+ product.price = (entry in prices) ? prices[entry] : 0
+ product.category = category
+ drinks_product_records.Add(product)
+
+ var/list/pets_products = list(
+ list(list_pets, "cat_pets"))
+ for(var/current_list in pets_products)
+ var/category = current_list[2]
+
+ for(var/entry in current_list[1])
+ var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry)
+
+ product.price = (entry in prices) ? prices[entry] : 0
+ product.category = category
+ pets_product_records.Add(product)
+
+/obj/machinery/casino_prize_dispenser/Destroy()
+ for(var/datum/stored_item/vending_product/R in weapons_product_records)
+ qdel(R)
+ weapons_product_records = null
+
+ for(var/datum/stored_item/vending_product/R in gear_product_records)
+ qdel(R)
+ gear_product_records = null
+
+ for(var/datum/stored_item/vending_product/R in clothing_product_records)
+ qdel(R)
+ clothing_product_records = null
+
+ for(var/datum/stored_item/vending_product/R in misc_product_records)
+ qdel(R)
+ misc_product_records = null
+
+ for(var/datum/stored_item/vending_product/R in drinks_product_records)
+ qdel(R)
+ drinks_product_records = null
+
+ for(var/datum/stored_item/vending_product/R in pets_product_records)
+ qdel(R)
+ pets_product_records = null
+ return ..()
+
+/obj/machinery/casino_prize_dispenser/attackby(obj/item/weapon/W as obj, mob/user as mob)
+
+ if(currently_vending)
+ var/paid = 0
+ var/handled = 0
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ var/obj/item/weapon/spacecasinocash/C = W
+ paid = pay_with_chips(C, user)
+ handled = 1
+
+ if(paid)
+ vend(currently_vending, usr)
+ return
+ else if(handled)
+ SSnanoui.update_uis(src)
+ return // don't smack that machine with your 2 chips
+
+ if(istype(W, /obj/item/weapon/spacecasinocash))
+ attack_hand(user)
+ return
+ ..()
+
+/obj/machinery/casino_prize_dispenser/attack_hand(mob/user as mob)
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ ui_interact(user)
+
+/obj/machinery/casino_prize_dispenser/proc/pay_with_chips(var/obj/item/weapon/spacecasinocash/cashmoney, mob/user)
+ if(currently_vending.price > 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, "\icon[cashmoney] That is not enough chips.")
+ return 0
+
+ if(istype(cashmoney, /obj/item/weapon/spacecasinocash))
+
+ visible_message("\The [usr] inserts some chips into \the [src].")
+ cashmoney.worth -= currently_vending.price
+
+ if(cashmoney.worth <= 0)
+ usr.drop_from_inventory(cashmoney)
+ qdel(cashmoney)
+ else
+ cashmoney.update_icon()
+
+ return 1
+
+/obj/machinery/casino_prize_dispenser/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+
+ var/list/data = list()
+
+ if(currently_vending)
+ data["mode"] = 2
+ data["product"] = currently_vending.item_name
+ data["price"] = currently_vending.price
+ data["message_err"] = 0
+ data["message"] = status_message
+ data["message_err"] = status_error
+
+ else if(currently_selecting)
+ data["mode"] = 1
+ var/list/listed_products = null
+ listed_products = list()
+
+ switch(currently_selecting)
+ if("cat_weapons")
+ for(var/key = 1 to weapons_product_records.len)
+ var/datum/stored_item/vending_product/I = weapons_product_records[key]
+
+ listed_products.Add(list(list(
+ "key" = key,
+ "name" = I.item_name,
+ "price" = I.price,
+ "color" = I.display_color)))
+ if("cat_gear")
+ for(var/key = 1 to gear_product_records.len)
+ var/datum/stored_item/vending_product/I = gear_product_records[key]
+
+ listed_products.Add(list(list(
+ "key" = key,
+ "name" = I.item_name,
+ "price" = I.price,
+ "color" = I.display_color)))
+ if("cat_clothing")
+ for(var/key = 1 to clothing_product_records.len)
+ var/datum/stored_item/vending_product/I = clothing_product_records[key]
+
+ listed_products.Add(list(list(
+ "key" = key,
+ "name" = I.item_name,
+ "price" = I.price,
+ "color" = I.display_color)))
+ if("cat_misc")
+ for(var/key = 1 to misc_product_records.len)
+ var/datum/stored_item/vending_product/I = misc_product_records[key]
+
+ listed_products.Add(list(list(
+ "key" = key,
+ "name" = I.item_name,
+ "price" = I.price,
+ "color" = I.display_color)))
+ if("cat_drinks")
+ for(var/key = 1 to drinks_product_records.len)
+ var/datum/stored_item/vending_product/I = drinks_product_records[key]
+
+ listed_products.Add(list(list(
+ "key" = key,
+ "name" = I.item_name,
+ "price" = I.price,
+ "color" = I.display_color)))
+ if("cat_pets")
+ for(var/key = 1 to pets_product_records.len)
+ var/datum/stored_item/vending_product/I = pets_product_records[key]
+
+ listed_products.Add(list(list(
+ "key" = key,
+ "name" = I.item_name,
+ "price" = I.price,
+ "color" = I.display_color)))
+ else
+ return
+
+ data["products"] = listed_products
+
+ else
+ data["mode"] = 0
+
+ data["category_weapons"] = category_weapons
+ data["category_gear"] = category_gear
+ data["category_clothing"] = category_clothing
+ data["category_misc"] = category_misc
+ data["category_drinks"] = category_drinks
+ data["category_pets"] = category_pets
+
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "casino_prize_dispenser_ch.tmpl", name, 440, 600)
+ ui.set_initial_data(data)
+ ui.open()
+
+/obj/machinery/casino_prize_dispenser/Topic(href, href_list)
+ if(stat & (BROKEN|NOPOWER))
+ return
+ if(usr.stat || usr.restrained())
+ return
+
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) //WIP check the vending_product
+ if((href_list["Select"]) && (vend_ready) && (!currently_vending))
+ switch(href_list["Select"])
+ if("selected_weapons")
+ currently_selecting = "cat_weapons"
+ prize_payout_mode = category_weapons
+ if("selected_gear")
+ currently_selecting = "cat_gear"
+ prize_payout_mode = category_gear
+ if("selected_clothing")
+ currently_selecting = "cat_clothing"
+ prize_payout_mode = category_clothing
+ if("selected_misc")
+ currently_selecting = "cat_misc"
+ prize_payout_mode = category_misc
+ if("selected_drinks")
+ currently_selecting = "cat_drinks"
+ prize_payout_mode = category_drinks
+ if("selected_pets")
+ currently_selecting = "cat_pets"
+ prize_payout_mode = category_pets
+ else
+ currently_selecting = null
+ prize_payout_mode = null
+
+ if((href_list["vend"]) && (vend_ready) && (!currently_vending))
+ var/key = text2num(href_list["vend"])
+
+ switch(currently_selecting)
+ if("cat_weapons")
+ var/datum/stored_item/vending_product/R = weapons_product_records[key]
+ currently_selecting = null
+
+ if(R.price <= 0)
+ vend(R, usr)
+ else
+ currently_vending = R
+ status_message = "Please insert chips to pay for the prize!"
+ status_error = 0
+
+ if("cat_gear")
+ var/datum/stored_item/vending_product/R = gear_product_records[key]
+ currently_selecting = null
+
+ if(R.price <= 0)
+ vend(R, usr)
+ else
+ currently_vending = R
+ status_message = "Please insert chips to pay for the prize!"
+ status_error = 0
+
+ if("cat_clothing")
+ var/datum/stored_item/vending_product/R = clothing_product_records[key]
+ currently_selecting = null
+
+ if(R.price <= 0)
+ vend(R, usr)
+ else
+ currently_vending = R
+ status_message = "Please insert chips to pay for the prize!"
+ status_error = 0
+
+ if("cat_misc")
+ var/datum/stored_item/vending_product/R = misc_product_records[key]
+ currently_selecting = null
+
+ if(R.price <= 0)
+ vend(R, usr)
+ else
+ currently_vending = R
+ status_message = "Please insert chips to pay for the prize!"
+ status_error = 0
+
+ if("cat_drinks")
+ var/datum/stored_item/vending_product/R = drinks_product_records[key]
+ currently_selecting = null
+
+ if(R.price <= 0)
+ vend(R, usr)
+ else
+ currently_vending = R
+ status_message = "Please insert chips to pay for the prize!"
+ status_error = 0
+ if("cat_pets")
+ var/datum/stored_item/vending_product/R = pets_product_records[key]
+ currently_selecting = null
+
+ if(R.price <= 0)
+ vend(R, usr)
+ else
+ currently_vending = R
+ status_message = "Please insert chips to pay for the prize!"
+ status_error = 0
+ else
+ return
+
+ else if(href_list["cancelpurchase"])
+ currently_vending = null
+
+
+ SSnanoui.update_uis(src)
+
+/obj/machinery/casino_prize_dispenser/proc/vend(datum/stored_item/vending_product/R, mob/user) //WIP
+ vend_ready = 0 //One thing at a time!!
+ status_message = "Vending..."
+ status_error = 0
+ SSnanoui.update_uis(src)
+
+ if(icon_vend) //Show the vending animation if needed
+ flick(icon_vend,src)
+
+ spawn(vend_delay)
+ if(prize_payout_mode == 2)
+ new R.item_path(src.loc)
+ playsound(src, 'sound/items/vending.ogg', 50, 1, 1)
+
+ status_message = "Thank you for your purchase, your prize has been logged!"
+ to_chat(user,status_message)
+ do_logging(R.item_path, user)
+
+ status_message = ""
+ status_error = 0
+ vend_ready = 1
+ currently_vending = null
+ SSnanoui.update_uis(src)
+
+ return 1
+
+/obj/machinery/casino_prize_dispenser/proc/do_logging(item, mob/user)
+ var/prize_log = "[user.ckey] playing as [user.name] bought a [item]."
+ log[++log.len] = prize_log
+ //Currently doesnt have in game way to show, to ensure theres no chance of players ckeys exposed - Jack
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 397366c6c2..9fd6d026a0 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -259,7 +259,7 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva
set category = "Admin"
var/list/cores = list()
- for(var/obj/structure/AIcore/deactivated/D in all_deactivated_AI_cores)
+ for(var/obj/structure/AIcore/deactivated/D in GLOB.all_deactivated_AI_cores)
cores["[D] ([D.loc.loc])"] = D
var/id = input("Which core?", "Toggle AI Core Latejoin", null) as null|anything in cores
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index 1a4ec083df..4128e12877 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -233,5 +233,10 @@
else
to_chat(usr, "Cannot issue pass without issuing ID.")
+<<<<<<< HEAD
add_fingerprint(usr)
- return TRUE
\ No newline at end of file
+ return TRUE
+=======
+ src.add_fingerprint(usr)
+ SSnanoui.update_uis(src)
+>>>>>>> master-holder
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 9932934a83..33d37edfa6 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -33,7 +33,7 @@
data["chemImplants"] = list()
data["trackImplants"] = list()
if(screen)
- for(var/obj/item/weapon/implant/chem/C in all_chem_implants)
+ for(var/obj/item/weapon/implant/chem/C in GLOB.all_chem_implants)
var/turf/T = get_turf(C)
if(!T)
continue
@@ -44,7 +44,7 @@
"units" = C.reagents.total_volume,
"ref" = "\ref[C]"
)))
- for(var/obj/item/weapon/implant/tracking/track in all_tracking_implants)
+ for(var/obj/item/weapon/implant/tracking/track in GLOB.all_tracking_implants)
var/turf/T = get_turf(track)
if(!T)
continue
@@ -92,4 +92,4 @@
to_chat(I.imp_in, "You hear a voice in your head saying: '[warning]'")
. = TRUE
- add_fingerprint(usr)
+ add_fingerprint(usr)
\ No newline at end of file
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 958101a3b9..a2ddb55f97 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -28,9 +28,9 @@
return attack_hand(user)
/obj/machinery/button/remote/emag_act(var/remaining_charges, var/mob/user)
- if(req_access.len || req_one_access.len)
- req_access = list()
- req_one_access = list()
+ if(LAZYLEN(req_access) || LAZYLEN(req_one_access.len))
+ req_access = req_access ? list() : null
+ req_one_access = req_one_access ? list() : null // if it's not set keep it not set
playsound(src, "sparks", 100, 1)
return 1
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 014efcb581..5a2e21bafc 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -80,17 +80,17 @@
var/mob/living/carbon/human/X = user
if(istype(X.species, /datum/species/xenos))
if(src.locked || src.welded)
- visible_message("\The [user] begins digging into \the [src] internals!")
+ visible_message("\The [user] begins tearing into \the [src] internals!") //CHOMPedit . edited message to make it more violent
src.do_animate("deny")
- if(do_after(user,5 SECONDS,src))
- visible_message("\The [user] forces \the [src] open, sparks flying from its electronics!")
+ if(do_after(user,30 SECONDS,src)) //CHOMPedit . Increased time to force open welded door for alien
+ visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") //CHOMPedit
src.do_animate("spark")
playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS)
src.locked = 0
src.welded = 0
update_icon()
open(1)
- src.emag_act()
+ src.set_broken() //CHOMPedit . Changed action to make ripping open the airlock more realistic
else if(src.density)
visible_message("\The [user] begins forcing \the [src] open!")
if(do_after(user, 5 SECONDS,src))
@@ -241,6 +241,8 @@
explosion_resistance = 5
opacity = 0
glass = 1
+ open_sound_powered = 'sound/machines/hall1o.ogg' //CHOMPEdit
+ close_sound_powered = 'sound/machines/hall1c.ogg' //CHOMPEdit
/obj/machinery/door/airlock/centcom
name = "Centcom Airlock"
@@ -1225,7 +1227,7 @@ About the new airlock wires panel:
var/volume
if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled.
if(arePowerSystemsOn())
- sound = legacy_open_powered
+ sound = open_sound_powered
volume = 50
else
sound = open_sound_unpowered
@@ -1239,7 +1241,7 @@ About the new airlock wires panel:
volume = 75
else // Else, play these.
if(arePowerSystemsOn())
- sound = open_sound_powered
+ sound = legacy_open_powered
volume = 50
else
sound = open_sound_unpowered
@@ -1354,7 +1356,7 @@ About the new airlock wires panel:
var/volume
if(old_sounds)
if(arePowerSystemsOn())
- sound = legacy_close_powered
+ sound = close_sound_powered
volume = 50
else
sound = open_sound_unpowered
@@ -1368,7 +1370,7 @@ About the new airlock wires panel:
volume = 75
else
if(arePowerSystemsOn())
- sound = close_sound_powered
+ sound = legacy_close_powered
volume = 50
else
sound = open_sound_unpowered
@@ -1430,10 +1432,10 @@ About the new airlock wires panel:
//update the door's access to match the electronics'
secured_wires = electronics.secure
if(electronics.one_access)
- req_access.Cut()
+ if(req_access) req_access.Cut() //YWEdit
req_one_access = src.electronics.conf_access
else
- req_one_access.Cut()
+ if(req_one_access) req_one_access.Cut() //YWEdit
req_access = src.electronics.conf_access
//get the name from the assembly
diff --git a/code/game/machinery/doors/airlock_ch.dm b/code/game/machinery/doors/airlock_ch.dm
new file mode 100644
index 0000000000..e50062cd00
--- /dev/null
+++ b/code/game/machinery/doors/airlock_ch.dm
@@ -0,0 +1,6 @@
+/obj/machinery/door/airlock/scp
+ name = "SCP Access"
+ icon = 'icons/obj/doors/SCPdoor.dmi'
+ //req_one_access = list(access_maint_tunnels)
+ open_sound_powered = 'sound/machines/scp1o.ogg'
+ close_sound_powered = 'sound/machines/scp1c.ogg'
\ No newline at end of file
diff --git a/code/game/machinery/doors/airlock_yw.dm b/code/game/machinery/doors/airlock_yw.dm
new file mode 100644
index 0000000000..71077deedc
--- /dev/null
+++ b/code/game/machinery/doors/airlock_yw.dm
@@ -0,0 +1,92 @@
+/obj/machinery/door/airlock/command
+ req_one_access = list(access_heads, access_blueshield)
+
+/obj/machinery/door/airlock/security
+ req_one_access = list(access_security, access_blueshield)
+
+/obj/machinery/door/airlock/engineering
+ req_one_access = list(access_engine, access_blueshield)
+
+/obj/machinery/door/airlock/engineeringatmos
+ req_one_access = list(access_atmospherics, access_blueshield)
+
+/obj/machinery/door/airlock/medical
+ req_one_access = list(access_medical, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance
+ //req_one_access = list(access_maint_tunnels, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance/cargo
+ req_one_access = list(access_cargo, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance/command
+ req_one_access = list(access_heads, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance/engi
+ req_one_access = list(access_engine, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance/medical
+ req_one_access = list(access_medical, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance/rnd
+ req_one_access = list(access_research, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance/sec
+ req_one_access = list(access_security, access_blueshield)
+
+/obj/machinery/door/airlock/glass_external
+ req_one_access = list(access_external_airlocks, access_blueshield)
+
+/obj/machinery/door/airlock/centcom
+ req_one_access = list(access_cent_general, access_blueshield)
+
+/obj/machinery/door/airlock/vault
+ req_one_access = list(access_heads_vault, access_blueshield)
+
+/obj/machinery/door/airlock/hatch
+ req_one_access = list(access_maint_tunnels, access_blueshield)
+
+/obj/machinery/door/airlock/maintenance_hatch
+ req_one_access = list(access_maint_tunnels, access_blueshield)
+
+/obj/machinery/door/airlock/glass_command
+ req_one_access = list(access_heads, access_blueshield)
+
+/obj/machinery/door/airlock/glass_engineering
+ req_one_access = list(access_engine, access_blueshield)
+
+/obj/machinery/door/airlock/glass_engineeringatmos
+ req_one_access = list(access_atmospherics, access_blueshield)
+
+/obj/machinery/door/airlock/glass_security
+ req_one_access = list(access_security, access_blueshield)
+
+/obj/machinery/door/airlock/glass_medical
+ req_one_access = list(access_medical, access_blueshield)
+
+/obj/machinery/door/airlock/mining
+ req_one_access = list(access_mining, access_blueshield)
+
+/obj/machinery/door/airlock/atmos
+ req_one_access = list(access_atmospherics, access_blueshield)
+
+/obj/machinery/door/airlock/glass_research
+ req_one_access = list(access_research, access_blueshield)
+
+/obj/machinery/door/airlock/glass_mining
+ req_one_access = list(access_mining, access_blueshield)
+
+/obj/machinery/door/airlock/glass_atmos
+ req_one_access = list(access_atmospherics, access_blueshield)
+
+/obj/machinery/door/airlock/science
+ req_one_access = list(access_research, access_blueshield)
+
+/obj/machinery/door/airlock/glass_science
+ req_one_access = list(access_research, access_blueshield)
+
+/obj/machinery/door/airlock/highsecurity
+ req_one_access = list(access_heads_vault, access_blueshield)
+
+/obj/machinery/door/window/brigdoor
+ req_access = list(access_security, access_blueshield)
\ No newline at end of file
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 08e0979ed5..bc9c199ed2 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -11,7 +11,7 @@
// The emag thing wasn't working as intended, manually overwrote it.
#define BLAST_DOOR_CRUSH_DAMAGE 40
-#define SHUTTER_CRUSH_DAMAGE 0 // VOREStation Edit - Shutter damage 0.
+#define SHUTTER_CRUSH_DAMAGE 5 // YW Edit - Shutter damage 5.
/obj/machinery/door/blast
name = "Blast Door"
diff --git a/code/game/machinery/doors/blast_door_yw.dm b/code/game/machinery/doors/blast_door_yw.dm
new file mode 100644
index 0000000000..791355e98e
--- /dev/null
+++ b/code/game/machinery/doors/blast_door_yw.dm
@@ -0,0 +1,32 @@
+// SUBTYPE: Reactor Shroud.
+// radiation proof door for use as shielding for the R-UST.
+/obj/machinery/door/blast/radproof/
+ name = "Reactor Shroud"
+ desc = "Two massive interlocking hulks of radiation resistant metal. It looks like it could stop a tank."
+ icon_state_open = "pdoor0"
+ icon_state_opening = "pdoorc0"
+ icon_state_closed = "pdoor1"
+ icon_state_closing = "pdoorc1"
+ icon_state = "pdoor1"
+ maxhealth = 600
+ rad_resistance = 100
+ id = "EngineShroud"
+
+/obj/machinery/door/blast/radproof/open
+ icon_state = "pdoor0"
+ density = 0
+ opacity = 0
+ rad_resistance = 0
+
+/obj/machinery/door/blast/radproof/force_open()
+ src.rad_resistance = 0
+ ..()
+
+/obj/machinery/door/blast/radproof/force_close()
+ src.rad_resistance = 100
+ ..()
+
+/obj/machinery/button/remote/blast_door/radproof
+ name = "Reactor Shroud Control"
+ desc = "It the reactor shroud remotely."
+ id = "EngineShroud"
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 30e0d6f82f..9fa4945f5b 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -53,7 +53,7 @@
if(F.id == id)
LAZYADD(targets,F)
- for(var/obj/structure/closet/secure_closet/brig/C in all_brig_closets)
+ for(var/obj/structure/closet/secure_closet/brig/C in GLOB.all_brig_closets)
if(C.id == id)
LAZYADD(targets,C)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 6cae2617fd..8c4f1c6e89 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -49,6 +49,8 @@
"hot",
"cold"
)
+ var/open_sound = 'sound/machines/firelockopen.ogg' //CHOMPEdit firedoor sound variable.
+ var/close_sound = 'sound/machines/firelockclose.ogg' //CHOMPEdit firedoor sound variable.
/obj/machinery/door/firedoor/Initialize()
. = ..()
@@ -436,9 +438,9 @@
switch(animation)
if("opening")
flick("door_opening", src)
- playsound(src, 'sound/machines/firelockopen.ogg', 37, 1)
+ playsound(src, open_sound, 37, 1) //CHOMPEdit var
if("closing")
- playsound(src, 'sound/machines/firelockclose.ogg', 37, 1)
+ playsound(src, close_sound, 37, 1) //CHOMPEdit var
flick("door_closing", src)
return
@@ -512,6 +514,8 @@
/obj/machinery/door/firedoor/multi_tile
icon = 'icons/obj/doors/DoorHazard2x1.dmi'
width = 2
+ open_sound = 'sound/machines/firewide1o.ogg' //CHOMPEdit
+ close_sound = 'sound/machines/firewide1c.ogg' //CHOMPEdit
/obj/machinery/door/firedoor/glass
name = "\improper Emergency Glass Shutter"
diff --git a/code/game/machinery/doors/firedoor_ch.dm b/code/game/machinery/doors/firedoor_ch.dm
new file mode 100644
index 0000000000..be3b96b3da
--- /dev/null
+++ b/code/game/machinery/doors/firedoor_ch.dm
@@ -0,0 +1,7 @@
+//Glass variation of the 2x1 firedoor
+/obj/machinery/door/firedoor/multi_tile/glass
+ icon = 'icons/obj/doors/DoorHazardGlass2x1.dmi'
+ width = 2
+ glass = 1
+ open_sound = 'sound/machines/firewide1o.ogg'
+ close_sound = 'sound/machines/firewide1c.ogg'
diff --git a/code/game/machinery/embedded_controller/mapping_helpers.dm b/code/game/machinery/embedded_controller/mapping_helpers.dm
index 768fc74beb..f1cb6d21c8 100644
--- a/code/game/machinery/embedded_controller/mapping_helpers.dm
+++ b/code/game/machinery/embedded_controller/mapping_helpers.dm
@@ -1,177 +1,210 @@
-/*
-
-Note that these have to be in the same /area that the controller is in for them to function.
-You still need to set the controller's "id_tag" to something unique.
-Any frequency works, it's self-setting, but it seems like people have decided 1380 for airlocks so maybe set that on the controller too.
-
-*/
-
-/obj/effect/map_helper/airlock
- name = "use a subtype!"
- icon = 'icons/misc/map_helpers.dmi'
- plane = 20 //I dunno just high.
- alpha = 170
-
- //The controller we're wanting our device to use
- var/obj/machinery/embedded_controller/radio/my_controller
- var/my_controller_type = /obj/machinery/embedded_controller/radio/airlock
- //The device we're setting up
- var/my_device
- var/my_device_type
- //Most things have a radio tag of some sort that needs adjusting
- var/tag_addon
-
-/obj/effect/map_helper/airlock/Initialize()
- ..()
- my_controller = get_controller(get_area(src))
- my_device = locate(my_device_type) in get_turf(src)
- if(!my_device)
- to_world("WARNING:Airlock helper '[name]' couldn't find what it wanted at: X:[x] Y:[y] Z:[z]")
- else if(!my_controller)
- to_world("WARNING:Airlock helper '[name]' couldn't find a controller at: X:[x] Y:[y] Z:[z]")
- else if(!my_controller.id_tag)
- to_world("WARNING:Airlock helper '[name]' found a controller without an 'id_tag' set: X:[x] Y:[y] Z:[z]")
- else
- setup()
- return INITIALIZE_HINT_QDEL
-
-/obj/effect/map_helper/airlock/Destroy()
- my_controller = null
- my_device = null
- return ..()
-
-/obj/effect/map_helper/airlock/proc/get_controller(var/area/A)
- if(!A)
- return null
-
- var/list/potentials = list()
- for(var/obj/O in A)
- if(istype(O, my_controller_type))
- potentials += O
-
- //Couldn't find one
- if(!potentials.len)
- return null
-
- //Only found one
- if(potentials.len == 1)
- return potentials[1]
-
- //Gotta find closest
- var/closest = potentials[potentials.len]
- var/closest_dist = get_dist(src, closest)
- potentials.len--
- while(potentials.len)
- var/C = potentials[potentials.len]
- potentials.len--
- var/dist = get_dist(src, C)
- if(dist < closest_dist)
- closest_dist = dist
- closest = C
-
- return closest
-
-/obj/effect/map_helper/airlock/proc/setup()
- return //Stub for subtypes
-
-
-/*
- Doors
-*/
-/obj/effect/map_helper/airlock/door
- name = "use a subtype! - airlock door"
- my_device_type = /obj/machinery/door/airlock
-
-/obj/effect/map_helper/airlock/door/setup()
- var/obj/machinery/door/airlock/my_airlock = my_device
- my_airlock.lock()
- my_airlock.id_tag = my_controller.id_tag + tag_addon
- my_airlock.frequency = my_controller.frequency
- my_airlock.set_frequency(my_controller.frequency)
-
-/obj/effect/map_helper/airlock/door/ext_door
- name = "exterior airlock door"
- icon_state = "doorout"
- tag_addon = "_outer"
-
-/obj/effect/map_helper/airlock/door/int_door
- name = "interior airlock door"
- icon_state = "doorin"
- tag_addon = "_inner"
-
-/obj/effect/map_helper/airlock/door/simple
- name = "simple docking controller hatch"
- icon_state = "doorsimple"
- tag_addon = "_hatch"
- my_controller_type = /obj/machinery/embedded_controller/radio/simple_docking_controller
-
-
-/*
- Atmos
-*/
-/obj/effect/map_helper/airlock/atmos
- name = "use a subtype! - airlock pump"
- my_device_type = /obj/machinery/atmospherics/unary/vent_pump
-
-/obj/effect/map_helper/airlock/atmos/setup()
- var/obj/machinery/atmospherics/unary/vent_pump/my_pump = my_device
- my_pump.frequency = my_controller.frequency //Unlike doors, these set up their radios in atmos init, so they won't have gone before us.
- my_pump.id_tag = my_controller.id_tag + tag_addon
-
-/obj/effect/map_helper/airlock/atmos/chamber_pump
- name = "chamber pump"
- icon_state = "pump"
- tag_addon = "_pump"
-
-/obj/effect/map_helper/airlock/atmos/pump_out_internal
- name = "air dump intake"
- icon_state = "pumpdin"
- tag_addon = "_pump_out_internal"
-
-/obj/effect/map_helper/airlock/atmos/pump_out_external
- name = "air dump output"
- icon_state = "pumpdout"
- tag_addon = "_pump_out_external"
-
-
-/*
- Sensors - did you know they function as buttons? You don't also need a button.
-*/
-/obj/effect/map_helper/airlock/sensor
- name = "use a subtype! - airlock sensor"
- my_device_type = /obj/machinery/airlock_sensor
- var/command
-
-/obj/effect/map_helper/airlock/sensor/setup()
- var/obj/machinery/airlock_sensor/my_sensor = my_device
- my_sensor.id_tag = my_controller.id_tag + tag_addon
- my_sensor.master_tag = my_controller.id_tag
- my_sensor.frequency = my_controller.frequency
- my_sensor.set_frequency(my_controller.frequency)
- if(command)
- my_sensor.command = command
-
-/obj/effect/map_helper/airlock/sensor/ext_sensor
- name = "exterior sensor"
- icon_state = "sensout"
- tag_addon = "_exterior_sensor"
- command = "cycle_exterior"
-
-/obj/effect/map_helper/airlock/sensor/chamber_sensor
- name = "chamber sensor"
- icon_state = "sens"
- tag_addon = "_sensor"
- command = "cycle"
-
-/obj/effect/map_helper/airlock/sensor/int_sensor
- name = "interior sensor"
- icon_state = "sensin"
- tag_addon = "_interior_sensor"
- command = "cycle_interior"
-
-/*
- Buttons
-*/
-
-/obj/effect/map_helper/airlock/buttons
- name = "Just use a sensor instead. They are actually buttons."
+/*
+
+Note that these have to be in the same /area that the controller is in for them to function.
+You still need to set the controller's "id_tag" to something unique.
+Any frequency works, it's self-setting, but it seems like people have decided 1380 for airlocks so maybe set that on the controller too.
+
+*/
+
+/obj/effect/map_helper/airlock
+ name = "use a subtype!"
+ icon = 'icons/misc/map_helpers.dmi'
+ plane = 20 //I dunno just high.
+ alpha = 170
+
+ //The controller we're wanting our device to use
+ var/obj/machinery/embedded_controller/radio/my_controller
+ var/my_controller_type = /obj/machinery/embedded_controller/radio/airlock
+ //The device we're setting up
+ var/my_device
+ var/my_device_type
+ //Most things have a radio tag of some sort that needs adjusting
+ var/tag_addon
+
+/obj/effect/map_helper/airlock/Initialize()
+ ..()
+ my_controller = get_controller(get_area(src))
+ my_device = locate(my_device_type) in get_turf(src)
+ if(!my_device)
+ to_world("WARNING:Airlock helper '[name]' couldn't find what it wanted at: X:[x] Y:[y] Z:[z]")
+ else if(!my_controller)
+ to_world("WARNING:Airlock helper '[name]' couldn't find a controller at: X:[x] Y:[y] Z:[z]")
+ else if(!my_controller.id_tag)
+ to_world("WARNING:Airlock helper '[name]' found a controller without an 'id_tag' set: X:[x] Y:[y] Z:[z]")
+ else
+ setup()
+ return INITIALIZE_HINT_QDEL
+
+/obj/effect/map_helper/airlock/Destroy()
+ my_controller = null
+ my_device = null
+ return ..()
+
+/obj/effect/map_helper/airlock/proc/get_controller(var/area/A)
+ if(!A)
+ return null
+
+ var/list/potentials = list()
+ for(var/obj/O in A)
+ if(istype(O, my_controller_type))
+ potentials += O
+
+ //Couldn't find one
+ if(!potentials.len)
+ return null
+
+ //Only found one
+ if(potentials.len == 1)
+ return potentials[1]
+
+ //Gotta find closest
+ var/closest = potentials[potentials.len]
+ var/closest_dist = get_dist(src, closest)
+ potentials.len--
+ while(potentials.len)
+ var/C = potentials[potentials.len]
+ potentials.len--
+ var/dist = get_dist(src, C)
+ if(dist < closest_dist)
+ closest_dist = dist
+ closest = C
+
+ return closest
+
+/obj/effect/map_helper/airlock/proc/setup()
+ return //Stub for subtypes
+
+
+/*
+ Doors
+*/
+/obj/effect/map_helper/airlock/door
+ name = "use a subtype! - airlock door"
+ my_device_type = /obj/machinery/door/airlock
+
+/obj/effect/map_helper/airlock/door/setup()
+ var/obj/machinery/door/airlock/my_airlock = my_device
+ my_airlock.lock()
+ my_airlock.id_tag = my_controller.id_tag + tag_addon
+ my_airlock.frequency = my_controller.frequency
+ my_airlock.set_frequency(my_controller.frequency)
+ my_airlock.req_access = my_controller.req_access
+ my_airlock.req_one_access = my_controller.req_one_access
+
+/obj/effect/map_helper/airlock/door/ext_door
+ name = "exterior airlock door"
+ icon_state = "doorout"
+ tag_addon = "_outer"
+
+/obj/effect/map_helper/airlock/door/int_door
+ name = "interior airlock door"
+ icon_state = "doorin"
+ tag_addon = "_inner"
+
+/obj/effect/map_helper/airlock/door/simple
+ name = "simple docking controller hatch"
+ icon_state = "doorsimple"
+ tag_addon = "_hatch"
+ my_controller_type = /obj/machinery/embedded_controller/radio/simple_docking_controller
+
+
+/*
+ Atmos
+*/
+/obj/effect/map_helper/airlock/atmos
+ name = "use a subtype! - airlock pump"
+ my_device_type = /obj/machinery/atmospherics/unary/vent_pump
+
+/obj/effect/map_helper/airlock/atmos/setup()
+ var/obj/machinery/atmospherics/unary/vent_pump/my_pump = my_device
+ my_pump.frequency = my_controller.frequency //Unlike doors, these set up their radios in atmos init, so they won't have gone before us.
+ my_pump.id_tag = my_controller.id_tag + tag_addon
+
+/obj/effect/map_helper/airlock/atmos/chamber_pump
+ name = "chamber pump"
+ icon_state = "pump"
+ tag_addon = "_pump"
+
+/obj/effect/map_helper/airlock/atmos/pump_out_internal
+ name = "air dump intake"
+ icon_state = "pumpdin"
+ tag_addon = "_pump_out_internal"
+
+/obj/effect/map_helper/airlock/atmos/pump_out_external
+ name = "air dump output"
+ icon_state = "pumpdout"
+ tag_addon = "_pump_out_external"
+
+
+/*
+ Sensors - did you know they function as buttons? You don't also need a button.
+ CHOMPEdit: They don't function identically to buttons. They're also entirely unnecessary for station use because of their complexity.
+ They do function well and should be used for shuttle airlocks but unchanging environments don't need sensors.
+ A chamber sensor is still necessary.
+*/
+/obj/effect/map_helper/airlock/sensor
+ name = "use a subtype! - airlock sensor"
+ my_device_type = /obj/machinery/airlock_sensor
+ var/command
+
+/obj/effect/map_helper/airlock/sensor/setup()
+ var/obj/machinery/airlock_sensor/my_sensor = my_device
+ my_sensor.id_tag = my_controller.id_tag + tag_addon
+ my_sensor.master_tag = my_controller.id_tag
+ my_sensor.frequency = my_controller.frequency
+ my_sensor.set_frequency(my_controller.frequency)
+ my_sensor.req_access = my_controller.req_access
+ my_sensor.req_one_access = my_controller.req_one_access
+ if(command)
+ my_sensor.command = command
+
+/obj/effect/map_helper/airlock/sensor/ext_sensor
+ name = "exterior sensor"
+ icon_state = "sensout"
+ tag_addon = "_exterior_sensor"
+ command = "cycle_exterior"
+
+/obj/effect/map_helper/airlock/sensor/chamber_sensor
+ name = "chamber sensor"
+ icon_state = "sens"
+ tag_addon = "_sensor"
+ command = "cycle"
+
+/obj/effect/map_helper/airlock/sensor/int_sensor
+ name = "interior sensor"
+ icon_state = "sensin"
+ tag_addon = "_interior_sensor"
+ command = "cycle_interior"
+
+/*
+ Buttons
+*/
+
+// CHOMPStation Addition: Button helpers, because they didn't exist before due to 'just use sensors'
+/obj/effect/map_helper/airlock/button
+ name = "Use a subtype! - button"
+ my_device_type = /obj/machinery/access_button
+ var/command
+
+/obj/effect/map_helper/airlock/button/setup()
+ var/obj/machinery/airlock_sensor/my_button = my_device
+ my_button.master_tag = my_controller.id_tag
+ my_button.frequency = my_controller.frequency
+ my_button.set_frequency(my_controller.frequency)
+ my_button.req_access = my_controller.req_access
+ my_button.req_one_access = my_controller.req_one_access
+ if(command)
+ my_button.command = command
+
+/obj/effect/map_helper/airlock/button/ext_button
+ name = "exterior button"
+ icon_state = "btnout"
+ tag_addon = "_exterior_button"
+ command = "cycle_exterior"
+
+/obj/effect/map_helper/airlock/button/int_button
+ name = "interior button"
+ icon_state = "btnin"
+ tag_addon = "_interior_button"
+ command = "cycle_interior"
+// CHOMPStation Addition End
\ No newline at end of file
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index 601d65a616..2697595b59 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -214,6 +214,13 @@
x_offset = 24
y_offset = 24
+/datum/frame/frame_types/geiger //yw edit start
+ name = "Geiger Counter"
+ frame_class = FRAME_CLASS_ALARM
+ frame_size = 2
+ frame_style = FRAME_STYLE_WALL
+ x_offset = 28
+ y_offset = 28 //yw edit ends
//////////////////////////////
// Frame Object (Structure)
//////////////////////////////
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index e8e741b578..05aee888a9 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -76,6 +76,9 @@
secret_tracks |= T
else
tracks |= T
+ if(T.casino) //CHOMPEDIT: preventing casion tracks from being added to other jukeboxes
+ tracks -= T
+
else if(!LAZYLEN(tracks)) //We don't even have default tracks
stat |= BROKEN // No tracks configured this round!
diff --git a/code/game/machinery/jukebox_ch.dm b/code/game/machinery/jukebox_ch.dm
new file mode 100644
index 0000000000..86b0fc90b0
--- /dev/null
+++ b/code/game/machinery/jukebox_ch.dm
@@ -0,0 +1,21 @@
+
+/obj/machinery/media/jukebox/casinojukebox
+ name = "space casino jukebox"
+ icon = 'icons/obj/casino_ch.dmi'
+ icon_state = "casinojukebox-nopower"
+ state_base = "casinojukebox"
+
+// On initialization, copy our tracks from the global list
+/obj/machinery/media/jukebox/casinojukebox/Initialize()
+ . = ..()
+ if(LAZYLEN(all_jukebox_tracks)) //Global list has tracks
+ tracks.Cut()
+ secret_tracks.Cut()
+ for(var/datum/track/T in all_jukebox_tracks) //Load them
+ if(!T.casino)
+ tracks -= T
+ secret_tracks -= T
+ if(T.casino)
+ tracks |= T
+ else if(!LAZYLEN(tracks)) //We don't even have default tracks
+ stat |= BROKEN // No tracks configured this round!
\ No newline at end of file
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 81efc0f42b..0179dff591 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -67,6 +67,7 @@
L.updateicon()
area.power_change()
+ GLOB.lights_switched_on_roundstat++
/obj/machinery/light_switch/power_change()
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index de85f95e9a..ffa444612a 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -97,7 +97,7 @@
alert_readers(FC.announcement)
/datum/feed_network/proc/alert_readers(var/annoncement)
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
+ for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
NEWSCASTER.newsAlert(annoncement)
NEWSCASTER.update_icon()
@@ -166,7 +166,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
/obj/machinery/newscaster/Initialize()
..() //Not returning . because lateload below
- allCasters += src
+ GLOB.allCasters += src
unit_no = ++unit_no_cur
paper_remaining = 15
update_icon()
@@ -176,7 +176,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
node = get_exonet_node()
/obj/machinery/newscaster/Destroy()
- allCasters -= src
+ GLOB.allCasters -= src
node = null
return ..()
@@ -518,7 +518,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster)
var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.wanted_issue = null
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
+ for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
NEWSCASTER.update_icon()
set_temp("Wanted issue taken down.", "success", FALSE)
return TRUE
@@ -826,7 +826,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user)
spawn(300)
alert = 0
update_icon()
- playsound(src, 'sound/machines/twobeep.ogg', 75, 1)
+// playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1) //CHOMPEdit less peeps pls
else
for(var/mob/O in hearers(world.view-1, T))
O.show_message("[name] beeps, \"Attention! Wanted issue distributed!\"",2)
diff --git a/code/game/machinery/pipe/pipe_recipes.dm b/code/game/machinery/pipe/pipe_recipes.dm
index 8aee2a1908..4175efc3ff 100644
--- a/code/game/machinery/pipe/pipe_recipes.dm
+++ b/code/game/machinery/pipe/pipe_recipes.dm
@@ -134,7 +134,9 @@ GLOBAL_LIST_INIT(disposal_pipe_recipes, list(
dirtype = initial(construction_type.dispenser_class)
if (dirtype == PIPE_TRIN_M)
icon_state_m = "[icon_state]m"
- paintable = ispath(path, /obj/machinery/atmospherics/pipe) && !(ispath(path, /obj/machinery/atmospherics/pipe/vent)) // VOREStation Add
+
+ // YW Edit: Add HE pipes to non-paintable objects list.
+ paintable = ispath(path, /obj/machinery/atmospherics/pipe) && !(ispath(path, /obj/machinery/atmospherics/pipe/vent)) && !(ispath(path, /obj/machinery/atmospherics/pipe/simple/heat_exchanging)) // VOREStation Add
//
diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm
index 5b10e398a3..637ad9f53b 100644
--- a/code/game/machinery/pointdefense.dm
+++ b/code/game/machinery/pointdefense.dm
@@ -21,7 +21,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
. = ..()
if(id_tag)
//No more than 1 controller please.
- for(var/thing in pointdefense_controllers)
+ for(var/thing in GLOB.pointdefense_controllers)
var/obj/machinery/pointdefense_control/PC = thing
if(PC != src && PC.id_tag == id_tag)
warning("Two [src] with the same id_tag of [id_tag]")
@@ -75,8 +75,8 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
var/list/turrets = list()
if(id_tag)
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
- for(var/i = 1 to LAZYLEN(pointdefense_turrets))
- var/obj/machinery/power/pointdefense/PD = pointdefense_turrets[i]
+ for(var/i = 1 to LAZYLEN(GLOB.pointdefense_turrets))
+ var/obj/machinery/power/pointdefense/PD = GLOB.pointdefense_turrets[i]
if(!(PD.id_tag == id_tag && get_z(PD) in connected_z_levels))
continue
var/list/turret = list()
@@ -97,7 +97,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text
if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state))
// Check for duplicate controllers with this ID
- for(var/thing in pointdefense_controllers)
+ for(var/thing in GLOB.pointdefense_controllers)
var/obj/machinery/pointdefense_control/PC = thing
if(PC != src && PC.id_tag == id_tag)
to_chat(user, "The [new_ident] network already has a controller.")
@@ -203,7 +203,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense)
if(!id_tag)
return null
var/list/connected_z_levels = GetConnectedZlevels(get_z(src))
- for(var/thing in pointdefense_controllers)
+ for(var/thing in GLOB.pointdefense_controllers)
var/obj/machinery/pointdefense_control/PDC = thing
if(PDC.id_tag == id_tag && (get_z(PDC) in connected_z_levels))
return PDC
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index c205395199..6332bab79a 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -10,7 +10,7 @@
active_power_usage = 40000 //40 kW
var/efficiency = 40000 //will provide the modified power rate when upgraded
var/obj/item/charging = null
- var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/suit_cooling_unit/emergency, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/device/defib_kit, /obj/item/ammo_casing/microbattery) //VOREStation Add - NSFW Batteries
+ var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/suit_cooling_unit/emergency, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/device/defib_kit, /obj/item/ammo_casing/microbattery, /obj/item/ammo_magazine/cell_mag, /obj/item/weapon/gun/projectile/cell_loaded) //VOREStation Add - NSFW Batteries
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
@@ -68,9 +68,21 @@
if(EW.use_external_power)
to_chat(user, "\The [EW] has no recharge port.")
return
- if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/microbattery)) //VOREStation Edit: NSFW charging
- to_chat(user, "\The [G] does not have a battery installed.")
- return
+ else if(istype(G, /obj/item/ammo_magazine/cell_mag))
+ var/obj/item/ammo_magazine/cell_mag/maggy = G
+ if(maggy.stored_ammo.len < 1)
+ to_chat(user, "\The [G] does not have any cells installed.")
+ return
+ else if(istype(G, /obj/item/weapon/gun/projectile/cell_loaded))
+ var/obj/item/weapon/gun/projectile/cell_loaded/gunny = G
+ if(gunny.ammo_magazine)
+ var/obj/item/ammo_magazine/cell_mag/maggy = gunny.ammo_magazine
+ if(maggy.stored_ammo.len < 1)
+ to_chat(user, "\The [G] does not have any cell in its magazine installed.")
+ return
+ else
+ to_chat(user, "\The [G] does not have a magazine installed..")
+ return
user.drop_item()
G.loc = src
@@ -137,6 +149,7 @@
else if(istype(charging, /obj/item/ammo_casing/microbattery))
var/obj/item/ammo_casing/microbattery/batt = charging
if(batt.shots_left >= initial(batt.shots_left))
+ batt.shots_left = initial(batt.shots_left)
icon_state = icon_state_charged
update_use_power(USE_POWER_IDLE)
else
@@ -146,6 +159,26 @@
return
//VOREStation Add End
+ else if(istype(charging, /obj/item/ammo_magazine/cell_mag))
+ charge_mag(charging)
+
+ else if(istype(charging, /obj/item/weapon/gun/projectile/cell_loaded))
+ var/obj/item/weapon/gun/projectile/cell_loaded/gunny = charging
+ charge_mag(gunny.ammo_magazine)
+
+/obj/machinery/recharger/proc/charge_mag(var/obj/item/ammo_magazine/cell_mag/maggy)
+ var/tally = maggy.stored_ammo.len
+ for(var/obj/item/ammo_casing/microbattery/batt in maggy)
+ if(batt.shots_left < initial(batt.shots_left))
+ icon_state = icon_state_charging
+ batt.shots_left++
+ update_use_power(USE_POWER_ACTIVE)
+ else
+ tally -= 1
+ if(tally == 0)
+ icon_state = icon_state_charged
+ update_use_power(USE_POWER_IDLE)
+
/obj/machinery/recharger/emp_act(severity)
if(stat & (NOPOWER|BROKEN) || !anchored)
..(severity)
@@ -179,7 +212,7 @@
layer = ABOVE_TURF_LAYER
active_power_usage = 60000 //60 kW , It's more specialized than the standalone recharger (guns, batons, and flashlights only) so make it more powerful
efficiency = 60000
- allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/gun/magnetic, /obj/item/weapon/melee/baton, /obj/item/device/flashlight, /obj/item/weapon/cell/device)
+ allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/gun/magnetic, /obj/item/weapon/melee/baton, /obj/item/device/flashlight, /obj/item/weapon/cell/device, /obj/item/ammo_casing/microbattery, /obj/item/ammo_magazine/cell_mag, /obj/item/weapon/gun/projectile/cell_loaded)
icon_state_charged = "wrecharger2"
icon_state_charging = "wrecharger1"
icon_state_idle = "wrecharger0"
diff --git a/code/game/machinery/requests_console_vr.dm b/code/game/machinery/requests_console_vr.dm
index 9e93691c2e..6c1f5d63ad 100644
--- a/code/game/machinery/requests_console_vr.dm
+++ b/code/game/machinery/requests_console_vr.dm
@@ -90,3 +90,9 @@
name = "AI RC"
department = "AI"
departmentType = RC_ASSIST|RC_INFO
+
+/obj/machinery/requests_console/preset/hop //yw edit
+ name = "Head of personnel RC"
+ department = "Head of Personnel's Desk"
+ departmentType = RC_ASSIST|RC_INFO
+ announcementConsole = 1
\ No newline at end of file
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 87d2ca9b44..3d13b800e2 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -567,7 +567,7 @@
//Departments that the cycler can paint suits to look like.
var/list/departments = list("Engineering","Mining","Medical","Security","Atmospherics","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Security EVA")
//Species that the suits can be configured to fit.
- var/list/species = list(SPECIES_HUMAN,SPECIES_SKRELL,SPECIES_UNATHI,SPECIES_TAJ, SPECIES_TESHARI)
+ var/list/species = list(SPECIES_HUMAN,SPECIES_SKRELL,SPECIES_UNATHI,SPECIES_TAJ, SPECIES_TESHARI, /*yawngreyedit*/SPECIES_GREY_YW) //VORESTATION EDIT)
var/target_department
var/target_species
diff --git a/code/game/machinery/suit_storage_unit_vr.dm b/code/game/machinery/suit_storage_unit_vr.dm
index 168114844d..2b354cbd93 100644
--- a/code/game/machinery/suit_storage_unit_vr.dm
+++ b/code/game/machinery/suit_storage_unit_vr.dm
@@ -1,6 +1,6 @@
/obj/machinery/suit_cycler
- departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Exploration","Pilot Blue","Pilot","Manager","Prototype","No Change")
- species = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_VULPKANIN)
+ departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Emergency Medical Response","Crowd Control","Exploration","Pilot Blue","Pilot","Manager","Prototype")
+ species = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_VULPKANIN, /*yawngreyedit*/SPECIES_GREY_YW)
// Old Exploration is too WIP to use right now
/obj/machinery/suit_cycler/exploration
@@ -64,4 +64,4 @@
name = "Talon captain suit cycler"
model_text = "Talon captain"
req_access = list(access_talon)
- departments = list("Talon Officer","No Change")
\ No newline at end of file
+ departments = list("Talon Officer","No Change")
diff --git a/code/game/machinery/suit_storage_unit_yw.dm b/code/game/machinery/suit_storage_unit_yw.dm
new file mode 100644
index 0000000000..da60f289d5
--- /dev/null
+++ b/code/game/machinery/suit_storage_unit_yw.dm
@@ -0,0 +1,2 @@
+/obj/machinery/suit_cycler/prototype
+ req_access = list(access_hos)
\ No newline at end of file
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 2c59ec8b20..97ad09d2f8 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -90,7 +90,7 @@
if(user)
to_chat(user, "The connected wire doesn't have enough current.")
return
- for(var/obj/singularity/singulo in all_singularities)
+ for(var/obj/singularity/singulo in GLOB.all_singularities)
if(singulo.z == z)
singulo.target = src
icon_state = "[icontype]1"
@@ -100,7 +100,7 @@
to_chat(user, "You activate the beacon.")
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
- for(var/obj/singularity/singulo in all_singularities)
+ for(var/obj/singularity/singulo in GLOB.all_singularities)
if(singulo.target == src)
singulo.target = null
icon_state = "[icontype]0"
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 7a14fa2023..b4edf1d470 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -7,8 +7,8 @@
*/
-#define STATION_Z 1
-#define TELECOMM_Z 3
+#define STATION_Z 2
+#define TELECOMM_Z 4
/obj/machinery/telecomms
var/list/temp = null // output message
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index b9c616c14e..e9649fbbcb 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -40,8 +40,8 @@
id = "Hub"
network = "tcommsat"
autolinkers = list("hub", "relay", "c_relay", "s_relay", "m_relay", "r_relay", "science", "medical",
- "supply", "service", "common", "command", "engineering", "security", "unused", "hb_relay",
- "receiverA", "broadcasterA") //VOREStation Edit - Added "hb_relay"
+ "supply", "service", "common", "command", "engineering", "security", "unused", "hb_relay", "casino_relay",
+ "receiverA", "broadcasterA") //VOREStation Edit - Added "hb_relay" || CHOMPStation Edit - Added "casino_relay"
/obj/machinery/telecomms/hub/preset_cent
id = "CentCom Hub"
diff --git a/code/game/machinery/telecomms/presets_ch.dm b/code/game/machinery/telecomms/presets_ch.dm
new file mode 100644
index 0000000000..0d2191393f
--- /dev/null
+++ b/code/game/machinery/telecomms/presets_ch.dm
@@ -0,0 +1,8 @@
+// ### CHOMP Preset machines ###
+
+//Relay
+
+/obj/machinery/telecomms/relay/preset/casino
+ id = "Casino Relay"
+ autolinkers = list("casino_relay")
+ produces_heat = 0
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index cc8c262803..631e5b9779 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -24,7 +24,7 @@
teleport_control = new(src)
var/obj/machinery/teleport/station/station = null
var/obj/machinery/teleport/hub/hub = null
-
+
// Search surrounding turfs for the station, and then search the station's surrounding turfs for the hub.
for(var/direction in cardinal)
station = locate(/obj/machinery/teleport/station, get_step(src, direction))
diff --git a/code/game/machinery/vending_machines.dm b/code/game/machinery/vending_machines.dm
index 8f09407df7..82c9eb0581 100644
--- a/code/game/machinery/vending_machines.dm
+++ b/code/game/machinery/vending_machines.dm
@@ -751,8 +751,14 @@
/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,
//VOREStation Add End
+ //YawnWider Add Start
+ /obj/item/toy/plushie/teshari/_yw = 1,
+ /obj/item/toy/plushie/teshari/w_yw = 1,
+ /obj/item/toy/plushie/teshari/b_yw = 1,
+ /obj/item/toy/plushie/teshari/y_yw = 1)
+ //YawnWider Add End
premium = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/champagne = 1,
/obj/item/weapon/storage/trinketbox = 2)
prices = list(/obj/item/weapon/storage/fancy/heartbox = 15,
@@ -791,8 +797,14 @@
/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,
//VOREStation Add End
+ //YawnWider Add Start
+ /obj/item/toy/plushie/teshari/_yw = 150,
+ /obj/item/toy/plushie/teshari/w_yw = 150,
+ /obj/item/toy/plushie/teshari/b_yw = 150,
+ /obj/item/toy/plushie/teshari/y_yw = 150)
+ //YawnWider Add End
/obj/machinery/vending/fishing
diff --git a/code/game/machinery/vending_machines_vr.dm b/code/game/machinery/vending_machines_vr.dm
index a643f76d2b..7261f9f66b 100644
--- a/code/game/machinery/vending_machines_vr.dm
+++ b/code/game/machinery/vending_machines_vr.dm
@@ -15,7 +15,7 @@
/obj/machinery/vending/engivend/New()
products += list(/obj/item/clothing/glasses/omnihud/eng = 6)
- contraband += list(/obj/item/weapon/rms = 5)
+ //YW Removal: contraband += list(/obj/item/weapon/rms = 5)
..()
/obj/machinery/vending/medical/New()
@@ -1004,7 +1004,7 @@
/obj/item/clothing/suit/jacket/puffer/vest = 5,
/obj/item/clothing/suit/storage/flannel/red = 5,
/obj/item/clothing/suit/unathi/robe = 5,
- /obj/item/clothing/suit/storage/snowsuit = 5,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5,
/obj/item/clothing/suit/storage/toggle/internalaffairs = 5,
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5,
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5,
@@ -1091,7 +1091,7 @@
/obj/item/clothing/suit/jacket/puffer/vest = 100,
/obj/item/clothing/suit/storage/flannel/red = 100,
/obj/item/clothing/suit/unathi/robe = 100,
- /obj/item/clothing/suit/storage/snowsuit = 100,
+ /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 100,
/obj/item/clothing/suit/storage/toggle/internalaffairs = 100,
/obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 100,
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 100,
diff --git a/code/game/machinery/vending_yw.dm b/code/game/machinery/vending_yw.dm
new file mode 100644
index 0000000000..cec6c9abcf
--- /dev/null
+++ b/code/game/machinery/vending_yw.dm
@@ -0,0 +1,34 @@
+/obj/machinery/vending/cigarette/New()
+ products += list(/obj/item/weapon/storage/fancy/cigarettes/yw/mauser = 5)
+ prices += list(/obj/item/weapon/storage/fancy/cigarettes/yw/mauser = 18)
+ ..()
+
+/obj/machinery/vending/food/prison
+ name = "Prison Nutriment Vendor"
+ desc = "Delicious, probably not."
+ icon_state = "fridge_dark"
+ products = list(/obj/item/weapon/tray = 6,
+ /obj/item/weapon/material/kitchen/utensil/fork = 6,
+ /obj/item/weapon/material/knife/plastic = 6,
+ /obj/item/weapon/material/kitchen/utensil/spoon = 6,
+ /obj/item/weapon/reagent_containers/food/snacks/bugball = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 30,
+ /obj/item/weapon/reagent_containers/food/snacks/tofu = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/wishsoup = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 10,
+ )
+ contraband = list(/obj/item/weapon/reagent_containers/food/snacks/tofupie = 3)
+ vend_delay = 15
+
+/obj/machinery/vending/security/yw
+ name = "SecTech"
+ desc = "A security equipment vendor."
+ product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?"
+ icon_state = "sec"
+ req_access = list(access_security)
+ products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6)
+ contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2)
+ req_log_access = access_armory
+ has_logs = 1
\ No newline at end of file
diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm
index 4052afe8e6..4aa9f9c03a 100644
--- a/code/game/mecha/combat/gorilla.dm
+++ b/code/game/mecha/combat/gorilla.dm
@@ -1,8 +1,8 @@
/obj/mecha/combat/gorilla
- name = "Gorilla"
- desc = "Blitzkrieg!" //stop using all caps in item descs i will fight you. its redundant with the bold.
- icon = 'icons/mecha/mecha64x64.dmi'
+ desc = "BLITZKRIEEEEEEEG!"
+ name = "Sd.Kfz. 269 Mechakampfwagen Gorilla Ausf. A"
+ icon = 'icons/mecha/AxisMech.dmi'
icon_state = "pzrmech"
initial_icon = "pzrmech"
pixel_x = -16
@@ -11,8 +11,8 @@
maxhealth = 5000
opacity = 0 // Because there's big tall legs to look through. Also it looks fucky if this is set to 1.
deflect_chance = 50
- damage_absorption = list("brute"=0.1,"fire"=0.8,"bullet"=0.1,"laser"=0.6,"energy"=0.7,"bomb"=0.7) //values show how much damage will pass through, not how much will be absorbed.
- max_temperature = 35000 //Just a bit better than the Durand.
+ damage_absorption = list("brute"=0.1,"fire"=0.7,"bullet"=0.1,"laser"=0.6,"energy"=0.7,"bomb"=0.7) //values show how much damage will pass through, not how much will be absorbed.
+ max_temperature = 35000
infra_luminosity = 3
wreckage = /obj/effect/decal/mecha_wreckage/gorilla
add_req_access = 0
@@ -36,8 +36,6 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon(src)
ME.attach(src)
- ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon/weak(src) //Saves energy, I suppose. Anti-infantry.
- ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
@@ -46,18 +44,39 @@
/obj/mecha/combat/gorilla/mechstep(direction)
var/result = step(src,direction)
- playsound(src,"mechstep",40,1)
+ var/stepsound = rand(1,2)
+ if(result)
+ switch(stepsound)
+ if(1)
+ playsound(src,'sound/mecha/bigmech_lstep.ogg',40,1)
+ if(2)
+ playsound(src,'sound/mecha/bigmech_rstep.ogg',40,1)
return result
/obj/mecha/combat/gorilla/mechturn(direction)
dir = direction
- playsound(src,"mechstep",40,1)
+ var/turnsound = rand(1,2)
+ switch(turnsound)
+ if(1)
+ playsound(src,'sound/mecha/bigmech_lturn.ogg',40,1)
+ if(2)
+ playsound(src,'sound/mecha/bigmech_rturn.ogg',40,1)
+ return 1
+/obj/mecha/combat/gorilla/mechturn(direction)
+ dir = direction
+ var/turnsound = rand(1,2)
+ switch(turnsound)
+ if(1)
+ playsound(src,'sound/mecha/bigmech_lturn.ogg',40,1)
+ if(2)
+ playsound(src,'sound/mecha/bigmech_rturn.ogg',40,1)
+ return 1
/obj/mecha/combat/gorilla/relaymove(mob/user,direction)
- if(user != src.occupant)
+ if(user != src.occupant) //While not "realistic", this piece is player friendly.
user.loc = get_turf(src)
- to_chat(user, "You climb out from [src]")
+ user << "You climb out from [src]"
return 0
if(!can_move)
return 0
diff --git a/code/game/mecha/combat/scarab_ch.dm b/code/game/mecha/combat/scarab_ch.dm
new file mode 100644
index 0000000000..b42b2de166
--- /dev/null
+++ b/code/game/mecha/combat/scarab_ch.dm
@@ -0,0 +1,20 @@
+//ChompEdit - Making use of unused assets.
+/obj/mecha/combat/scarab
+ desc = "A very speedy and cramped quadredped combat mech designed for recon operations."
+ name = "Scarab"
+ icon_state = "scarab_militia"
+ initial_icon = "scarab_militia"
+ step_in = 2 // Four legs means FAST AS FUCK BOI
+ step_energy_drain = 5 //Half of normal step drain. Faster mech, more movement.
+ opacity = 0
+ health = 250
+ maxhealth = 250
+ deflect_chance = 10
+ damage_absorption = list("brute"=0.8,"fire"=1,"bullet"=0.8,"laser"=0.8,"energy"=1,"bomb"=1)
+ max_temperature = 20000
+ infra_luminosity = 6
+
+ wreckage = /obj/effect/decal/mecha_wreckage/scarab
+
+ max_hull_equip = 1
+ max_weapon_equip = 1
\ No newline at end of file
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index bec2b1a6c3..412437b3aa 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -240,7 +240,7 @@
if(EQUIP_SPECIAL)
chassis.special_equipment -= src
//VOREStation Addition begin: MICROMECHS
- if(EQUIP_MICRO_UTILITY)
+ if(EQUIP_MICRO_UTILITY)//CHOMPstation edit - This was improperly named bugging detaching on my equipment fix.
chassis.micro_utility_equipment -= src
if(EQUIP_MICRO_WEAPON)
chassis.micro_weapon_equipment -= src
diff --git a/code/game/mecha/equipment/tools/phoron_bore_ch.dm b/code/game/mecha/equipment/tools/phoron_bore_ch.dm
new file mode 100644
index 0000000000..a41c1fca15
--- /dev/null
+++ b/code/game/mecha/equipment/tools/phoron_bore_ch.dm
@@ -0,0 +1,15 @@
+//CHOMPedit, cool tunneling device is cool
+/obj/item/mecha_parts/mecha_equipment/weapon/phoron_bore
+ auto_rearm = 1
+ equip_cooldown = 15 // half of drill
+ name = "\improper PB-23 \"Phobos\" Phoron Bore"
+ desc = "A design for a large, mecha-mounted Phoron bore, stolen driectly from Grayson Manufactories Ltd. and reproducted by NT. It makes use a specialized compressed phoron crystal. The bolt it fires travels for 6 tiles before dissapaiting, breaking rocks and extracting minerals."
+ icon = 'icons/mecha/mecha_equipment_ch.dmi'
+ icon_state = "mecha_pbore"
+ energy_drain = 200
+ projectile = /obj/item/projectile/bullet/magnetic/bore
+ fire_sound = 'sound/weapons/railgun.ogg'
+
+ equip_type = EQUIP_UTILITY
+
+ origin_tech = list(TECH_MATERIAL = 5, TECH_PHORON = 5, TECH_POWER = 5)
diff --git a/code/game/mecha/equipment/weapons/ballistic/automatic.dm b/code/game/mecha/equipment/weapons/ballistic/automatic.dm
index 3578592511..3dd4acf81a 100644
--- a/code/game/mecha/equipment/weapons/ballistic/automatic.dm
+++ b/code/game/mecha/equipment/weapons/ballistic/automatic.dm
@@ -4,8 +4,8 @@
icon_state = "mecha_uac2"
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/pistol/medium
- fire_sound = 'sound/weapons/Gunshot_machinegun.ogg'
- projectiles = 30 //10 bursts, matching the Scattershot's 10. Also, conveniently, doesn't eat your powercell when reloading like 300 bullets does.
+ fire_sound = 'sound/weapons/UAC2.ogg'
+ projectiles = 300 //10 bursts, matching the Scattershot's 10. Also, conveniently, doesn't eat your powercell when reloading like 300 bullets does. //CHOMPEdit: Literally factually incorrect. You reloading 300 rounds is the same as reloading 30 rounds 10 times. Resetting this back to 300.
projectiles_per_shot = 3
deviation = 0.3
projectile_energy_cost = 20
diff --git a/code/game/mecha/equipment/weapons/ballistic/shotgun.dm b/code/game/mecha/equipment/weapons/ballistic/shotgun.dm
index e698248b7f..a0caf891e2 100644
--- a/code/game/mecha/equipment/weapons/ballistic/shotgun.dm
+++ b/code/game/mecha/equipment/weapons/ballistic/shotgun.dm
@@ -4,7 +4,7 @@
icon_state = "mecha_scatter"
equip_cooldown = 20
projectile = /obj/item/projectile/bullet/pellet/shotgun/flak
- fire_sound = 'sound/weapons/Gunshot_shotgun.ogg'
+ fire_sound = 'sound/weapons/LBX10.ogg'
fire_volume = 80
projectiles = 40
projectiles_per_shot = 4
@@ -24,4 +24,4 @@
projectiles = 20
deviation = 1
- equip_type = EQUIP_UTILITY
\ No newline at end of file
+ equip_type = EQUIP_UTILITY
diff --git a/code/game/mecha/equipment/weapons/energy/ion.dm b/code/game/mecha/equipment/weapons/energy/ion.dm
index 7d5be8ef2c..ef98c39ef9 100644
--- a/code/game/mecha/equipment/weapons/energy/ion.dm
+++ b/code/game/mecha/equipment/weapons/energy/ion.dm
@@ -5,7 +5,7 @@
icon_state = "mecha_ion"
energy_drain = 120
projectile = /obj/item/projectile/ion
- fire_sound = 'sound/weapons/Laser.ogg'
+ fire_sound = 'sound/weapons/IonCannon.ogg'
origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 4, TECH_MAGNET = 4)
@@ -17,4 +17,4 @@
energy_drain = 100
projectile = /obj/item/projectile/ion/pistol
- equip_type = EQUIP_UTILITY
\ No newline at end of file
+ equip_type = EQUIP_UTILITY
diff --git a/code/game/mecha/equipment/weapons/energy/laser.dm b/code/game/mecha/equipment/weapons/energy/laser.dm
index 5a480a9691..372fe67f0f 100644
--- a/code/game/mecha/equipment/weapons/energy/laser.dm
+++ b/code/game/mecha/equipment/weapons/energy/laser.dm
@@ -5,7 +5,7 @@
icon_state = "mecha_laser"
energy_drain = 30
projectile = /obj/item/projectile/beam
- fire_sound = 'sound/weapons/Laser.ogg'
+ fire_sound = 'sound/weapons/MediumLaser.ogg'
origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 3, TECH_MAGNET = 3)
@@ -36,7 +36,7 @@
icon_state = "mecha_laser-rig"
energy_drain = 60
projectile = /obj/item/projectile/beam
- fire_sound = 'sound/weapons/Laser.ogg'
+ fire_sound = 'sound/weapons/MediumLaser.ogg'
required_type = list(/obj/mecha/combat, /obj/mecha/working)
equip_type = EQUIP_UTILITY
@@ -50,7 +50,7 @@
icon_state = "mecha_laser"
energy_drain = 60
projectile = /obj/item/projectile/beam/heavylaser
- fire_sound = 'sound/weapons/lasercannonfire.ogg'
+ fire_sound = 'sound/weapons/LargeLaser.ogg'
step_delay = 1
@@ -67,4 +67,4 @@
equip_type = EQUIP_UTILITY
- origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4, TECH_PHORON = 3, TECH_ILLEGAL = 1)
\ No newline at end of file
+ origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4, TECH_PHORON = 3, TECH_ILLEGAL = 1)
diff --git a/code/game/mecha/equipment/weapons/explosive/missile.dm b/code/game/mecha/equipment/weapons/explosive/missile.dm
index f0c73de695..6b9d35bf2d 100644
--- a/code/game/mecha/equipment/weapons/explosive/missile.dm
+++ b/code/game/mecha/equipment/weapons/explosive/missile.dm
@@ -32,7 +32,7 @@
desc = "A missile battery that holds eight missiles."
icon_state = "mecha_missilerack"
projectile = /obj/item/projectile/bullet/srmrocket
- fire_sound = 'sound/weapons/rpg.ogg'
+ fire_sound = 'sound/weapons/SRM.ogg' //CHOMP Edit
projectiles = 8
projectile_energy_cost = 1000
equip_cooldown = 60
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 0482af9937..02c7e1f4df 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -64,6 +64,9 @@
projectiles = projectiles_per_shot
// set_ready_state(0)
+//CHOMPedit, redundant code removed. Fixes weapon lock on mob kill.
+ add_attack_logs(chassis.occupant,target, "Fired exosuit weapon [src.name] (MANUAL)")
+
do_after_cooldown()
return
@@ -90,4 +93,4 @@
if(!isnull(M.accuracy))
P.accuracy += M.accuracy
if(!isnull(M.accuracy_dispersion))
- P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0)
\ No newline at end of file
+ P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index e9e3397bba..e7e0d3b7dd 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -318,6 +318,7 @@
cell = null
internal_tank = null
+ GLOB.mech_destroyed_roundstat++ //CHOMP Edit This is for the roundtrivia system
if(smoke_possible) //Just making sure nothing is running.
qdel(smoke_system)
@@ -2219,7 +2220,7 @@
output += "Universal Module: [W.name] Detach
"
for(var/obj/item/mecha_parts/mecha_equipment/W in special_equipment)
output += "Special Module: [W.name] Detach
"
- for(var/obj/item/mecha_parts/mecha_equipment/W in micro_utility_equipment) // VOREstation Edit - Adds micro equipent to the menu
+ for(var/obj/item/mecha_parts/mecha_equipment/W in micro_utility_equipment)//CHOMPstation Edit - Adds micro equipent to the menu
output += "Micro Utility Module: [W.name] Detach
"
for(var/obj/item/mecha_parts/mecha_equipment/W in micro_weapon_equipment)
output += "Micro Weapon Module: [W.name] Detach
"
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index e345013e3d..b3909968b6 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -818,6 +818,7 @@
if(3)
if(diff==FORWARD)
user.visible_message("[user] installs the external armor layer to [holder].", "You install the external armor layer to [holder].")
+ //CHOMPedit. Prevents Sereniy from eating entire stacks of plasteel.
holder.icon_state = "gygax18"
else
user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
diff --git a/code/game/mecha/mecha_construction_paths_ch.dm b/code/game/mecha/mecha_construction_paths_ch.dm
new file mode 100644
index 0000000000..8d9ce06602
--- /dev/null
+++ b/code/game/mecha/mecha_construction_paths_ch.dm
@@ -0,0 +1,278 @@
+/datum/construction/mecha/scarab_chassis
+ steps = list(list("key"=/obj/item/mecha_parts/part/scarab_torso),//1
+ list("key"=/obj/item/mecha_parts/part/scarab_left_arm),//2
+ list("key"=/obj/item/mecha_parts/part/scarab_right_arm),//3
+ list("key"=/obj/item/mecha_parts/part/scarab_left_legs),//4
+ list("key"=/obj/item/mecha_parts/part/scarab_right_legs),//5
+ list("key"=/obj/item/mecha_parts/part/scarab_head)
+ )
+
+/datum/construction/mecha/scarab_chassis/custom_action(step, obj/item/I, mob/user)
+ user.visible_message("[user] has connected [I] to [holder].", "You connect [I] to [holder]")
+ holder.overlays += I.icon_state
+ qdel(I)
+ return 1
+
+/datum/construction/mecha/scarab_chassis/action(obj/item/I,mob/user as mob)
+ return check_all_steps(I,user)
+
+/datum/construction/mecha/scarab_chassis/spawn_result()
+ var/obj/item/mecha_parts/chassis/const_holder = holder
+ const_holder.construct = new /datum/construction/reversible/mecha/scarab(const_holder)
+ const_holder.icon = 'icons/mecha/mech_construction_ch.dmi'
+ const_holder.icon_state = "scarab_chassis_complete"
+ const_holder.density = 1
+ spawn()
+ qdel(src)
+ return
+
+
+/datum/construction/reversible/mecha/scarab
+ result = "/obj/mecha/combat/scarab"
+ steps = list(
+ //1
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=IS_WRENCH,
+ "desc"="External armor is wrenched."),
+ //2
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
+ "desc"="External armor is installed."),
+ //3
+ list("key"=/obj/item/stack/material/plasteel,
+ "backkey"=/obj/item/weapon/weldingtool,
+ "desc"="Internal armor is welded."),
+ //4
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=IS_WRENCH,
+ "desc"="Internal armor is wrenched"),
+ //5
+ list("key"=IS_WRENCH,
+ "backkey"=IS_CROWBAR,
+ "desc"="Internal armor is installed"),
+ //6
+ list("key"=/obj/item/stack/material/steel,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="Advanced capacitor is secured"),
+ //7
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
+ "desc"="Advanced capacitor is installed"),
+ //8
+ list("key"=/obj/item/weapon/stock_parts/capacitor/adv,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="Advanced scanner module is secured"),
+ //9
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
+ "desc"="Advanced scanner module is installed"),
+ //10
+ list("key"=/obj/item/weapon/stock_parts/scanning_module/adv,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="Targeting module is secured"),
+ //11
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
+ "desc"="Targeting module is installed"),
+ //12
+ list("key"=/obj/item/weapon/circuitboard/mecha/scarab/targeting,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="Peripherals control module is secured"),
+ //13
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
+ "desc"="Peripherals control module is installed"),
+ //14
+ list("key"=/obj/item/weapon/circuitboard/mecha/scarab/peripherals,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="Central control module is secured"),
+ //15
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_CROWBAR,
+ "desc"="Central control module is installed"),
+ //16
+ list("key"=/obj/item/weapon/circuitboard/mecha/scarab/main,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="The wiring is adjusted"),
+ //17
+ list("key"=/obj/item/weapon/tool/wirecutters,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="The wiring is added"),
+ //18
+ list("key"=/obj/item/stack/cable_coil,
+ "backkey"=IS_SCREWDRIVER,
+ "desc"="The hydraulic systems are active."),
+ //19
+ list("key"=IS_SCREWDRIVER,
+ "backkey"=IS_WRENCH,
+ "desc"="The hydraulic systems are connected."),
+ //20
+ list("key"=IS_WRENCH,
+ "desc"="The hydraulic systems are disconnected.")
+ )
+
+/datum/construction/reversible/mecha/scarab/action(obj/item/I,mob/user as mob)
+ return check_step(I,user)
+
+/datum/construction/reversible/mecha/scarab/custom_action(index, diff, obj/item/I, mob/user)
+ if(!..())
+ return 0
+
+ switch(index)
+ if(20)
+ user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ holder.icon_state = "scarab_chassis_complete"
+ if(19)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ holder.icon_state = "scarab_chassis_complete"
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
+ holder.icon_state = "scarab_chassis_complete"
+ if(18)
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ holder.icon_state = "scarab_wire1"
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
+ holder.icon_state = "scarab_chassis_complete"
+ if(17)
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ holder.icon_state = "scarab_wire2"
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
+ coil.amount = 4
+ holder.icon_state = "scarab_chassis_complete"
+ if(16)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ qdel(I)
+ holder.icon_state = "scarab_chip1"
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
+ holder.icon_state = "scarab_wire1"
+ if(15)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ holder.icon_state = "scarab_chip1"
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/scarab/main(get_turf(holder))
+ holder.icon_state = "scarab_wire2"
+ if(14)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ qdel(I)
+ holder.icon_state = "scarab_chip2"
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
+ holder.icon_state = "scarab_chip1"
+ if(13)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ holder.icon_state = "scarab_chip2"
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/scarab/peripherals(get_turf(holder))
+ holder.icon_state = "scarab_chip1"
+ if(12)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the weapon control module into [holder].", "You install the weapon control module into [holder].")
+ qdel(I)
+ holder.icon_state = "scarab_chip3"
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+ holder.icon_state = "scarab_chip1"
+ if(11)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
+ holder.icon_state = "scarab_chip3"
+ else
+ user.visible_message("[user] removes the weapon control module from [holder].", "You remove the weapon control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/scarab/targeting(get_turf(holder))
+ holder.icon_state = "scarab_chip2"
+ if(10)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs advanced scanner module to [holder].", "You install advanced scanner module to [holder].")
+ qdel(I)
+ holder.icon_state = "scarab_chip4"
+ else
+ user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.")
+ holder.icon_state = "scarab_chip3"
+ if(9)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the advanced scanner module.", "You secure the advanced scanner module.")
+ holder.icon_state = "scarab_chip4"
+ else
+ user.visible_message("[user] removes the advanced scanner module from [holder].", "You remove the advanced scanner module from [holder].")
+ new /obj/item/weapon/stock_parts/scanning_module/adv(get_turf(holder))
+ holder.icon_state = "scarab_chip3"
+ if(8)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs advanced capacitor to [holder].", "You install advanced capacitor to [holder].")
+ qdel(I)
+ holder.icon_state = "scarab_chip5"
+ else
+ user.visible_message("[user] unfastens the advanced scanner module.", "You unfasten the advanced scanner module.")
+ holder.icon_state = "scarab_chip3"
+ if(7)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the advanced capacitor.", "You secure the advanced capacitor.")
+ holder.icon_state = "scarab_chip5"
+ else
+ user.visible_message("[user] removes the advanced capacitor from [holder].", "You remove the advanced capacitor from [holder].")
+ new /obj/item/weapon/stock_parts/capacitor/adv(get_turf(holder))
+ holder.icon_state = "scarab_chip5"
+ if(6)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ holder.icon_state = "scarab_chip5"
+ else
+ user.visible_message("[user] unfastens the advanced capacitor.", "You unfasten the advanced capacitor.")
+ holder.icon_state = "scarab_chip4"
+ if(5)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ holder.icon_state = "scarab_chip5"
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "scarab_chip5"
+ if(4)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ holder.icon_state = "scarab_weld1"
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
+ holder.icon_state = "scarab_chip5"
+ if(3)
+ if(diff==FORWARD)
+ user.visible_message("[user] installs external armour layers to [holder].", "You install the external armor layer to [holder].")
+ holder.icon_state = "scarab_weld2"
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
+ holder.icon_state = "scarab_chip5"
+ if(2)
+ if(diff==FORWARD)
+ user.visible_message("[user] secures external armor layer.", "You secure the external armor layer.")
+ holder.icon_state = "scarab_weld2"
+ else
+ user.visible_message("[user] pries the external armor layer from [holder].", "You pry external armor layer from [holder].")
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
+ MS.amount = 5
+ holder.icon_state = "scarab_weld1"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens external armor layer.", "You unfasten the external armor layer.")
+ holder.icon_state = "scarab_weld2"
+ return 1
+
+/datum/construction/reversible/mecha/scarab/spawn_result()
+ ..()
+ feedback_inc("mecha_scarab_created",1)
+ return
\ No newline at end of file
diff --git a/code/game/mecha/mecha_parts_ch.dm b/code/game/mecha/mecha_parts_ch.dm
new file mode 100644
index 0000000000..ad61572d22
--- /dev/null
+++ b/code/game/mecha/mecha_parts_ch.dm
@@ -0,0 +1,50 @@
+/obj/item/mecha_parts/chassis/scarab
+ name = "Scarab Chassis"
+ icon = 'icons/mecha/mech_construct_ch.dmi'
+ icon_state = "scarab_chassis"
+
+ New()
+ ..()
+ construct = new /datum/construction/mecha/scarab_chassis(src)
+
+/obj/item/mecha_parts/part/scarab_torso
+ name="Scarab Torso"
+ desc="A torso part of Scarab. Contains power unit, processing core and life support systems."
+ icon = 'icons/mecha/mech_construct_ch.dmi'
+ icon_state = "scarab_torso"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 4, TECH_ENGINEERING = 3)
+
+/obj/item/mecha_parts/part/scarab_head
+ name="Scarab Head"
+ desc="A Scarab head. Houses advanced surveilance and target marking equipment."
+ icon = 'icons/mecha/mech_construct_ch.dmi'
+ icon_state = "scarab_head"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 3, TECH_ENGINEERING = 3)
+
+/obj/item/mecha_parts/part/scarab_left_arm
+ name="Scarab Left Arm"
+ desc="A Scarab left arm. Data and power sockets are compatible with most exosuit tools and weapons."
+ icon = 'icons/mecha/mech_construct_ch.dmi'
+ icon_state = "scarab_l_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
+
+/obj/item/mecha_parts/part/scarab_right_arm
+ name="Scarab Right Arm"
+ desc="A Scarab right arm. Data and power sockets are compatible with most exosuit tools and weapons."
+ icon = 'icons/mecha/mech_construct_ch.dmi'
+ icon_state = "scarab_r_arm"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
+
+/obj/item/mecha_parts/part/scarab_left_legs
+ name="Scarab Left Legs"
+ desc="A powerful, yet lightweight, pair of legs."
+ icon = 'icons/mecha/mech_construct_ch.dmi'
+ icon_state = "scarab_l_legs"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
+
+/obj/item/mecha_parts/part/scarab_right_legs
+ name="Scarab Right Legs"
+ desc="A powerful, yet lightweight, pair of legs."
+ icon = 'icons/mecha/mech_construct_ch.dmi'
+ icon_state = "scarab_r_legs"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
diff --git a/code/game/mecha/mecha_wreckage_ch.dm b/code/game/mecha/mecha_wreckage_ch.dm
new file mode 100644
index 0000000000..2725827c64
--- /dev/null
+++ b/code/game/mecha/mecha_wreckage_ch.dm
@@ -0,0 +1,16 @@
+/obj/effect/decal/mecha_wreckage/scarab
+ name = "Scarab Wreckage"
+ icon = 'icons/mecha/mecha_ch.dmi'
+ icon_state = "scarab_militia-broken"
+ desc = "Wasn't fast enough..."
+
+ welder_salvage = list(
+ /obj/item/mecha_parts/part/scarab_torso,
+ /obj/item/mecha_parts/part/scarab_head,
+ /obj/item/mecha_parts/part/scarab_left_arm,
+ /obj/item/mecha_parts/part/scarab_right_arm,
+ /obj/item/mecha_parts/part/scarab_left_legs,
+ /obj/item/mecha_parts/part/scarab_right_legs,
+ /obj/item/stack/material/plasteel,
+ /obj/item/stack/material/steel,
+ /obj/item/stack/rods)
\ No newline at end of file
diff --git a/code/game/objects/banners.dm b/code/game/objects/banners.dm
index 4d5a77dc7f..0e4aaef6d8 100644
--- a/code/game/objects/banners.dm
+++ b/code/game/objects/banners.dm
@@ -31,10 +31,9 @@
desc = "A banner with the symbol of the Solar Confederate Government."
catalogue_data = list(/datum/category_item/catalogue/information/organization/solgov)
-/* //VOREStation Removal
+//VOREStation Removal //CHOMP re-addition. Seriously? You commented this out for your lore? What's wrong with JUST NOT SPAWNING IT or something.
/obj/item/weapon/banner/virgov
name = "\improper VirGov banner"
icon_state = "banner-virgov"
desc = "A banner with the symbol of the local government, the Vir Governmental Authority, also known as VirGov."
- catalogue_data = list(/datum/category_item/catalogue/information/organization/virgov)
-*/
\ No newline at end of file
+// catalogue_data = list(/datum/category_item/catalogue/information/organization/virgov) //CHOMP Removal. We need to add our own code/game/busy_space/organizations.dm for lore
diff --git a/code/game/objects/banners_vr.dm b/code/game/objects/banners_vr.dm
index 75b014b1cc..ab84d37df4 100644
--- a/code/game/objects/banners_vr.dm
+++ b/code/game/objects/banners_vr.dm
@@ -1,2 +1,2 @@
/obj/item/weapon/banner/solgov
- name = "\improper SolCom banner"
\ No newline at end of file
+ name = "\improper SolGov banner" //YW EDIT: SolGov
\ No newline at end of file
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 533414d50c..f4603bba52 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -135,7 +135,7 @@
// step_towards(M, src)
. = buckle_mob(M, forced)
- playsound(src, 'sound/effects/seatbelt.ogg', 50, 1)
+ playsound(src.loc, 'sound/effects/seatbelt.ogg', 50, 1)
if(.)
var/reveal_message = list("buckled_mob" = null, "buckled_to" = null) //VORE EDIT: This being a list and messages existing for the buckle target atom.
if(!silent)
@@ -163,7 +163,7 @@
/atom/movable/proc/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
var/mob/living/M = unbuckle_mob(buckled_mob)
- playsound(src, 'sound/effects/seatbelt.ogg', 50, 1)
+ playsound(src.loc, 'sound/effects/seatbelt.ogg', 50, 1)
if(M)
if(M != user)
M.visible_message(\
diff --git a/code/game/objects/effects/alien/alien egg.dm b/code/game/objects/effects/alien/alien egg.dm
new file mode 100644
index 0000000000..8af53f8f3a
--- /dev/null
+++ b/code/game/objects/effects/alien/alien egg.dm
@@ -0,0 +1,96 @@
+#define MAX_PROGRESS 100
+
+/obj/structure/alien/egg //CHOMPedit this entire file is a CHOMPedit
+ desc = "It looks like a weird egg."
+ name = "egg"
+ icon_state = "egg_growing"
+ density = 0
+ anchored = 1
+ var/progress = 0
+
+/obj/structure/alien/egg/Initialize()
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/structure/alien/egg/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/structure/alien/egg/CanUseTopic(var/mob/user)
+ return isobserver(user) ? STATUS_INTERACTIVE : STATUS_CLOSE
+
+/obj/structure/alien/egg/Topic(href, href_list)
+ if(..())
+ return 1
+
+ if(href_list["spawn"])
+ attack_ghost(usr)
+
+/obj/structure/alien/egg/process()
+ progress++
+ if(progress >= MAX_PROGRESS)
+ for(var/mob/observer/ghost/O in GLOB.ghost_mob_list)
+ if(O.client && O.client.prefs && (BE_ALIEN))
+ to_chat(O, "An alien is ready to hatch! ([ghost_follow_link(src, O)]) (spawn)")
+ STOP_PROCESSING(SSobj, src)
+ update_icon()
+
+/obj/structure/alien/egg/update_icon()
+ if(progress == -1)
+ icon_state = "egg_hatched"
+ else if(progress < MAX_PROGRESS)
+ icon_state = "egg_growing"
+ else
+ icon_state = "egg"
+
+/obj/structure/alien/egg/attack_ghost(var/mob/observer/ghost/user)
+ if(progress == -1) //Egg has been hatched.
+ return
+
+ if(progress < MAX_PROGRESS)
+ to_chat(user, "\The [src] has not yet matured.")
+ return
+
+ if(!user.MayRespawn(1))
+ return
+
+ // Check for bans properly.
+ if(jobban_isbanned(user, MODE_XENOMORPH))
+ to_chat(user, "You are banned from playing a Xenomorph.")
+ return
+
+ var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes")
+
+ if(!src || confirm != "Yes")
+ return
+
+ if(!user || !user.ckey)
+ return
+
+ if(progress == -1) //Egg has been hatched.
+ to_chat(user, "Too slow...")
+ return
+
+ flick("egg_opening",src)
+ progress = -1 // No harvesting pls.
+ sleep(5)
+
+ if(!src || !user)
+ visible_message("\The [src] writhes with internal motion, but nothing comes out.")
+ progress = MAX_PROGRESS // Someone else can have a go.
+ return // What a pain.
+
+ // Create the mob, transfer over key.
+ var/mob/living/carbon/alien/larva/larva = new(get_turf(src))
+ larva.ckey = user.ckey
+ spawn(-1)
+ if(user) qdel(user) // Remove the keyless ghost if it exists.
+
+ visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!")
+
+ // Turn us into a hatched egg.
+ name = "hatched alien egg"
+ desc += " This one has hatched."
+ update_icon()
+
+#undef MAX_PROGRESS
diff --git a/code/game/objects/effects/alien/alien.dm b/code/game/objects/effects/alien/alien.dm
new file mode 100644
index 0000000000..5036f71c63
--- /dev/null
+++ b/code/game/objects/effects/alien/alien.dm
@@ -0,0 +1,62 @@
+/obj/structure/alien ////CHOMPedit This entire file is a CHOMPedit, for new eggs
+ name = "alien thing"
+ desc = "There's something alien about this."
+ icon = 'icons/mob/alien.dmi'
+ layer = ABOVE_JUNK_LAYER
+ var/health = 50
+
+/obj/structure/alien/proc/healthcheck()
+ if(health <=0)
+ set_density(0)
+ qdel(src)
+ return
+
+/obj/structure/alien/bullet_act(var/obj/item/projectile/Proj)
+ health -= Proj.damage
+ ..()
+ healthcheck()
+ return
+
+/obj/structure/alien/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ health-=50
+ if(2.0)
+ health-=50
+ if(3.0)
+ if (prob(50))
+ health-=50
+ else
+ health-=25
+ healthcheck()
+ return
+
+/obj/structure/alien/hitby(AM as mob|obj)
+ ..()
+ visible_message("\The [src] was hit by \the [AM].")
+ var/tforce = 0
+ if(ismob(AM))
+ tforce = 10
+ else
+ tforce = AM:throwforce
+ playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
+ health = max(0, health - tforce)
+ healthcheck()
+ ..()
+ return
+
+/obj/structure/alien/attack_generic()
+ attack_hand(usr)
+
+/obj/structure/alien/attackby(var/obj/item/weapon/W, var/mob/user)
+ health = max(0, health - W.force)
+ playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
+ healthcheck()
+ ..()
+ return
+
+/obj/structure/alien/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group) return 0
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return !opacity
+ return !density
diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm
index 836e277872..d2f2ad98a4 100644
--- a/code/game/objects/effects/alien/aliens.dm
+++ b/code/game/objects/effects/alien/aliens.dm
@@ -4,7 +4,6 @@
* Resin
* Weeds
* Acid
- * Egg
*/
/*
@@ -421,129 +420,4 @@
visible_message("[src.target] begins to crumble under the acid!")
spawn(rand(150, 200)) tick()
-/*
- * Egg
- */
-/var/const //for the status var
- BURST = 0
- BURSTING = 1
- GROWING = 2
- GROWN = 3
-
- MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger
- MAX_GROWTH_TIME = 3000
-
-/obj/effect/alien/egg
- desc = "It looks like a weird egg"
- name = "egg"
-// icon_state = "egg_growing" // So the egg looks 'grown', even though it's not.
- icon_state = "egg"
- density = 0
- anchored = 1
-
- var/health = 100
- var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive
-
-/obj/effect/alien/egg/New()
-/*
- if(config.aliens_allowed)
- ..()
- spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME))
- Grow()
- else
- qdel(src)
-*/
-/obj/effect/alien/egg/attack_hand(user as mob)
-
- var/mob/living/carbon/M = user
- if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs))
- return attack_hand(user)
-
- switch(status)
- if(BURST)
- to_chat(user, "You clear the hatched egg.")
- qdel(src)
- return
-/* if(GROWING)
- to_chat(user, "The child is not developed yet.")
- return
- if(GROWN)
- to_chat(user, "You retrieve the child.")
- Burst(0)
- return
-
-/obj/effect/alien/egg/proc/GetFacehugger() // Commented out for future edit.
- return locate(/obj/item/clothing/mask/facehugger) in contents
-
-/obj/effect/alien/egg/proc/Grow()
- icon_state = "egg"
-// status = GROWN
- status = BURST
-// new /obj/item/clothing/mask/facehugger(src)
- return
-*/
-/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining
- if(status == GROWN || status == GROWING)
-// var/obj/item/clothing/mask/facehugger/child = GetFacehugger()
- icon_state = "egg_hatched"
-/* flick("egg_opening", src)
- status = BURSTING
- spawn(15)
- status = BURST
- child.loc = get_turf(src)
-
- if(kill && istype(child))
- child.Die()
- else
- for(var/mob/M in range(1,src))
- if(CanHug(M))
- child.Attach(M)
- break
-*/
-/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
- ..()
- healthcheck()
- return
-
-/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb)
- visible_message("[user] [attack_verb] the [src]!")
- user.do_attack_animation(src)
- health -= damage
- healthcheck()
- return
-
-/obj/effect/alien/egg/take_damage(var/damage)
- health -= damage
- healthcheck()
- return
-
-
-/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user)
- if(health <= 0)
- return
- if(W.attack_verb.len)
- src.visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]")
- else
- src.visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]")
- var/damage = W.force / 4.0
-
- if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
-
- if(WT.remove_fuel(0, user))
- damage = 15
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
-
- src.health -= damage
- src.healthcheck()
-
-
-/obj/effect/alien/egg/proc/healthcheck()
- if(health <= 0)
- Burst()
-
-/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 500 + T0C)
- health -= 5
- healthcheck()
\ No newline at end of file
+//CHOMPedit old eggs removed
diff --git a/code/game/objects/effects/blockers_yw.dm b/code/game/objects/effects/blockers_yw.dm
new file mode 100644
index 0000000000..62d55d27fa
--- /dev/null
+++ b/code/game/objects/effects/blockers_yw.dm
@@ -0,0 +1,12 @@
+//simple mob blocker to use in VR to stop mobs from going through
+/obj/effect/mobblocker
+ name = "Mob blocker"
+ desc = "Blocks simple mobs from going through"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "directional_shield"
+ anchored = TRUE
+
+/obj/effect/mobblocker/CanPass(atom/movable/mover, turf/target)
+ if(istype(mover, /mob/living/simple_mob))
+ return FALSE
+ return TRUE
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/Cleanable/reagent_ch.dm b/code/game/objects/effects/decals/Cleanable/reagent_ch.dm
new file mode 100644
index 0000000000..da72466130
--- /dev/null
+++ b/code/game/objects/effects/decals/Cleanable/reagent_ch.dm
@@ -0,0 +1,48 @@
+////////////CHOMP CLEANABLE REAGENT PUDDLES/////////////////////
+
+/obj/effect/decal/cleanable/blood/reagent //Yes, we are using the blood system for this
+ name = "liquid"
+ dryname = "dried liquid"
+ desc = "It's a liquid, how boring and bland."
+ drydesc = "It's dry and crusty and boring and bland."
+ basecolor = "#FFFFFF"
+ var/ckey_source = null //The person the liquid came from
+ var/ckey_spawner = null //The person who extracted the reagent
+
+ var/custombasename = null
+ var/custombasedesc = null
+ var/custombasecolor = null
+
+/obj/effect/decal/cleanable/blood/reagent/New(var/spill_name, var/spill_color, var/spill_reagentid, var/new_amount, var/ckey_user, var/ckey_spawn)
+ switch(spill_reagentid) //To ensure that if people spill some liquids, it wont cause issues with spawning, like spilling blood. Also allow for spilling of certain things to
+ if("blood")
+ return
+ if("water") //Dont recall if we have a water puddle system, but keeping this blacklisted, would be silly with dried water puddles.
+ return
+
+ ckey_source = ckey_spawn
+ ckey_spawner = ckey_user
+
+ name = "[spill_name]"
+ dryname = "dried [spill_name]"
+ desc = "It's a puddle of [spill_name]"
+ drydesc = "It's a dried puddle of [spill_name]"
+ basecolor = spill_color
+ amount = new_amount
+
+ custombasename = "[spill_name]"
+ custombasedesc = "It's a puddle of [spill_name]"
+ custombasecolor = spill_color
+
+ update_icon()
+ START_PROCESSING(SSobj, src)
+
+/obj/effect/decal/cleanable/blood/reagent/update_icon()
+ if(custombasecolor == "rainbow") custombasecolor = "#[get_random_colour(1)]"
+
+ color = custombasecolor
+ name = custombasename
+ desc = custombasedesc
+
+/obj/effect/decal/cleanable/blood/reagent/Crossed(mob/living/carbon/human/perp)
+ //Nothing, we dont wanna spread our mess all over, at least not until people want that
diff --git a/code/game/objects/effects/decals/posters/polarisposters_vr.dm b/code/game/objects/effects/decals/posters/polarisposters_vr.dm
index 5045346289..2d91fe35c3 100644
--- a/code/game/objects/effects/decals/posters/polarisposters_vr.dm
+++ b/code/game/objects/effects/decals/posters/polarisposters_vr.dm
@@ -1,5 +1,5 @@
-/datum/poster/nanotrasen/nt_7
- name = "SolCom"
- desc = "This poster showcases an TCG emblem. The outer ring reads,\
+/datum/poster/nanotrasen/nt_7 //YW EDIT: SolGov, USDF
+ name = "SolGov"
+ desc = "This poster showcases an USDF emblem. The outer ring reads,\
\"NIL MORTALIBUS ARDUI EST\".\
Commonwealth of Sol-Procyon."
diff --git a/code/game/objects/effects/decals/posters/voreposters_vr.dm b/code/game/objects/effects/decals/posters/voreposters_vr.dm
index 006bf32d27..bf5ea3f341 100644
--- a/code/game/objects/effects/decals/posters/voreposters_vr.dm
+++ b/code/game/objects/effects/decals/posters/voreposters_vr.dm
@@ -1,3 +1,4 @@
+/* //CHOMPedit: commenting out most of these posters as half are virgo staff and many others are not suitable for here.
/datum/poster/vore_1
icon_state = "sbsposter1"
name = "Best Girl Pip"
@@ -46,6 +47,7 @@
icon_state = "dwposter1"
name = "WANTED: WAR CRIMINAL"
desc = "A poster bringing awareness to the distinguishing costume of a known war criminal operating in Virgo-Erigonne space."
+*/ //CHOMPedit end
/datum/poster/vore_15
icon_state = "dwposter2"
name = "Implanter"
@@ -58,18 +60,22 @@
icon_state = "dwposter4"
name = "We know"
desc = "A poster purporting the infallibility of NanoTrasen's forensics department."
+/* //CHOMPedit
/datum/poster/vore_18
icon_state = "dwposter5"
name = "KAT"
desc = "A promotional poster for popular exotube show 'Kat-Kat Korner'"
+*/ //CHOMPedit end
/datum/poster/vore_19
icon_state = "dwposter6"
name = "install.css"
desc = "A nostalgia trip."
+/* //CHOMPedit
/datum/poster/vore_20
icon_state = "dwposter7"
name = "TALON"
desc = "The logo and banner of a notable group of contractors known to trade with NanoTrasen."
+*/ //CHOMPedit end
/datum/poster/vore_21
icon_state = "dwposter8"
name = "GPA"
diff --git a/code/game/objects/effects/effect_system_ch.dm b/code/game/objects/effects/effect_system_ch.dm
new file mode 100644
index 0000000000..b6f4e1921f
--- /dev/null
+++ b/code/game/objects/effects/effect_system_ch.dm
@@ -0,0 +1,65 @@
+
+/////////////////////////////////////////////
+// Confetti and Glitter
+// Uses same system as smoke so can have directional travel
+/////////////////////////////////////////////
+
+/obj/effect/effect/confetti
+ name = "confetti"
+ icon = 'icons/effects/effects_ch.dmi'
+ icon_state = "confetti"
+ opacity = 0
+ anchored = 0.0
+ mouse_opacity = 0
+ var/amount = 6.0
+ var/time_to_live = 500
+
+/obj/effect/effect/confetti/New()
+ ..()
+ if(time_to_live)
+ spawn (time_to_live)
+ if(!QDELETED(src))
+ qdel(src)
+ //make confetti on ground cleanable decal to spawn
+
+/datum/effect/effect/system/confetti_spread
+ var/total_confetti = 0 // To stop it being spammed and lagging!
+ var/direction
+ var/confetti_type = /obj/effect/effect/confetti
+
+/datum/effect/effect/system/confetti_spread/set_up(n = 5, c = 0, loca, direct)
+ if(n > 10)
+ n = 10
+ number = n
+ cardinals = c
+ if(istype(loca, /turf/))
+ location = loca
+ else
+ location = get_turf(loca)
+ if(direct)
+ direction = direct
+
+/datum/effect/effect/system/confetti_spread/start(var/I)
+ var/i = 0
+ for(i=0, i 20)
+ return
+ spawn(0)
+ if(holder)
+ src.location = get_turf(holder)
+ var/obj/effect/effect/confetti/confetti = new confetti_type(src.location)
+ src.total_confetti++
+ if(I)
+ confetti.color = I //Allows us to do differently colored confetti
+ var/direction = src.direction
+ if(!direction)
+ if(src.cardinals)
+ direction = pick(cardinal)
+ else
+ direction = pick(alldirs)
+ for(i=0, iAccording the blueprints, you are now in outer space. Hold your breath."
+ if(!istype(A, /area/space))//YWEdit Start.
+ text += "According the blueprints, you are now in \"[A.name]\".
"
+ else
+ text += "According the blueprints, you are now in outer space. Hold your breath.
" //YWEdit End.
if (AREA_STATION)
text += "According the blueprints, you are now in \"[A.name]\".
"
if (AREA_SPECIAL)
@@ -116,6 +120,9 @@
return A
/obj/item/blueprints/proc/get_area_type(var/area/A = get_area())
+ for(var/type in SPACE_OUTSIDE_TYPES) //YWEDIT Start.
+ if(istype(A, type))
+ return AREA_SPACE //YWEDIT End.
for(var/type in SPACE_AREA_TYPES)
if(istype(A, type))
return AREA_SPACE
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index b49ee7a70f..690cdefff1 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -40,6 +40,26 @@
storage_capacity = (MOB_MEDIUM * 2) - 1
var/contains_body = 0
+//Yawn add
+/obj/item/bodybag/large
+ name = "mass grave body bag"
+ desc = "A large folded bag designed for the storage and transportation of cadavers."
+ icon = 'icons/obj/closets/bodybag_large.dmi'
+ w_class = ITEMSIZE_LARGE
+
+ attack_self(mob/user)
+ var/obj/structure/closet/body_bag/large/R = new /obj/structure/closet/body_bag/large(user.loc)
+ R.add_fingerprint(user)
+ qdel(src)
+
+/obj/structure/closet/body_bag/large
+ name = "mass grave body bag"
+ desc = "A massive body bag that holds as much as it does due to bluespace lining on its zipper. Shockingly compact for its storage."
+ icon = 'icons/obj/closets/bodybag_large.dmi'
+ storage_capacity = (MOB_MEDIUM * 12) - 1 //Holds 12 bodys
+ item_path = /obj/item/bodybag/large
+//End of Yawn add
+
/obj/structure/closet/body_bag/attackby(var/obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/pen))
var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
diff --git a/code/game/objects/items/devices/communicator/helper.dm b/code/game/objects/items/devices/communicator/helper.dm
index b406100456..5cf5eac2c2 100644
--- a/code/game/objects/items/devices/communicator/helper.dm
+++ b/code/game/objects/items/devices/communicator/helper.dm
@@ -44,18 +44,19 @@
var/index = 0
for(var/datum/feed_message/FM in channel.messages)
index++
- var/list/msgdata = list(
- "author" = FM.author,
- "body" = FM.body,
- "img" = null,
- "message_type" = FM.message_type,
- "time_stamp" = FM.time_stamp,
- "caption" = FM.caption,
- "index" = index
- )
if(FM.img)
- msgdata["img"] = icon2base64(FM.img)
- messages[++messages.len] = msgdata
+ usr << browse_rsc(FM.img, "pda_news_tmp_photo_[feeds["channel"]]_[index].png")
+ // News stories are HTML-stripped but require newline replacement to be properly displayed in NanoUI
+ var/body = replacetext(FM.body, "\n", "
")
+ messages[++messages.len] = list(
+ "author" = FM.author,
+ "body" = body,
+ "message_type" = FM.message_type,
+ "time_stamp" = FM.time_stamp,
+ "has_image" = (FM.img != null),
+ "caption" = FM.caption,
+ "index" = index
+ )
feeds[++feeds.len] = list(
"name" = channel.channel_name,
@@ -95,3 +96,448 @@
news.Swap(1, 3) // List is sorted in ascending order of timestamp, we want descending
return news
+
+
+
+// Putting the commcard data harvesting helpers here
+// Not ideal to put all the procs on the base type
+// but it may open options for adminbus,
+// And it saves duplicated code
+
+
+// Medical records
+/obj/item/weapon/commcard/proc/get_med_records()
+ var/med_records[0]
+ for(var/datum/data/record/M in sortRecord(data_core.medical))
+ var/record[0]
+ record[++record.len] = list("tab" = "Name", "val" = M.fields["name"])
+ record[++record.len] = list("tab" = "ID", "val" = M.fields["id"])
+ record[++record.len] = list("tab" = "Blood Type", "val" = M.fields["b_type"])
+ record[++record.len] = list("tab" = "DNA #", "val" = M.fields["b_dna"])
+ record[++record.len] = list("tab" = "Gender", "val" = M.fields["id_gender"])
+ record[++record.len] = list("tab" = "Entity Classification", "val" = M.fields["brain_type"])
+ record[++record.len] = list("tab" = "Minor Disorders", "val" = M.fields["mi_dis"])
+ record[++record.len] = list("tab" = "Major Disorders", "val" = M.fields["ma_dis"])
+ record[++record.len] = list("tab" = "Allergies", "val" = M.fields["alg"])
+ record[++record.len] = list("tab" = "Condition", "val" = M.fields["cdi"])
+ record[++record.len] = list("tab" = "Notes", "val" = M.fields["notes"])
+
+ med_records[++med_records.len] = list("name" = M.fields["name"], "record" = record)
+ return med_records
+
+
+// Employment records
+/obj/item/weapon/commcard/proc/get_emp_records()
+ var/emp_records[0]
+ for(var/datum/data/record/G in sortRecord(data_core.general))
+ var/record[0]
+ record[++record.len] = list("tab" = "Name", "val" = G.fields["name"])
+ record[++record.len] = list("tab" = "ID", "val" = G.fields["id"])
+ record[++record.len] = list("tab" = "Rank", "val" = G.fields["rank"])
+ record[++record.len] = list("tab" = "Fingerprint", "val" = G.fields["fingerprint"])
+ record[++record.len] = list("tab" = "Entity Classification", "val" = G.fields["brain_type"])
+ record[++record.len] = list("tab" = "Sex", "val" = G.fields["sex"])
+ record[++record.len] = list("tab" = "Species", "val" = G.fields["species"])
+ record[++record.len] = list("tab" = "Age", "val" = G.fields["age"])
+ record[++record.len] = list("tab" = "Notes", "val" = G.fields["notes"])
+
+ emp_records[++emp_records.len] = list("name" = G.fields["name"], "record" = record)
+ return emp_records
+
+
+// Security records
+/obj/item/weapon/commcard/proc/get_sec_records()
+ var/sec_records[0]
+ for(var/datum/data/record/G in sortRecord(data_core.general))
+ var/record[0]
+ record[++record.len] = list("tab" = "Name", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Sex", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Species", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Age", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Rank", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Fingerprint", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Physical Status", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Mental Status", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Criminal Status", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Major Crimes", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Minor Crimes", "val" = G.fields[""])
+ record[++record.len] = list("tab" = "Notes", "val" = G.fields["notes"])
+
+ sec_records[++sec_records.len] = list("name" = G.fields["name"], "record" = record)
+ return sec_records
+
+
+// Status of all secbots
+// Weaker than what PDAs appear to do, but as of 7/1/2018 PDA secbot access is nonfunctional
+/obj/item/weapon/commcard/proc/get_sec_bot_access()
+ var/sec_bots[0]
+ for(var/mob/living/bot/secbot/S in mob_list)
+ // Get new bot
+ var/status[0]
+ status[++status.len] = list("tab" = "Name", "val" = sanitize(S.name))
+
+ // If it's turned off, then it shouldn't be broadcasting any further info
+ if(!S.on)
+ status[++status.len] = list("tab" = "Power", "val" = "Off") // Encoding the span classes here so I don't have to do complicated switches in the ui template
+ continue
+ status[++status.len] = list("tab" = "Power", "val" = "On")
+
+ // -- What it's doing
+ // If it's engaged, then say who it thinks it's engaging
+ if(S.target)
+ status[++status.len] = list("tab" = "Status", "val" = "Apprehending Target")
+ status[++status.len] = list("tab" = "Target", "val" = S.target_name(S.target))
+ // Else if it's patrolling
+ else if(S.will_patrol)
+ status[++status.len] = list("tab" = "Status", "val" = "Patrolling")
+ // Otherwise we don't know what it's doing
+ else
+ status[++status.len] = list("tab" = "Status", "val" = "Idle")
+
+ // Where it is
+ status[++status.len] = list("tab" = "Location", "val" = sanitize("[get_area(S.loc)]"))
+
+ // Append bot to the list
+ sec_bots[++sec_bots.len] = list("bot" = S.name, "status" = status)
+ return sec_bots
+
+
+// Code and frequency of stored signalers
+// Supports multiple signalers within the device
+/obj/item/weapon/commcard/proc/get_int_signalers()
+ var/signalers[0]
+ for(var/obj/item/device/assembly/signaler/S in internal_devices)
+ var/unit[0]
+ unit[++unit.len] = list("tab" = "Code", "val" = S.code)
+ unit[++unit.len] = list("tab" = "Frequency", "val" = S.frequency)
+
+ signalers[++signalers.len] = list("ref" = "\ref[S]", "status" = unit)
+
+ return signalers
+
+// Returns list of all powernet sensors currently visible to the commcard
+/obj/item/weapon/commcard/proc/find_powernet_sensors()
+ var/grid_sensors[0]
+
+ // Find all the powernet sensors we need to pull data from
+ // Copied from /datum/nano_module/power_monitor/proc/refresh_sensors(),
+ // located in '/code/modules/nano/modules/power_monitor.dm'
+ // Minor tweaks for efficiency and cleanliness
+ var/turf/T = get_turf(src)
+ if(T)
+ var/list/levels = using_map.get_map_levels(T.z, FALSE)
+ for(var/obj/machinery/power/sensor/S in machines)
+ if((S.long_range) || (S.loc.z in levels) || (S.loc.z == T.z)) // Consoles have range on their Z-Level. Sensors with long_range var will work between Z levels.
+ if(S.name_tag == "#UNKN#") // Default name. Shouldn't happen!
+ warning("Powernet sensor with unset ID Tag! [S.x]X [S.y]Y [S.z]Z")
+ else
+ grid_sensors += S
+ return grid_sensors
+
+// List of powernets
+/obj/item/weapon/commcard/proc/get_powernet_monitoring_list()
+ // Fetch power monitor data
+ var/sensors[0]
+
+ for(var/obj/machinery/power/sensor/S in internal_data["grid_sensors"])
+ var/list/focus = S.return_reading_data()
+
+ sensors[++sensors.len] = list(
+ "name" = S.name_tag,
+ "alarm" = focus["alarm"]
+ )
+
+ return sensors
+
+// Information about the targeted powernet
+/obj/item/weapon/commcard/proc/get_powernet_target(var/target_sensor)
+ if(!target_sensor)
+ return
+
+ var/powernet_target[0]
+
+ for(var/obj/machinery/power/sensor/S in internal_data["grid_sensors"])
+ var/list/focus = S.return_reading_data()
+
+ // Packages the span class here so it doesn't need to be interpreted w/in the for loop in the ui template
+ var/load_stat = "Optimal"
+ if(focus["load_percentage"] >= 95)
+ load_stat = "DANGER: Overload"
+ else if(focus["load_percentage"] >= 85)
+ load_stat = "WARNING: High Load"
+
+ var/alarm_stat = focus["alarm"] ? "WARNING: Abnormal activity detected!" : "Secure"
+
+ if(target_sensor == S.name_tag)
+ powernet_target = list(
+ "name" = S.name_tag,
+ "alarm" = focus["alarm"],
+ "error" = focus["error"],
+ "apc_data" = focus["apc_data"],
+ "status" = list(
+ list("field" = "Network Load Status", "statval" = load_stat),
+ list("field" = "Network Security Status", "statval" = alarm_stat),
+ list("field" = "Load Percentage", "statval" = focus["load_percentage"]),
+ list("field" = "Available Power", "statval" = focus["total_avail"]),
+ list("field" = "APC Power Usage", "statval" = focus["total_used_apc"]),
+ list("field" = "Other Power Usage", "statval" = focus["total_used_other"]),
+ list("field" = "Total Usage", "statval" = focus["total_used_all"])
+ )
+ )
+
+ return powernet_target
+
+// Compiles the locations of all janitorial paraphernalia, as used by janitorialLocator.tmpl
+/obj/item/weapon/commcard/proc/get_janitorial_locations()
+ // Fetch janitorial locator
+ var/janidata[0]
+ var/list/cleaningList = list()
+ cleaningList += GLOB.all_mops + GLOB.all_mopbuckets + GLOB.all_janitorial_carts
+
+ // User's location
+ var/turf/userloc = get_turf(src)
+ if(isturf(userloc))
+ janidata[++janidata.len] = list("field" = "Current Location", "val" = "[userloc.x], [userloc.y], [using_map.get_zlevel_name(userloc.z)]")
+ else
+ janidata[++janidata.len] = list("field" = "Current Location", "val" = "Unknown")
+ return janidata // If the user isn't on a valid turf, then it shouldn't be able to find anything anyways
+
+ // Mops, mop buckets, janitorial carts.
+ for(var/obj/C in cleaningList)
+ var/turf/T = get_turf(C)
+ if(isturf(T) )//&& T.z in using_map.get_map_levels(userloc, FALSE))
+ if(T.z == userloc.z)
+ janidata[++janidata.len] = list("field" = apply_text_macros("\proper [C.name]"), "val" = "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]")
+ else
+ janidata[++janidata.len] = list("field" = apply_text_macros("\proper [C.name]"), "val" = "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]")
+
+ // Cleanbots
+ for(var/mob/living/bot/cleanbot/B in living_mob_list)
+ var/turf/T = get_turf(B)
+ if(isturf(T) )//&& T.z in using_map.get_map_levels(userloc, FALSE))
+ var/textout = ""
+ if(B.on)
+ textout += "Status: Online
"
+ if(T.z == userloc.z)
+ textout += "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]"
+ else
+ textout += "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]"
+ else
+ textout += "Status: Offline"
+
+ janidata[++janidata.len] = list("field" = "[B.name]", "val" = textout)
+
+ return janidata
+
+// Compiles the three lists used by GPS_access.tmpl
+// The contents of the three lists are inherently related, so separating them into different procs would be largely redundant
+/obj/item/weapon/commcard/proc/get_GPS_lists()
+ // GPS Access
+ var/intgps[0] // Gps devices within the commcard -- Allow tag edits, turning on/off, etc
+ var/extgps[0] // Gps devices not inside the commcard -- Print locations if a gps is on
+ var/stagps[0] // Gps net status, location, whether it's on, if it's got long range
+ var/obj/item/device/gps/cumulative = new(src)
+ cumulative.tracking = FALSE
+ cumulative.local_mode = TRUE // Won't detect long-range signals automatically
+ cumulative.long_range = FALSE
+ var/list/toggled_gps = list() // List of GPS units that are turned off before display_list() is called
+
+ for(var/obj/item/device/gps/G in internal_devices)
+ var/gpsdata[0]
+ if(G.tracking && !G.emped)
+ cumulative.tracking = TRUE // Turn it on
+ if(G.long_range)
+ cumulative.long_range = TRUE // It can detect long-range
+ if(!G.local_mode)
+ cumulative.local_mode = FALSE // It is detecting long-range
+
+ gpsdata["ref"] = "\ref[G]"
+ gpsdata["tag"] = G.gps_tag
+ gpsdata["power"] = G.tracking
+ gpsdata["local_mode"] = G.local_mode
+ gpsdata["long_range"] = G.long_range
+ gpsdata["hide_signal"] = G.hide_signal
+ gpsdata["can_hide"] = G.can_hide_signal
+
+ intgps[++intgps.len] = gpsdata // Add it to the list
+
+ if(G.tracking)
+ G.tracking = FALSE // Disable the internal gps units so they don't show up in the report
+ toggled_gps += G
+
+ var/list/remote_gps = cumulative.display_list() // Fetch information for all units except the ones inside of this device
+
+ for(var/obj/item/device/gps/G in toggled_gps) // Reenable any internal GPS units
+ G.tracking = TRUE
+
+ stagps["enabled"] = cumulative.tracking
+ stagps["long_range_en"] = (cumulative.long_range && !cumulative.local_mode)
+
+ stagps["my_area_name"] = remote_gps["my_area_name"]
+ stagps["curr_x"] = remote_gps["curr_x"]
+ stagps["curr_y"] = remote_gps["curr_y"]
+ stagps["curr_z"] = remote_gps["curr_z"]
+ stagps["curr_z_name"] = remote_gps["curr_z_name"]
+
+ extgps = remote_gps["gps_list"] // Compiled by the GPS
+
+ qdel(cumulative) // Don't want spare GPS units building up in the contents
+
+ return list(
+ intgps,
+ extgps,
+ stagps
+ )
+
+// Collects the current status of the supply shuttle
+// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
+// code\game\machinery\computer\supply.dm, starting at line 55
+/obj/item/weapon/commcard/proc/get_supply_shuttle_status()
+ var/shuttle_status[0]
+ var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle
+ if(shuttle)
+ if(shuttle.has_arrive_time())
+ shuttle_status["location"] = "In transit"
+ shuttle_status["mode"] = SUP_SHUTTLE_TRANSIT
+ shuttle_status["time"] = shuttle.eta_minutes()
+
+ else
+ shuttle_status["time"] = 0
+ if(shuttle.at_station())
+ if(shuttle.shuttle_docking_controller)
+ switch(shuttle.shuttle_docking_controller.get_docking_status())
+ if("docked")
+ shuttle_status["location"] = "Docked"
+ shuttle_status["mode"] = SUP_SHUTTLE_DOCKED
+ if("undocked")
+ shuttle_status["location"] = "Undocked"
+ shuttle_status["mode"] = SUP_SHUTTLE_UNDOCKED
+ if("docking")
+ shuttle_status["location"] = "Docking"
+ shuttle_status["mode"] = SUP_SHUTTLE_DOCKING
+ shuttle_status["force"] = shuttle.can_force()
+ if("undocking")
+ shuttle_status["location"] = "Undocking"
+ shuttle_status["mode"] = SUP_SHUTTLE_UNDOCKING
+ shuttle_status["force"] = shuttle.can_force()
+
+ else
+ shuttle_status["location"] = "Station"
+ shuttle_status["mode"] = SUP_SHUTTLE_DOCKED
+
+ else
+ shuttle_status["location"] = "Away"
+ shuttle_status["mode"] = SUP_SHUTTLE_AWAY
+
+ if(shuttle.can_launch())
+ shuttle_status["launch"] = 1
+ else if(shuttle.can_cancel())
+ shuttle_status["launch"] = 2
+ else
+ shuttle_status["launch"] = 0
+
+ switch(shuttle.moving_status)
+ if(SHUTTLE_IDLE)
+ shuttle_status["engine"] = "Idle"
+ if(SHUTTLE_WARMUP)
+ shuttle_status["engine"] = "Warming up"
+ if(SHUTTLE_INTRANSIT)
+ shuttle_status["engine"] = "Engaged"
+
+ else
+ shuttle["mode"] = SUP_SHUTTLE_ERROR
+
+ return shuttle_status
+
+// Compiles the list of supply orders
+// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
+// code\game\machinery\computer\supply.dm, starting at line 130
+/obj/item/weapon/commcard/proc/get_supply_orders()
+ var/orders[0]
+ for(var/datum/supply_order/S in SSsupply.order_history)
+ orders[++orders.len] = list(
+ "ref" = "\ref[S]",
+ "status" = S.status,
+ "entries" = list(
+ list("field" = "Supply Pack", "entry" = S.name),
+ list("field" = "Cost", "entry" = S.cost),
+ list("field" = "Index", "entry" = S.index),
+ list("field" = "Reason", "entry" = S.comment),
+ list("field" = "Ordered by", "entry" = S.ordered_by),
+ list("field" = "Ordered at", "entry" = S.ordered_at),
+ list("field" = "Approved by", "entry" = S.approved_by),
+ list("field" = "Approved at", "entry" = S.approved_at)
+ )
+ )
+
+ return orders
+
+// Compiles the list of supply export receipts
+// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
+// code\game\machinery\computer\supply.dm, starting at line 147
+/obj/item/weapon/commcard/proc/get_supply_receipts()
+ var/receipts[0]
+ for(var/datum/exported_crate/E in SSsupply.exported_crates)
+ receipts[++receipts.len] = list(
+ "ref" = "\ref[E]",
+ "contents" = E.contents,
+ "error" = E.contents["error"],
+ "title" = list(
+ list("field" = "Name", "entry" = E.name),
+ list("field" = "Value", "entry" = E.value)
+ )
+ )
+ return receipts
+
+
+// Compiles the list of supply packs for the category currently stored in internal_data["supply_category"]
+// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
+// code\game\machinery\computer\supply.dm, starting at line 147
+/obj/item/weapon/commcard/proc/get_supply_pack_list()
+ var/supply_packs[0]
+ for(var/pack_name in SSsupply.supply_pack)
+ var/datum/supply_pack/P = SSsupply.supply_pack[pack_name]
+ if(P.group == internal_data["supply_category"])
+ var/list/pack = list(
+ "name" = P.name,
+ "cost" = P.cost,
+ "contraband" = P.contraband,
+ "manifest" = uniquelist(P.manifest),
+ "random" = P.num_contained,
+ "expand" = 0,
+ "ref" = "\ref[P]"
+ )
+
+ if(P in internal_data["supply_pack_expanded"])
+ pack["expand"] = 1
+
+ supply_packs[++supply_packs.len] = pack
+
+ return supply_packs
+
+
+// Compiles miscellaneous data and permissions used by the supply template
+/obj/item/weapon/commcard/proc/get_misc_supply_data()
+ return list(
+ "shuttle_auth" = (internal_data["supply_controls"] & SUP_SEND_SHUTTLE),
+ "order_auth" = (internal_data["supply_controls"] & SUP_ACCEPT_ORDERS),
+ "supply_points" = SSsupply.points,
+ "supply_categories" = all_supply_groups
+ )
+
+/obj/item/weapon/commcard/proc/get_status_display()
+ return list(
+ "line1" = internal_data["stat_display_line1"],
+ "line2" = internal_data["stat_display_line2"],
+ "active_line1" = internal_data["stat_display_active1"],
+ "active_line2" = internal_data["stat_display_active2"],
+ "active" = internal_data["stat_display_special"]
+ )
+
+/obj/item/weapon/commcard/proc/find_blast_doors()
+ var/target_doors[0]
+ for(var/obj/machinery/door/blast/B in machines)
+ if(B.id == internal_data["shuttle_door_code"])
+ target_doors += B
+
+ return target_doors
diff --git a/code/game/objects/items/devices/geiger_yw.dm b/code/game/objects/items/devices/geiger_yw.dm
new file mode 100644
index 0000000000..eb89f3f4dd
--- /dev/null
+++ b/code/game/objects/items/devices/geiger_yw.dm
@@ -0,0 +1,112 @@
+/obj/item/device/geiger/wall
+ name = "mounted geiger counter"
+ desc = "A wall mounted device used for detecting and measuring radiation in an area."
+ icon = 'icons/obj/devices_yw.dmi'
+ icon_state = "geiger_wall"
+ item_state = "geiger_wall"
+ anchored = 1
+ scanning = 1
+ radiation_count = 0
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
+ w_class = ITEMSIZE_LARGE
+ flags = NOBLOODY
+ var/circuit = /obj/item/weapon/circuitboard/geiger
+ var/number = 0
+ var/last_tick //used to delay the powercheck
+ var/wiresexposed = 0
+
+/obj/item/device/geiger/wall/Initialize()
+ START_PROCESSING(SSobj, src)
+ soundloop = new(list(src), FALSE)
+ return ..()
+
+/obj/item/device/geiger/wall/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ QDEL_NULL(soundloop)
+ return ..()
+/*
+/obj/item/device/geiger/wall/process()
+ get_radiation()
+
+/obj/item/device/geiger/wall/proc/get_radiation()
+ if(!scanning)
+ return
+ radiation_count = SSradiation.get_rads_at_turf(get_turf(src))
+ update_icon()
+ update_sound()
+
+/obj/item/device/geiger/wall/examine(mob/user)
+ ..(user)
+ get_radiation()
+ to_chat(user, "[scanning ? "Ambient" : "Stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.")
+
+/obj/item/device/geiger/wall/rad_act(amount)
+ if(!amount || !scanning)
+ return FALSE
+
+ if(amount > radiation_count)
+ radiation_count = amount
+
+ update_icon()
+ update_sound()
+*/
+
+/obj/item/device/geiger/wall/attack_self(var/mob/user)
+ scanning = !scanning
+ update_icon()
+ update_sound()
+ to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] \the [src].")
+
+/obj/item/device/geiger/wall/update_icon()
+ if(!scanning)
+ icon_state = "geiger_wall-p"
+ return 1
+
+ switch(radiation_count)
+ if(null)
+ icon_state = "geiger_level_1"
+ if(-INFINITY to RAD_LEVEL_LOW)
+ icon_state = "geiger_level_1"
+ if(RAD_LEVEL_LOW to RAD_LEVEL_MODERATE)
+ icon_state = "geiger_level_2"
+ if(RAD_LEVEL_MODERATE to RAD_LEVEL_HIGH)
+ icon_state = "geiger_level_3"
+ if(RAD_LEVEL_HIGH to RAD_LEVEL_VERY_HIGH)
+ icon_state = "geiger_level_4"
+ if(RAD_LEVEL_VERY_HIGH to INFINITY)
+ icon_state = "geiger_level_5"
+/*
+/obj/item/device/geiger/wall/process()
+ if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0))
+ last_tick = world.timeofday
+
+ if(!src.loc)
+ scanning = 0
+ else
+ var/area/A = get_area(src)
+ if(!A)
+ scanning = 0
+ else
+ scanning = A.powered(EQUIP) // set "on" to the power status
+
+ if(!scanning)
+ if(wiresexposed)
+ icon_state = "geiger_wall-p_open"
+ else
+ icon_state = "geiger_wall-p"
+ else
+ if(wiresexposed)
+ icon_state = "geiger_wall-p_open"
+ else
+ icon_state = initial(icon_state) */
+
+/obj/item/device/geiger/wall/attack_ai(mob/user as mob)
+ src.add_fingerprint(user)
+ spawn (0)
+ attack_self(user)
+
+/obj/item/device/geiger/wall/attack_hand(mob/user as mob)
+ src.add_fingerprint(user)
+ spawn (0)
+ attack_self(user)
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
new file mode 100644
index 0000000000..d273995fae
--- /dev/null
+++ b/code/game/objects/items/devices/instruments.dm
@@ -0,0 +1,105 @@
+//copy pasta of the space violin, don't hurt me -RF
+
+/obj/item/device/instrument/guitar
+ name = "guitar"
+ desc = "It's made of wood and has bronze strings."
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "guitar"
+ item_state = "guitar"
+ attack_verb = list("smashed")
+ instrumentId = "guitar"
+ instrumentExt = "ogg"
+
+/obj/item/device/instrument/keytar
+ name = "portable keyboard"
+ desc = "A keyboard, for those interested in the piano on the go! "
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "keyboard"
+ item_state = "keyboard"
+ attack_verb = list("smashed")
+ instrumentId = "piano"
+ instrumentExt = "ogg"
+
+/obj/item/device/instrument/eguitar
+ name = "electrica guitar"
+ desc = "A metallic musical instrument with strings, made for all your shredding needs."
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "eguitar"
+ item_state = "eguitar"
+ attack_verb = list("smashed")
+ instrumentId = "eguitar"
+ instrumentExt = "ogg"
+
+/obj/item/device/instrument/xylophone
+ name = "xylophone"
+ desc = "A percussion instrument consisting of a series of wooden bars graduated in length."
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "xylophone"
+ attack_verb = list("smashed")
+ instrumentId = "xylophone"
+ instrumentExt = "mid"
+
+/obj/item/device/instrument/accordion
+ name = "accordion"
+ desc = "A musical instrument played by blowing and pressing keys. Someone detached Pun-Pun's hands!"
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "accordion"
+ attack_verb = list("smashed")
+ instrumentId = "accordion"
+ instrumentExt = "mid"
+
+/obj/item/device/instrument/saxophone
+ name = "saxophone"
+ desc = "A metal wind instruments with a single-reed mouthpiece known for it's soothing tones."
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "saxophone"
+ attack_verb = list("smashed")
+ instrumentId = "saxophone"
+ instrumentExt = "mid"
+
+/obj/item/device/instrument/glockenspiel
+ name = "glockenspiel"
+ desc = "A percussion instrument composed of a set of tuned metal bars perfect for any marching band."
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "glockenspiel"
+ attack_verb = list("smashed")
+ instrumentId = "glockenspiel"
+ instrumentExt = "mid"
+
+/obj/item/device/instrument/recorder
+ name = "recorder"
+ desc = "A depressing version of a flute. Does anyone even play this?"
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "recorder"
+ attack_verb = list("smashed")
+ instrumentId = "recorder"
+ instrumentExt = "mid"
+
+/obj/item/device/instrument/trombone
+ name = "trombone"
+ desc = "A large brass wind instrument. Seems to call for incidental music."
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "trombone"
+ attack_verb = list("smashed")
+ instrumentId = "trombone"
+ instrumentExt = "mid"
+
+/obj/item/device/instrument/harmonica
+ name = "harmonica"
+ desc = "A literal mouth organ, it just smells of the frontier!"
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "harmonica"
+ attack_verb = list("smashed")
+ instrumentId = "harmonica"
+ instrumentExt = "mid"
+ w_class = ITEMSIZE_SMALL
+
+/obj/item/device/instrument/bikehorn
+ name = "bike horn"
+ desc = "Why... why would you even play this?!"
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "bike_horn"
+ attack_verb = list("smashed")
+ instrumentId = "bikehorn"
+ instrumentExt = "ogg"
+
diff --git a/code/game/objects/items/devices/radio/encryptionkey_vr.dm b/code/game/objects/items/devices/radio/encryptionkey_vr.dm
index f492f097ed..92a5ed142b 100644
--- a/code/game/objects/items/devices/radio/encryptionkey_vr.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey_vr.dm
@@ -1,7 +1,7 @@
-/obj/item/device/encryptionkey/heads/hop
+/obj/item/device/encryptionkey/heads/hop //YW Edit: removes Explorer channel access, not in line with our chain of command.
name = "head of personnel's encryption key"
icon_state = "hop_cypherkey"
- channels = list("Supply" = 1, "Service" = 1, "Command" = 1, "Security" = 1, "Explorer" = 1)
+ channels = list("Supply" = 1, "Service" = 1, "Command" = 1, "Security" = 1)
/obj/item/device/encryptionkey/heads/ai_integrated
name = "ai integrated encryption key"
@@ -14,10 +14,10 @@
icon_state = "cap_cypherkey"
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1)
-/obj/item/device/encryptionkey/heads/rd
+/obj/item/device/encryptionkey/heads/rd //YW Edit: adds Explorer channel access, to come in line with our chain of command.
name = "research director's encryption key"
icon_state = "rd_cypherkey"
- channels = list("Command" = 1, "Science" = 1)
+ channels = list("Command" = 1, "Science" = 1, "Explorer" = 1)
/obj/item/device/encryptionkey/ert
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1)
@@ -25,15 +25,15 @@
/obj/item/device/encryptionkey/omni //Literally only for the admin intercoms
channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1)
-/obj/item/device/encryptionkey/pathfinder
+/obj/item/device/encryptionkey/pathfinder //YW Edit: removes command channel access, not in line with our chain of command.
name = "pathfinder's encryption key"
icon_state = "com_cypherkey"
- channels = list("Command" = 1, "Explorer" = 1)
+ channels = list("Explorer" = 1)
-/obj/item/device/encryptionkey/qm
+/obj/item/device/encryptionkey/qm //YW Edit: removes command channel access, not in line with our chain of command.
name = "quartermaster's encryption key"
icon_state = "qm_cypherkey"
- channels = list("Command" = 1, "Supply" = 1)
+ channels = list("Supply" = 1)
/obj/item/device/encryptionkey/pilot
name = "pilot's encryption key"
diff --git a/code/game/objects/items/devices/radio/encryptionkey_yw.dm b/code/game/objects/items/devices/radio/encryptionkey_yw.dm
new file mode 100644
index 0000000000..d54b0fc1e7
--- /dev/null
+++ b/code/game/objects/items/devices/radio/encryptionkey_yw.dm
@@ -0,0 +1,4 @@
+/obj/item/device/encryptionkey/heads/blueshield
+ name = "blueshield's encryption key"
+ icon_state = "hos_cypherkey"
+ channels = list("Security" = 1, "Command" = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/headset_yw.dm b/code/game/objects/items/devices/radio/headset_yw.dm
new file mode 100644
index 0000000000..178e4f01f1
--- /dev/null
+++ b/code/game/objects/items/devices/radio/headset_yw.dm
@@ -0,0 +1,5 @@
+/obj/item/device/radio/headset/heads/blueshield
+ name = "Blueshield headset"
+ desc = "The headset of the man who protects command's worthless lifes."
+ icon_state = "com_headset"
+ ks2type = /obj/item/device/encryptionkey/heads/blueshield
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index df39eeaf02..05be57c265 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -33,6 +33,12 @@
/obj/item/device/radio/intercom/interrogation
name = "station intercom (Interrogation)"
frequency = 1449
+ broadcasting = 1 //yw edit starts
+ listening = 0
+
+/obj/item/device/radio/intercom/interrogation/observation
+ listening = 1
+ broadcasting = 0 //yw edit ends
/obj/item/device/radio/intercom/private
name = "station intercom (Private)"
diff --git a/code/game/objects/items/devices/radio/radio_yw.dm b/code/game/objects/items/devices/radio/radio_yw.dm
new file mode 100644
index 0000000000..66072ca8db
--- /dev/null
+++ b/code/game/objects/items/devices/radio/radio_yw.dm
@@ -0,0 +1,7 @@
+/obj/item/device/bluespaceradio/cryogaia_prelinked
+ name = "bluespace radio (Cryogaia)"
+ handset = /obj/item/device/radio/bluespacehandset/linked/cryogaia_prelinked
+
+/obj/item/device/radio/bluespacehandset/linked/cryogaia_prelinked
+ bs_tx_preload_id = "cryogaia_rx" //Transmit to a receiver
+ bs_rx_preload_id = "cryogaia_tx" //Recveive from a transmitter
\ No newline at end of file
diff --git a/code/game/objects/items/devices/starcaster_ch.dm b/code/game/objects/items/devices/starcaster_ch.dm
new file mode 100644
index 0000000000..bb4fa728bb
--- /dev/null
+++ b/code/game/objects/items/devices/starcaster_ch.dm
@@ -0,0 +1,75 @@
+/datum/category_item/catalogue/information/starfire_news
+ desc = "A small news reporting agency based near Sif's New Reykjavik, the Starfire Report is somewhat infamous \
+ for scrutinizing the actions of Trans-Stellar Corporations in the Vir system yet coming out on top in the legal \
+ battles with inevitably follow. Aside from reporting, the agency is also known for inventing and manufacturing the \
+ starcaster, a cheap device capable of accessing news articles from almost anywhere in the galaxy without need for \
+ a stable exonet connection."
+ value = CATALOGUER_REWARD_TRIVIAL
+
+/obj/item/device/starcaster_news
+ name = "\improper Starcaster"
+ desc = "A device from the Starfire Report for reading the news and nothing else."
+ icon = 'icons/obj/library.dmi'
+ icon_state = "newscodex-open"
+// catalogue_data = list(/datum/category_item/catalogue/information/starfire_news) Commented out until I can figure out why this won't scan.
+
+ var/datum/computer_file/data/news_article/loaded_article = null //You must specify the variable this far to avoid compilation errors.
+ var/show_archived = null
+
+
+
+/obj/item/device/starcaster_news/attack_self(mob/user as mob)
+
+ user.set_machine(src)
+ ui_interact(user) //Activates nanoUI. Fuck nanoUI.
+ return
+
+/obj/item/device/starcaster_news/Topic(href, href_list) //Mostly ripped off from news_browser.dm
+ if(..())
+ return 1
+ if(href_list["PRG_openarticle"])
+ . = 1
+ if(loaded_article)
+ return 1
+
+ for(var/datum/computer_file/data/news_article/N in ntnet_global.available_news)
+ if(N.uid == text2num(href_list["PRG_openarticle"]))
+ loaded_article = N.clone()
+ break
+ if(href_list["PRG_reset"])
+ . = 1
+ loaded_article = null
+ if(href_list["PRG_toggle_archived"]) //Fuck nanoUI
+ . = 1
+ show_archived = !show_archived
+ if(.)
+ SSnanoui.update_uis(src)
+
+/obj/item/device/starcaster_news/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) //Also ripped from news_browser.dm. Fuck nanoUI
+ var/obj/item/device/starcaster_news/PRG = src //If you're trying to understand this shit go to nano/templates/starcaster_ch.tmpl
+
+ var/list/data = list()
+
+ if(PRG.loaded_article) // Viewing an article.
+ data["title"] = PRG.loaded_article.filename
+ data["cover"] = PRG.loaded_article.cover
+ data["article"] = PRG.loaded_article.stored_data
+ else // Viewing list of articles
+ var/list/all_articles[0]
+ for(var/datum/computer_file/data/news_article/F in ntnet_global.available_news)
+ if(!PRG.show_archived && F.archived)
+ continue
+ all_articles.Add(list(list(
+ "name" = F.filename,
+ "uid" = F.uid,
+ "archived" = F.archived
+ )))
+ data["all_articles"] = all_articles
+ data["showing_archived"] = PRG.show_archived
+
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "starcaster_ch.tmpl", "Starcaster News Browser", 575, 750)
+ ui.auto_update_layout = 1
+ ui.set_initial_data(data)
+ ui.open()
diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm
index 3e2d5dc5c7..7400b14ddb 100644
--- a/code/game/objects/items/devices/translocator_vr.dm
+++ b/code/game/objects/items/devices/translocator_vr.dm
@@ -113,7 +113,7 @@
/obj/item/device/perfect_tele/attack_self(mob/user)
if(loc_network)
- for(var/obj/item/device/perfect_tele_beacon/stationary/nb in premade_tele_beacons)
+ for(var/obj/item/device/perfect_tele_beacon/stationary/nb in GLOB.premade_tele_beacons)
if(nb.tele_network == loc_network)
beacons[nb.tele_name] = nb
loc_network = null //Consumed
diff --git a/code/game/objects/items/devices/violin.dm b/code/game/objects/items/devices/violin.dm
index 5dc215cf91..ce6b929f94 100644
--- a/code/game/objects/items/devices/violin.dm
+++ b/code/game/objects/items/devices/violin.dm
@@ -6,6 +6,10 @@
var/instrumentExt = "mid"
icon = 'icons/obj/musician.dmi'
force = 10
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_instruments.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_instruments.dmi',
+ )
/obj/item/device/instrument/New()
..()
@@ -34,8 +38,16 @@
song.interact(user)
/obj/item/device/instrument/violin
- name = "space violin"
- desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
+ name = "violin"
+ desc = "A wooden musical instrument with four strings and a bow. A true classic."
icon_state = "violin"
attack_verb = list("smashed")
instrumentId = "violin"
+ item_state = "violin"
+
+/obj/item/device/instrument/violin/gold
+ name = "golden violin"
+ desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\""
+ icon = 'icons/obj/musician_yw.dmi'
+ icon_state = "golden_violin"
+ attack_verb = list("smashed")
diff --git a/code/game/objects/items/gunbox_yw.dm b/code/game/objects/items/gunbox_yw.dm
new file mode 100644
index 0000000000..c7d4047c74
--- /dev/null
+++ b/code/game/objects/items/gunbox_yw.dm
@@ -0,0 +1,39 @@
+/obj/item/gunbox/blueshield
+ name = "blueshield mainarm box"
+ desc = "A secure box containing a blueshield main weapon."
+
+//Primary gun: Either shotgun or SMG
+
+/obj/item/gunbox/blueshield/attack_self(mob/living/user)
+ var/list/options = list()
+ options["Jackhammer Revolver Shotgun (12 Gauge)"] = list(/obj/item/weapon/gun/projectile/revolvershotgun, /obj/item/ammo_magazine/m12gdrumjack, /obj/item/ammo_magazine/m12gdrumjack, /obj/item/ammo_magazine/m12gdrumjack/beanbag)
+ options["WT550 Machine Pistol (9mm)"] = list(/obj/item/weapon/gun/projectile/automatic/wt550, /obj/item/ammo_magazine/m9mmt/rubber, /obj/item/ammo_magazine/m9mmt, /obj/item/ammo_magazine/m9mmt)
+ options["X01 Energy Gun (Weapon Cell)"] = list(/obj/item/weapon/gun/energy/x01, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
+ var/choice = input(user,"Would you prefer a Jackhammer shotgun, a WT550 Machine Pistol, or an X01 Energy Gun?") as null|anything in options
+ if(src && choice)
+ var/list/things_to_spawn = options[choice]
+ for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
+ var/atom/movable/AM = new new_type(get_turf(src))
+ if(istype(AM, /obj/item/weapon/gun))
+ to_chat(user, "You have chosen \the [AM].")
+ qdel(src)
+
+/obj/item/gunbox/blueshield/secondary
+ name = "blueshield sidearm box"
+ desc = "A secure box containing a blueshield sidearm."
+
+//Sidearm: Egun, or a .44 with rubber and lethal mag
+
+/obj/item/gunbox/blueshield/secondary/attack_self(mob/living/user)
+ var/list/options = list()
+ options["NSCW Variable Pistol(Microbattery)"] = list(/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos)
+ options["E-Gun (Weapon Cell)"] = list(/obj/item/weapon/gun/energy/gun, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
+ options["Consul Revolver (.44)"] = list(/obj/item/weapon/gun/projectile/revolver/consul, /obj/item/ammo_magazine/s44, /obj/item/ammo_magazine/s44, /obj/item/ammo_magazine/s44/rubber)
+ var/choice = input(user,"Would you prefer an NSCW, e-gun or a revolver?") as null|anything in options
+ if(src && choice)
+ var/list/things_to_spawn = options[choice]
+ for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
+ var/atom/movable/AM = new new_type(get_turf(src))
+ if(istype(AM, /obj/item/weapon/gun))
+ to_chat(user, "You have chosen \the [AM].")
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles_yw.dm b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles_yw.dm
new file mode 100644
index 0000000000..6b1018021b
--- /dev/null
+++ b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles_yw.dm
@@ -0,0 +1,27 @@
+/obj/fiftyspawner/bcarpet
+ name = "stack of black carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/bcarpet
+
+/obj/fiftyspawner/blucarpet
+ name = "stack of blue carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/blucarpet
+
+/obj/fiftyspawner/turcarpet
+ name = "stack of tue carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/turcarpet
+
+/obj/fiftyspawner/sblucarpet
+ name = "stack of silver blue carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/sblucarpet
+
+/obj/fiftyspawner/gaycarpet
+ name = "stack of clown carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/gaycarpet
+
+/obj/fiftyspawner/purcarpet
+ name = "stack of purple carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/purcarpet
+
+/obj/fiftyspawner/oracarpet
+ name = "stack of orange carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet/oracarpet
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index f7282464e2..d70db63f08 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -20,6 +20,11 @@
drop_sound = 'sound/items/drop/axe.ogg'
pickup_sound = 'sound/items/pickup/axe.ogg'
+ var/material/material //CHOMPEDIT: Start, To make tiles have material variables
+ var/default_type = DEFAULT_WALL_MATERIAL
+ var/perunit = SHEET_MATERIAL_AMOUNT
+ var/apply_colour //CHOMPEDIT: End
+
/obj/item/stack/tile/New()
..()
randpixel_xy()
@@ -72,9 +77,9 @@
stacktype = /obj/item/stack/tile/wood
build_type = /obj/item/stack/tile/wood
+
+//CHOMPEDIT: Moving carpets to tile_types_ch to give them proper names, descriptions and material variables
/*
- * Carpets
- */
/obj/item/stack/tile/carpet
name = "carpet"
singular_name = "carpet"
@@ -96,7 +101,8 @@
icon_state = "tile-tealcarpet"
no_variants = FALSE
-/obj/item/stack/tile/carpet/bcarpet
+/obj/item/stack/tile/carpet/bcarpet //YW EDIT: Commented out to help with upstream merging. Get on this you fucking virgo bois. -yw //CHOMP Comment: Yawn commented out this block, but CHOMP already commented out this stuff so I just removed theirs.
+
icon_state = "tile-carpet"
/obj/item/stack/tile/carpet/blucarpet
icon_state = "tile-carpet"
@@ -110,6 +116,7 @@
icon_state = "tile-carpet"
/obj/item/stack/tile/carpet/oracarpet
icon_state = "tile-carpet"
+ */
/obj/item/stack/tile/floor
name = "floor tile"
@@ -242,4 +249,4 @@
uses_charge = 1
charge_costs = list(250)
stacktype = /obj/item/stack/tile/roofing
- build_type = /obj/item/stack/tile/roofing
\ No newline at end of file
+ build_type = /obj/item/stack/tile/roofing
diff --git a/code/game/objects/items/stacks/tiles/tile_types_ch.dm b/code/game/objects/items/stacks/tiles/tile_types_ch.dm
new file mode 100644
index 0000000000..cd919466e6
--- /dev/null
+++ b/code/game/objects/items/stacks/tiles/tile_types_ch.dm
@@ -0,0 +1,102 @@
+// Procs to allow tiles to have material variables, consider unifying this on stack parent?
+// Uncertain if any of these procs can result in unforseen issues with tile objects, if there are bugs with tiles check if any of these procs are the cause
+
+/obj/item/stack/tile/New()
+ ..()
+
+ if(!default_type)
+ default_type = DEFAULT_WALL_MATERIAL
+ material = get_material_by_name("[default_type]")
+ if(!material)
+ qdel(src)
+ return 0
+
+ recipes = material.get_recipes()
+ stacktype = material.stack_type
+ if(islist(material.stack_origin_tech))
+ origin_tech = material.stack_origin_tech.Copy()
+
+ if(apply_colour)
+ color = material.icon_colour
+
+ if(!material.conductive)
+ flags |= NOCONDUCT
+
+ matter = material.get_matter()
+ return 1
+
+
+/obj/item/stack/material/get_material()
+ return material
+
+/*
+ * Carpets
+ */
+/obj/item/stack/tile/carpet
+ name = "red carpet"
+ singular_name = "red carpet"
+ desc = "A piece of red carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ force = 1.0
+ throwforce = 1.0
+ throw_speed = 5
+ throw_range = 20
+ flags = 0
+ no_variants = FALSE
+ default_type = MAT_CARPET
+
+/obj/item/stack/tile/carpet/teal
+ name = "teal carpet"
+ singular_name = "teal carpet"
+ desc = "A piece of teal carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-tealcarpet"
+ default_type = MAT_CARPET_TEAL
+
+/obj/item/stack/tile/carpet/bcarpet
+ name = "black carpet"
+ singular_name = "black carpet"
+ desc = "A piece of black carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ default_type = MAT_CARPET_BLACK
+
+/obj/item/stack/tile/carpet/blucarpet
+ name = "blue carpet"
+ singular_name = "blue carpet"
+ desc = "A piece of blue carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ default_type = MAT_CARPET_BLUE
+
+/obj/item/stack/tile/carpet/turcarpet
+ name = "turquoise carpet"
+ singular_name = "turquoise carpet"
+ desc = "A piece of turquoise carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ default_type = MAT_CARPET_TURQUOISE
+
+/obj/item/stack/tile/carpet/sblucarpet
+ name = "silver blue carpet"
+ singular_name = "silver blue carpet"
+ desc = "A piece of silver blue carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ default_type = MAT_CARPET_SILVERBLUE
+
+/obj/item/stack/tile/carpet/gaycarpet
+ name = "clown carpet"
+ singular_name = "clown carpet"
+ desc = "A piece of clown carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ default_type = MAT_CARPET_PINK
+
+/obj/item/stack/tile/carpet/purcarpet
+ name = "purple carpet"
+ singular_name = "purple carpet"
+ desc = "A piece of purple carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ default_type = MAT_CARPET_PURPLE
+
+/obj/item/stack/tile/carpet/oracarpet
+ name = "orange carpet"
+ singular_name = "orange carpet"
+ desc = "A piece of orange carpet. It is the same size as a normal floor tile!"
+ icon_state = "tile-carpet"
+ default_type = MAT_CARPET_ORANGE
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/tiles/tile_types_yw.dm b/code/game/objects/items/stacks/tiles/tile_types_yw.dm
new file mode 100644
index 0000000000..a78efd1045
--- /dev/null
+++ b/code/game/objects/items/stacks/tiles/tile_types_yw.dm
@@ -0,0 +1,21 @@
+/obj/item/stack/tile/carpet/bcarpet
+ name = "black carpet"
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/blucarpet
+ name = "blue carpet"
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/turcarpet
+ name = "tur carpet"
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/sblucarpet
+ name = "silver blue carpet"
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/gaycarpet
+ name = "Clown Carpet"
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/purcarpet
+ name = "purple carpet"
+ icon_state = "tile-carpet"
+/obj/item/stack/tile/carpet/oracarpet
+ name = "orange carpet"
+ icon_state = "tile-carpet"
\ No newline at end of file
diff --git a/code/game/objects/items/surplus_voucher_ch.dm b/code/game/objects/items/surplus_voucher_ch.dm
new file mode 100644
index 0000000000..3d2adc8601
--- /dev/null
+++ b/code/game/objects/items/surplus_voucher_ch.dm
@@ -0,0 +1,180 @@
+// Contains the supply vouchers for taskmanager.dm
+/obj/item/surplus_voucher
+ icon = 'icons/obj/items.dmi'
+ icon_state = "pizza_voucher"
+ throwforce = 0
+ throw_speed = 5
+ throw_range = 4
+ force = 0
+
+/obj/item/surplus_voucher/com
+ name = "Reward Surplus Voucher"
+ desc = "A surplus voucher! This one is meant to reward valued employees! Activate it for your surplus delivery!"
+/obj/item/surplus_voucher/com/attack_self(mob/user as mob)
+ spawn_item(get_turf(src))
+
+/obj/item/surplus_voucher/com/proc/spawn_item(var/turf/T)
+ var/path = pick(prob(6);/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac,
+ prob(3);/obj/item/weapon/reagent_containers/food/drinks/bottle/wine,
+ prob(3);/obj/item/weapon/spacecash/c50,
+ prob(3);/obj/item/weapon/spacecash/c100,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/cheeseburger,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/fries,
+ prob(2);/obj/item/pizzabox/meat,
+ prob(2);/obj/item/pizzabox/vegetable,
+ prob(1);/obj/item/pizzabox/pineapple,
+ prob(2);/obj/item/pizzabox/margherita,
+ prob(2);/obj/item/pizzabox/mushroom,
+ prob(3);/obj/item/toy/bouquet,
+ prob(5);/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,
+ prob(3);/obj/item/weapon/storage/box/snappops,
+ prob(2);/obj/item/clothing/under/syndicate/tacticool,
+ prob(3);/obj/item/clothing/head/cowboy_hat/small,
+ prob(3);/obj/item/toy/sword,
+ prob(3);/obj/item/toy/cultsword,
+ prob(1);/obj/structure/plushie/ian)
+ playsound(T, 'sound/effects/phasein.ogg', 25, 1)
+ new path(T)
+ del(src)
+
+/obj/item/surplus_voucher/eng
+ name = "Engineering Surplus Voucher"
+ desc = "A surplus voucher! This one is meant to resupply engineering with tools! Activate it for your surplus delivery!"
+/obj/item/surplus_voucher/eng/attack_self(mob/user as mob)
+ spawn_item(get_turf(src))
+
+/obj/item/surplus_voucher/eng/proc/spawn_item(var/turf/T)
+ var/path = pick(prob(2);/datum/design/item/powercell/high,
+ prob(2);/obj/item/weapon/storage/briefcase/inflatable,
+ prob(2);/obj/item/clamp,
+ prob(3);/obj/item/weapon/extinguisher,
+ prob(3);/obj/item/weapon/weldingtool/largetank,
+ prob(2);/obj/item/weapon/tool/wirecutters,
+ prob(3);/obj/item/weapon/tool/wrench,
+ prob(3);/obj/item/weapon/tool/screwdriver,
+ prob(3);/obj/item/device/analyzer,
+ prob(3);/obj/item/device/t_scanner,
+ prob(2);/obj/item/weapon/grenade/chem_grenade/metalfoam,
+ prob(1);/obj/item/toy/figure/engineer)
+ playsound(T, 'sound/effects/phasein.ogg', 25, 1)
+ new path(T)
+ del(src)
+
+
+
+/obj/item/surplus_voucher/med
+ name = "Medical Surplus Voucher"
+ desc = "A surplus voucher! This one is meant to resupply medical with chemicals and kits! Activate it for your surplus delivery!"
+/obj/item/surplus_voucher/med/attack_self(mob/user as mob)
+ spawn_item(get_turf(src))
+
+/obj/item/surplus_voucher/med/proc/spawn_item(var/turf/T)
+ var/path = pick(prob(6);/obj/item/weapon/storage/firstaid/regular,
+ prob(6);/obj/item/weapon/storage/firstaid/fire,
+ prob(6);/obj/item/weapon/storage/firstaid/toxin,
+ prob(6);/obj/item/weapon/storage/firstaid/o2,
+ prob(6);/obj/item/weapon/storage/firstaid/adv,
+ prob(3);/obj/item/weapon/storage/pill_bottle/antitox,
+ prob(3);/obj/item/weapon/storage/pill_bottle/bicaridine,
+ prob(2);/obj/item/weapon/storage/pill_bottle/dexalin_plus,
+ prob(3);/obj/item/weapon/storage/pill_bottle/dylovene,
+ prob(3);/obj/item/weapon/storage/pill_bottle/inaprovaline,
+ prob(3);/obj/item/weapon/storage/pill_bottle/kelotane,
+ prob(3);/obj/item/weapon/storage/pill_bottle/dermaline,
+ prob(3);/obj/item/weapon/storage/pill_bottle/spaceacillin,
+ prob(3);/obj/item/weapon/storage/pill_bottle/tramadol,
+ prob(3);/obj/item/weapon/storage/pill_bottle/carbon,
+ prob(3);/obj/item/weapon/storage/pill_bottle/iron,
+ prob(4);/obj/item/weapon/storage/pill_bottle/assorted,
+ prob(4);/obj/item/weapon/backup_implanter,
+ prob(2);/obj/item/toy/plushie/borgplushie/medihound)
+ playsound(T, 'sound/effects/phasein.ogg', 25, 1)
+ new path(T)
+ del(src)
+
+/obj/item/surplus_voucher/sci
+ name = "Science Surplus Voucher"
+ desc = "A surplus voucher! This one is meant to supply science with a variety of miscellaneous items! Activate it for your surplus delivery!"
+/obj/item/surplus_voucher/sci/attack_self(mob/user as mob)
+ spawn_item(get_turf(src))
+
+/obj/item/surplus_voucher/sci/proc/spawn_item(var/turf/T)
+ var/path = pick(prob(1);/obj/item/device/kit/paint/ripley,
+ prob(1);/obj/item/device/kit/paint/ripley/death,
+ prob(1);/obj/item/device/kit/paint/ripley/flames_red,
+ prob(1);/obj/item/device/kit/paint/ripley/flames_blue,
+ prob(1);/obj/item/device/kit/paint/durand,
+ prob(1);/obj/item/device/kit/paint/gygax/darkgygax,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/monkeycube,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/monkeycube/sobakacube,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/monkeycube/sarucube,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/monkeycube/sparracube,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wolpincube,
+ prob(2);/obj/item/weapon/storage/part_replacer,
+ prob(2);/obj/item/device/integrated_circuit_printer,
+ prob(1);/obj/item/weapon/disk/integrated_circuit/upgrade/advanced,
+ prob(3);/obj/item/stack/nanopaste,
+ prob(3);/obj/item/weapon/melee/baton/slime,
+ prob(3);/obj/item/weapon/gun/energy/taser/xeno,
+ prob(3);/obj/item/weapon/storage/box/monkeycubes,
+ prob(1);/obj/item/toy/figure/borg)
+ playsound(T, 'sound/effects/phasein.ogg', 25, 1)
+ new path(T)
+ del(src)
+
+/obj/item/surplus_voucher/sec
+ name = "Security Surplus Voucher"
+ desc = "A surplus voucher! This one is meant to resupply security with gear... and donuts! Activate it for your surplus delivery!"
+/obj/item/surplus_voucher/sec/attack_self(mob/user as mob)
+ spawn_item(get_turf(src))
+
+/obj/item/surplus_voucher/sec/proc/spawn_item(var/turf/T)
+ var/path = pick(prob(2);/obj/item/weapon/storage/box/flashbangs,
+ prob(4);/obj/item/weapon/storage/box/flare,
+ prob(5);/obj/item/weapon/storage/box/donut,
+ prob(4);/obj/item/weapon/storage/box/handcuffs,
+ prob(3);/obj/item/weapon/reagent_containers/spray/pepper,
+ prob(3);/obj/item/weapon/melee/baton/loaded,
+ prob(2);/obj/item/weapon/storage/box/beanbags,
+ prob(2);/obj/item/weapon/storage/box/stunshells,
+ prob(2);/obj/item/ammo_magazine/m45/rubber,
+ prob(2);/obj/item/ammo_magazine/m9mmt/rubber,
+ prob(2);/obj/item/weapon/cell/device/weapon,
+ prob(1);/obj/item/toy/plushie/borgplushie)
+ playsound(T, 'sound/effects/phasein.ogg', 25, 1)
+ new path(T)
+ del(src)
+
+/obj/item/surplus_voucher/ser
+ name = "Service Surplus Voucher"
+ desc = "A surplus voucher! This one is meant to generally resupply service employees! Activate it for your surplus delivery!"
+/obj/item/surplus_voucher/ser/attack_self(mob/user as mob)
+ spawn_item(get_turf(src))
+
+/obj/item/surplus_voucher/ser/proc/spawn_item(var/turf/T)
+ var/path = pick(prob(4);/obj/item/weapon/reagent_containers/food/drinks/milk,
+ prob(4);/obj/item/weapon/reagent_containers/food/condiment/flour,
+ prob(4);/obj/item/weapon/reagent_containers/food/drinks/soymilk,
+ prob(4);/obj/item/weapon/storage/fancy/egg_box,
+ prob(3);/obj/item/weapon/reagent_containers/food/snacks/meat,
+ prob(3);/obj/item/weapon/reagent_containers/spray/cleaner,
+ prob(2);/obj/item/weapon/grenade/chem_grenade/cleaner,
+ prob(1);/obj/item/weapon/storage/box/monkeycubes,
+ prob(3);/obj/item/weapon/reagent_containers/spray/plantbgone,
+ prob(2);/obj/item/seeds/sunflowerseed,
+ prob(2);/obj/item/seeds/cornseed,
+ prob(2);/obj/item/seeds/berryseed,
+ prob(2);/obj/item/seeds/wheatseed,
+ prob(2);/obj/item/seeds/orangeseed,
+ prob(1);/obj/item/toy/figure/bartender)
+ playsound(T, 'sound/effects/phasein.ogg', 25, 1)
+ new path(T)
+ del(src)
\ No newline at end of file
diff --git a/code/game/objects/items/toys/toys_yw.dm b/code/game/objects/items/toys/toys_yw.dm
new file mode 100644
index 0000000000..b312d70341
--- /dev/null
+++ b/code/game/objects/items/toys/toys_yw.dm
@@ -0,0 +1,109 @@
+/obj/item/toy/plushie/teshari/strix
+ name = "Strix Hades"
+ desc = "This is Strix Hades the plushie Avali. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like he is sleeping. Shhh!"
+ icon_state = "strixplush"
+ item_state = "strixplush"
+ slot_flags = SLOT_BACK | SLOT_HEAD
+ pokephrase = "Weh!"
+ icon = 'icons/obj/toy_yw.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_toys_yw.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_toys_yw.dmi',
+ slot_back_str = 'icons/mob/toy_worn_yw.dmi',
+ slot_head_str = 'icons/mob/toy_worn_yw.dmi')
+
+ rename_plushie()
+ set name = "Name Plushie"
+ set category = "Object"
+ set desc = "Give your plushie a cute name!"
+ var/mob/M = usr
+ if(!M.mind)
+ return 0
+
+ if(src && !M.stat && in_range(M,src))
+ to_chat(M, "You cannot rename Strix Hades! You hug him anyway.")
+ return 1
+
+/obj/item/toy/plushie/teshari/eili
+ name = "Eili"
+ desc = "This is a plushie that resembles an Avali named Eili. The ammount of detail makes it almost look lifelike! Looks like she is sleeping. Shhh!"
+ icon_state = "jeans_eiliplush"
+ item_state = "jeans_eiliplush"
+ slot_flags = SLOT_BACK | SLOT_HEAD
+ pokephrase = "Weh!"
+ icon = 'icons/vore/custom_items_yw.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/vore/custom_items_left_hand_yw.dmi',
+ slot_r_hand_str = 'icons/vore/custom_items_right_hand_yw.dmi',
+ slot_back_str = 'icons/vore/custom_onmob_yw.dmi',
+ slot_head_str = 'icons/vore/custom_onmob_yw.dmi')
+
+
+ rename_plushie()
+ set name = "Name Plushie"
+ set category = "Object"
+ set desc = "Give your plushie a cute name!"
+ var/mob/M = usr
+ if(!M.mind)
+ return 0
+
+ if(src && !M.stat && in_range(M,src))
+ to_chat(M, "You cannot rename Eili! You hug her anyway.")
+ return 1
+
+/obj/item/toy/plushie/teshari/_yw
+ name = "lifelike teshari plush"
+ desc = "This is a plush teshari. Very soft. The ammount of detail makes it almost look lifelike! Looks like it is sleeping. Shhh!"
+ icon_state = "teshariplushie_brown"
+ item_state = "teshariplushie_brown"
+ pokephrase = "Rya!"
+ slot_flags = SLOT_BACK | SLOT_HEAD
+ icon = 'icons/obj/toy_yw.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_toys_yw.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_toys_yw.dmi',
+ slot_back_str = 'icons/mob/toy_worn_yw.dmi',
+ slot_head_str = 'icons/mob/toy_worn_yw.dmi')
+
+/obj/item/toy/plushie/teshari/w_yw
+ name = "lifelike teshari plush"
+ desc = "This is a plush teshari. Very soft. The ammount of detail makes it almost look lifelike! Looks like it is sleeping. Shhh!"
+ icon_state = "teshariplushie_white"
+ item_state = "teshariplushie_white"
+ pokephrase = "Rya!"
+ slot_flags = SLOT_BACK | SLOT_HEAD
+ icon = 'icons/obj/toy_yw.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_toys_yw.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_toys_yw.dmi',
+ slot_back_str = 'icons/mob/toy_worn_yw.dmi',
+ slot_head_str = 'icons/mob/toy_worn_yw.dmi')
+
+/obj/item/toy/plushie/teshari/b_yw
+ name = "lifelike teshari plush"
+ desc = "This is a plush teshari. Very soft. The ammount of detail makes it almost look lifelike! Looks like it is sleeping. Shhh!"
+ icon_state = "teshariplushie_black"
+ item_state = "teshariplushie_black"
+ pokephrase = "Rya!"
+ slot_flags = SLOT_BACK | SLOT_HEAD
+ icon = 'icons/obj/toy_yw.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_toys_yw.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_toys_yw.dmi',
+ slot_back_str = 'icons/mob/toy_worn_yw.dmi',
+ slot_head_str = 'icons/mob/toy_worn_yw.dmi',
+ slot_ear_str = 'icons/mob/toy_worn_yw.dmi')
+
+/obj/item/toy/plushie/teshari/y_yw
+ name = "lifelike teshari plush"
+ desc = "This is a plush teshari. Very soft. The ammount of detail makes it almost look lifelike! Looks like it is sleeping. Shhh!"
+ icon_state = "teshariplushie_yellow"
+ item_state = "teshariplushie_yellow"
+ pokephrase = "Rya!"
+ slot_flags = SLOT_BACK | SLOT_HEAD
+ icon = 'icons/obj/toy_yw.dmi'
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_toys_yw.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_toys_yw.dmi',
+ slot_back_str = 'icons/mob/toy_worn_yw.dmi',
+ slot_head_str = 'icons/mob/toy_worn_yw.dmi')
diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm
index b0a72144d4..634e3602da 100644
--- a/code/game/objects/items/weapons/RMS_vr.dm
+++ b/code/game/objects/items/weapons/RMS_vr.dm
@@ -168,22 +168,24 @@
10;new /obj/item/stack/material/snow,
5;new /obj/item/stack/material/phoron,
5;new /obj/item/stack/material/silver,
- 5;new /obj/item/stack/material/gold,
- 1;new /obj/item/stack/material/diamond)
+ 5;new /obj/item/stack/material/gold
+ //YW EDIT: 1;new /obj/item/stack/material/diamond
+ )
if(overcharge && emagged)
product = pick(1;new /obj/item/stack/rods,
5;new /obj/item/device/fbp_backup_cell,
5;new /obj/item/trash/rkibble,
10;new /obj/item/stack/tile/grass,
10;new /obj/item/stack/tile/carpet,
- 10;new /obj/item/weapon/reagent_containers/spray/waterflower,
- 10;new /obj/item/weapon/bikehorn,
- 10;new /obj/item/weapon/storage/backpack/clown,
- 10;new /obj/item/clothing/under/rank/clown,
- 10;new /obj/item/clothing/shoes/clown_shoes,
- 10;new /obj/item/clothing/mask/gas/clown_hat,
- 10;new /obj/item/device/pda/clown,
- 1;new /mob/living/simple_mob/vore/catgirl)
+ 10;new /obj/item/weapon/reagent_containers/spray/waterflower
+ //YW EDIT: 10;new /obj/item/weapon/bikehorn,
+ //YW EDIT: 10;new /obj/item/weapon/storage/backpack/clown,
+ //YW EDIT: 10;new /obj/item/clothing/under/rank/clown,
+ //YW EDIT: 10;new /obj/item/clothing/shoes/clown_shoes,
+ //YW EDIT: 10;new /obj/item/clothing/mask/gas/clown_hat,
+ //YW EDIT: 10;new /obj/item/device/pda/clown,
+ //YW EDIT: 1;new /mob/living/simple_mob/vore/catgirl
+ )
spark_system.start()
product.loc = get_turf(A)
diff --git a/code/game/objects/items/weapons/RPD_vr.dm b/code/game/objects/items/weapons/RPD_vr.dm
index b658db082c..d4650eb16a 100644
--- a/code/game/objects/items/weapons/RPD_vr.dm
+++ b/code/game/objects/items/weapons/RPD_vr.dm
@@ -31,7 +31,7 @@
var/category = ATMOS_CATEGORY
var/piping_layer = PIPING_LAYER_DEFAULT
var/obj/item/weapon/tool/wrench/tool
- var/datum/pipe_recipe/recipe // pipe recipie selected for display/construction
+ var/datum/pipe_recipe/recipe = null // pipe recipie selected for display/construction //YW edit, added = null
var/static/datum/pipe_recipe/first_atmos
var/static/datum/pipe_recipe/first_disposal
var/mode = BUILD_MODE | DESTROY_MODE | WRENCH_MODE
@@ -56,6 +56,8 @@
recipe = first_atmos
if(!first_disposal)
first_disposal = GLOB.disposal_pipe_recipes[GLOB.disposal_pipe_recipes[1]][1]
+ if(!recipe)
+ recipe = first_atmos
/obj/item/weapon/pipe_dispenser/Destroy()
qdel_null(spark_system)
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index 5d983e596a..b178ecc6dd 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -70,21 +70,25 @@ RSF
mode = 2
to_chat(user,"Changed dispensing mode to 'Container'.")
return
- if (mode == 2)
+ if(mode == 2)
mode = 3
- to_chat(user,"Changed dispensing mode to 'Paper'")
+ to_chat(user,"Changed dispensing mode to 'Metamorphic Glass: Pint'") //YW Changes begin
return
- if (mode == 3)
+ if(mode == 3)
mode = 4
- to_chat(user,"Changed dispensing mode to 'Pen'")
+ to_chat(user,"Changed dispensing mode to 'Paper'")
return
- if (mode == 4)
+ if(mode == 4)
mode = 5
- to_chat(user,"Changed dispensing mode to 'Dice Pack'")
+ to_chat(user,"Changed dispensing mode to 'Pen'")
return
- if (mode == 5)
+ if(mode == 5)
+ mode = 6
+ to_chat(user,"Changed dispensing mode to 'Dice Pack'")
+ return
+ if(mode == 6)
mode = 1
- to_chat(user,"Changed dispensing mode to 'Cigarette'")
+ to_chat(user,"Changed dispensing mode to 'Cigarette'") // YW Changes end
return
/obj/item/weapon/rsf/afterattack(atom/A, mob/user as mob, proximity)
@@ -114,12 +118,15 @@ RSF
product = new glasstype()
used_energy = 50
if(3)
+ product = new /obj/item/weapon/reagent_containers/food/drinks/metaglass() //YW Changes begin
+ used_energy = 50
+ if(4)
product = new /obj/item/weapon/paper()
used_energy = 10
- if(4)
+ if(5)
product = new /obj/item/weapon/pen()
used_energy = 50
- if(5)
+ if(6) //YW Changes end
product = new /obj/item/weapon/storage/pill_bottle/dice()
used_energy = 200
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboards_yw.dm b/code/game/objects/items/weapons/circuitboards/circuitboards_yw.dm
new file mode 100644
index 0000000000..ed2d1c5da0
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/circuitboards_yw.dm
@@ -0,0 +1,5 @@
+/obj/item/weapon/circuitboard/geiger
+ name = T_BOARD("geiger counter")
+ build_path = /obj/item/device/geiger/wall
+ board_type = new /datum/frame/frame_types/geiger
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index e9c0ee728a..85f81b1058 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -172,7 +172,7 @@
/obj/item/weapon/circuitboard/teleporter_hub
name = T_BOARD("teleporter hub")
build_path = /obj/machinery/teleport/hub
- board_type = "teleporter_hub"
+ board_type = new /datum/frame/frame_types/machine //YWEdit makes buildable
// origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 4)
req_components = list(
/obj/item/weapon/stock_parts/scanning_module = 4,
@@ -182,7 +182,7 @@
/obj/item/weapon/circuitboard/teleporter_station
name = T_BOARD("teleporter station")
build_path = /obj/machinery/teleport/station
- board_type = "teleporter_station"
+ board_type = new /datum/frame/frame_types/machine //YWEdit makes buildable
// origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 3)
req_components = list(
/obj/item/weapon/stock_parts/console_screen = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/frame_ch.dm b/code/game/objects/items/weapons/circuitboards/frame_ch.dm
new file mode 100644
index 0000000000..45df1c1e48
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/frame_ch.dm
@@ -0,0 +1,9 @@
+/obj/item/weapon/circuitboard/microwave/advanced
+ name = T_BOARD("deluxe microwave")
+ build_path = /obj/machinery/microwave/advanced
+ board_type = new /datum/frame/frame_types/microwave
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/capacitor = 1)
diff --git a/code/game/objects/items/weapons/circuitboards/mecha_ch.dm b/code/game/objects/items/weapons/circuitboards/mecha_ch.dm
new file mode 100644
index 0000000000..b44e45869e
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/mecha_ch.dm
@@ -0,0 +1,21 @@
+#ifdef T_BOARD_CHMecha
+#error T_BOARD_CHMECHA already defined elsewhere, we can't use it.
+#endif
+#define T_BOARD_CHMECHA(name) "exosuit module circuit board (" + (name) + ")"
+//renaming CHmecha for Chomp mecha to allow for more to be made if needed.
+
+/obj/item/weapon/circuitboard/mecha/scarab
+ origin_tech = list(TECH_DATA = 4)
+
+/obj/item/weapon/circuitboard/mecha/scarab/peripherals
+ name = T_BOARD_CHMECHA("Scarab peripherals control")
+ icon_state = "mcontroller"
+
+/obj/item/weapon/circuitboard/mecha/scarab/targeting
+ name = T_BOARD_CHMECHA("Scarab weapon control and targeting")
+ icon_state = "mcontroller"
+ origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4)
+
+/obj/item/weapon/circuitboard/mecha/scarab/main
+ name = T_BOARD_CHMECHA("Scarab central control")
+ icon_state = "mainboard"
diff --git a/code/game/objects/items/weapons/grenades/confetti_grenade_ch.dm b/code/game/objects/items/weapons/grenades/confetti_grenade_ch.dm
new file mode 100644
index 0000000000..3f0583ba66
--- /dev/null
+++ b/code/game/objects/items/weapons/grenades/confetti_grenade_ch.dm
@@ -0,0 +1,51 @@
+/obj/item/weapon/grenade/confetti
+ desc = "It is set to detonate in 2 seconds. These party grenades will make everyone jump with joy (or fright)!"
+ name = "grenatti"
+ icon = 'icons/obj/grenade.dmi'
+ icon_state = "grenade"
+ det_time = 20
+ item_state = "grenade"
+ slot_flags = SLOT_BELT
+ var/datum/effect/effect/system/confetti_spread
+ var/confetti_strength = 8
+
+/obj/item/weapon/grenade/confetti/New()
+ ..()
+ src.confetti_spread = new /datum/effect/effect/system/confetti_spread()
+ src.confetti_spread.attach(src)
+
+/obj/item/weapon/grenade/confetti/Destroy()
+ qdel(confetti_spread)
+ confetti_spread = null
+ return ..()
+
+/obj/item/weapon/grenade/confetti/detonate() //Find a good confetti firework or pop sound effect later
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1, -3)
+ src.confetti_spread.set_up(10, 0, usr.loc)
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+ qdel(src)
+
+ return
+
+/obj/item/weapon/grenade/confetti/party_ball //Intended to be used only with the confetti cannon.
+ name = "party ball"
+ desc = "Full of !!FUN!!"
+ icon = 'icons/obj/grenade_ch.dmi'
+ icon_state = "party_ball"
+ confetti_strength = 2
+ det_time = 1
+ throwforce = 0 //Confetti cannon is only fun to shoot at people if it deals no damage.
+
+/obj/item/weapon/grenade/confetti/party_ball/detonate() //Could condense this by making the sound a variable in the parent but I'm lazy.
+ playsound(src.loc, 'sound/effects/confetti_ball.ogg', 50, 1, -3)
+ src.confetti_spread.set_up(10, 0, usr.loc)
+ spawn(0)
+ for(var/i = 1 to confetti_strength)
+ src.confetti_spread.start()
+ sleep(10)
+ qdel(src)
+
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade_ch.dm b/code/game/objects/items/weapons/grenades/spawnergrenade_ch.dm
new file mode 100644
index 0000000000..48f4e42a74
--- /dev/null
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade_ch.dm
@@ -0,0 +1,115 @@
+/obj/item/weapon/grenade/spawnergrenade/casino
+
+ desc = "It is set to detonate in 5 seconds. It will release a goose that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Goose)"
+ icon = 'icons/obj/grenade_ch.dmi'
+ icon_state = "casino"
+ item_state = "casino"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2)
+ spawner_type = /mob/living/simple_mob/animal/space/goose/domesticated
+
+
+// Detonate now just handles the two loops that query for people in lockers and people who can see it.
+/obj/item/weapon/grenade/spawnergrenade/casino/detonate()
+
+ if(spawner_type && deliveryamt)
+ var/turf/T = get_turf(src)
+ playsound(T, 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/i=1, i<=deliveryamt, i++)
+ var/atom/movable/x = new spawner_type(T)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(x, pick(NORTH,SOUTH,EAST,WEST))
+ qdel(src)
+ return
+
+/obj/item/weapon/grenade/spawnergrenade/casino/goat
+ desc = "It is set to detonate in 5 seconds. It will release a goat that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Goat)"
+ spawner_type = /mob/living/simple_mob/animal/goat
+
+/obj/item/weapon/grenade/spawnergrenade/casino/armadillo
+ desc = "It is set to detonate in 5 seconds. It will release a armadillo that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Armadillo)"
+ spawner_type = /mob/living/simple_mob/animal/passive/armadillo
+
+/obj/item/weapon/grenade/spawnergrenade/casino/cat
+ desc = "It is set to detonate in 5 seconds. It will release a cat that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Cat)"
+ spawner_type = /mob/living/simple_mob/animal/passive/cat
+
+/obj/item/weapon/grenade/spawnergrenade/casino/chicken
+ desc = "It is set to detonate in 5 seconds. It will release a chicken that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Chicken)"
+ spawner_type = /mob/living/simple_mob/animal/passive/chicken
+
+/obj/item/weapon/grenade/spawnergrenade/casino/cow
+ desc = "It is set to detonate in 5 seconds. It will release a cow that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Cow)"
+ spawner_type = /mob/living/simple_mob/animal/passive/cow
+
+/obj/item/weapon/grenade/spawnergrenade/casino/corgi
+ desc = "It is set to detonate in 5 seconds. It will release a corgi that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Corgi)"
+ spawner_type = /mob/living/simple_mob/animal/passive/dog/corgi
+
+/obj/item/weapon/grenade/spawnergrenade/casino/fox
+ desc = "It is set to detonate in 5 seconds. It will release a fox that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Fox)"
+ spawner_type = /mob/living/simple_mob/animal/passive/fox
+
+/obj/item/weapon/grenade/spawnergrenade/casino/lizard
+ desc = "It is set to detonate in 5 seconds. It will release a lizard that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Lizard)"
+ spawner_type = /mob/living/simple_mob/animal/passive/lizard
+
+/obj/item/weapon/grenade/spawnergrenade/casino/penguin
+ desc = "It is set to detonate in 5 seconds. It will release a penguin that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Penguin)"
+ spawner_type = /mob/living/simple_mob/animal/passive/penguin
+
+/obj/item/weapon/grenade/spawnergrenade/casino/snake
+ desc = "It is set to detonate in 5 seconds. It will release a snake that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Snake)"
+ spawner_type = /mob/living/simple_mob/animal/passive/snake
+
+/obj/item/weapon/grenade/spawnergrenade/casino/yithian
+ desc = "It is set to detonate in 5 seconds. It will release a yithian that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Yithian)"
+ spawner_type = /mob/living/simple_mob/animal/passive/yithian
+
+/obj/item/weapon/grenade/spawnergrenade/casino/tindalos
+ desc = "It is set to detonate in 5 seconds. It will release a tindalos that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Tindalos)"
+ spawner_type = /mob/living/simple_mob/animal/passive/tindalos
+
+/obj/item/weapon/grenade/spawnergrenade/casino/fennec
+ desc = "It is set to detonate in 5 seconds. It will release a fennec that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Fennec)"
+ spawner_type = /mob/living/simple_mob/vore/fennec
+
+/obj/item/weapon/grenade/spawnergrenade/casino/redpanda
+ desc = "It is set to detonate in 5 seconds. It will release a red panda that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Red panda)"
+ spawner_type = /mob/living/simple_mob/vore/redpanda
+
+/obj/item/weapon/grenade/spawnergrenade/casino/horse
+ desc = "It is set to detonate in 5 seconds. It will release a horse that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Horse)"
+ spawner_type = /mob/living/simple_mob/vore/horse
+
+/obj/item/weapon/grenade/spawnergrenade/casino/otie
+ desc = "It is set to detonate in 5 seconds. It will release a otie that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Otie)"
+ spawner_type = /mob/living/simple_mob/otie/friendly
+
+/obj/item/weapon/grenade/spawnergrenade/casino/otie/chubby
+ desc = "It is set to detonate in 5 seconds. It will release a chonker otie that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Well feed Otie)"
+ spawner_type = /mob/living/simple_mob/otie/friendly/chubby
+
+/obj/item/weapon/grenade/spawnergrenade/casino/zorgoia
+ desc = "It is set to detonate in 5 seconds. It will release a zorgoia that has been won from the golden goose casino!"
+ name = "Casino Creature Container (Zorgoia)"
+ spawner_type = /mob/living/simple_mob/otie/zorgoia/friendly
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/id cards/CH_ids.dm b/code/game/objects/items/weapons/id cards/CH_ids.dm
new file mode 100644
index 0000000000..2d023bb626
--- /dev/null
+++ b/code/game/objects/items/weapons/id cards/CH_ids.dm
@@ -0,0 +1,26 @@
+/obj/item/weapon/card/id/casino
+ name = "casino employee id"
+ desc = "An ID card for an employee of the golden goose casino."
+ icon_state = "ch_casino"
+ item_state = "gold_id"
+
+ access = list(160)
+
+/obj/item/weapon/card/id/casino/booth
+ name = "casino booth employee id"
+ desc = "An ID card for an employee of the golden goose casino with extra access to prize booth."
+ access = list(160, 200)
+
+/obj/item/weapon/card/id/casino
+ name = "casino employee id"
+ desc = "An ID card for an employee of the golden goose casino."
+ icon_state = "ch_casino"
+ item_state = "gold_id"
+
+ access = list(160, 200, 201)
+
+/obj/item/weapon/card/id/casino/manager
+ name = "casino manager id"
+ desc = "An ID card for the manager of the golden goose casino."
+ icon_state = "ch_casino_manager"
+ access = list(160, 200, 201, 300)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/id cards/YW_ids.dm b/code/game/objects/items/weapons/id cards/YW_ids.dm
new file mode 100644
index 0000000000..64f5500873
--- /dev/null
+++ b/code/game/objects/items/weapons/id cards/YW_ids.dm
@@ -0,0 +1,5 @@
+/obj/item/weapon/card/id/blueshield
+ assignment = "Blueshield Guard"
+ rank= "Blueshield Guard"
+ icon_state = "blueshield"
+ preserve_item = 0
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/lego.dm b/code/game/objects/items/weapons/lego.dm
new file mode 100644
index 0000000000..1c489651a5
--- /dev/null
+++ b/code/game/objects/items/weapons/lego.dm
@@ -0,0 +1,58 @@
+/obj/item/weapon/lego
+ name = "Lego of Doom"
+ throw_speed = 5
+ throw_range = 4
+ gender = PLURAL
+ icon = 'icons/obj/items_ch.dmi'
+ icon_state = "lego"
+ desc = "An absolutely horrifying mechanical trap, banned in most sectors across the universe. Placing one is considered a major war crime."
+ randpixel = 0
+ center_of_mass = null
+ throwforce = 0
+ w_class = ITEMSIZE_SMALL
+
+/obj/item/weapon/lego/Crossed(atom/movable/AM as mob|obj)
+ if(AM.is_incorporeal())
+ return
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(L.m_intent == "run")
+ L.visible_message(
+ "[L] steps on \the [src].",
+ "You step on \the [src], you poor bastard!",
+ "You hear the sound of immeasurable suffering!"
+ )
+ L.adjustHalLoss(100)
+ playsound(src, 'sound/misc/legodeath.ogg', 50, 1)
+ qdel(src)
+ ..()
+
+/obj/item/weapon/lego/gib
+ name = "Lego of Doom"
+ throw_speed = 5
+ throw_range = 4
+ gender = PLURAL
+ icon = 'icons/obj/items_ch.dmi'
+ icon_state = "lego"
+ desc = "An absolutely horrifying mechanical trap, banned in most sectors across the universe. Placing one is considered a major war crime."
+ randpixel = 0
+ center_of_mass = null
+ throwforce = 0
+ w_class = ITEMSIZE_SMALL
+
+/obj/item/weapon/lego/gib/Crossed(atom/movable/AM as mob|obj)
+ if(AM.is_incorporeal())
+ return
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(L.m_intent == "run")
+ L.visible_message(
+ "[L] steps on \the [src].",
+ "You step on \the [src], you poor bastard!",
+ "You hear the sound of immeasurable suffering!"
+ )
+ L.gib()
+ playsound(src, 'sound/misc/legodeath.ogg', 50, 1)
+ qdel(src)
+ ..()
+
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index 07a868d432..b8252872e8 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -21,7 +21,7 @@
-
+