mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-22 13:27:49 +01:00
@@ -2,3 +2,10 @@
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.txt]
|
||||
insert_final_newline = false
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
# merger hooks, run tools/hooks/install.bat or install.sh to set up
|
||||
*.dmm merge=dmm
|
||||
*.dmi merge=dmi
|
||||
|
||||
# force changelog merging to use union
|
||||
html/changelog.html merge=union
|
||||
|
||||
# force all files to be LF
|
||||
* text=auto
|
||||
+220
-1
@@ -1,2 +1,221 @@
|
||||
###Files and folders specified here will never be tracked.
|
||||
|
||||
tgstation.int
|
||||
#Ignore everything in datafolder and subdirectories
|
||||
/data/**/*
|
||||
/tmp/**/*
|
||||
|
||||
#Ignore byond config folder.
|
||||
/cfg/**/*
|
||||
|
||||
#Ignore compiled files and other files generated during compilation.
|
||||
*.mdme
|
||||
*.dmb
|
||||
*.rsc
|
||||
*.lk
|
||||
*.int
|
||||
*.backup
|
||||
### https://raw.github.com/github/gitignore/cc542de017c606138a87ee4880e5f06b3a306def/Global/Linux.gitignore
|
||||
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
|
||||
### https://raw.github.com/github/gitignore/cc542de017c606138a87ee4880e5f06b3a306def/Global/Vim.gitignore
|
||||
|
||||
# swap
|
||||
[._]*.s[a-w][a-z]
|
||||
[._]s[a-w][a-z]
|
||||
# session
|
||||
Session.vim
|
||||
# temporary
|
||||
.netrwhist
|
||||
*~
|
||||
# auto-generated tag files
|
||||
tags
|
||||
|
||||
|
||||
### https://raw.github.com/github/gitignore/cc542de017c606138a87ee4880e5f06b3a306def/Python.gitignore
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
#*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
env/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*,cover
|
||||
.hypothesis/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
|
||||
# Flask instance folder
|
||||
instance/
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# IPython Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery beat schedule file
|
||||
celerybeat-schedule
|
||||
|
||||
# dotenv
|
||||
.env
|
||||
|
||||
# virtualenv
|
||||
venv/
|
||||
ENV/
|
||||
|
||||
# IntelliJ IDEA / PyCharm (with plugin)
|
||||
.idea
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
|
||||
### https://raw.github.com/github/gitignore/cc542de017c606138a87ee4880e5f06b3a306def/Global/Windows.gitignore
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
#*.cab
|
||||
#*.msi
|
||||
#*.msm
|
||||
#*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
|
||||
### https://raw.github.com/github/gitignore/cc542de017c606138a87ee4880e5f06b3a306def/Global/OSX.gitignore
|
||||
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
*.before
|
||||
|
||||
#Sublime
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
|
||||
#Visual studio stuff
|
||||
*.vscode/*
|
||||
!/.vscode/extensions.json
|
||||
tools/MapAtmosFixer/MapAtmosFixer/obj/*
|
||||
tools/MapAtmosFixer/MapAtmosFixer/bin/*
|
||||
|
||||
#GitHub Atom
|
||||
.atom-build.json
|
||||
|
||||
#KDevelop and Kate
|
||||
*.kdev4*
|
||||
*.kate-swp
|
||||
|
||||
#extra map stuff
|
||||
/_maps/**/backup/
|
||||
/_maps/templates.dm
|
||||
|
||||
#dmdoc default folder
|
||||
/dmdoc
|
||||
# Ignore custom music and title screens (amend as appropriate)
|
||||
/config/jukebox_music/sounds/*
|
||||
!/config/jukebox_music/sounds/exclude
|
||||
/config/title_music/sounds/*
|
||||
!/config/title_music/sounds/exclude
|
||||
/config/title_screens/images/*
|
||||
!/config/title_screens/images/exclude
|
||||
|
||||
+124504
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,177 @@
|
||||
## Hyper Station 13
|
||||
|
||||
Based and maintained from Citadel Station.
|
||||
|
||||
[](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
|
||||
|
||||
[](http://www.krihelinator.xyz)
|
||||
|
||||
[](http://isitmaintained.com/project/quotefox/Hyper-Station-13 "Percentage of issues still open") [](http://isitmaintained.com/project/quotefox/Hyper-Station-13 "Average time to resolve an issue")
|
||||
|
||||
**Hyper Station Information**
|
||||
**Website:** http://hyperstation13.com
|
||||
**Code:** https://github.com/quotefox/Hyper-Station-13
|
||||
**Discord:** [Here](https://discord.gg/PCtX2fH).
|
||||
|
||||
**Upstream Information**
|
||||
**/tg/ Station**
|
||||
**Website:** http://www.tgstation13.org
|
||||
**Code:** https://github.com/tgstation/tgstation
|
||||
**Wiki** http://tgstation13.org/wiki/Main_Page
|
||||
**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
|
||||
|
||||
**Citadel Station**
|
||||
**Website:** http://citadel-station.net
|
||||
**Code:** https://github.com/Citadel-Station-13/Citadel-Station-13
|
||||
**Discord:** [Here](https://discord.gg/E6SQuhz).
|
||||
|
||||
## DOWNLOADING
|
||||
|
||||
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code
|
||||
|
||||
Option 1:
|
||||
Follow this: http://www.tgstation13.org/wiki/Setting_up_git
|
||||
|
||||
Option 2: Download the source code as a zip by clicking the ZIP button in the
|
||||
code tab of https://github.com/tgstation/tgstation
|
||||
(note: this will use a lot of bandwidth if you wish to update and is a lot of
|
||||
hassle if you want to make any changes at all, so it's not recommended.)
|
||||
|
||||
Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2)
|
||||
|
||||
## INSTALLATION
|
||||
|
||||
First-time installation should be fairly straightforward. First, you'll need
|
||||
BYOND installed. You can get it from https://www.byond.com/download. Once you've done
|
||||
that, extract the game files to wherever you want to keep them. This is a
|
||||
sourcecode-only release, so the next step is to compile the server files.
|
||||
Open tgstation.dme by double-clicking it, open the Build menu, and click
|
||||
compile. This'll take a little while, and if everything's done right you'll get
|
||||
a message like this:
|
||||
|
||||
```
|
||||
saving tgstation.dmb (DEBUG mode)
|
||||
tgstation.dmb - 0 errors, 0 warnings
|
||||
```
|
||||
|
||||
If you see any errors or warnings, something has gone wrong - possibly a corrupt
|
||||
download or the files extracted wrong. If problems persist, ask for assistance
|
||||
in irc://irc.rizon.net/coderbus
|
||||
|
||||
Once that's done, open up the config folder. You'll want to edit config.txt to
|
||||
set the probabilities for different gamemodes in Secret and to set your server
|
||||
location so that all your players don't get disconnected at the end of each
|
||||
round. It's recommended you don't turn on the gamemodes with probability 0,
|
||||
except Extended, as they have various issues and aren't currently being tested,
|
||||
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
|
||||
isn't in the Secret rotation by default as it's just not very fun.
|
||||
|
||||
You'll also want to edit config/admins.txt to remove the default admins and add
|
||||
your own. "Game Master" is the highest level of access, and probably the one
|
||||
you'll want to use for now. You can set up your own ranks and find out more in
|
||||
config/admin_ranks.txt
|
||||
|
||||
The format is
|
||||
|
||||
```
|
||||
byondkey = Rank
|
||||
```
|
||||
|
||||
where the admin rank must be properly capitalised.
|
||||
|
||||
This codebase also depends on a native library called rust-g. A precompiled
|
||||
Windows DLL is included in this repository, but Linux users will need to build
|
||||
and install it themselves. Directions can be found at the [rust-g
|
||||
repo](https://github.com/tgstation13/rust-g).
|
||||
|
||||
Finally, to start the server, run Dream Daemon and enter the path to your
|
||||
compiled tgstation.dmb file. Make sure to set the port to the one you
|
||||
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
|
||||
and the server should start up and be ready to join. It is also recommended that
|
||||
you set up the SQL backend (see below).
|
||||
|
||||
## UPDATING
|
||||
|
||||
To update an existing installation, first back up your /config and /data folders
|
||||
as these store your server configuration, player preferences and banlist.
|
||||
|
||||
Then, extract the new files (preferably into a clean directory, but updating in
|
||||
place should work fine), copy your /config and /data folders back into the new
|
||||
install, overwriting when prompted except if we've specified otherwise, and
|
||||
recompile the game. Once you start the server up again, you should be running
|
||||
the new version.
|
||||
|
||||
## HOSTING
|
||||
|
||||
If you'd like a more robust server hosting option for tgstation and its
|
||||
derivatives. Check out our server tools suite at
|
||||
https://github.com/tgstation/tgstation-server
|
||||
|
||||
## MAPS
|
||||
|
||||
/tg/station currently comes equipped with five maps.
|
||||
|
||||
* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation)
|
||||
* [MetaStation](https://tgstation13.org/wiki/MetaStation)
|
||||
* [DeltaStation](https://tgstation13.org/wiki/DeltaStation)
|
||||
* [OmegaStation](https://tgstation13.org/wiki/OmegaStation)
|
||||
* [PubbyStation](https://tgstation13.org/wiki/PubbyStation)
|
||||
|
||||
|
||||
All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility.
|
||||
|
||||
The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round.
|
||||
|
||||
If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file.
|
||||
|
||||
Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger)
|
||||
|
||||
## AWAY MISSIONS
|
||||
|
||||
/tg/station supports loading away missions however they are disabled by default.
|
||||
|
||||
Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code.
|
||||
|
||||
To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load.
|
||||
|
||||
## SQL SETUP
|
||||
|
||||
The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database
|
||||
|
||||
## WEB/CDN RESOURCE DELIVERY
|
||||
|
||||
Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server.
|
||||
|
||||
1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0`
|
||||
1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc.
|
||||
* If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers.
|
||||
* Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files.
|
||||
|
||||
## IRC BOT SETUP
|
||||
|
||||
Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified
|
||||
IRC channel/server, see the /tools/minibot folder for more
|
||||
|
||||
## CONTRIBUTING
|
||||
|
||||
Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md)
|
||||
|
||||
## LICENSE
|
||||
|
||||
All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html).
|
||||
|
||||
All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||
(Including tools unless their readme specifies otherwise.)
|
||||
|
||||
See LICENSE and GPLv3.txt for more details.
|
||||
|
||||
tgui clientside is licensed as a subproject under the MIT license.
|
||||
Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1
|
||||
tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
|
||||
The TGS3 API is licensed as a subproject under the MIT license.
|
||||
|
||||
See tgui/LICENSE.md for the MIT license.
|
||||
See tgui/assets/fonts/SIL-OFL-1.1-LICENSE.md for the SIL Open Font License.
|
||||
See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license.
|
||||
|
||||
All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](http://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
|
||||
@@ -279,6 +279,7 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/freezer,
|
||||
/area/ruin/powered/seedvault)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
|
||||
+124522
-7205
File diff suppressed because it is too large
Load Diff
+84177
-2294
File diff suppressed because it is too large
Load Diff
+1968
-164
File diff suppressed because it is too large
Load Diff
+238
-41
@@ -1,56 +1,253 @@
|
||||
"a" = (/turf/open/space/basic,/area/space)
|
||||
"b" = (/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"c" = (/obj/structure/sign/mining/survival{dir = 1},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"d" = (/obj/structure/fans,/turf/open/floor/pod,/area/survivalpod)
|
||||
"e" = (/obj/machinery/smartfridge/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"f" = (/obj/item/gps/computer,/turf/open/floor/pod,/area/survivalpod)
|
||||
"g" = (/obj/structure/sign/mining/survival{dir = 8},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"h" = (/obj/machinery/sleeper/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"i" = (/turf/open/floor/pod,/area/survivalpod)
|
||||
"j" = (/obj/structure/bed/pod,/obj/item/bedsheet/black,/turf/open/floor/pod,/area/survivalpod)
|
||||
"k" = (/obj/structure/sign/mining/survival{dir = 4},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"l" = (/obj/structure/table/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"m" = (/obj/structure/tubes,/obj/structure/chair/comfy/black{dir = 8},/turf/open/floor/pod,/area/survivalpod)
|
||||
"n" = (/obj/structure/sign/mining/survival,/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"o" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod/glass,/turf/open/floor/pod,/area/survivalpod)
|
||||
"p" = (/obj/structure/sign/mining,/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/open/space/basic,
|
||||
/area/space)
|
||||
"b" = (
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"c" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 1
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"d" = (
|
||||
/obj/structure/fans,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"e" = (
|
||||
/obj/machinery/smartfridge/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"f" = (
|
||||
/obj/item/gps/computer,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"g" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 8
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"h" = (
|
||||
/obj/machinery/sleeper/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"i" = (
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"j" = (
|
||||
/obj/structure/bed/pod,
|
||||
/obj/item/bedsheet/black,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"k" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 4
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"l" = (
|
||||
/obj/structure/table/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"m" = (
|
||||
/obj/structure/tubes,
|
||||
/obj/structure/chair/comfy/black{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"n" = (
|
||||
/obj/structure/sign/mining/survival,
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"o" = (
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/machinery/door/airlock/survival_pod/glass,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"p" = (
|
||||
/obj/structure/sign/mining,
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
|
||||
(1,1,1) = {"
|
||||
bbcbb
|
||||
bdefb
|
||||
ghijk
|
||||
blimb
|
||||
bnopb
|
||||
b
|
||||
b
|
||||
g
|
||||
b
|
||||
b
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
b
|
||||
d
|
||||
h
|
||||
l
|
||||
n
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
c
|
||||
e
|
||||
i
|
||||
i
|
||||
o
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
b
|
||||
f
|
||||
j
|
||||
m
|
||||
p
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
b
|
||||
b
|
||||
k
|
||||
b
|
||||
b
|
||||
"}
|
||||
|
||||
(1,1,2) = {"
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,2) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,2) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(4,1,2) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(5,1,2) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
|
||||
(1,1,3) = {"
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,3) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,3) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(4,1,3) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(5,1,3) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
|
||||
(1,1,4) = {"
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,4) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,4) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(4,1,4) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(5,1,4) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
|
||||
(1,1,5) = {"
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
aaaaa
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,5) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(3,1,5) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(4,1,5) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(5,1,5) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
|
||||
+247
-36
@@ -1,39 +1,250 @@
|
||||
"a" = (/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"b" = (/obj/structure/sign/mining/survival{dir = 1},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"c" = (/obj/structure/sign/mining/survival{dir = 8},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"d" = (/obj/structure/fans,/turf/open/floor/pod,/area/survivalpod)
|
||||
"e" = (/obj/machinery/smartfridge/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"f" = (/obj/item/gps/computer,/turf/open/floor/pod,/area/survivalpod)
|
||||
"g" = (/obj/structure/ore_box,/obj/structure/window/reinforced/survival_pod{dir = 8; layer = 3},/turf/open/floor/pod,/area/survivalpod)
|
||||
"h" = (/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/structure/rack,/turf/open/floor/pod,/area/survivalpod)
|
||||
"i" = (/obj/structure/sign/mining/survival{dir = 4},/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"j" = (/obj/machinery/sleeper/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"k" = (/turf/open/floor/pod,/area/survivalpod)
|
||||
"l" = (/obj/structure/bed/pod,/obj/item/bedsheet/black,/turf/open/floor/pod,/area/survivalpod)
|
||||
"m" = (/obj/structure/window/reinforced/survival_pod{dir = 8; layer = 3},/turf/open/floor/pod,/area/survivalpod)
|
||||
"n" = (/obj/structure/table/survival_pod,/obj/item/storage/firstaid/regular,/turf/open/floor/pod,/area/survivalpod)
|
||||
"o" = (/obj/structure/tubes,/turf/open/floor/pod,/area/survivalpod)
|
||||
"p" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/turf/open/floor/pod,/area/survivalpod)
|
||||
"q" = (/obj/machinery/light{dir = 4; light_color = "#DDFFD3"},/turf/open/floor/pod,/area/survivalpod)
|
||||
"r" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/machinery/shower{layer = 2},/obj/structure/curtain{alpha = 240; color = "#454545"; icon_state = "closed"; layer = 5.1; open = 0},/turf/open/floor/pod,/area/survivalpod)
|
||||
"s" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 4},/obj/structure/toilet{layer = 2},/obj/structure/curtain{alpha = 240; color = "#454545"; icon_state = "closed"; layer = 5.1; open = 0},/turf/open/floor/pod,/area/survivalpod)
|
||||
"t" = (/obj/machinery/door/window/survival_pod{icon_state = "windoor"; dir = 1},/turf/open/floor/pod,/area/survivalpod)
|
||||
"u" = (/obj/structure/window/reinforced/survival_pod{density = 0; dir = 9},/turf/open/floor/pod,/area/survivalpod)
|
||||
"v" = (/obj/structure/chair,/turf/open/floor/pod,/area/survivalpod)
|
||||
"w" = (/obj/structure/sink/kitchen{icon_state = "sink_alt"; dir = 4; pixel_x = -13},/turf/open/floor/pod,/area/survivalpod)
|
||||
"x" = (/obj/machinery/light,/obj/machinery/door/window/survival_pod{icon_state = "windoor"; dir = 4},/turf/open/floor/pod,/area/survivalpod)
|
||||
"y" = (/obj/structure/table/reinforced,/turf/open/floor/pod,/area/survivalpod)
|
||||
"z" = (/obj/structure/sign/mining/survival,/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"A" = (/obj/machinery/door/airlock/survival_pod/glass,/obj/structure/fans/tiny,/turf/open/floor/pod,/area/survivalpod)
|
||||
"B" = (/obj/structure/sign/mining,/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"C" = (/obj/structure/fans/tiny,/obj/machinery/door/airlock/survival_pod/glass,/obj/structure/fans/tiny,/turf/open/floor/pod,/area/survivalpod)
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"b" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 1
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"c" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 8
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"d" = (
|
||||
/obj/structure/fans,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"e" = (
|
||||
/obj/machinery/smartfridge/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"f" = (
|
||||
/obj/item/gps/computer,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"g" = (
|
||||
/obj/structure/ore_box,
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8;
|
||||
layer = 3
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"h" = (
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/structure/rack,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"i" = (
|
||||
/obj/structure/sign/mining/survival{
|
||||
dir = 4
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"j" = (
|
||||
/obj/machinery/sleeper/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"k" = (
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"l" = (
|
||||
/obj/structure/bed/pod,
|
||||
/obj/item/bedsheet/black,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"m" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8;
|
||||
layer = 3
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"n" = (
|
||||
/obj/structure/table/survival_pod,
|
||||
/obj/item/storage/firstaid/regular,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"o" = (
|
||||
/obj/structure/tubes,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"p" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"q" = (
|
||||
/obj/machinery/light{
|
||||
dir = 4;
|
||||
light_color = "#DDFFD3"
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"r" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/shower{
|
||||
layer = 2
|
||||
},
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "closed";
|
||||
layer = 5.1;
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"s" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/toilet{
|
||||
layer = 2
|
||||
},
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "closed";
|
||||
layer = 5.1;
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"t" = (
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
icon_state = "windoor";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"u" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
density = 0;
|
||||
dir = 9
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"v" = (
|
||||
/obj/structure/chair,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"w" = (
|
||||
/obj/structure/sink/kitchen{
|
||||
icon_state = "sink_alt";
|
||||
dir = 4;
|
||||
pixel_x = -13
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"x" = (
|
||||
/obj/machinery/light,
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
icon_state = "windoor";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"y" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"z" = (
|
||||
/obj/structure/sign/mining/survival,
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"A" = (
|
||||
/obj/machinery/door/airlock/survival_pod/glass,
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"B" = (
|
||||
/obj/structure/sign/mining,
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"C" = (
|
||||
/obj/structure/fans/tiny,
|
||||
/obj/machinery/door/airlock/survival_pod/glass,
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
|
||||
(1,1,1) = {"
|
||||
abababa
|
||||
cdefghi
|
||||
ajklmqa
|
||||
cnkopkA
|
||||
arstuva
|
||||
cwxkkyi
|
||||
azaCaBa
|
||||
a
|
||||
c
|
||||
a
|
||||
c
|
||||
a
|
||||
c
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
b
|
||||
d
|
||||
j
|
||||
n
|
||||
r
|
||||
w
|
||||
z
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
e
|
||||
k
|
||||
k
|
||||
s
|
||||
x
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
b
|
||||
f
|
||||
l
|
||||
o
|
||||
t
|
||||
k
|
||||
C
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
g
|
||||
m
|
||||
p
|
||||
u
|
||||
k
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
b
|
||||
h
|
||||
q
|
||||
k
|
||||
v
|
||||
y
|
||||
B
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
i
|
||||
a
|
||||
A
|
||||
a
|
||||
i
|
||||
a
|
||||
"}
|
||||
|
||||
+280
-39
@@ -1,42 +1,283 @@
|
||||
"a" = (/turf/closed/wall/mineral/titanium/survival,/area/survivalpod)
|
||||
"b" = (/obj/machinery/door/airlock/survival_pod,/obj/structure/fans/tiny,/turf/closed/wall/mineral/titanium/survival,/area/survivalpod)
|
||||
"c" = (/obj/machinery/sleeper/survival_pod,/turf/open/floor/pod/dark,/area/survivalpod)
|
||||
"d" = (/obj/machinery/vending/wallmed{pixel_y = 24},/obj/machinery/light{dir = 4; light_color = "#DDFFD3"},/turf/open/floor/pod/dark,/area/survivalpod)
|
||||
"e" = (/turf/open/floor/pod,/area/survivalpod)
|
||||
"f" = (/obj/structure/fans,/obj/structure/window/reinforced/survival_pod{dir = 8},/turf/closed/wall/mineral/titanium/survival,/area/survivalpod)
|
||||
"g" = (/obj/machinery/smartfridge/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"h" = (/obj/item/gps/computer,/turf/open/floor/pod,/area/survivalpod)
|
||||
"i" = (/obj/structure/table/survival_pod,/obj/item/storage/firstaid/regular{pixel_y = 9},/obj/item/storage/firstaid/brute,/turf/open/floor/pod/dark,/area/survivalpod)
|
||||
"j" = (/turf/open/floor/pod/dark,/area/survivalpod)
|
||||
"k" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/turf/open/floor/pod,/area/survivalpod)
|
||||
"l" = (/obj/machinery/door/airlock/survival_pod/glass,/turf/open/floor/pod/dark,/area/survivalpod)
|
||||
"m" = (/obj/structure/table/survival_pod,/turf/open/floor/pod/light,/area/survivalpod)
|
||||
"n" = (/obj/machinery/mineral/equipment_vendor,/turf/open/floor/pod,/area/survivalpod)
|
||||
"o" = (/obj/structure/bed,/obj/effect/spawner/lootdrop/bedsheet,/obj/machinery/light{icon_state = "tube"; dir = 1},/turf/open/floor/pod/light,/area/survivalpod)
|
||||
"p" = (/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 6},/turf/open/floor/pod,/area/survivalpod)
|
||||
"q" = (/obj/structure/window/reinforced/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"r" = (/obj/structure/window/reinforced/survival_pod,/obj/structure/ore_box,/turf/open/floor/pod,/area/survivalpod)
|
||||
"s" = (/obj/machinery/light{icon_state = "tube"; dir = 8},/turf/open/floor/pod,/area/survivalpod)
|
||||
"t" = (/obj/structure/chair{icon_state = "chair"; dir = 1},/turf/open/floor/pod/light,/area/survivalpod)
|
||||
"u" = (/obj/machinery/door/window/survival_pod{icon_state = "windoor"; dir = 4},/turf/open/floor/pod,/area/survivalpod)
|
||||
"v" = (/turf/open/floor/pod/light,/area/survivalpod)
|
||||
"w" = (/obj/structure/sink/kitchen{icon_state = "sink_alt"; dir = 4; pixel_x = -13},/turf/open/floor/pod/light,/area/survivalpod)
|
||||
"x" = (/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 4},/turf/open/floor/pod,/area/survivalpod)
|
||||
"y" = (/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/effect/spawner/lootdrop/mre,/obj/structure/rack,/turf/open/floor/pod,/area/survivalpod)
|
||||
"z" = (/obj/structure/closet/secure_closet/miner,/turf/open/floor/pod,/area/survivalpod)
|
||||
"A" = (/obj/machinery/door/airlock/survival_pod,/obj/structure/fans/tiny,/turf/open/floor/pod,/area/survivalpod)
|
||||
"B" = (/obj/machinery/door/airlock/survival_pod/glass,/turf/open/floor/pod/light,/area/survivalpod)
|
||||
"C" = (/obj/structure/toilet{icon_state = "toilet00"; dir = 1},/obj/structure/curtain{alpha = 240; color = "#454545"; icon_state = "closed"; open = 0},/turf/open/floor/pod/light,/area/survivalpod)
|
||||
"D" = (/obj/machinery/shower{icon_state = "shower"; dir = 1},/obj/structure/curtain{alpha = 240; color = "#454545"; icon_state = "closed"; open = 0},/turf/open/floor/pod/light,/area/survivalpod)
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/closed/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"b" = (
|
||||
/obj/machinery/door/airlock/survival_pod,
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/closed/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"c" = (
|
||||
/obj/machinery/sleeper/survival_pod,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/survivalpod)
|
||||
"d" = (
|
||||
/obj/machinery/vending/wallmed{
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/machinery/light{
|
||||
dir = 4;
|
||||
light_color = "#DDFFD3"
|
||||
},
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/survivalpod)
|
||||
"e" = (
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"f" = (
|
||||
/obj/structure/fans,
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/turf/closed/wall/mineral/titanium/survival,
|
||||
/area/survivalpod)
|
||||
"g" = (
|
||||
/obj/machinery/smartfridge/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"h" = (
|
||||
/obj/item/gps/computer,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"i" = (
|
||||
/obj/structure/table/survival_pod,
|
||||
/obj/item/storage/firstaid/regular{
|
||||
pixel_y = 9
|
||||
},
|
||||
/obj/item/storage/firstaid/brute,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/survivalpod)
|
||||
"j" = (
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/survivalpod)
|
||||
"k" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"l" = (
|
||||
/obj/machinery/door/airlock/survival_pod/glass,
|
||||
/turf/open/floor/pod/dark,
|
||||
/area/survivalpod)
|
||||
"m" = (
|
||||
/obj/structure/table/survival_pod,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
"n" = (
|
||||
/obj/machinery/mineral/equipment_vendor,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"o" = (
|
||||
/obj/structure/bed,
|
||||
/obj/effect/spawner/lootdrop/bedsheet,
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
"p" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 6
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"q" = (
|
||||
/obj/structure/window/reinforced/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"r" = (
|
||||
/obj/structure/window/reinforced/survival_pod,
|
||||
/obj/structure/ore_box,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"s" = (
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"t" = (
|
||||
/obj/structure/chair{
|
||||
icon_state = "chair";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
"u" = (
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
icon_state = "windoor";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"v" = (
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
"w" = (
|
||||
/obj/structure/sink/kitchen{
|
||||
icon_state = "sink_alt";
|
||||
dir = 4;
|
||||
pixel_x = -13
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
"x" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"y" = (
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/effect/spawner/lootdrop/mre,
|
||||
/obj/structure/rack,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"z" = (
|
||||
/obj/structure/closet/secure_closet/miner,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"A" = (
|
||||
/obj/machinery/door/airlock/survival_pod,
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"B" = (
|
||||
/obj/machinery/door/airlock/survival_pod/glass,
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
"C" = (
|
||||
/obj/structure/toilet{
|
||||
icon_state = "toilet00";
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "closed";
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
"D" = (
|
||||
/obj/machinery/shower{
|
||||
icon_state = "shower";
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "closed";
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/pod/light,
|
||||
/area/survivalpod)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaaabaaaa
|
||||
acdaefgha
|
||||
aijlekeea
|
||||
aaaaeeeea
|
||||
amoaseena
|
||||
atvaepqra
|
||||
awvBeueea
|
||||
aCDaexyza
|
||||
aaaaAaaaa
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
c
|
||||
i
|
||||
a
|
||||
m
|
||||
t
|
||||
w
|
||||
C
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
d
|
||||
j
|
||||
a
|
||||
o
|
||||
v
|
||||
v
|
||||
D
|
||||
a
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
a
|
||||
l
|
||||
a
|
||||
a
|
||||
a
|
||||
B
|
||||
a
|
||||
a
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
b
|
||||
e
|
||||
e
|
||||
e
|
||||
s
|
||||
e
|
||||
e
|
||||
e
|
||||
A
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
f
|
||||
k
|
||||
e
|
||||
e
|
||||
p
|
||||
u
|
||||
x
|
||||
a
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
g
|
||||
e
|
||||
e
|
||||
e
|
||||
q
|
||||
e
|
||||
y
|
||||
a
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
a
|
||||
h
|
||||
e
|
||||
e
|
||||
n
|
||||
r
|
||||
e
|
||||
z
|
||||
a
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
|
||||
@@ -1,56 +1,480 @@
|
||||
"a" = (/turf/closed/wall/mineral/titanium/survival/pod,/area/survivalpod)
|
||||
"b" = (/obj/structure/toilet{icon_state = "toilet00"; dir = 4},/obj/structure/curtain{alpha = 240; color = "#454545"; icon_state = "closed"; open = 0},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"c" = (/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"d" = (/obj/structure/table/wood/fancy/black,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"e" = (/obj/machinery/door/window/survival_pod{icon_state = "windoor"; dir = 8},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"f" = (/obj/machinery/chem_dispenser/drinks/beer{pixel_y = 24},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"g" = (/obj/machinery/chem_dispenser/drinks{pixel_y = 24},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"h" = (/obj/machinery/vending/boozeomat/all_access{pixel_y = 32},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"i" = (/obj/machinery/shower{icon_state = "shower"; dir = 4},/obj/structure/curtain{alpha = 240; color = "#454545"; icon_state = "closed"; open = 0},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"j" = (/obj/structure/bed,/obj/effect/spawner/lootdrop/bedsheet,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"k" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/structure/table/wood/fancy/black,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"l" = (/obj/structure/table/wood/fancy/black,/obj/effect/spawner/lootdrop/three_course_meal,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"m" = (/obj/structure/table/wood/fancy/black,/obj/item/reagent_containers/food/drinks/shaker,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"n" = (/obj/structure/table/wood/fancy/black,/obj/machinery/light{icon_state = "tube"; dir = 1},/obj/effect/spawner/lootdrop/three_course_meal,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"o" = (/obj/machinery/door/airlock/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"p" = (/obj/structure/chair/stool/bar,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"q" = (/turf/open/floor/pod,/area/survivalpod)
|
||||
"r" = (/obj/structure/piano,/turf/open/floor/pod,/area/survivalpod)
|
||||
"s" = (/obj/structure/chair/stool,/turf/open/floor/pod,/area/survivalpod)
|
||||
"t" = (/obj/machinery/door/airlock/survival_pod/glass,/obj/structure/fans/tiny,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"u" = (/obj/machinery/light{icon_state = "tube"; dir = 8},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"v" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/chair/sofa/right,/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 1},/turf/open/floor/pod,/area/survivalpod)
|
||||
"w" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/chair/sofa,/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 1},/turf/open/floor/pod,/area/survivalpod)
|
||||
"x" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 4},/obj/structure/chair/sofa/corner,/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 4},/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 1},/turf/open/floor/pod,/area/survivalpod)
|
||||
"y" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 4},/obj/structure/grille,/turf/open/floor/pod,/area/survivalpod)
|
||||
"z" = (/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 4},/obj/structure/chair/sofa{icon_state = "sofamiddle"; dir = 8},/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 4},/turf/open/floor/pod,/area/survivalpod)
|
||||
"A" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/fans,/turf/open/floor/pod,/area/survivalpod)
|
||||
"B" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/machinery/smartfridge/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"C" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/item/gps/computer,/turf/open/floor/pod,/area/survivalpod)
|
||||
"D" = (/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 4},/obj/structure/chair/sofa/left{icon_state = "sofaend_left"; dir = 8},/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 4},/turf/open/floor/pod,/area/survivalpod)
|
||||
"E" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/machinery/sleeper/survival_pod,/turf/open/floor/pod,/area/survivalpod)
|
||||
"F" = (/obj/structure/ore_box{layer = 3.1},/turf/open/floor/pod,/area/survivalpod)
|
||||
"G" = (/obj/structure/table/wood/fancy/black,/obj/item/storage/box/drinkingglasses,/obj/machinery/light{icon_state = "tube"; dir = 4},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"H" = (/obj/machinery/door/window/survival_pod{icon_state = "windoor"; dir = 8},/turf/open/floor/pod,/area/survivalpod)
|
||||
"I" = (/obj/structure/table/reinforced,/obj/item/storage/firstaid/regular{pixel_y = 8},/obj/item/storage/firstaid/brute,/obj/item/storage/hypospraykit/regular{pixel_y = -4},/obj/item/crowbar,/turf/open/floor/pod,/area/survivalpod)
|
||||
"J" = (/obj/structure/window/reinforced/survival_pod{dir = 8},/obj/structure/window/reinforced/survival_pod,/obj/structure/window/reinforced/survival_pod{icon_state = "pwindow"; dir = 5},/obj/structure/grille,/turf/open/floor/pod,/area/survivalpod)
|
||||
"K" = (/obj/structure/window/reinforced/survival_pod,/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/grille,/turf/open/floor/pod,/area/survivalpod)
|
||||
"L" = (/obj/machinery/light{icon_state = "tube"; dir = 8},/turf/open/floor/pod,/area/survivalpod)
|
||||
"M" = (/obj/machinery/light{icon_state = "tube"; dir = 4},/turf/open/floor/pod,/area/survivalpod)
|
||||
"N" = (/obj/machinery/door/window/survival_pod{icon_state = "windoor"; dir = 1},/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 1},/obj/machinery/light{icon_state = "tube"; dir = 8},/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"O" = (/obj/machinery/door/window/survival_pod{icon_state = "windoor"; dir = 4},/obj/machinery/door/firedoor/border_only{icon_state = "door_open"; dir = 4},/obj/machinery/light,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
"P" = (/obj/machinery/light,/turf/open/floor/carpet/black,/area/survivalpod)
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/closed/wall/mineral/titanium/survival/pod,
|
||||
/area/survivalpod)
|
||||
"b" = (
|
||||
/obj/structure/toilet{
|
||||
icon_state = "toilet00";
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "closed";
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"c" = (
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"d" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"e" = (
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
icon_state = "windoor";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"f" = (
|
||||
/obj/machinery/chem_dispenser/drinks/beer{
|
||||
pixel_y = 24
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"g" = (
|
||||
/obj/machinery/chem_dispenser/drinks{
|
||||
pixel_y = 24
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"h" = (
|
||||
/obj/machinery/vending/boozeomat/all_access{
|
||||
pixel_y = 32
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"i" = (
|
||||
/obj/machinery/shower{
|
||||
icon_state = "shower";
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/curtain{
|
||||
alpha = 240;
|
||||
color = "#454545";
|
||||
icon_state = "closed";
|
||||
open = 0
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"j" = (
|
||||
/obj/structure/bed,
|
||||
/obj/effect/spawner/lootdrop/bedsheet,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"k" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"l" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/obj/effect/spawner/lootdrop/three_course_meal,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"m" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/obj/item/reagent_containers/food/drinks/shaker,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"n" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/spawner/lootdrop/three_course_meal,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"o" = (
|
||||
/obj/machinery/door/airlock/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"p" = (
|
||||
/obj/structure/chair/stool/bar,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"q" = (
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"r" = (
|
||||
/obj/structure/piano,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"s" = (
|
||||
/obj/structure/chair/stool,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"t" = (
|
||||
/obj/machinery/door/airlock/survival_pod/glass,
|
||||
/obj/structure/fans/tiny,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"u" = (
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"v" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/chair/sofa/right,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"w" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/chair/sofa,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"x" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/sofa/corner,
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"y" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/grille,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"z" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/sofa{
|
||||
icon_state = "sofamiddle";
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"A" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/fans,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"B" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/smartfridge/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"C" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/gps/computer,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"D" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/chair/sofa/left{
|
||||
icon_state = "sofaend_left";
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"E" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/sleeper/survival_pod,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"F" = (
|
||||
/obj/structure/ore_box{
|
||||
layer = 3.1
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"G" = (
|
||||
/obj/structure/table/wood/fancy/black,
|
||||
/obj/item/storage/box/drinkingglasses,
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"H" = (
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
icon_state = "windoor";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"I" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/storage/firstaid/regular{
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/item/storage/firstaid/brute,
|
||||
/obj/item/storage/hypospraykit/regular{
|
||||
pixel_y = -4
|
||||
},
|
||||
/obj/item/crowbar,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"J" = (
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced/survival_pod,
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
icon_state = "pwindow";
|
||||
dir = 5
|
||||
},
|
||||
/obj/structure/grille,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"K" = (
|
||||
/obj/structure/window/reinforced/survival_pod,
|
||||
/obj/structure/window/reinforced/survival_pod{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/grille,
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"L" = (
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"M" = (
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/pod,
|
||||
/area/survivalpod)
|
||||
"N" = (
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
icon_state = "windoor";
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/light{
|
||||
icon_state = "tube";
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"O" = (
|
||||
/obj/machinery/door/window/survival_pod{
|
||||
icon_state = "windoor";
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/door/firedoor/border_only{
|
||||
icon_state = "door_open";
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
"P" = (
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/carpet/black,
|
||||
/area/survivalpod)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaaaaaaaaaa
|
||||
abcnacefgha
|
||||
aicjauklmGa
|
||||
aaoaacppppa
|
||||
aLcrscqqqMa
|
||||
accccccccct
|
||||
aNvwxcqqqMa
|
||||
ycllzcqABCa
|
||||
ycdlDcqEqFa
|
||||
ycccOcPHqIa
|
||||
JKKKataaaaa
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
y
|
||||
y
|
||||
y
|
||||
J
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
b
|
||||
i
|
||||
a
|
||||
L
|
||||
c
|
||||
N
|
||||
c
|
||||
c
|
||||
c
|
||||
K
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
a
|
||||
c
|
||||
c
|
||||
o
|
||||
c
|
||||
c
|
||||
v
|
||||
l
|
||||
d
|
||||
c
|
||||
K
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
n
|
||||
j
|
||||
a
|
||||
r
|
||||
c
|
||||
w
|
||||
l
|
||||
l
|
||||
c
|
||||
K
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
s
|
||||
c
|
||||
x
|
||||
z
|
||||
D
|
||||
O
|
||||
a
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
a
|
||||
c
|
||||
u
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
c
|
||||
t
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
a
|
||||
e
|
||||
k
|
||||
p
|
||||
q
|
||||
c
|
||||
q
|
||||
q
|
||||
q
|
||||
P
|
||||
a
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
a
|
||||
f
|
||||
l
|
||||
p
|
||||
q
|
||||
c
|
||||
q
|
||||
A
|
||||
E
|
||||
H
|
||||
a
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
a
|
||||
g
|
||||
m
|
||||
p
|
||||
q
|
||||
c
|
||||
q
|
||||
B
|
||||
q
|
||||
q
|
||||
a
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
a
|
||||
h
|
||||
G
|
||||
p
|
||||
M
|
||||
c
|
||||
M
|
||||
C
|
||||
F
|
||||
I
|
||||
a
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
t
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
"}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#define FORCE_MAP "_maps/boxstation.json"
|
||||
@@ -115,6 +115,7 @@
|
||||
#define DRINKSBLOOD 15
|
||||
#define NOEYES 16
|
||||
#define MARKINGS 17
|
||||
#define WINGCOLOR 18
|
||||
|
||||
//organ slots
|
||||
#define ORGAN_SLOT_BRAIN "brain"
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
|
||||
#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90b3dd"
|
||||
#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "#ef7f7f"
|
||||
#define COLOR_WHITEMODE_BACKGROUND "#ffffff"
|
||||
#define COLOR_WHITEMODE_DARKBACKGROUND "#eeeeee"
|
||||
#define COLOR_WHITEMODE_BACKGROUND "#eeeeee"
|
||||
#define COLOR_WHITEMODE_DARKBACKGROUND "#dddddd"
|
||||
#define COLOR_WHITEMODE_TEXT "#000000"
|
||||
|
||||
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
|
||||
|
||||
@@ -109,3 +109,8 @@
|
||||
#define RCD_AIRLOCK 2
|
||||
#define RCD_DECONSTRUCT 3
|
||||
#define RCD_WINDOWGRILLE 4
|
||||
#define RCD_MACHINE 8
|
||||
#define RCD_COMPUTER 16
|
||||
|
||||
#define RCD_UPGRADE_FRAMES 1
|
||||
#define RCD_UPGRADE_SIMPLE_CIRCUITS 2
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#define LOG_GAME (1 << 12)
|
||||
#define LOG_ADMIN_PRIVATE (1 << 13)
|
||||
#define LOG_ASAY (1 << 14)
|
||||
#define LOG_CLONING (1 << 15)
|
||||
|
||||
//Individual logging panel pages
|
||||
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK)
|
||||
|
||||
@@ -100,10 +100,6 @@
|
||||
#define NUKE_ON_TIMING 2
|
||||
#define NUKE_ON_EXPLODING 3
|
||||
|
||||
//cloning defines. These are flags.
|
||||
#define CLONING_SUCCESS (1<<0)
|
||||
#define CLONING_DELETE_RECORD (1<<1)
|
||||
|
||||
//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
|
||||
#define PLANT_GENE_REMOVABLE (1<<0)
|
||||
#define PLANT_GENE_EXTRACTABLE (1<<1)
|
||||
|
||||
@@ -62,6 +62,7 @@ GLOBAL_LIST_EMPTY(gentlemans_organ_names)
|
||||
GLOBAL_LIST_EMPTY(balls_shapes_list)
|
||||
GLOBAL_LIST_EMPTY(balls_shapes_icons)
|
||||
GLOBAL_LIST_EMPTY(breasts_size_list)
|
||||
GLOBAL_LIST_EMPTY(genital_fluids_list)
|
||||
GLOBAL_LIST_EMPTY(breasts_shapes_list)
|
||||
GLOBAL_LIST_EMPTY(breasts_shapes_icons)
|
||||
GLOBAL_LIST_EMPTY(vagina_shapes_list)
|
||||
|
||||
@@ -58,10 +58,6 @@
|
||||
if (CONFIG_GET(flag/log_game))
|
||||
WRITE_LOG(GLOB.world_game_log, "GAME: [text]")
|
||||
|
||||
/proc/log_cloning(text, mob/initiator)
|
||||
if(CONFIG_GET(flag/log_cloning))
|
||||
WRITE_LOG(GLOB.world_cloning_log, "CLONING: [text]")
|
||||
|
||||
/proc/log_access(text)
|
||||
if (CONFIG_GET(flag/log_access))
|
||||
WRITE_LOG(GLOB.world_game_log, "ACCESS: [text]")
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.r_wings_list,roundstart = TRUE)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_fluff, GLOB.moth_fluffs_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list)
|
||||
|
||||
//CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE
|
||||
//mammal bodyparts (fucking furries)
|
||||
@@ -52,7 +54,8 @@
|
||||
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
|
||||
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
|
||||
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
|
||||
GLOB.genital_fluids_list = list ("milk", "water", "semen", "blood", "femcum")
|
||||
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")
|
||||
for(var/K in GLOB.breasts_shapes_list)
|
||||
var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]
|
||||
|
||||
@@ -70,8 +70,12 @@
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
|
||||
if(!GLOB.wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
|
||||
if(!GLOB.deco_wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list)
|
||||
if(!GLOB.moth_wings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
|
||||
if(!GLOB.moth_fluffs_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_fluff, GLOB.moth_fluffs_list)
|
||||
if(!GLOB.moth_markings_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
|
||||
|
||||
@@ -148,7 +152,8 @@
|
||||
"caps" = pick(GLOB.caps_list),
|
||||
"moth_wings" = pick(GLOB.moth_wings_list),
|
||||
"moth_markings" = pick(GLOB.moth_markings_list),
|
||||
"taur" = "None",
|
||||
"insect_fluff" = "None",
|
||||
"taur" = "None",
|
||||
"mam_body_markings" = pick(snowflake_markings_list),
|
||||
"mam_ears" = pick(snowflake_ears_list),
|
||||
"mam_snouts" = pick(snowflake_mam_snouts_list),
|
||||
|
||||
@@ -792,3 +792,6 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
|
||||
rearranged += cword
|
||||
message = "[prefix][jointext(rearranged," ")]"
|
||||
. = message
|
||||
|
||||
#define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97))
|
||||
#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1))
|
||||
@@ -33,8 +33,10 @@ GLOBAL_LIST_EMPTY(animated_tails_list_human)
|
||||
GLOBAL_LIST_EMPTY(ears_list)
|
||||
GLOBAL_LIST_EMPTY(wings_list)
|
||||
GLOBAL_LIST_EMPTY(wings_open_list)
|
||||
GLOBAL_LIST_EMPTY(deco_wings_list)
|
||||
GLOBAL_LIST_EMPTY(r_wings_list)
|
||||
GLOBAL_LIST_EMPTY(moth_wings_list)
|
||||
GLOBAL_LIST_EMPTY(moth_fluffs_list)
|
||||
GLOBAL_LIST_EMPTY(moth_markings_list)
|
||||
GLOBAL_LIST_EMPTY(caps_list)
|
||||
|
||||
|
||||
@@ -26,8 +26,6 @@ GLOBAL_VAR(query_debug_log)
|
||||
GLOBAL_PROTECT(query_debug_log)
|
||||
GLOBAL_VAR(world_job_debug_log)
|
||||
GLOBAL_PROTECT(world_job_debug_log)
|
||||
GLOBAL_VAR(world_cloning_log)
|
||||
GLOBAL_PROTECT(world_cloning_log)
|
||||
|
||||
GLOBAL_LIST_EMPTY(bombers)
|
||||
GLOBAL_PROTECT(bombers)
|
||||
|
||||
@@ -39,8 +39,6 @@
|
||||
|
||||
/datum/config_entry/flag/log_game // log game events
|
||||
|
||||
/datum/config_entry/flag/log_cloning // log cloning actions.
|
||||
|
||||
/datum/config_entry/flag/log_vote // log voting
|
||||
|
||||
/datum/config_entry/flag/log_whisper // log client whisper
|
||||
|
||||
@@ -245,6 +245,14 @@
|
||||
/datum/action/item_action/toggle_helmet_light
|
||||
name = "Toggle Helmet Light"
|
||||
|
||||
/datum/action/item_action/toggle_welding_screen
|
||||
name = "Toggle Welding Screen"
|
||||
|
||||
/datum/action/item_action/toggle_welding_screen/Trigger()
|
||||
var/obj/item/clothing/head/hardhat/weldhat/H = target
|
||||
if(istype(H))
|
||||
H.toggle_welding_screen(owner)
|
||||
|
||||
/datum/action/item_action/toggle_welding_screen/plasmaman
|
||||
name = "Toggle Welding Screen"
|
||||
|
||||
|
||||
+1
-1
@@ -371,7 +371,7 @@
|
||||
updateappearance(icon_update=0)
|
||||
|
||||
if(LAZYLEN(mutation_index))
|
||||
dna.mutation_index = mutation_index.Copy()
|
||||
dna.mutation_index = mutation_index
|
||||
domutcheck()
|
||||
|
||||
if(mrace || newfeatures || ui)
|
||||
|
||||
@@ -62,9 +62,6 @@
|
||||
var/unconvertable = FALSE
|
||||
var/late_joiner = FALSE
|
||||
|
||||
var/last_death = 0
|
||||
|
||||
|
||||
var/force_escaped = FALSE // Set by Into The Sunset command of the shuttle manipulator
|
||||
|
||||
var/list/learned_recipes //List of learned recipe TYPES.
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
area_type = /area
|
||||
protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer,
|
||||
/area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/survivalpod)
|
||||
/area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/survivalpod, /area/crew_quarters/dorms)
|
||||
target_trait = ZTRAIT_STATION
|
||||
|
||||
immunity_type = "rad"
|
||||
|
||||
@@ -598,14 +598,6 @@
|
||||
/atom/proc/multitool_act(mob/living/user, obj/item/I)
|
||||
return
|
||||
|
||||
///Check if the multitool has an item in it's data buffer
|
||||
/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE)
|
||||
if(!istype(I, /obj/item/multitool))
|
||||
if(user && !silent)
|
||||
to_chat(user, "<span class='warning'>[I] has no data buffer!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/atom/proc/screwdriver_act(mob/living/user, obj/item/I)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I)
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
circuit = /obj/item/circuitboard/machine/clonepod
|
||||
|
||||
var/heal_level //The clone is released once its health reaches this level.
|
||||
var/obj/machinery/computer/cloning/connected //So we remember the connected clone machine.
|
||||
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
|
||||
var/mess = FALSE //Need to clean out it if it's full of exploded clone.
|
||||
var/attempting = FALSE //One clone attempt at a time thanks
|
||||
var/speed_coeff
|
||||
@@ -53,10 +53,7 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/clonepod/Destroy()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
go_out()
|
||||
if(mob_occupant)
|
||||
log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to Destroy().")
|
||||
QDEL_NULL(radio)
|
||||
QDEL_NULL(countdown)
|
||||
if(connected)
|
||||
@@ -77,23 +74,6 @@
|
||||
if(heal_level > 100)
|
||||
heal_level = 100
|
||||
|
||||
/obj/machinery/clonepod/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
user.examinate(src)
|
||||
|
||||
/obj/machinery/clonepod/attack_ai(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/clonepod/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>The <i>linking</i> device can be <i>scanned<i> with a multitool.</span>"
|
||||
if(in_range(user, src) || isobserver(user))
|
||||
. += "<span class='notice'>The status display reads: Cloning speed at <b>[speed_coeff*50]%</b>.<br>Predicted amount of cellular damage: <b>[100-heal_level]%</b>.</span>"
|
||||
if(efficiency > 5)
|
||||
. += "<span class='notice'>Pod has been upgraded to support autoprocessing and apply beneficial mutations.</span>"
|
||||
|
||||
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
|
||||
//TO-DO: Make the genetics machine accept them.
|
||||
/obj/item/disk/data
|
||||
@@ -122,7 +102,7 @@
|
||||
//Clonepod
|
||||
|
||||
/obj/machinery/clonepod/examine(mob/user)
|
||||
. = ..()
|
||||
..()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mess)
|
||||
to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...")
|
||||
@@ -149,54 +129,44 @@
|
||||
return examine(user)
|
||||
|
||||
//Start growing a human clone in the pod!
|
||||
/obj/machinery/clonepod/proc/growclone(clonename, ui, mutation_index, mindref, last_death, blood_type, datum/species/mrace, list/features, factions, list/quirks, empty)
|
||||
/obj/machinery/clonepod/proc/growclone(ckey, clonename, ui, mutation_index, mindref, datum/species/mrace, list/features, factions, list/quirks)
|
||||
if(panel_open)
|
||||
return FALSE
|
||||
if(mess || attempting)
|
||||
return FALSE
|
||||
|
||||
if(!empty) //Doesn't matter if we're just making a copy
|
||||
clonemind = locate(mindref) in SSticker.minds
|
||||
if(!istype(clonemind)) //not a mind
|
||||
clonemind = locate(mindref) in SSticker.minds
|
||||
if(!istype(clonemind)) //not a mind
|
||||
return FALSE
|
||||
if(!QDELETED(clonemind.current))
|
||||
if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
|
||||
return FALSE
|
||||
if(clonemind.last_death != last_death) //The soul has advanced, the record has not.
|
||||
if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding.
|
||||
return FALSE
|
||||
if(!QDELETED(clonemind.current))
|
||||
if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
|
||||
return NONE
|
||||
if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding.
|
||||
return NONE
|
||||
if(!clonemind.active)
|
||||
// get_ghost() will fail if they're unable to reenter their body
|
||||
var/mob/dead/observer/G = clonemind.get_ghost()
|
||||
if(!G)
|
||||
return NONE
|
||||
if(G.suiciding) // The ghost came from a body that is suiciding.
|
||||
return NONE
|
||||
if(clonemind.damnation_type) //Can't clone the damned.
|
||||
INVOKE_ASYNC(src, .proc/horrifyingsound)
|
||||
mess = TRUE
|
||||
icon_state = "pod_g"
|
||||
update_icon()
|
||||
if(clonemind.active) //somebody is using that mind
|
||||
if( ckey(clonemind.key)!=ckey )
|
||||
return FALSE
|
||||
else
|
||||
// get_ghost() will fail if they're unable to reenter their body
|
||||
var/mob/dead/observer/G = clonemind.get_ghost()
|
||||
if(!G)
|
||||
return FALSE
|
||||
if(G.suiciding) // The ghost came from a body that is suiciding.
|
||||
return FALSE
|
||||
if(clonemind.damnation_type) //Can't clone the damned.
|
||||
INVOKE_ASYNC(src, .proc/horrifyingsound)
|
||||
mess = TRUE
|
||||
update_icon()
|
||||
return FALSE
|
||||
|
||||
attempting = TRUE //One at a time!!
|
||||
countdown.start()
|
||||
|
||||
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
|
||||
|
||||
H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features)
|
||||
H.hardset_dna(ui, mutation_index, H.real_name, null, mrace, features)
|
||||
|
||||
if(!HAS_TRAIT(H, TRAIT_RADIMMUNE))//dont apply mutations if the species is Mutation proof.
|
||||
if(efficiency > 2)
|
||||
var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations)
|
||||
H.dna.remove_mutation_group(unclean_mutations)
|
||||
if(efficiency > 5 && prob(20))
|
||||
H.easy_randmut(POSITIVE)
|
||||
if(efficiency < 3 && prob(50))
|
||||
var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
|
||||
if(ismob(M))
|
||||
H = M
|
||||
if(prob(50 - efficiency*10)) //Chance to give a bad mutation.
|
||||
H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) //100% bad mutation. Can be cured with mutadone.
|
||||
|
||||
H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment.
|
||||
occupant = H
|
||||
@@ -214,16 +184,15 @@
|
||||
ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, "cloning")
|
||||
H.Unconscious(80)
|
||||
|
||||
if(!empty)
|
||||
clonemind.transfer_to(H)
|
||||
clonemind.transfer_to(H)
|
||||
|
||||
if(grab_ghost_when == CLONER_FRESH_CLONE)
|
||||
H.grab_ghost()
|
||||
to_chat(H, "<span class='notice'><b>Consciousness slowly creeps over you as your body regenerates.</b><br><i>So this is what cloning feels like?</i></span>")
|
||||
if(grab_ghost_when == CLONER_FRESH_CLONE)
|
||||
H.grab_ghost()
|
||||
to_chat(H, "<span class='notice'><b>Consciousness slowly creeps over you as your body regenerates.</b><br><i>So this is what cloning feels like?</i></span>")
|
||||
|
||||
if(grab_ghost_when == CLONER_MATURE_CLONE)
|
||||
H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost
|
||||
to_chat(H.get_ghost(TRUE), "<span class='notice'>Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.</span>")
|
||||
if(grab_ghost_when == CLONER_MATURE_CLONE)
|
||||
H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost
|
||||
to_chat(H.get_ghost(TRUE), "<span class='notice'>Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.</span>")
|
||||
|
||||
if(H)
|
||||
H.faction |= factions
|
||||
@@ -237,7 +206,7 @@
|
||||
|
||||
H.suiciding = FALSE
|
||||
attempting = FALSE
|
||||
return CLONING_SUCCESS
|
||||
return TRUE
|
||||
|
||||
//Grow clones to maturity then kick them out. FREELOADERS
|
||||
/obj/machinery/clonepod/process()
|
||||
@@ -246,20 +215,16 @@
|
||||
if(!is_operational()) //Autoeject if power is lost
|
||||
if(mob_occupant)
|
||||
go_out()
|
||||
log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to power loss.")
|
||||
|
||||
mob_occupant.apply_vore_prefs()
|
||||
|
||||
connected_message("Clone Ejected: Loss of power.")
|
||||
|
||||
else if(mob_occupant && (mob_occupant.loc == src))
|
||||
if(mob_occupant && (mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
|
||||
if((mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes.
|
||||
connected_message("Clone Rejected: Deceased.")
|
||||
if(internal_radio)
|
||||
SPEAK("The cloning has been \
|
||||
aborted due to unrecoverable tissue failure.")
|
||||
go_out()
|
||||
log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] after suiciding.")
|
||||
mob_occupant.apply_vore_prefs()
|
||||
|
||||
else if(mob_occupant.cloneloss > (100 - heal_level))
|
||||
@@ -307,13 +272,10 @@
|
||||
BP.attach_limb(mob_occupant)
|
||||
|
||||
go_out()
|
||||
log_cloning("[key_name(mob_occupant)] completed cloning cycle in [src] at [AREACOORD(src)].")
|
||||
mob_occupant.apply_vore_prefs()
|
||||
|
||||
else if (!mob_occupant || mob_occupant.loc != src)
|
||||
occupant = null
|
||||
if (!mess && !panel_open)
|
||||
icon_state = "pod_0"
|
||||
use_power(200)
|
||||
|
||||
update_icon()
|
||||
@@ -328,8 +290,6 @@
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/multitool))
|
||||
if(!multitool_check_buffer(user, W))
|
||||
return
|
||||
var/obj/item/multitool/P = W
|
||||
|
||||
if(istype(P.buffer, /obj/machinery/computer/cloning))
|
||||
@@ -356,13 +316,10 @@
|
||||
to_chat(user, "<span class='danger'>Error: Pod has no occupant.</span>")
|
||||
return
|
||||
else
|
||||
add_fingerprint(user)
|
||||
connected_message("Emergency Ejection")
|
||||
SPEAK("An emergency ejection of the current clone has occurred. Survival not guaranteed.")
|
||||
to_chat(user, "<span class='notice'>You force an emergency ejection. </span>")
|
||||
go_out()
|
||||
log_cloning("[key_name(user)] manually ejected [key_name(mob_occupant)] from [src] at [AREACOORD(src)].")
|
||||
log_combat(user, mob_occupant, "ejected", W, "from [src]")
|
||||
mob_occupant.apply_vore_prefs()
|
||||
else
|
||||
return ..()
|
||||
@@ -372,9 +329,6 @@
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You corrupt the genetic compiler.</span>")
|
||||
malfunction()
|
||||
add_fingerprint(user)
|
||||
log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.")
|
||||
log_combat(user, src, "emagged", null, occupant ? "[occupant] inside, killing them via malfunction." : null)
|
||||
|
||||
//Put messages in the connected computer's temp var for display.
|
||||
/obj/machinery/clonepod/proc/connected_message(message)
|
||||
@@ -427,7 +381,6 @@
|
||||
unattached_flesh.Cut()
|
||||
|
||||
occupant = null
|
||||
clonemind = null
|
||||
|
||||
/obj/machinery/clonepod/proc/malfunction()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
@@ -438,14 +391,13 @@
|
||||
mess = TRUE
|
||||
maim_clone(mob_occupant) //Remove every bit that's grown back so far to drop later, also destroys bits that haven't grown yet
|
||||
update_icon()
|
||||
if(clonemind && mob_occupant.mind != clonemind)
|
||||
if(mob_occupant.mind != clonemind)
|
||||
clonemind.transfer_to(mob_occupant)
|
||||
mob_occupant.grab_ghost() // We really just want to make you suffer.
|
||||
flash_color(mob_occupant, flash_color="#960000", flash_time=100)
|
||||
to_chat(mob_occupant, "<span class='warning'><b>Agony blazes across your consciousness as your body is torn apart.</b><br><i>Is this what dying is like? Yes it is.</i></span>")
|
||||
playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 50, 0)
|
||||
SEND_SOUND(mob_occupant, sound('sound/hallucinations/veryfar_noise.ogg',0,1,50))
|
||||
log_cloning("[key_name(mob_occupant)] destroyed within [src] at [AREACOORD(src)] due to malfunction.")
|
||||
QDEL_IN(mob_occupant, 40)
|
||||
|
||||
/obj/machinery/clonepod/relaymove(mob/user)
|
||||
@@ -464,14 +416,11 @@
|
||||
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of, ERROR: John Doe, prematurely." ,0))
|
||||
mob_occupant.apply_vore_prefs()
|
||||
go_out()
|
||||
log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to EMP pulse.")
|
||||
|
||||
/obj/machinery/clonepod/ex_act(severity, target)
|
||||
..()
|
||||
if(!QDELETED(src) && occupant)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(!QDELETED(src))
|
||||
go_out()
|
||||
log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to explosion.")
|
||||
|
||||
/obj/machinery/clonepod/handle_atom_del(atom/A)
|
||||
if(A == occupant)
|
||||
@@ -487,9 +436,7 @@
|
||||
|
||||
/obj/machinery/clonepod/deconstruct(disassembled = TRUE)
|
||||
if(occupant)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
go_out()
|
||||
log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to deconstruction.")
|
||||
..()
|
||||
|
||||
/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H)
|
||||
|
||||
@@ -7,24 +7,25 @@
|
||||
icon_keyboard = "med_key"
|
||||
circuit = /obj/item/circuitboard/computer/cloning
|
||||
req_access = list(ACCESS_HEADS) //ONLY USED FOR RECORD DELETION RIGHT NOW.
|
||||
var/obj/machinery/dna_scannernew/scanner //Linked scanner. For scanning.
|
||||
var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning.
|
||||
var/list/pods //Linked cloning pods
|
||||
var/temp = "Inactive"
|
||||
var/scantemp_ckey
|
||||
var/scantemp = "Ready to Scan"
|
||||
var/menu = 1 //Which menu screen to display
|
||||
var/list/records = list()
|
||||
var/datum/data/record/active_record = null
|
||||
var/obj/item/disk/data/diskette = null //Mostly so the geneticist can steal everything.
|
||||
|
||||
var/loading = 0 // Nice loading text
|
||||
var/autoprocess = 0
|
||||
var/list/records = list()
|
||||
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
|
||||
/obj/machinery/computer/cloning/Initialize()
|
||||
. = ..()
|
||||
updatemodules(TRUE)
|
||||
var/obj/item/circuitboard/computer/cloning/board = circuit
|
||||
records = board.records
|
||||
|
||||
|
||||
/obj/machinery/computer/cloning/Destroy()
|
||||
@@ -38,7 +39,7 @@
|
||||
if(pods)
|
||||
for(var/P in pods)
|
||||
var/obj/machinery/clonepod/pod = P
|
||||
if(pod.occupant && mind && pod.clonemind == mind)
|
||||
if(pod.occupant && pod.clonemind == mind)
|
||||
return null
|
||||
if(pod.is_operational() && !(pod.occupant || pod.mess))
|
||||
return pod
|
||||
@@ -59,9 +60,6 @@
|
||||
else if(!. && pod.is_operational() && !(pod.occupant || pod.mess) && pod.efficiency > 5)
|
||||
. = pod
|
||||
|
||||
/proc/grow_clone_from_record(obj/machinery/clonepod/pod, datum/data/record/R, empty)
|
||||
return pod.growclone(R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mindref"], R.fields["last_death"], R.fields["blood_type"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], empty)
|
||||
|
||||
/obj/machinery/computer/cloning/process()
|
||||
if(!(scanner && LAZYLEN(pods) && autoprocess))
|
||||
return
|
||||
@@ -70,19 +68,16 @@
|
||||
scan_occupant(scanner.occupant)
|
||||
|
||||
for(var/datum/data/record/R in records)
|
||||
var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(R.fields["mindref"])
|
||||
var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(R.fields["mind"])
|
||||
|
||||
if(!pod)
|
||||
return
|
||||
|
||||
if(pod.occupant)
|
||||
continue
|
||||
continue //how though?
|
||||
|
||||
var/result = grow_clone_from_record(pod, R)
|
||||
if(result & CLONING_SUCCESS)
|
||||
if(pod.growclone(R.fields["ckey"], R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mind"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"]))
|
||||
temp = "[R.fields["name"]] => <font class='good'>Cloning cycle in progress...</font>"
|
||||
log_cloning("Cloning of [key_name(R.fields["mindref"])] automatically started via autoprocess - [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].")
|
||||
if(result & CLONING_DELETE_RECORD)
|
||||
records -= R
|
||||
|
||||
/obj/machinery/computer/cloning/proc/updatemodules(findfirstcloner)
|
||||
@@ -137,9 +132,7 @@
|
||||
to_chat(user, "<span class='notice'>You insert [W].</span>")
|
||||
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
|
||||
src.updateUsrDialog()
|
||||
else if(W.tool_behaviour == TOOL_MULTITOOL)
|
||||
if(!multitool_check_buffer(user, W))
|
||||
return
|
||||
else if(istype(W, /obj/item/multitool))
|
||||
var/obj/item/multitool/P = W
|
||||
|
||||
if(istype(P.buffer, /obj/machinery/clonepod))
|
||||
@@ -208,7 +201,6 @@
|
||||
|
||||
if(scanner_occupant)
|
||||
dat += "<a href='byond://?src=[REF(src)];scan=1'>Start Scan</a>"
|
||||
dat += "<a href='byond://?src=[REF(src)];scan=1;body_only=1'>Body-Only Scan</a>"
|
||||
dat += "<br><a href='byond://?src=[REF(src)];lock=1'>[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]</a>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Start Scan</span>"
|
||||
@@ -236,11 +228,8 @@
|
||||
if (!src.active_record)
|
||||
dat += "<font class='bad'>Record not found.</font>"
|
||||
else
|
||||
var/body_only = active_record.fields["body_only"]
|
||||
dat += "<h4>[active_record.fields["name"]][body_only ? " - BODY-ONLY" : ""]</h4>"
|
||||
dat += "Scan ID [active_record.fields["id"]] \
|
||||
[!body_only ? "<a href='byond://?src=[REF(src)];clone=[active_record.fields["id"]]'>Clone</a>" : "" ]\
|
||||
<a href='byond://?src=[REF(src)];clone=[active_record.fields["id"]];empty=TRUE'>Empty Clone</a><br>"
|
||||
dat += "<h4>[src.active_record.fields["name"]]</h4>"
|
||||
dat += "Scan ID [src.active_record.fields["id"]] <a href='byond://?src=[REF(src)];clone=[active_record.fields["id"]]'>Clone</a><br>"
|
||||
|
||||
var/obj/item/implant/health/H = locate(src.active_record.fields["imp"])
|
||||
|
||||
@@ -250,14 +239,7 @@
|
||||
dat += "<font class='bad'>Unable to locate Health Implant.</font><br /><br />"
|
||||
|
||||
dat += "<b>Unique Identifier:</b><br /><span class='highlight'>[src.active_record.fields["UI"]]</span><br>"
|
||||
dat += "<b>Structural Enzymes:</b><br /><span class='highlight'>"
|
||||
for(var/key in active_record.fields["SE"])
|
||||
if(key != RACEMUT)
|
||||
var/val = active_record.fields["SE"][key]
|
||||
var/alias = GLOB.all_mutations[key].alias
|
||||
dat +="[alias]: [val]<br />"
|
||||
|
||||
dat += "</span><br />"
|
||||
dat += "<b>Structural Enzymes:</b><br /><span class='highlight'>[src.active_record.fields["SE"]]</span><br>"
|
||||
|
||||
if(diskette && diskette.fields)
|
||||
dat += "<div class='block'>"
|
||||
@@ -314,13 +296,18 @@
|
||||
|
||||
else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational())
|
||||
scantemp = ""
|
||||
var/body_only = href_list["body_only"]
|
||||
|
||||
loading = 1
|
||||
src.updateUsrDialog()
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
say("Initiating scan...")
|
||||
|
||||
addtimer(CALLBACK(src, .proc/do_scan, usr, body_only), 2 SECONDS)
|
||||
spawn(20)
|
||||
src.scan_occupant(scanner.occupant)
|
||||
|
||||
loading = 0
|
||||
src.updateUsrDialog()
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
|
||||
|
||||
//No locking an open scanner.
|
||||
@@ -336,42 +323,34 @@
|
||||
playsound(src, "terminal_type", 25, 0)
|
||||
src.active_record = find_record("id", href_list["view_rec"], records)
|
||||
if(active_record)
|
||||
menu = 3
|
||||
if(!active_record.fields["ckey"])
|
||||
records -= active_record
|
||||
active_record = null
|
||||
src.temp = "<font class='bad'>Record Corrupt</font>"
|
||||
else
|
||||
src.menu = 3
|
||||
else
|
||||
temp = "Record missing."
|
||||
src.temp = "Record missing."
|
||||
|
||||
else if (href_list["del_rec"])
|
||||
if ((!src.active_record) || (src.menu < 3))
|
||||
return
|
||||
if (src.menu == 3) //If we are viewing a record, confirm deletion
|
||||
var/has_access = FALSE
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/user = usr
|
||||
var/obj/item/card/id/C = user.get_idcard(TRUE)
|
||||
if(C)
|
||||
if(check_access(C))
|
||||
has_access = TRUE
|
||||
if(active_record.fields["body_only"]) //Body-only scans are not as important and can be deleted freely
|
||||
has_access = TRUE
|
||||
if(has_access)
|
||||
temp = "Delete record?"
|
||||
menu = 4
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
else
|
||||
temp = "Access Denied"
|
||||
menu = 2
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
src.temp = "Delete record?"
|
||||
src.menu = 4
|
||||
playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0)
|
||||
|
||||
else if (src.menu == 4)
|
||||
var/obj/item/card/id/C = usr.get_active_held_item()
|
||||
if (istype(C)||istype(C, /obj/item/pda))
|
||||
if(src.check_access(C))
|
||||
log_cloning("[key_name(usr)] deleted [key_name(active_record.fields["mindref"])]'s cloning records from [src] at [AREACOORD(src)].")
|
||||
src.temp = "[src.active_record.fields["name"]] => Record deleted."
|
||||
src.records.Remove(active_record)
|
||||
active_record = null
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
src.menu = 2
|
||||
var/obj/item/circuitboard/computer/cloning/board = circuit
|
||||
board.records = records
|
||||
else
|
||||
src.temp = "<font class='bad'>Access Denied.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
@@ -421,14 +400,9 @@
|
||||
|
||||
else if (href_list["clone"])
|
||||
var/datum/data/record/C = find_record("id", href_list["clone"], records)
|
||||
var/empty = href_list["empty"]
|
||||
//Look for that player! They better be dead!
|
||||
if(C)
|
||||
if(C.fields["body_only"] && !empty)
|
||||
temp = "<font class='bad'>Cannot initiate regular cloning with body-only scans.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
var/obj/machinery/clonepod/pod = GetAvailablePod()
|
||||
var/success = FALSE
|
||||
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
|
||||
if(!LAZYLEN(pods))
|
||||
temp = "<font class='bad'>No Clonepods detected.</font>"
|
||||
@@ -436,33 +410,20 @@
|
||||
else if(!pod)
|
||||
temp = "<font class='bad'>No Clonepods available.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
else if(!CONFIG_GET(flag/revival_cloning) && !empty)
|
||||
else if(!CONFIG_GET(flag/revival_cloning))
|
||||
temp = "<font class='bad'>Unable to initiate cloning cycle.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
else if(pod.occupant)
|
||||
temp = "<font class='bad'>Cloning cycle already in progress.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
else if(pod.growclone(C.fields["ckey"], C.fields["name"], C.fields["UI"], C.fields["SE"], C.fields["mind"], C.fields["mrace"], C.fields["features"], C.fields["factions"], C.fields["quirks"]))
|
||||
temp = "[C.fields["name"]] => <font class='good'>Cloning cycle in progress...</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
records.Remove(C)
|
||||
if(active_record == C)
|
||||
active_record = null
|
||||
menu = 1
|
||||
else
|
||||
var/result = grow_clone_from_record(pod, C, empty)
|
||||
if(result & CLONING_SUCCESS)
|
||||
temp = "[C.fields["name"]] => <font class='good'>Cloning cycle in progress...</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
records.Remove(C)
|
||||
if(active_record == C)
|
||||
active_record = null
|
||||
menu = 1
|
||||
success = TRUE
|
||||
if(!empty)
|
||||
log_cloning("[key_name(usr)] initiated cloning of [key_name(C.fields["mindref"])] via [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].")
|
||||
else
|
||||
log_cloning("[key_name(usr)] initiated EMPTY cloning of [key_name(C.fields["mindref"])] via [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].")
|
||||
if(result & CLONING_DELETE_RECORD)
|
||||
if(active_record == C)
|
||||
active_record = null
|
||||
menu = 1
|
||||
records -= C
|
||||
|
||||
if(!success)
|
||||
temp = "[C.fields["name"]] => <font class='bad'>Initialisation failure.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
|
||||
@@ -478,31 +439,21 @@
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/cloning/proc/do_scan(mob/user, body_only)
|
||||
scan_occupant(scanner.occupant, user, body_only)
|
||||
|
||||
loading = FALSE
|
||||
updateUsrDialog()
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE)
|
||||
|
||||
/obj/machinery/computer/cloning/proc/scan_occupant(occupant, mob/M, body_only)
|
||||
/obj/machinery/computer/cloning/proc/scan_occupant(occupant)
|
||||
var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
|
||||
var/datum/dna/dna
|
||||
|
||||
// Do not use unless you know what they are.
|
||||
var/mob/living/carbon/C = mob_occupant
|
||||
var/mob/living/brain/B = mob_occupant
|
||||
|
||||
if(ishuman(mob_occupant))
|
||||
var/mob/living/carbon/C = mob_occupant
|
||||
dna = C.has_dna()
|
||||
if(isbrain(mob_occupant))
|
||||
var/mob/living/brain/B = mob_occupant
|
||||
dna = B.stored_dna
|
||||
|
||||
if(!istype(dna))
|
||||
scantemp = "<font class='bad'>Unable to locate valid genetic data.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
return
|
||||
if(!body_only && (mob_occupant.suiciding || mob_occupant.hellbound))
|
||||
if(mob_occupant.suiciding || mob_occupant.hellbound)
|
||||
scantemp = "<font class='bad'>Subject's brain is not responding to scanning stimuli.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
return
|
||||
@@ -510,14 +461,14 @@
|
||||
scantemp = "<font class='bad'>Subject no longer contains the fundamental materials required to create a living clone.</font>"
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
|
||||
return
|
||||
if (!body_only && isnull(mob_occupant.mind))
|
||||
if ((!mob_occupant.ckey) || (!mob_occupant.client))
|
||||
scantemp = "<font class='bad'>Mental interface failure.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
return
|
||||
// if (find_record("ckey", mob_occupant.ckey, records))
|
||||
// scantemp = "<font class='average'>Subject already in database.</font>"
|
||||
// playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
// return
|
||||
if (find_record("ckey", mob_occupant.ckey, records))
|
||||
scantemp = "<font class='average'>Subject already in database.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
return
|
||||
|
||||
var/datum/data/record/R = new()
|
||||
if(dna.species)
|
||||
@@ -530,7 +481,7 @@
|
||||
var/datum/species/rando_race = pick(GLOB.roundstart_races)
|
||||
R.fields["mrace"] = rando_race.type
|
||||
|
||||
//R.fields["ckey"] = mob_occupant.ckey
|
||||
R.fields["ckey"] = mob_occupant.ckey
|
||||
R.fields["name"] = mob_occupant.real_name
|
||||
R.fields["id"] = copytext(md5(mob_occupant.real_name), 2, 6)
|
||||
R.fields["UE"] = dna.unique_enzymes
|
||||
@@ -544,32 +495,22 @@
|
||||
var/datum/quirk/T = V
|
||||
R.fields["quirks"][T.type] = T.clone_data()
|
||||
|
||||
R.fields["mindref"] = "[REF(mob_occupant.mind)]"
|
||||
R.fields["last_death"] = mob_occupant.stat == DEAD ? mob_occupant.mind.last_death : -1
|
||||
R.fields["body_only"] = body_only
|
||||
if (!isnull(mob_occupant.mind)) //Save that mind so traitors can continue traitoring after cloning.
|
||||
R.fields["mind"] = "[REF(mob_occupant.mind)]"
|
||||
|
||||
if(!body_only)
|
||||
//Add an implant if needed
|
||||
var/obj/item/implant/health/imp
|
||||
for(var/obj/item/implant/health/HI in mob_occupant.implants)
|
||||
imp = HI
|
||||
break
|
||||
if(!imp)
|
||||
imp = new /obj/item/implant/health(mob_occupant)
|
||||
imp.implant(mob_occupant)
|
||||
R.fields["imp"] = "[REF(imp)]"
|
||||
//Add an implant if needed
|
||||
var/obj/item/implant/health/imp
|
||||
for(var/obj/item/implant/health/HI in mob_occupant.implants)
|
||||
imp = HI
|
||||
break
|
||||
if(!imp)
|
||||
imp = new /obj/item/implant/health(mob_occupant)
|
||||
imp.implant(mob_occupant)
|
||||
R.fields["imp"] = "[REF(imp)]"
|
||||
|
||||
var/datum/data/record/old_record = find_record("mindref", REF(mob_occupant.mind), records)
|
||||
if(body_only)
|
||||
old_record = find_record("UE", dna.unique_enzymes, records) //Body-only records cannot be identified by mind, so we use the DNA
|
||||
if(old_record && ((old_record.fields["UI"] != dna.uni_identity) || (!old_record.fields["body_only"]))) //Never overwrite a mind-and-body record if it exists
|
||||
old_record = null
|
||||
if(old_record)
|
||||
records -= old_record
|
||||
scantemp = "Record updated."
|
||||
else
|
||||
scantemp = "Subject successfully scanned."
|
||||
src.records += R
|
||||
log_cloning("[M ? key_name(M) : "Autoprocess"] added the [body_only ? "body-only " : ""]record of [key_name(mob_occupant)] to [src] at [AREACOORD(src)].")
|
||||
var/obj/item/circuitboard/computer/cloning/board = circuit
|
||||
board.records = records
|
||||
scantemp = "Subject successfully scanned."
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
|
||||
|
||||
@@ -1408,6 +1408,9 @@
|
||||
/obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
switch(the_rcd.mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
if(security_level != AIRLOCK_SECURITY_NONE && the_rcd.canRturf != TRUE)
|
||||
to_chat(user, "<span class='notice'>[src]'s reinforcement needs to be removed first.</span>")
|
||||
return FALSE
|
||||
return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32)
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -450,6 +450,21 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/structure/firelock_frame/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
if((constructionStep == CONSTRUCTION_NOCIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS))
|
||||
return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/firelock_frame/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_UPGRADE_SIMPLE_CIRCUITS)
|
||||
user.visible_message("<span class='notice'>[user] fabricates a circuit and places it into [src].</span>", \
|
||||
"<span class='notice'>You adapt a firelock circuit and slot it into the assembly.</span>")
|
||||
constructionStep = CONSTRUCTION_GUTTED
|
||||
update_icon()
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/firelock_frame/heavy
|
||||
name = "heavy firelock frame"
|
||||
reinforced = TRUE
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
internal_radio = FALSE
|
||||
|
||||
//Start growing a human clone in the pod!
|
||||
/obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, last_death, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance)
|
||||
/obj/machinery/clonepod/experimental/growclone(ckey, clonename, ui, se, datum/species/mrace, list/features, factions)
|
||||
if(panel_open)
|
||||
return FALSE
|
||||
if(mess || attempting)
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
|
||||
|
||||
H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features)
|
||||
H.hardset_dna(ui, se, H.real_name, null, mrace, features)
|
||||
|
||||
if(efficiency > 2)
|
||||
var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations)
|
||||
@@ -292,7 +292,7 @@
|
||||
temp = "<font class='bad'>Cloning cycle already in progress.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
|
||||
else
|
||||
pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, null, dna.blood_type, clone_species, dna.features, mob_occupant.faction)
|
||||
pod.growclone(null, mob_occupant.real_name, dna.uni_identity, dna.mutation_index, clone_species, dna.features, mob_occupant.faction)
|
||||
temp = "[mob_occupant.real_name] => <font class='good'>Cloning data sent to pod.</font>"
|
||||
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
|
||||
|
||||
|
||||
@@ -252,6 +252,20 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
if((buildstage == 0) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS))
|
||||
return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1)
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/firealarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_UPGRADE_SIMPLE_CIRCUITS)
|
||||
user.visible_message("<span class='notice'>[user] fabricates a circuit and places it into [src].</span>", \
|
||||
"<span class='notice'>You adapt a fire alarm circuit and slot it into the assembly.</span>")
|
||||
buildstage = 1
|
||||
update_icon()
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/firealarm/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
. = ..()
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/obj/item/assembly/signaler/anomaly/aSignal
|
||||
var/area/impact_area
|
||||
|
||||
var/lifespan = 990
|
||||
var/lifespan = 1190
|
||||
var/death_time
|
||||
|
||||
var/countdown_colour
|
||||
|
||||
@@ -435,3 +435,44 @@
|
||||
animate(src, alpha = 0, transform = skew, time = duration)
|
||||
else
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/constructing_effect
|
||||
icon = 'icons/effects/effects_rcd.dmi'
|
||||
icon_state = ""
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
anchored = TRUE
|
||||
var/status = 0
|
||||
var/delay = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status)
|
||||
. = ..()
|
||||
status = rcd_status
|
||||
delay = rcd_delay
|
||||
if (status == RCD_DECONSTRUCT)
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 11)
|
||||
delay -= 11
|
||||
icon_state = "rcd_end_reverse"
|
||||
else
|
||||
update_icon()
|
||||
|
||||
/obj/effect/constructing_effect/update_icon()
|
||||
icon_state = "rcd"
|
||||
if (delay < 10)
|
||||
icon_state += "_shortest"
|
||||
else if (delay < 20)
|
||||
icon_state += "_shorter"
|
||||
else if (delay < 37)
|
||||
icon_state += "_short"
|
||||
if (status == RCD_DECONSTRUCT)
|
||||
icon_state += "_reverse"
|
||||
|
||||
/obj/effect/constructing_effect/proc/end_animation()
|
||||
if (status == RCD_DECONSTRUCT)
|
||||
qdel(src)
|
||||
else
|
||||
icon_state = "rcd_end"
|
||||
addtimer(CALLBACK(src, .proc/end), 15)
|
||||
|
||||
/obj/effect/constructing_effect/proc/end()
|
||||
qdel(src)
|
||||
+108
-32
@@ -37,6 +37,7 @@ RLD
|
||||
var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays
|
||||
var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states
|
||||
var/custom_range = 7
|
||||
var/upgrade = FALSE
|
||||
|
||||
/obj/item/construction/Initialize()
|
||||
. = ..()
|
||||
@@ -45,8 +46,12 @@ RLD
|
||||
spark_system.attach(src)
|
||||
|
||||
/obj/item/construction/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "\A [src]. It currently holds [matter]/[max_matter] matter-units." )
|
||||
. = ..()
|
||||
to_chat(user, "It currently holds [matter]/[max_matter] matter-units." )
|
||||
if(upgrade & RCD_UPGRADE_FRAMES)
|
||||
to_chat(user, "It contains the design for machine frames, computer frames and deconstruction." )
|
||||
if(upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)
|
||||
to_chat(user, "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells.")
|
||||
|
||||
/obj/item/construction/Destroy()
|
||||
QDEL_NULL(spark_system)
|
||||
@@ -82,6 +87,13 @@ RLD
|
||||
loaded = loadwithsheets(W, sheetmultiplier * 0.25, user) // 1 matter for 1 floortile, as 4 tiles are produced from 1 metal
|
||||
if(loaded)
|
||||
to_chat(user, "<span class='notice'>[src] now holds [matter]/[max_matter] matter-units.</span>")
|
||||
else if(istype(W, /obj/item/rcd_upgrade))
|
||||
to_chat(user, "<span class='notice'>You upgrade the RCD with the [W]!</span>")
|
||||
var/obj/item/rcd_upgrade/rcd_up = W
|
||||
if(!(upgrade & rcd_up.upgrade))
|
||||
upgrade |= rcd_up.upgrade
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
|
||||
qdel(W)
|
||||
else
|
||||
return ..()
|
||||
update_icon() //ensures that ammo counters (if present) get updated
|
||||
@@ -110,10 +122,10 @@ RLD
|
||||
if(matter < amount)
|
||||
if(user)
|
||||
to_chat(user, no_ammo_message)
|
||||
return 0
|
||||
return FALSE
|
||||
matter -= amount
|
||||
update_icon()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/construction/proc/checkResource(amount, mob/user)
|
||||
. = matter >= amount
|
||||
@@ -127,15 +139,14 @@ RLD
|
||||
if(!(A in range(custom_range, get_turf(user))))
|
||||
to_chat(user, "<span class='warning'>The \'Out of Range\' light on [src] blinks red.</span>")
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/obj/item/construction/proc/prox_check(proximity)
|
||||
if(proximity)
|
||||
return TRUE
|
||||
else
|
||||
var/view_range = user.client ? user.client.view : world.view
|
||||
//if user can't be seen from A (only checks surroundings' opaqueness) and can't see A.
|
||||
//jarring, but it should stop people from targetting atoms they can't see...
|
||||
//excluding darkness, to allow RLD to be used to light pitch black dark areas.
|
||||
if(!((user in view(view_range, A)) || (user in viewers(view_range, A))))
|
||||
to_chat(user, "<span class='warning'>You focus, pointing \the [src] at whatever outside your field of vision in the given direction... to no avail.</span>")
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/item/construction/rcd
|
||||
name = "rapid-construction-device (RCD)"
|
||||
@@ -148,6 +159,7 @@ RLD
|
||||
has_ammobar = TRUE
|
||||
var/mode = 1
|
||||
var/ranged = FALSE
|
||||
var/computer_dir = 1
|
||||
var/airlock_type = /obj/machinery/door/airlock
|
||||
var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use
|
||||
var/window_type = /obj/structure/window/fulltile
|
||||
@@ -218,11 +230,10 @@ RLD
|
||||
|
||||
t1 += "<p><a href='?src=[REF(src)];close=1'>Close</a></p>\n"
|
||||
|
||||
var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500)
|
||||
var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500, src)
|
||||
popup.set_content(t1)
|
||||
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
|
||||
popup.open()
|
||||
onclose(user, "rcd_access")
|
||||
|
||||
/obj/item/construction/rcd/Topic(href, href_list)
|
||||
..()
|
||||
@@ -270,6 +281,28 @@ RLD
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
|
||||
if(!user)
|
||||
return
|
||||
var/list/computer_dirs = list(
|
||||
"NORTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "cnorth"),
|
||||
"EAST" = image(icon = 'icons/mob/radial.dmi', icon_state = "ceast"),
|
||||
"SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"),
|
||||
"WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest")
|
||||
)
|
||||
var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(computerdirs)
|
||||
if("NORTH")
|
||||
computer_dir = 1
|
||||
if("EAST")
|
||||
computer_dir = 4
|
||||
if("SOUTH")
|
||||
computer_dir = 2
|
||||
if("WEST")
|
||||
computer_dir = 8
|
||||
|
||||
/obj/item/construction/rcd/proc/change_airlock_setting(mob/user)
|
||||
if(!user)
|
||||
return
|
||||
@@ -412,15 +445,22 @@ RLD
|
||||
var/list/rcd_results = A.rcd_vals(user, src)
|
||||
if(!rcd_results)
|
||||
return FALSE
|
||||
if(do_after(user, rcd_results["delay"] * delay_mod, target = A))
|
||||
var/delay = rcd_results["delay"] * delay_mod
|
||||
var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode)
|
||||
var/turf/the_turf = get_turf(A)
|
||||
var/turf_coords = "[COORD(the_turf)]"
|
||||
investigate_log("[user] is attempting to use [src] on [A] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
|
||||
if(do_after(user, delay, target = A))
|
||||
if(checkResource(rcd_results["cost"], user))
|
||||
var/atom/cached = A
|
||||
if(A.rcd_act(user, src, rcd_results["mode"]))
|
||||
rcd_effect.end_animation()
|
||||
useResource(rcd_results["cost"], user)
|
||||
activate()
|
||||
investigate_log("[user] used [src] on [cached] (now [A]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
|
||||
investigate_log("[user] used [src] on [cached] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
return TRUE
|
||||
qdel(rcd_effect)
|
||||
|
||||
/obj/item/construction/rcd/Initialize()
|
||||
. = ..()
|
||||
@@ -434,10 +474,15 @@ RLD
|
||||
..()
|
||||
var/list/choices = list(
|
||||
"Airlock" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"),
|
||||
"Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"),
|
||||
"Grilles & Windows" = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"),
|
||||
"Floors & Walls" = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor")
|
||||
)
|
||||
if(upgrade & RCD_UPGRADE_FRAMES)
|
||||
choices += list(
|
||||
"Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"),
|
||||
"Machine Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "machine"),
|
||||
"Computer Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "computer_dir"),
|
||||
)
|
||||
if(mode == RCD_AIRLOCK)
|
||||
choices += list(
|
||||
"Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"),
|
||||
@@ -459,6 +504,12 @@ RLD
|
||||
mode = RCD_DECONSTRUCT
|
||||
if("Grilles & Windows")
|
||||
mode = RCD_WINDOWGRILLE
|
||||
if("Machine Frames")
|
||||
mode = RCD_MACHINE
|
||||
if("Computer Frames")
|
||||
mode = RCD_COMPUTER
|
||||
change_computer_dir(user)
|
||||
return
|
||||
if("Change Access")
|
||||
change_airlock_access(user)
|
||||
return
|
||||
@@ -481,7 +532,12 @@ RLD
|
||||
|
||||
/obj/item/construction/rcd/afterattack(atom/A, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!prox_check(proximity))
|
||||
if(!proximity)
|
||||
if(!ranged || !range_check(A,user)) //early return not-in-range sanity.
|
||||
return
|
||||
if(target_check(A,user))
|
||||
user.Beam(A,icon_state="rped_upgrade",time=30)
|
||||
rcd_create(A,user)
|
||||
return
|
||||
rcd_create(A, user)
|
||||
|
||||
@@ -511,6 +567,8 @@ RLD
|
||||
no_ammo_message = "<span class='warning'>Insufficient charge.</span>"
|
||||
desc = "A device used to rapidly build walls and floors."
|
||||
canRturf = TRUE
|
||||
upgrade = TRUE
|
||||
var/energyfactor = 72
|
||||
|
||||
|
||||
/obj/item/construction/rcd/borg/useResource(amount, mob/user)
|
||||
@@ -521,7 +579,7 @@ RLD
|
||||
if(user)
|
||||
to_chat(user, no_ammo_message)
|
||||
return 0
|
||||
. = borgy.cell.use(amount * 72) //borgs get 1.3x the use of their RCDs
|
||||
. = borgy.cell.use(amount * energyfactor) //borgs get 1.3x the use of their RCDs
|
||||
if(!. && user)
|
||||
to_chat(user, no_ammo_message)
|
||||
return .
|
||||
@@ -534,19 +592,29 @@ RLD
|
||||
if(user)
|
||||
to_chat(user, no_ammo_message)
|
||||
return 0
|
||||
. = borgy.cell.charge >= (amount * 72)
|
||||
. = borgy.cell.charge >= (amount * energyfactor)
|
||||
if(!. && user)
|
||||
to_chat(user, no_ammo_message)
|
||||
return .
|
||||
|
||||
/obj/item/construction/rcd/borg/syndicate
|
||||
icon_state = "ircd"
|
||||
item_state = "ircd"
|
||||
energyfactor = 66
|
||||
|
||||
/obj/item/construction/rcd/loaded
|
||||
materials = list(MAT_METAL=48000, MAT_GLASS=32000)
|
||||
matter = 160
|
||||
|
||||
/obj/item/construction/rcd/loaded/upgraded
|
||||
upgrade = TRUE
|
||||
|
||||
/obj/item/construction/rcd/combat
|
||||
name = "Combat RCD"
|
||||
desc = "A device used to rapidly build and deconstruct. Reload with metal, plasteel, glass or compressed matter cartridges. This RCD has been upgraded to be able to remove Rwalls!"
|
||||
icon_state = "ircd"
|
||||
item_state = "ircd"
|
||||
upgrade = TRUE
|
||||
max_matter = 500
|
||||
matter = 500
|
||||
canRturf = TRUE
|
||||
@@ -557,6 +625,7 @@ RLD
|
||||
item_state = "ircd"
|
||||
max_matter = 500
|
||||
matter = 500
|
||||
upgrade = TRUE
|
||||
delay_mod = 0.6
|
||||
sheetmultiplier = 8
|
||||
|
||||
@@ -582,7 +651,8 @@ RLD
|
||||
name = "admin RCD"
|
||||
max_matter = INFINITY
|
||||
matter = INFINITY
|
||||
|
||||
upgrade = TRUE
|
||||
ranged = TRUE
|
||||
|
||||
// Ranged RCD
|
||||
|
||||
@@ -593,25 +663,16 @@ RLD
|
||||
max_matter = 300
|
||||
matter = 300
|
||||
delay_mod = 0.6
|
||||
upgrade = TRUE
|
||||
ranged = TRUE
|
||||
icon_state = "arcd"
|
||||
item_state = "oldrcd"
|
||||
has_ammobar = FALSE
|
||||
|
||||
/obj/item/construction/rcd/arcd/afterattack(atom/A, mob/user)
|
||||
. = ..()
|
||||
if(!range_check(A,user))
|
||||
return
|
||||
if(target_check(A,user))
|
||||
user.Beam(A,icon_state="rped_upgrade",time=30)
|
||||
rcd_create(A,user)
|
||||
|
||||
|
||||
|
||||
// RAPID LIGHTING DEVICE
|
||||
|
||||
|
||||
|
||||
/obj/item/construction/rld
|
||||
name = "rapid-light-device (RLD)"
|
||||
desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges."
|
||||
@@ -776,6 +837,21 @@ RLD
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/rcd_upgrade
|
||||
name = "RCD advanced design disk"
|
||||
desc = "It seems to be empty."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "datadisk3"
|
||||
var/upgrade
|
||||
|
||||
/obj/item/rcd_upgrade/frames
|
||||
desc = "It contains the design for machine frames, computer frames and deconstruction."
|
||||
upgrade = RCD_UPGRADE_FRAMES
|
||||
|
||||
/obj/item/rcd_upgrade/simple_circuits
|
||||
desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
|
||||
upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS
|
||||
|
||||
#undef GLOW_MODE
|
||||
#undef LIGHT_MODE
|
||||
#undef REMOVE_MODE
|
||||
#undef REMOVE_MODE
|
||||
@@ -1,6 +1,9 @@
|
||||
#define RANDOM_GRAFFITI "Random Graffiti"
|
||||
#define RANDOM_LETTER "Random Letter"
|
||||
#define RANDOM_PUNCTUATION "Random Punctuation"
|
||||
#define RANDOM_NUMBER "Random Number"
|
||||
#define RANDOM_SYMBOL "Random Symbol"
|
||||
#define RANDOM_DRAWING "Random Drawing"
|
||||
#define RANDOM_ORIENTED "Random Oriented"
|
||||
#define RANDOM_RUNE "Random Rune"
|
||||
#define RANDOM_ANY "Random Anything"
|
||||
@@ -32,16 +35,16 @@
|
||||
var/drawtype
|
||||
var/text_buffer = ""
|
||||
|
||||
var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","arrow","star","poseur tag","prolizard","antilizard", "tile") //cit edit
|
||||
var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
|
||||
var/list/numerals = list("0","1","2","3","4","5","6","7","8","9")
|
||||
var/list/oriented = list("arrow","body") // These turn to face the same way as the drawer
|
||||
var/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6")
|
||||
var/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED,
|
||||
RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER)
|
||||
var/list/graffiti_large_h = list("yiffhell", "secborg", "paint")
|
||||
var/static/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","star","poseur tag","prolizard","antilizard", "tile")
|
||||
var/static/list/symbols = list("danger","firedanger","electricdanger","biohazard","radiation","safe","evac","space","med","trade","shop","food","peace","like","skull","nay","heart","credit")
|
||||
var/static/list/drawings = list("smallbrush","brush","largebrush","splatter","snake","stickman","carp","ghost","clown","taser","disk","fireaxe","toolbox","corgi","cat","toilet","blueprint","beepsky","scroll","bottle","shotgun")
|
||||
var/static/list/oriented = list("arrow","line","thinline","shortline","body","chevron","footprint","clawprint","pawprint") // These turn to face the same way as the drawer
|
||||
var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6")
|
||||
var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED,
|
||||
RANDOM_NUMBER, RANDOM_GRAFFITI, RANDOM_LETTER, RANDOM_SYMBOL, RANDOM_PUNCTUATION, RANDOM_DRAWING)
|
||||
var/static/list/graffiti_large_h = list("yiffhell", "secborg", "paint")
|
||||
|
||||
var/list/all_drawables
|
||||
var/static/list/all_drawables = graffiti + symbols + drawings + oriented + runes + graffiti_large_h
|
||||
|
||||
var/paint_mode = PAINT_NORMAL
|
||||
|
||||
@@ -54,8 +57,6 @@
|
||||
var/instant = FALSE
|
||||
var/self_contained = TRUE // If it deletes itself when it is empty
|
||||
|
||||
var/list/validSurfaces = list(/turf/open/floor)
|
||||
|
||||
var/edible = TRUE // That doesn't mean eating it is a good idea
|
||||
|
||||
var/list/reagent_contents = list("nutriment" = 1)
|
||||
@@ -71,6 +72,9 @@
|
||||
var/datum/team/gang/gang //For marking territory.
|
||||
var/gang_tag_delay = 30 //this is the delay for gang mode tag applications on anything that gang = true on.
|
||||
|
||||
/obj/item/toy/crayon/proc/isValidSurface(surface)
|
||||
return istype(surface, /turf/open/floor)
|
||||
|
||||
/obj/item/toy/crayon/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is jamming [src] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (BRUTELOSS|OXYLOSS)
|
||||
@@ -81,7 +85,6 @@
|
||||
if(name == "crayon")
|
||||
name = "[item_color] crayon"
|
||||
|
||||
all_drawables = graffiti + letters + numerals + oriented + runes + graffiti_large_h
|
||||
drawtype = pick(all_drawables)
|
||||
|
||||
refill()
|
||||
@@ -147,61 +150,70 @@
|
||||
ui.open()
|
||||
|
||||
/obj/item/toy/crayon/spraycan/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
if(has_cap)
|
||||
is_capped = !is_capped
|
||||
to_chat(user, "<span class='notice'>The cap on [src] is now [is_capped ? "on" : "off"].</span>")
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/item/toy/crayon/ui_data()
|
||||
var/list/data = list()
|
||||
data["drawables"] = list()
|
||||
var/list/D = data["drawables"]
|
||||
/obj/item/toy/crayon/proc/staticDrawables()
|
||||
|
||||
. = list()
|
||||
|
||||
var/list/g_items = list()
|
||||
D += list(list("name" = "Graffiti", "items" = g_items))
|
||||
. += list(list("name" = "Graffiti", "items" = g_items))
|
||||
for(var/g in graffiti)
|
||||
g_items += list(list("item" = g))
|
||||
|
||||
var/list/glh_items = list()
|
||||
D += list(list("name" = "Graffiti Large Horizontal", "items" = glh_items))
|
||||
. += list(list("name" = "Graffiti Large Horizontal", "items" = glh_items))
|
||||
for(var/glh in graffiti_large_h)
|
||||
glh_items += list(list("item" = glh))
|
||||
|
||||
var/list/L_items = list()
|
||||
D += list(list("name" = "Letters", "items" = L_items))
|
||||
for(var/L in letters)
|
||||
L_items += list(list("item" = L))
|
||||
var/list/S_items = list()
|
||||
. += list(list("name" = "Symbols", "items" = S_items))
|
||||
for(var/S in symbols)
|
||||
S_items += list(list("item" = S))
|
||||
|
||||
var/list/N_items = list()
|
||||
D += list(list(name = "Numerals", "items" = N_items))
|
||||
for(var/N in numerals)
|
||||
N_items += list(list("item" = N))
|
||||
var/list/D_items = list()
|
||||
. += list(list("name" = "Drawings", "items" = D_items))
|
||||
for(var/D in drawings)
|
||||
D_items += list(list("item" = D))
|
||||
|
||||
var/list/O_items = list()
|
||||
D += list(list(name = "Oriented", "items" = O_items))
|
||||
. += list(list(name = "Oriented", "items" = O_items))
|
||||
for(var/O in oriented)
|
||||
O_items += list(list("item" = O))
|
||||
|
||||
var/list/R_items = list()
|
||||
D += list(list(name = "Runes", "items" = R_items))
|
||||
. += list(list(name = "Runes", "items" = R_items))
|
||||
for(var/R in runes)
|
||||
R_items += list(list("item" = R))
|
||||
|
||||
var/list/rand_items = list()
|
||||
D += list(list(name = "Random", "items" = rand_items))
|
||||
. += list(list(name = "Random", "items" = rand_items))
|
||||
for(var/i in randoms)
|
||||
rand_items += list(list("item" = i))
|
||||
|
||||
data["selected_stencil"] = drawtype
|
||||
data["text_buffer"] = text_buffer
|
||||
|
||||
data["has_cap"] = has_cap
|
||||
data["is_capped"] = is_capped
|
||||
data["can_change_colour"] = can_change_colour
|
||||
data["current_colour"] = paint_color
|
||||
/obj/item/toy/crayon/ui_data()
|
||||
|
||||
return data
|
||||
var/static/list/crayon_drawables
|
||||
|
||||
if (!crayon_drawables)
|
||||
crayon_drawables = staticDrawables()
|
||||
|
||||
. = list()
|
||||
.["drawables"] = crayon_drawables
|
||||
.["selected_stencil"] = drawtype
|
||||
.["text_buffer"] = text_buffer
|
||||
|
||||
.["has_cap"] = has_cap
|
||||
.["is_capped"] = is_capped
|
||||
.["can_change_colour"] = can_change_colour
|
||||
.["current_colour"] = paint_color
|
||||
|
||||
/obj/item/toy/crayon/ui_act(action, list/params)
|
||||
if(..())
|
||||
@@ -216,6 +228,7 @@
|
||||
if(stencil in all_drawables + randoms)
|
||||
drawtype = stencil
|
||||
. = TRUE
|
||||
text_buffer = ""
|
||||
if(stencil in graffiti_large_h)
|
||||
paint_mode = PAINT_LARGE_HORIZONTAL
|
||||
text_buffer = ""
|
||||
@@ -223,8 +236,13 @@
|
||||
paint_mode = PAINT_NORMAL
|
||||
if("select_colour")
|
||||
if(can_change_colour)
|
||||
paint_color = input(usr,"","Choose Color",paint_color) as color|null
|
||||
. = TRUE
|
||||
var/chosen_colour = input(usr,"","Choose Color",paint_color) as color|null
|
||||
|
||||
if (!isnull(chosen_colour))
|
||||
paint_color = chosen_colour
|
||||
. = TRUE
|
||||
else
|
||||
. = FALSE
|
||||
if("enter_text")
|
||||
var/txt = stripped_input(usr,"Choose what to write.",
|
||||
"Scribbles",default = text_buffer)
|
||||
@@ -235,18 +253,16 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/toy/crayon/proc/crayon_text_strip(text)
|
||||
var/list/base = string2charlist(lowertext(text))
|
||||
var/list/out = list()
|
||||
for(var/a in base)
|
||||
if(a in (letters|numerals))
|
||||
out += a
|
||||
return jointext(out,"")
|
||||
var/static/regex/crayon_r = new /regex(@"[^\w!?,.=%#&+\/\-]")
|
||||
return replacetext(lowertext(text), crayon_r, "")
|
||||
|
||||
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity, params)
|
||||
. = ..()
|
||||
if(!proximity || !check_allowed_items(target))
|
||||
return
|
||||
|
||||
var/static/list/punctuation = list("!","?",".",",","/","+","-","=","%","#","&")
|
||||
|
||||
var/cost = 1
|
||||
if(paint_mode == PAINT_LARGE_HORIZONTAL)
|
||||
cost = 5
|
||||
@@ -264,13 +280,19 @@
|
||||
if(istype(target, /obj/effect/decal/cleanable))
|
||||
target = target.loc
|
||||
|
||||
if(!is_type_in_list(target,validSurfaces))
|
||||
if(!isValidSurface(target))
|
||||
return
|
||||
|
||||
var/drawing = drawtype
|
||||
switch(drawtype)
|
||||
if(RANDOM_LETTER)
|
||||
drawing = pick(letters)
|
||||
drawing = ascii2text(rand(97, 122)) // a-z
|
||||
if(RANDOM_PUNCTUATION)
|
||||
drawing = pick(punctuation)
|
||||
if(RANDOM_SYMBOL)
|
||||
drawing = pick(symbols)
|
||||
if(RANDOM_DRAWING)
|
||||
drawing = pick(drawings)
|
||||
if(RANDOM_GRAFFITI)
|
||||
drawing = pick(graffiti)
|
||||
if(RANDOM_RUNE)
|
||||
@@ -278,17 +300,24 @@
|
||||
if(RANDOM_ORIENTED)
|
||||
drawing = pick(oriented)
|
||||
if(RANDOM_NUMBER)
|
||||
drawing = pick(numerals)
|
||||
drawing = ascii2text(rand(48, 57)) // 0-9
|
||||
if(RANDOM_ANY)
|
||||
drawing = pick(all_drawables)
|
||||
|
||||
var/temp = "rune"
|
||||
if(drawing in letters)
|
||||
var/ascii = (length(drawing) == 1) ? TRUE : FALSE
|
||||
if(ascii && is_alpha(drawing))
|
||||
temp = "letter"
|
||||
else if(drawing in graffiti)
|
||||
temp = "graffiti"
|
||||
else if(drawing in numerals)
|
||||
else if(ascii && is_digit(drawing))
|
||||
temp = "number"
|
||||
else if(drawing in punctuation)
|
||||
temp = "punctuation mark"
|
||||
else if(drawing in symbols)
|
||||
temp = "symbol"
|
||||
else if(drawing in drawings)
|
||||
temp = "drawing"
|
||||
else if(drawing in graffiti|oriented)
|
||||
temp = "graffiti"
|
||||
|
||||
// If a gang member is using a gang spraycan, it'll behave differently
|
||||
var/gang_mode = FALSE
|
||||
@@ -338,7 +367,7 @@
|
||||
return
|
||||
|
||||
if(length(text_buffer))
|
||||
drawing = copytext(text_buffer,1,2)
|
||||
drawing = text_buffer[1]
|
||||
|
||||
|
||||
var/list/turf/affected_turfs = list()
|
||||
@@ -362,7 +391,7 @@
|
||||
if(PAINT_LARGE_HORIZONTAL)
|
||||
var/turf/left = locate(target.x-1,target.y,target.z)
|
||||
var/turf/right = locate(target.x+1,target.y,target.z)
|
||||
if(is_type_in_list(left, validSurfaces) && is_type_in_list(right, validSurfaces))
|
||||
if(isValidSurface(left) && isValidSurface(right))
|
||||
var/obj/effect/decal/cleanable/crayon/C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON)
|
||||
C.add_hiddenprint(user)
|
||||
affected_turfs += left
|
||||
@@ -377,8 +406,9 @@
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You spray a [temp] on \the [target.name]</span>")
|
||||
|
||||
if(length(text_buffer))
|
||||
if(length(text_buffer) > 1)
|
||||
text_buffer = copytext(text_buffer,2)
|
||||
SStgui.update_uis(src)
|
||||
|
||||
if(post_noise)
|
||||
audible_message("<span class='notice'>You hear spraying.</span>")
|
||||
@@ -516,7 +546,7 @@
|
||||
|
||||
charges = -1
|
||||
|
||||
/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/toy/crayon/rainbow/afterattack(atom/target, mob/user, proximity, params)
|
||||
paint_color = rgb(rand(0,255), rand(0,255), rand(0,255))
|
||||
. = ..()
|
||||
|
||||
@@ -533,7 +563,7 @@
|
||||
|
||||
/obj/item/storage/crayons/Initialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_items = 7
|
||||
STR.can_hold = typecacheof(list(/obj/item/toy/crayon))
|
||||
|
||||
@@ -591,12 +621,14 @@
|
||||
can_change_colour = TRUE
|
||||
gang = TRUE //Gang check is true for all things upon the honored hierarchy of spraycans, except those that are FALSE.
|
||||
|
||||
validSurfaces = list(/turf/open/floor, /turf/closed/wall)
|
||||
reagent_contents = list("welding_fuel" = 1, "ethanol" = 1)
|
||||
|
||||
pre_noise = TRUE
|
||||
post_noise = FALSE
|
||||
|
||||
/obj/item/toy/crayon/spraycan/isValidSurface(surface)
|
||||
return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall))
|
||||
|
||||
/obj/item/toy/crayon/spraycan/suicide_act(mob/user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(is_capped || !actually_paints)
|
||||
@@ -622,8 +654,8 @@
|
||||
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/toy/crayon/spraycan/New()
|
||||
..()
|
||||
/obj/item/toy/crayon/spraycan/Initialize()
|
||||
. = ..()
|
||||
// If default crayon red colour, pick a more fun spraycan colour
|
||||
if(!paint_color)
|
||||
paint_color = pick("#DA0000","#FF9300","#FFF200","#A8E61D","#00B7EF",
|
||||
@@ -640,7 +672,7 @@
|
||||
to_chat(user, "It is empty.")
|
||||
to_chat(user, "<span class='notice'>Alt-click [src] to [ is_capped ? "take the cap off" : "put the cap on"].</span>")
|
||||
|
||||
/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity, params)
|
||||
if(!proximity)
|
||||
return
|
||||
|
||||
@@ -656,8 +688,7 @@
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 25, 1, 5)
|
||||
|
||||
var/mob/living/carbon/C = target
|
||||
user.visible_message("<span class='danger'>[user] sprays [src] into the face of [target]!</span>")
|
||||
to_chat(target, "<span class='userdanger'>[user] sprays [src] into your face!</span>")
|
||||
C.visible_message("<span class='danger'>[user] sprays [src] into the face of [C]!</span>", "<span class='userdanger'>[user] sprays [src] into your face!</span>")
|
||||
|
||||
if(C.client)
|
||||
C.blur_eyes(3)
|
||||
@@ -678,13 +709,20 @@
|
||||
|
||||
return
|
||||
|
||||
if(istype(target, /obj/structure/window))
|
||||
if(isobj(target))
|
||||
if(actually_paints)
|
||||
if(color_hex2num(paint_color) < 350 && !istype(target, /obj/structure/window) && !istype(target, /obj/effect/decal/cleanable/crayon)) //Colors too dark are rejected
|
||||
to_chat(usr, "<span class='warning'>A color that dark on an object like this? Surely not...</span>")
|
||||
return FALSE
|
||||
|
||||
target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY)
|
||||
if(color_hex2num(paint_color) < 255)
|
||||
target.set_opacity(255)
|
||||
else
|
||||
target.set_opacity(initial(target.opacity))
|
||||
|
||||
if(istype(target, /obj/structure/window))
|
||||
if(color_hex2num(paint_color) < 255)
|
||||
target.set_opacity(255)
|
||||
else
|
||||
target.set_opacity(initial(target.opacity))
|
||||
|
||||
. = use_charges(user, 2)
|
||||
var/fraction = min(1, . / reagents.maximum_volume)
|
||||
reagents.reaction(target, TOUCH, fraction * volume_multiplier)
|
||||
@@ -692,6 +730,7 @@
|
||||
|
||||
if(pre_noise || post_noise)
|
||||
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
|
||||
user.visible_message("[user] coats [target] with spray paint!", "<span class='notice'>You coat [target] with spray paint.</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
@@ -709,7 +748,7 @@
|
||||
desc = "A metallic container containing shiny synthesised paint."
|
||||
charges = -1
|
||||
|
||||
/obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity)
|
||||
/obj/item/toy/crayon/spraycan/borg/afterattack(atom/target,mob/user,proximity, params)
|
||||
var/diff = ..()
|
||||
if(!iscyborg(user))
|
||||
to_chat(user, "<span class='notice'>How did you get this?</span>")
|
||||
@@ -754,7 +793,9 @@
|
||||
|
||||
reagent_contents = list("lube" = 1, "banana" = 1)
|
||||
volume_multiplier = 5
|
||||
validSurfaces = list(/turf/open/floor)
|
||||
|
||||
/obj/item/toy/crayon/spraycan/lubecan/isValidSurface(surface)
|
||||
return istype(surface, /turf/open/floor)
|
||||
|
||||
/obj/item/toy/crayon/spraycan/mimecan
|
||||
name = "silent spraycan"
|
||||
@@ -792,9 +833,17 @@
|
||||
if(user.mind && user.mind.has_antag_datum(/datum/antagonist/gang) || isobserver(user))
|
||||
to_chat(user, "This spraycan has been specially modified with a stage 2 nozzle kit, making it faster.")
|
||||
|
||||
/obj/item/toy/crayon/spraycan/infinite
|
||||
name = "infinite spraycan"
|
||||
charges = -1
|
||||
desc = "Now with 30% more bluespace technology."
|
||||
|
||||
#undef RANDOM_GRAFFITI
|
||||
#undef RANDOM_LETTER
|
||||
#undef RANDOM_PUNCTUATION
|
||||
#undef RANDOM_SYMBOL
|
||||
#undef RANDOM_DRAWING
|
||||
#undef RANDOM_NUMBER
|
||||
#undef RANDOM_ORIENTED
|
||||
#undef RANDOM_RUNE
|
||||
#undef RANDOM_ANY
|
||||
#undef RANDOM_ANY
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "forcefield projector"
|
||||
desc = "An experimental device that can create several forcefields at a distance."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "signmaker_engi"
|
||||
icon_state = "signmaker_forcefield"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
item_flags = NOBLUDGEON
|
||||
|
||||
@@ -78,8 +78,8 @@
|
||||
|
||||
/obj/item/holosign_creator/atmos
|
||||
name = "ATMOS holofan projector"
|
||||
desc = "A holographic projector that creates holographic barriers that prevent changes in atmosphere conditions."
|
||||
icon_state = "signmaker_engi"
|
||||
desc = "A holographic projector that creates holographic fans that prevent changes in atmosphere conditions."
|
||||
icon_state = "signmaker_atmos"
|
||||
holosign_type = /obj/structure/holosign/barrier/atmos
|
||||
creation_time = 0
|
||||
max_signs = 3
|
||||
|
||||
@@ -710,3 +710,32 @@
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("bashes", "smacks", "whacks")
|
||||
|
||||
/obj/item/nullrod/hypertool
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "hypertool"
|
||||
item_state = "hypertool"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
name = "hypertool"
|
||||
desc = "A tool so powerful even you cannot perfectly use it."
|
||||
armour_penetration = 35
|
||||
damtype = BRAIN
|
||||
attack_verb = list("pulsed", "mended", "cut")
|
||||
hitsound = 'sound/effects/sparks4.ogg'
|
||||
|
||||
/obj/item/nullrod/spear
|
||||
name = "ancient spear"
|
||||
desc = "An ancient spear made of brass, I mean gold, I mean bronze."
|
||||
icon_state = "ratvarian_spear"
|
||||
item_state = "ratvarian_spear"
|
||||
lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
armour_penetration = 10
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
attack_verb = list("stabbed", "poked", "slashed", "clocked")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
@@ -60,6 +60,7 @@
|
||||
/obj/item/radio,
|
||||
/obj/item/clothing/gloves,
|
||||
/obj/item/holosign_creator,
|
||||
/obj/item/forcefield_projector,
|
||||
/obj/item/assembly/signaler
|
||||
))
|
||||
STR.can_hold = can_hold
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
new /obj/item/clothing/under/rank/chief_engineer(src)
|
||||
new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
|
||||
new /obj/item/clothing/head/hardhat/white(src)
|
||||
new /obj/item/clothing/head/welding(src)
|
||||
new /obj/item/clothing/head/hardhat/weldhat/white(src)
|
||||
new /obj/item/clothing/gloves/color/yellow(src)
|
||||
new /obj/item/clothing/shoes/sneakers/brown(src)
|
||||
new /obj/item/tank/jetpack/suit(src)
|
||||
@@ -34,6 +34,7 @@
|
||||
new /obj/item/storage/photo_album/CE(src)
|
||||
new /obj/item/storage/lockbox/medal/engineering(src)
|
||||
new /obj/item/clothing/suit/hooded/wintercoat/ce(src)
|
||||
new /obj/item/construction/rcd/loaded/upgraded(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_electrical
|
||||
name = "electrical supplies locker"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
anchored = TRUE
|
||||
icon = 'icons/turf/walls/wall.dmi'
|
||||
icon_state = "wall"
|
||||
layer = CLOSED_TURF_LAYER
|
||||
layer = LOW_OBJ_LAYER
|
||||
density = TRUE
|
||||
opacity = 1
|
||||
max_integrity = 100
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
/obj/structure/holosign/barrier/atmos
|
||||
name = "holo firelock"
|
||||
desc = "A holographic barrier resembling a firelock. Though it does not prevent solid objects from passing through, gas is kept out."
|
||||
icon_state = "holo_firelock"
|
||||
icon_state = "holo_fan"
|
||||
density = FALSE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
@@ -81,6 +81,9 @@
|
||||
. = ..()
|
||||
air_update_turf(TRUE)
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/blocksTemperature()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg
|
||||
name = "Energy Field"
|
||||
desc = "A fragile energy field that blocks movement. Excels at blocking lethal projectiles."
|
||||
|
||||
@@ -236,6 +236,10 @@
|
||||
return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33)
|
||||
if(RCD_WINDOWGRILLE)
|
||||
return list("mode" = RCD_WINDOWGRILLE, "delay" = 10, "cost" = 4)
|
||||
if(RCD_MACHINE)
|
||||
return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25)
|
||||
if(RCD_COMPUTER)
|
||||
return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25)
|
||||
return FALSE
|
||||
|
||||
/turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
@@ -263,7 +267,7 @@
|
||||
A.autoclose = TRUE
|
||||
return TRUE
|
||||
if(RCD_DECONSTRUCT)
|
||||
if(ScrapeAway() == src)
|
||||
if(!ScrapeAway(flags = CHANGETURF_INHERIT_AIR))
|
||||
return FALSE
|
||||
to_chat(user, "<span class='notice'>You deconstruct [src].</span>")
|
||||
return TRUE
|
||||
@@ -274,4 +278,20 @@
|
||||
var/obj/structure/grille/G = new(src)
|
||||
G.anchored = TRUE
|
||||
return TRUE
|
||||
if(RCD_MACHINE)
|
||||
if(locate(/obj/structure/frame/machine) in src)
|
||||
return FALSE
|
||||
var/obj/structure/frame/machine/M = new(src)
|
||||
M.state = 2
|
||||
M.icon_state = "box_1"
|
||||
M.anchored = TRUE
|
||||
return TRUE
|
||||
if(RCD_COMPUTER)
|
||||
if(locate(/obj/structure/frame/computer) in src)
|
||||
return FALSE
|
||||
var/obj/structure/frame/computer/C = new(src)
|
||||
C.anchored = TRUE
|
||||
C.state = 1
|
||||
C.setDir(the_rcd.computer_dir)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -102,7 +102,6 @@ GLOBAL_VAR(restart_counter)
|
||||
GLOB.picture_log_directory = "data/picture_logs/[override_dir]"
|
||||
|
||||
GLOB.world_game_log = "[GLOB.log_directory]/game.log"
|
||||
GLOB.world_cloning_log = "[GLOB.log_directory]/cloning.log"
|
||||
GLOB.world_attack_log = "[GLOB.log_directory]/attack.log"
|
||||
GLOB.world_pda_log = "[GLOB.log_directory]/pda.log"
|
||||
GLOB.world_telecomms_log = "[GLOB.log_directory]/telecomms.log"
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
H.dna.features["spines"] = pick(GLOB.spines_list)
|
||||
H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
|
||||
H.dna.features["moth_wings"] = pick(GLOB.moth_wings_list)
|
||||
H.dna.features["moth_fluff"] = pick(GLOB.moth_fluffs_list)
|
||||
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
|
||||
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
|
||||
@@ -22,7 +22,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
|
||||
icon = 'icons/obj/rune.dmi'
|
||||
icon_state = "1"
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
layer = LOW_OBJ_LAYER
|
||||
layer = SIGIL_LAYER
|
||||
color = RUNE_COLOR_RED
|
||||
|
||||
var/invocation = "Aiy ele-mayo." //This is said by cultists when the rune is invoked.
|
||||
|
||||
@@ -357,6 +357,9 @@
|
||||
SSair.excited_groups -= src
|
||||
|
||||
////////////////////////SUPERCONDUCTIVITY/////////////////////////////
|
||||
/atom/movable/proc/blocksTemperature()
|
||||
return FALSE
|
||||
|
||||
/turf/proc/conductivity_directions()
|
||||
if(archived_cycle < SSair.times_fired)
|
||||
archive()
|
||||
@@ -371,6 +374,9 @@
|
||||
. |= direction
|
||||
|
||||
/turf/proc/neighbor_conduct_with_src(turf/open/other)
|
||||
for (var/atom/movable/G in src)
|
||||
if (G.blocksTemperature())
|
||||
return
|
||||
if(!other.blocks_air) //Open but neighbor is solid
|
||||
other.temperature_share_open_to_solid(src)
|
||||
else //Both tiles are solid
|
||||
@@ -382,6 +388,10 @@
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
for (var/atom/movable/G in src)
|
||||
if (G.blocksTemperature())
|
||||
return
|
||||
if(!other.blocks_air) //Both tiles are open
|
||||
var/turf/open/T = other
|
||||
T.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT)
|
||||
|
||||
@@ -822,6 +822,21 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/airalarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
if((buildstage == 0) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS))
|
||||
return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1)
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/airalarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_UPGRADE_SIMPLE_CIRCUITS)
|
||||
user.visible_message("<span class='notice'>[user] fabricates a circuit and places it into [src].</span>", \
|
||||
"<span class='notice'>You adapt an air alarm circuit and slot it into the assembly.</span>")
|
||||
buildstage = 1
|
||||
update_icon()
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/airalarm/AltClick(mob/user)
|
||||
..()
|
||||
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
|
||||
|
||||
@@ -2924,9 +2924,9 @@
|
||||
name = "Kinkmate construction kit"
|
||||
cost = 2000
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/vending_refill/kink,
|
||||
/obj/item/vending_refill/kink,
|
||||
/obj/item/vending_refill/kink,
|
||||
contains = list(/obj/item/vending_refill/kink,
|
||||
/obj/item/vending_refill/kink,
|
||||
/obj/item/vending_refill/kink,
|
||||
/obj/item/circuitboard/machine/kinkmate)
|
||||
crate_name = "Kinkmate construction kit"
|
||||
|
||||
@@ -2966,6 +2966,36 @@
|
||||
crate_name = "captain pen"
|
||||
crate_type = /obj/structure/closet/crate/secure/weapon //It is a combat pen
|
||||
|
||||
/datum/supply_pack/misc/dueling_stam
|
||||
name = "Dueling Pistols"
|
||||
desc = "Resolve all your quarrels with some nonlethal fun."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/storage/lockbox/dueling/hugbox/stamina,
|
||||
/obj/item/storage/lockbox/dueling/hugbox/stamina,
|
||||
/obj/item/storage/lockbox/dueling/hugbox/stamina,
|
||||
/obj/item/storage/lockbox/dueling/hugbox/stamina,
|
||||
/obj/item/storage/lockbox/dueling/hugbox/stamina)
|
||||
crate_name = "dueling pistols"
|
||||
|
||||
/datum/supply_pack/misc/dueling_lethal
|
||||
name = "Lethal Dueling Pistols"
|
||||
desc = "Settle your differences the true spaceman way."
|
||||
cost = 3000
|
||||
contraband = TRUE
|
||||
contains = list(/obj/item/storage/lockbox/dueling/hugbox,
|
||||
/obj/item/storage/lockbox/dueling/hugbox,
|
||||
/obj/item/storage/lockbox/dueling/hugbox)
|
||||
crate_name = "dueling pistols (lethal)"
|
||||
|
||||
/datum/supply_pack/misc/dueling_death
|
||||
name = "Elimination Dueling Pistols"
|
||||
desc = "It's high noon."
|
||||
cost = 5000
|
||||
hidden = TRUE
|
||||
contains = list(/obj/item/storage/lockbox/dueling)
|
||||
crate_name = "dueling pistols (elimination)"
|
||||
|
||||
|
||||
/datum/supply_pack/misc/exoticfootwear
|
||||
name = "Exotic Footwear Crate"
|
||||
desc = "Popularised by lizards and exotic dancers, the footwear included in this shipment is sure to give your feet the breathing room they deserve. Sweet Kicks Inc. is not responsible for any damage, distress, or @r0u$a1 caused by this shipment."
|
||||
@@ -3006,7 +3036,7 @@
|
||||
/obj/item/bedsheet/purple,
|
||||
/obj/item/bedsheet/red,
|
||||
/obj/item/bedsheet/yellow,
|
||||
/obj/item/bedsheet/brown,
|
||||
/obj/item/bedsheet/brown,
|
||||
/obj/item/bedsheet/black,
|
||||
/obj/item/bedsheet/rainbow)
|
||||
crate_name = "colored bedsheet crate"
|
||||
|
||||
@@ -5,7 +5,7 @@ This lets you switch chat themes by using winset and CSS loading, you must relog
|
||||
Things to note:
|
||||
If you change ANYTHING in interface/skin.dmf you need to change it here:
|
||||
Format:
|
||||
winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value")
|
||||
winset(src, "window as appears in skin.dmf after elem", "var to change = desired value")
|
||||
How this works:
|
||||
I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat)
|
||||
This then swaps the window theme automatically
|
||||
@@ -14,91 +14,51 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this.
|
||||
|
||||
/client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested.
|
||||
//Main windows
|
||||
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "split", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
//Buttons
|
||||
winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG]")
|
||||
winset(src, "report-issue", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
//Status and verb tabs
|
||||
winset(src, "output", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "statwindow", "text-color = #eaeaea;text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "output", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
|
||||
//Etc.
|
||||
winset(src, "say", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "say", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
|
||||
winset(src, "asset_cache_browser", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
|
||||
winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
|
||||
|
||||
/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing
|
||||
//Main windows
|
||||
winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "infowindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "info", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "browseroutput", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "outputwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "split", "background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
//Buttons
|
||||
winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "changelog", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "rules", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "wiki", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "forum", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
|
||||
winset(src, "github", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG]")
|
||||
winset(src, "report-issue", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
//Status and verb tabs
|
||||
winset(src, "output", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "output", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "statwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
|
||||
winset(src, "stat", "tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "stat", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "tab-text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "prefix-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "suffix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "output", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
|
||||
//Etc.
|
||||
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "say", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "asset_cache_browser", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
|
||||
winset(src, "tooltip", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "say", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
|
||||
|
||||
|
||||
/datum/asset/simple/goonchat
|
||||
@@ -114,4 +74,4 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this.
|
||||
"font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css',
|
||||
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
|
||||
"browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css',
|
||||
)
|
||||
)
|
||||
@@ -86,6 +86,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/facial_hair_color = "000" //Facial hair color
|
||||
var/skin_tone = "caucasian1" //Skin color
|
||||
var/eye_color = "000" //Eye color
|
||||
var/wing_color = "fff" //Wing color
|
||||
|
||||
//H13
|
||||
var/body_size = 100 //Body Size in percent
|
||||
@@ -100,10 +101,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"ears" = "None",
|
||||
"wings" = "None",
|
||||
"frills" = "None",
|
||||
"deco_wings" = "None",
|
||||
"spines" = "None",
|
||||
"body_markings" = "None",
|
||||
"legs" = "Normal Legs",
|
||||
"moth_wings" = "Plain",
|
||||
"moth_fluff" = "None",
|
||||
"moth_markings" = "None",
|
||||
"mcolor2" = "FFF",
|
||||
"mcolor3" = "FFF",
|
||||
@@ -609,6 +612,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
if("deco_wings" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
|
||||
dat += "<h3>Decorative wings</h3>"
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=deco_wings;task=input'>[features["deco_wings"]]</a>"
|
||||
dat += "<span style='border:1px solid #161616; background-color: #[wing_color];'> </span> <a href='?_src_=prefs;preference=wings_color;task=input'>Change</a><BR>"
|
||||
if("moth_wings" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
@@ -617,6 +628,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=moth_wings;task=input'>[features["moth_wings"]]</a>"
|
||||
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
if("moth_fluff" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
|
||||
dat += "<h3>Moth Fluff</h3>"
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=moth_fluffs;task=input'>[features["moth_fluff"]]</a>"
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
@@ -783,6 +805,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Cup Size:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_size;task=input'>[features["breasts_size"]]</a>"
|
||||
dat += "<b>Breast Shape:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_shape;task=input'>[features["breasts_shape"]]</a>"
|
||||
dat += "<b>Lactates:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_producing'>[features["breasts_producing"] == TRUE ? "Yes" : "No"]</a>"
|
||||
if(features["breasts_producing"] == TRUE)
|
||||
dat += "<b>Produces:</b><a style='display:block;width:50px' href='?_src_=prefs;preference=breasts_fluid;task=input'>[features["breasts_fluid"]]</a>"
|
||||
|
||||
dat += "</td>"
|
||||
dat += "</td>"
|
||||
dat += "</tr></table>"
|
||||
@@ -1780,6 +1805,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_wings)
|
||||
features["wings"] = new_wings
|
||||
|
||||
if("wings_color")
|
||||
var/new_wing_color = input(user, "Choose your character's wing colour:", "Character Preference","#"+wing_color) as color|null
|
||||
if(new_wing_color)
|
||||
if (new_wing_color == "#000000")
|
||||
wing_color = "#FFFFFF"
|
||||
else
|
||||
wing_color = sanitize_hexcolor(new_wing_color)
|
||||
|
||||
if("frills")
|
||||
var/new_frills
|
||||
new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in GLOB.frills_list
|
||||
@@ -1814,6 +1847,18 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_moth_wings)
|
||||
features["moth_wings"] = new_moth_wings
|
||||
|
||||
if("moth_fluffs")
|
||||
var/new_moth_fluff
|
||||
new_moth_fluff = input(user, "Choose your character's fluff:", "Character Preference") as null|anything in GLOB.moth_fluffs_list
|
||||
if(new_moth_fluff)
|
||||
features["moth_fluff"] = new_moth_fluff
|
||||
|
||||
if("deco_wings")
|
||||
var/new_deco_wings
|
||||
new_deco_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.deco_wings_list
|
||||
if(new_deco_wings)
|
||||
features["deco_wings"] = new_deco_wings
|
||||
|
||||
if("moth_markings")
|
||||
var/new_moth_markings
|
||||
new_moth_markings = input(user, "Choose your character's markings:", "Character Preference") as null|anything in GLOB.moth_markings_list
|
||||
@@ -1978,6 +2023,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
new_shape = input(user, "Breast Shape", "Character Preference") as null|anything in GLOB.breasts_shapes_list
|
||||
if(new_shape)
|
||||
features["breasts_shape"] = new_shape
|
||||
|
||||
if("breasts_fluid")
|
||||
var/new_shape
|
||||
new_shape = input(user, "Breast Fluid", "Character Preference") as null|anything in GLOB.genital_fluids_list
|
||||
if(new_shape)
|
||||
features["breasts_fluid"] = new_shape
|
||||
|
||||
if("breasts_color")
|
||||
var/new_breasts_color = input(user, "Breast Color:", "Character Preference") as color|null
|
||||
@@ -2355,6 +2406,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
organ_eyes.old_eye_color = eye_color
|
||||
character.hair_color = hair_color
|
||||
character.facial_hair_color = facial_hair_color
|
||||
character.wing_color = wing_color
|
||||
|
||||
character.skin_tone = skin_tone
|
||||
character.hair_style = hair_style
|
||||
|
||||
@@ -259,6 +259,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000")
|
||||
WRITE_FILE(S["features["mcolor"]"] , "#FFF")
|
||||
|
||||
if(!S["features["wing_color"]"] || S["features["wing_color"]"] == "#000")
|
||||
WRITE_FILE(S["features["wing_color"]"] , "#FFF")
|
||||
|
||||
//Character
|
||||
S["real_name"] >> real_name
|
||||
S["nameless"] >> nameless
|
||||
@@ -280,6 +283,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["shirt_color"] >> shirt_color
|
||||
S["socks"] >> socks
|
||||
S["socks_color"] >> socks_color
|
||||
S["wing_color"] >> wing_color
|
||||
S["backbag"] >> backbag
|
||||
S["jumpsuit_style"] >> jumpsuit_style
|
||||
S["uplink_loc"] >> uplink_spawn_loc
|
||||
@@ -292,9 +296,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_lizard_body_markings"] >> features["body_markings"]
|
||||
S["feature_lizard_legs"] >> features["legs"]
|
||||
S["feature_moth_wings"] >> features["moth_wings"]
|
||||
S["feature_moth_fluff"] >> features["moth_fluff"]
|
||||
S["feature_moth_markings"] >> features["moth_markings"]
|
||||
S["feature_human_tail"] >> features["tail_human"]
|
||||
S["feature_human_ears"] >> features["ears"]
|
||||
S["feature_deco_wings"] >> features["deco_wings"]
|
||||
|
||||
|
||||
|
||||
@@ -401,6 +407,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
if(!features["mcolor"] || features["mcolor"] == "#000")
|
||||
features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
|
||||
|
||||
if(!features["wing_color"] || features["wing_color"] == "#000")
|
||||
features["wing_color"] = "FFFFFF"
|
||||
|
||||
|
||||
|
||||
nameless = sanitize_integer(nameless, 0, 1, initial(nameless))
|
||||
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
||||
be_random_body = sanitize_integer(be_random_body, 0, 1, initial(be_random_body))
|
||||
@@ -422,6 +433,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
|
||||
eye_color = sanitize_hexcolor(eye_color, 3, 0)
|
||||
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
|
||||
wing_color = sanitize_hexcolor(wing_color, 3, FALSE, "#FFFFFF")
|
||||
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
|
||||
jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
|
||||
uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
|
||||
@@ -436,7 +448,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
|
||||
features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list)
|
||||
features["moth_fluff"] = sanitize_inlist(features["moth_fluff"], GLOB.moth_fluffs_list)
|
||||
features["moth_markings"] = sanitize_inlist(features["moth_markings"], GLOB.moth_markings_list, "None")
|
||||
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
|
||||
|
||||
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
||||
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
|
||||
@@ -496,6 +510,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["shirt_color"] , shirt_color)
|
||||
WRITE_FILE(S["socks"] , socks)
|
||||
WRITE_FILE(S["socks_color"] , socks_color)
|
||||
WRITE_FILE(S["wing_color"] , wing_color)
|
||||
WRITE_FILE(S["backbag"] , backbag)
|
||||
WRITE_FILE(S["jumpsuit_style"] , jumpsuit_style)
|
||||
WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc)
|
||||
@@ -511,7 +526,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
|
||||
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
|
||||
WRITE_FILE(S["feature_moth_wings"] , features["moth_wings"])
|
||||
WRITE_FILE(S["feature_moth_fluff"] , features["moth_fluff"])
|
||||
WRITE_FILE(S["feature_moth_markings"] , features["moth_markings"])
|
||||
WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"])
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
GLOBAL_VAR_INIT(LOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour.
|
||||
GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC")
|
||||
|
||||
/client/verb/looc(msg as text)
|
||||
set name = "LOOC"
|
||||
set desc = "Local OOC, seen only by those in view."
|
||||
@@ -59,30 +62,17 @@
|
||||
continue //Also handled later.
|
||||
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
// var/display_name = src.key
|
||||
// if(holder)
|
||||
// if(holder.fakekey)
|
||||
// if(C.holder)
|
||||
// display_name = "[holder.fakekey]/([src.key])"
|
||||
// else
|
||||
// display_name = holder.fakekey
|
||||
to_chat(C,"<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")
|
||||
if(GLOB.LOOC_COLOR)
|
||||
to_chat(C, "<font color='[GLOB.LOOC_COLOR]'><b><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></b></font>")
|
||||
else
|
||||
to_chat(C, "<span class='looc'><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></span>")
|
||||
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
var/prefix = "(R)LOOC"
|
||||
if (C.mob in heard)
|
||||
prefix = "LOOC"
|
||||
to_chat(C,"<font color='#6699CC'><span class='ooc'>[ADMIN_FLW(usr)]<span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")
|
||||
|
||||
/*for(var/mob/dead/observer/G in world)
|
||||
if(!G.client)
|
||||
continue
|
||||
var/client/C = G.client
|
||||
if (C in GLOB.admins)
|
||||
continue //handled earlier.
|
||||
if(C.prefs.toggles & CHAT_OOC)
|
||||
var/prefix = "(G)LOOC"
|
||||
if (C.mob in heard)
|
||||
prefix = "LOOC"
|
||||
to_chat(C,"<font color='#6699CC'><span class='ooc'><span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")*/
|
||||
if(GLOB.LOOC_COLOR)
|
||||
to_chat(C, "<font color='[GLOB.LOOC_COLOR]'><b>[ADMIN_FLW(usr)] <span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></b></font>")
|
||||
else
|
||||
to_chat(C, "<span class='looc'>[ADMIN_FLW(usr)] <span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span>")
|
||||
@@ -16,19 +16,26 @@
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head
|
||||
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/user)
|
||||
on = !on
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
user.update_inv_head() //so our mob-overlays update
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/living/user)
|
||||
toggle_helmet_light(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/proc/toggle_helmet_light(mob/living/user)
|
||||
on = !on
|
||||
if(on)
|
||||
turn_on(user)
|
||||
else
|
||||
turn_off(user)
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/update_icon()
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
H.update_inv_head()
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
A.UpdateButtonIcon(force = TRUE)
|
||||
|
||||
/obj/item/clothing/head/hardhat/proc/turn_on(mob/user)
|
||||
set_light(brightness_on, power_on)
|
||||
@@ -85,3 +92,68 @@
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat
|
||||
name = "welding hard hat"
|
||||
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield! The bulb seems a little smaller though."
|
||||
brightness_on = 3 //Needs a little bit of tradeoff
|
||||
dog_fashion = null
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_welding_screen)
|
||||
flash_protect = 2
|
||||
tint = 2
|
||||
flags_inv = HIDEEYES | HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
|
||||
visor_flags_inv = HIDEEYES | HIDEFACE
|
||||
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/attack_self(mob/living/user)
|
||||
toggle_helmet_light(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user)
|
||||
if(user.canUseTopic(src, BE_CLOSE))
|
||||
toggle_welding_screen(user)
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/proc/toggle_welding_screen(mob/living/user)
|
||||
if(weldingvisortoggle(user))
|
||||
playsound(src, 'sound/mecha/mechmove03.ogg', 30, TRUE) //Visors don't just come from nothing
|
||||
update_icon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
. += mutable_appearance('icons/mob/head.dmi', "weldhelmet")
|
||||
if(!up)
|
||||
. += mutable_appearance('icons/mob/head.dmi', "weldvisor")
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/update_icon()
|
||||
cut_overlays()
|
||||
if(!up)
|
||||
add_overlay("weldvisor")
|
||||
..()
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/orange
|
||||
icon_state = "hardhat0_orange"
|
||||
item_state = "hardhat0_orange"
|
||||
item_color = "orange"
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/white
|
||||
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight AND welding shield!" //This bulb is not smaller
|
||||
icon_state = "hardhat0_white"
|
||||
item_state = "hardhat0_white"
|
||||
brightness_on = 4 //Boss always takes the best stuff
|
||||
item_color = "white"
|
||||
clothing_flags = STOPSPRESSUREDAMAGE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/head/hardhat/weldhat/dblue
|
||||
icon_state = "hardhat0_dblue"
|
||||
item_state = "hardhat0_dblue"
|
||||
item_color = "dblue"
|
||||
@@ -527,6 +527,21 @@
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
flags_inv = HIDEHAIR|HIDEEARS
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/centcom
|
||||
name = "centcom winter coat"
|
||||
icon_state = "coatcentcom"
|
||||
item_state = "coatcentcom"
|
||||
armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize()
|
||||
. = ..()
|
||||
allowed = GLOB.security_wintercoat_allowed
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/centcom
|
||||
icon_state = "winterhood_centcom"
|
||||
armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/captain
|
||||
name = "captain's winter coat"
|
||||
icon_state = "coatcaptain"
|
||||
@@ -745,6 +760,16 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/qm
|
||||
icon_state = "winterhood_qm"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/aformal
|
||||
name = "assistant's formal winter coat"
|
||||
icon_state = "coataformal"
|
||||
item_state = "coataformal"
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/clothing/gloves/color/yellow)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/aformal
|
||||
icon_state = "winterhood_aformal"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/miner
|
||||
name = "mining winter coat"
|
||||
icon_state = "coatminer"
|
||||
@@ -756,6 +781,73 @@
|
||||
/obj/item/clothing/head/hooded/winterhood/miner
|
||||
icon_state = "winterhood_miner"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ratvar
|
||||
name = "ratvarian winter coat"
|
||||
icon_state = "coatratvar"
|
||||
item_state = "coatratvar"
|
||||
armor = list("melee" = 30, "bullet" = 45, "laser" = -10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/clockwork/replica_fabricator, /obj/item/clockwork/integration_cog, /obj/item/clockwork/slab, /obj/item/clockwork/weapon/ratvarian_spear)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar
|
||||
var/real = TRUE
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/ratvar
|
||||
icon_state = "winterhood_ratvar"
|
||||
light_range = 3
|
||||
light_power = 1
|
||||
light_color = "#B18B25" //clockwork slab background top color
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ratvar/equipped(mob/living/user,slot)
|
||||
..()
|
||||
if (slot != SLOT_WEAR_SUIT || !real)
|
||||
return
|
||||
if (is_servant_of_ratvar(user))
|
||||
return
|
||||
else
|
||||
user.dropItemToGround(src)
|
||||
to_chat(user,"<span class='large_brass'>\"Amusing that you think you are fit to wear this.\"</span>")
|
||||
to_chat(user,"<span class='userdanger'>Your skin burns where the coat touched your skin!</span>")
|
||||
user.adjustFireLoss(rand(10,16))
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/narsie
|
||||
name = "narsian winter coat"
|
||||
icon_state = "coatnarsie"
|
||||
item_state = "coatnarsie"
|
||||
armor = list("melee" = 30, "bullet" = 20, "laser" = 30,"energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 30, "acid" = 30)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/restraints/legcuffs/bola/cult,/obj/item/melee/cultblade,/obj/item/melee/cultblade/dagger,/obj/item/reagent_containers/glass/beaker/unholywater,/obj/item/cult_shift,/obj/item/flashlight/flare/culttorch,/obj/item/twohanded/cult_spear)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie
|
||||
var/real = TRUE
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/narsie/equipped(mob/living/user,slot)
|
||||
..()
|
||||
if (slot != SLOT_WEAR_SUIT || !real)
|
||||
return
|
||||
if (iscultist(user))
|
||||
return
|
||||
else
|
||||
user.dropItemToGround(src)
|
||||
to_chat(user,"<span class='cultlarge'>\"You are not fit to wear my follower's coat!\"</span>")
|
||||
to_chat(user,"<span class='userdanger'>Sharp spines jab you from within the coat!</span>")
|
||||
user.adjustBruteLoss(rand(10,16))
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/narsie
|
||||
icon_state = "winterhood_narsie"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ratvar/fake
|
||||
name = "brass winter coat"
|
||||
icon_state = "coatratvar"
|
||||
item_state = "coatratvar"
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
real = FALSE
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/narsie/fake
|
||||
name = "runed winter coat"
|
||||
icon_state = "coatnarsie"
|
||||
item_state = "coatnarsie"
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
real = FALSE
|
||||
|
||||
/obj/item/clothing/suit/spookyghost
|
||||
name = "spooky ghost"
|
||||
desc = "This is obviously just a bedsheet, but maybe try it on?"
|
||||
|
||||
@@ -105,7 +105,6 @@
|
||||
/obj/item/reagent_containers/food/drinks/throw_impact(atom/target, datum/thrownthing/throwinfo)
|
||||
. = ..()
|
||||
if(!.) //if the bottle wasn't caught
|
||||
SplashReagents(target)
|
||||
smash(target, throwinfo.thrower, TRUE)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE)
|
||||
@@ -115,6 +114,7 @@
|
||||
return
|
||||
if(bartender_check(target) && ranged)
|
||||
return
|
||||
SplashReagents(target)
|
||||
var/obj/item/broken_bottle/B = new (loc)
|
||||
B.icon_state = icon_state
|
||||
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
|
||||
@@ -349,6 +349,11 @@
|
||||
name = "grape juice box"
|
||||
desc = "Tasty grape juice in a fun little container. Non-alcoholic!"
|
||||
foodtype = FRUIT
|
||||
if("pineapplejuice")
|
||||
icon_state = "pineapplebox"
|
||||
name = "pineapple juice box"
|
||||
desc = "Why would you even want this?"
|
||||
foodtype = FRUIT | PINEAPPLE
|
||||
if("chocolate_milk")
|
||||
icon_state = "chocolatebox"
|
||||
name = "carton of chocolate milk"
|
||||
|
||||
@@ -412,6 +412,28 @@
|
||||
isGlass = FALSE
|
||||
list_reagents = list("menthol" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/pineapplejuice
|
||||
name = "pineapple juice"
|
||||
desc = "Extremely tart, yellow juice."
|
||||
icon_state = "pineapplejuice"
|
||||
item_state = "carton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
isGlass = FALSE
|
||||
list_reagents = list("pineapplejuice" = 100)
|
||||
foodtype = FRUIT | PINEAPPLE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/strawberryjuice
|
||||
name = "strawberry juice"
|
||||
desc = "Slushy, reddish juice."
|
||||
icon_state = "strawberryjuice"
|
||||
item_state = "carton"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
isGlass = FALSE
|
||||
list_reagents = list("strawberryjuice" = 100)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/grenadine
|
||||
name = "Jester Grenadine"
|
||||
desc = "Contains 0% real cherries!"
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
name = "pineapple flavored snowcone"
|
||||
desc = "A pineapple flavord snowball in a paper cup."
|
||||
icon_state = "pineapple_sc"
|
||||
list_reagents = list("nutriment" = 1, "water" = 1)
|
||||
list_reagents = list("nutriment" = 1, "pineapplejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "pineapples" = 5)
|
||||
foodtype = PINEAPPLE //Pineapple to allow all that like pineapple to enjoy
|
||||
|
||||
|
||||
@@ -538,6 +538,7 @@
|
||||
desc = "A sliced piece of juicy pineapple."
|
||||
icon_state = "pineapple_slice"
|
||||
filling_color = "#F6CB0B"
|
||||
juice_results = list("pineapplejuice" = 3)
|
||||
tastes = list("pineapple" = 1)
|
||||
foodtype = FRUIT | PINEAPPLE
|
||||
|
||||
|
||||
@@ -259,10 +259,10 @@
|
||||
required_reagents = list("gin" = 2, "sodawater" = 1, "limejuice" = 1)
|
||||
|
||||
/datum/chemical_reaction/bahama_mama
|
||||
name = "Bahama mama"
|
||||
name = "Bahama Mama"
|
||||
id = "bahama_mama"
|
||||
results = list("bahama_mama" = 6)
|
||||
required_reagents = list("rum" = 2, "orangejuice" = 2, "limejuice" = 1, "ice" = 1)
|
||||
results = list("bahama_mama" = 5)
|
||||
required_reagents = list("rum" = 2, "creme_de_coconut" = 1, "kahlua" = 1, "pineapplejuice" = 1)
|
||||
|
||||
/datum/chemical_reaction/singulo
|
||||
name = "Singulo"
|
||||
@@ -301,6 +301,19 @@
|
||||
required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1)
|
||||
|
||||
|
||||
/datum/chemical_reaction/painkiller
|
||||
name = "Painkiller"
|
||||
id = "painkiller"
|
||||
results = list("painkiller" = 10)
|
||||
required_reagents = list("creme_de_coconut" = 5, "pineapplejuice" = 4, "orangejuice" = 1)
|
||||
|
||||
/datum/chemical_reaction/pina_colada
|
||||
name = "Pina Colada"
|
||||
id = "pina_colada"
|
||||
results = list("pina_colada" = 5)
|
||||
required_reagents = list("creme_de_coconut" = 1, "pineapplejuice" = 2, "rum" = 1, "limejuice" = 1)
|
||||
|
||||
|
||||
////DRINKS THAT REQUIRED IMPROVED SPRITES BELOW:: -Agouri/////
|
||||
|
||||
/datum/chemical_reaction/sbiten
|
||||
@@ -381,6 +394,30 @@
|
||||
id = "neurotoxin"
|
||||
results = list("neurotoxin" = 2)
|
||||
required_reagents = list("gargleblaster" = 1, "morphine" = 1)
|
||||
//FermiChem vars: Easy to make, but hard to make potent
|
||||
OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions
|
||||
OptimalTempMax = 950 // Upper end for above
|
||||
ExplodeTemp = 999 //Temperature at which reaction explodes
|
||||
OptimalpHMin = 2 // Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase)
|
||||
OptimalpHMax = 3 // Higest value for above
|
||||
ReactpHLim = 5 // How far out pH wil react, giving impurity place (Exponential phase)
|
||||
CatalystFact = 0 // How much the catalyst affects the reaction (0 = no catalyst)
|
||||
CurveSharpT = 2 // How sharp the temperature exponential curve is (to the power of value)
|
||||
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
|
||||
ThermicConstant = 10 //Temperature change per 1u produced
|
||||
HIonRelease = 0.02 //pH change per 1u reaction
|
||||
RateUpLim = 5 //Optimal/max rate possible if all conditions are perfect
|
||||
FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
|
||||
FermiExplode = FALSE //If the chemical explodes in a special way
|
||||
PurityMin = 0 //The minimum purity something has to be above, otherwise it explodes.
|
||||
|
||||
/datum/chemical_reaction/neurotoxin/FermiFinish(datum/reagents/holder, var/atom/my_atom)
|
||||
var/datum/reagent/consumable/ethanol/neurotoxin/Nt = locate(/datum/reagent/consumable/ethanol/neurotoxin) in my_atom.reagents.reagent_list
|
||||
if(Nt)
|
||||
var/cached_volume = Nt.volume
|
||||
if(Nt.purity < 0.5)
|
||||
holder.remove_reagent(src.id, cached_volume)
|
||||
holder.add_reagent("neurosmash", cached_volume)
|
||||
|
||||
/datum/chemical_reaction/snowwhite
|
||||
name = "Snow White"
|
||||
@@ -806,8 +843,8 @@
|
||||
/datum/chemical_reaction/hellfire
|
||||
name = "Hellfire"
|
||||
id = "hellfire"
|
||||
results = list("hellfire" = 5)
|
||||
required_reagents = list("rum" = 1, "beer" = 1, "ice" = 1, "capsaicin" = 1, "limejuice" = 1)
|
||||
results = list("hellfire" = 4)
|
||||
required_reagents = list("rum" = 2, "ice" = 1, "crevice_spike" = 1)
|
||||
mix_message = "The liquid begins to churn as it changes to an amber orange and catches on fire."
|
||||
|
||||
/datum/chemical_reaction/sins_delight
|
||||
@@ -816,3 +853,33 @@
|
||||
results = list("sins_delight" = 5)
|
||||
required_reagents = list("demonsblood" = 2, "triple_sec" = 1, "martini" = 1, "changelingsting" = 1)
|
||||
mix_message = "The liquid starts swirling, before forming a pink cloud that dissipates in the air."
|
||||
|
||||
/datum/chemical_reaction/strawberry_daiquiri
|
||||
name = "Strawberry Daiquiri"
|
||||
id = "strawberry_daiquiri"
|
||||
results = list("strawberry_daiquiri" = 7)
|
||||
required_reagents = list("rum" = 2, "limejuice" = 1, "sugar" = 1, "strawberryjuice" = 2, "ice" = 1)
|
||||
|
||||
/datum/chemical_reaction/miami_vice
|
||||
name = "Miami Vice"
|
||||
id = "miami_vice"
|
||||
results = list("miami_vice" = 2)
|
||||
required_reagents = list("pina_colada" = 1, "strawberry_daiquiri" = 1)
|
||||
|
||||
/datum/chemical_reaction/malibu_sunset
|
||||
name = "Malibu Sunset"
|
||||
id = "malibu_sunset"
|
||||
results = list("malibu_sunset" = 5)
|
||||
required_reagents = list("creme_de_coconut" = 1, "pineapplejuice" = 1, "grenadine" = 1, "orangejuice" = 1, "ice" = 1)
|
||||
|
||||
/datum/chemical_reaction/liz_fizz
|
||||
name = "Liz Fizz"
|
||||
id = "liz_fizz"
|
||||
results = list("liz_fizz" = 5)
|
||||
required_reagents = list("triple_citrus" = 3, "ice" = 1, "cream" = 1)
|
||||
|
||||
/datum/chemical_reaction/hotlime_miami
|
||||
name = "Hotlime Miami"
|
||||
id = "hotlime_miami"
|
||||
results = list("hotlime_miami" = 2)
|
||||
required_reagents = list("ephedrine" = 1, "pina_colada" = 1)
|
||||
@@ -60,7 +60,7 @@
|
||||
/obj/item/reagent_containers/food/drinks/sillycup = 1,
|
||||
/datum/reagent/water = 5,
|
||||
/datum/reagent/consumable/ice = 15,
|
||||
/obj/item/reagent_containers/food/snacks/pineappleslice = 2
|
||||
/datum/reagent/consumable/pineapplejuice = 5
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/snowcones/pineapple
|
||||
subcategory = CAT_ICE
|
||||
|
||||
@@ -265,6 +265,7 @@ h1.alert, h2.alert {color: #a4bad6;}
|
||||
em {font-style: normal; font-weight: bold;}
|
||||
|
||||
.ooc {color: #cca300; font-weight: bold;}
|
||||
.looc {color: #d8b555; font-weight: bold;}
|
||||
.antagooc {color: #ce254f; font-weight: bold;}
|
||||
.adminobserverooc {color: #0099cc; font-weight: bold;}
|
||||
.adminooc {color: #3d5bc3; font-weight: bold;}
|
||||
@@ -326,8 +327,8 @@ h1.alert, h2.alert {color: #99aab5;}
|
||||
.blue {color: #215cff}
|
||||
.green {color: #059223;}
|
||||
.nicegreen {color: #059223;}
|
||||
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
|
||||
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
|
||||
.userlove {color: #ff42a6; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #82365e;}
|
||||
.love {color: #ff4591; font-style: italic; text-shadow: 0 0 6px #994449;}
|
||||
.shadowling {color: #8e8a99;}
|
||||
.cult {color: #aa1c1c;}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ html, body {
|
||||
color: #000000;
|
||||
}
|
||||
body {
|
||||
background: #fff;
|
||||
background: #eeeeee;
|
||||
font-family: Verdana, sans-serif;
|
||||
font-size: 9pt;
|
||||
line-height: 1.2;
|
||||
@@ -261,6 +261,7 @@ h1.alert, h2.alert {color: #000000;}
|
||||
em {font-style: normal; font-weight: bold;}
|
||||
|
||||
.ooc {color: #002eb8; font-weight: bold;}
|
||||
.looc {color: #6699CC; font-weight: bold;}
|
||||
.antagooc {color: #b8002e; font-weight: bold;}
|
||||
.adminobserverooc {color: #0099cc; font-weight: bold;}
|
||||
.adminooc {color: #700038; font-weight: bold;}
|
||||
|
||||
@@ -262,5 +262,6 @@
|
||||
name = "strawberry"
|
||||
icon_state = "strawberry"
|
||||
filling_color = "#7FFF00"
|
||||
juice_results = list("strawberryjuice" = 0)
|
||||
tastes = list("strawberries" = 1)
|
||||
wine_power = 20
|
||||
|
||||
@@ -273,6 +273,7 @@
|
||||
throwforce = 5
|
||||
hitsound = 'sound/weapons/klonk.ogg'
|
||||
attack_verb = list("klonked", "donked", "bonked")
|
||||
distill_reagent = "creme_de_coconut"
|
||||
var/opened = FALSE
|
||||
var/carved = FALSE
|
||||
var/chopped = FALSE
|
||||
|
||||
@@ -30,5 +30,6 @@
|
||||
filling_color = "#F6CB0B"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
foodtype = FRUIT | PINEAPPLE
|
||||
juice_results = list("pineapplejuice" = 0)
|
||||
tastes = list("pineapple" = 1)
|
||||
wine_power = 40
|
||||
|
||||
@@ -153,6 +153,7 @@
|
||||
var/newcolor = copytext(hash, 1, 7)
|
||||
add_atom_colour("#[newcolor]", FIXED_COLOUR_PRIORITY)
|
||||
light_color = "#[newcolor]"
|
||||
light_power = 0.3
|
||||
set_light(1)
|
||||
|
||||
/obj/structure/chisel_message/proc/pack()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/obj/item/twohanded/kinetic_crusher
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "mining_hammer"
|
||||
item_state = "mining_hammer0"
|
||||
item_state = "mining_hammer"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
|
||||
name = "proto-kinetic crusher"
|
||||
@@ -97,7 +97,7 @@
|
||||
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
|
||||
D.fire()
|
||||
charged = FALSE
|
||||
icon_state = "mining_hammer1_uncharged"
|
||||
icon_state = "mining_hammer"
|
||||
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
|
||||
return
|
||||
if(proximity_flag && isliving(target))
|
||||
@@ -261,7 +261,7 @@
|
||||
desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher."
|
||||
icon_state = "watcher_wing"
|
||||
denied_type = /obj/item/crusher_trophy/watcher_wing
|
||||
bonus_value = 10
|
||||
bonus_value = 50
|
||||
|
||||
/obj/item/crusher_trophy/watcher_wing/effect_desc()
|
||||
return "mark detonation to prevent certain creatures from using certain attacks for <b>[bonus_value*0.1]</b> second\s"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
hair_color = random_short_color()
|
||||
facial_hair_color = hair_color
|
||||
eye_color = random_eye_color()
|
||||
wing_color = "fff"
|
||||
if(!pref_species)
|
||||
var/rando_race = pick(GLOB.roundstart_races)
|
||||
pref_species = new rando_race()
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/******************************************
|
||||
************* Moth Markings *************
|
||||
*******************************************/
|
||||
|
||||
/datum/sprite_accessory/moth_fluff
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
color_src = 0
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/reddish
|
||||
name = "Reddish"
|
||||
icon_state = "redish"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/royal
|
||||
name = "Royal"
|
||||
icon_state = "royal"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/gothic
|
||||
name = "Gothic"
|
||||
icon_state = "gothic"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/lovers
|
||||
name = "Lovers"
|
||||
icon_state = "lovers"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/whitefly
|
||||
name = "White Fly"
|
||||
icon_state = "whitefly"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/punished
|
||||
name = "Burnt Off"
|
||||
icon_state = "punished"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/firewatch
|
||||
name = "Firewatch"
|
||||
icon_state = "firewatch"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/deathhead
|
||||
name = "Deathshead"
|
||||
icon_state = "deathhead"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/poison
|
||||
name = "Poison"
|
||||
icon_state = "poison"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/ragged
|
||||
name = "Ragged"
|
||||
icon_state = "ragged"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/moonfly
|
||||
name = "Moon Fly"
|
||||
icon_state = "moonfly"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/snow
|
||||
name = "Snow"
|
||||
icon_state = "snow"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/oakworm
|
||||
name = "Oak Worm"
|
||||
icon_state = "oakworm"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/jungle
|
||||
name = "Jungle"
|
||||
icon_state = "jungle"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/witchwing
|
||||
name = "Witch Wing"
|
||||
icon_state = "witchwing"
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/colored
|
||||
name = "Colored (Hair)"
|
||||
icon_state = "snow"
|
||||
color_src = HAIR
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/colored1
|
||||
name = "Colored (Primary)"
|
||||
icon_state = "snow"
|
||||
color_src = MUTCOLORS
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/colored2
|
||||
name = "Colored (Secondary)"
|
||||
icon_state = "snow"
|
||||
color_src = MUTCOLORS2
|
||||
|
||||
/datum/sprite_accessory/moth_fluff/colored3
|
||||
name = "Colored (Tertiary)"
|
||||
icon_state = "snow"
|
||||
color_src = MUTCOLORS3
|
||||
@@ -1,3 +1,5 @@
|
||||
//Angel Wings
|
||||
|
||||
/datum/sprite_accessory/wings/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
@@ -23,4 +25,102 @@
|
||||
dimension_x = 46
|
||||
center = TRUE
|
||||
dimension_y = 34
|
||||
locked = TRUE
|
||||
locked = TRUE
|
||||
|
||||
// Decorative wings
|
||||
/datum/sprite_accessory/deco_wings
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
color_src = WINGCOLOR
|
||||
|
||||
/datum/sprite_accessory/deco_wings/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/monarch
|
||||
name = "Monarch"
|
||||
icon_state = "monarch"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/luna
|
||||
name = "Luna"
|
||||
icon_state = "luna"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/atlas
|
||||
name = "Atlas"
|
||||
icon_state = "atlas"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/reddish
|
||||
name = "Reddish"
|
||||
icon_state = "redish"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/royal
|
||||
name = "Royal"
|
||||
icon_state = "royal"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/gothic
|
||||
name = "Gothic"
|
||||
icon_state = "gothic"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/lovers
|
||||
name = "Lovers"
|
||||
icon_state = "lovers"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/whitefly
|
||||
name = "White Fly"
|
||||
icon_state = "whitefly"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/punished
|
||||
name = "Burnt Off"
|
||||
icon_state = "punished"
|
||||
locked = TRUE
|
||||
|
||||
/datum/sprite_accessory/deco_wings/firewatch
|
||||
name = "Firewatch"
|
||||
icon_state = "firewatch"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/deathhead
|
||||
name = "Deathshead"
|
||||
icon_state = "deathhead"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/poison
|
||||
name = "Poison"
|
||||
icon_state = "poison"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/ragged
|
||||
name = "Ragged"
|
||||
icon_state = "ragged"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/moonfly
|
||||
name = "Moon Fly"
|
||||
icon_state = "moonfly"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/snow
|
||||
name = "Snow"
|
||||
icon_state = "snow"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/angel
|
||||
name = "Angel"
|
||||
icon_state = "angel"
|
||||
color_src = 0
|
||||
dimension_x = 46
|
||||
center = TRUE
|
||||
dimension_y = 34
|
||||
|
||||
/datum/sprite_accessory/deco_wings/bee
|
||||
name = "Bee"
|
||||
icon_state = "bee"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/fairy
|
||||
name = "Fairy"
|
||||
icon_state = "fairy"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/bat
|
||||
name = "Bat"
|
||||
icon_state = "bat"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/feathery
|
||||
name = "Feathery"
|
||||
icon_state = "feathery"
|
||||
|
||||
/datum/sprite_accessory/deco_wings/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
@@ -17,6 +17,8 @@
|
||||
//Eye colour
|
||||
var/eye_color = "000"
|
||||
|
||||
var/wing_color = "fff" //wings too
|
||||
|
||||
var/skin_tone = "caucasian1" //Skin tone
|
||||
|
||||
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
|
||||
|
||||
@@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
var/hair_color // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color
|
||||
var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent.
|
||||
var/wing_color
|
||||
|
||||
var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans)
|
||||
var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id.
|
||||
@@ -615,6 +616,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
|
||||
bodyparts_to_add -= "wings"
|
||||
|
||||
if("moth_fluff" in mutant_bodyparts)
|
||||
if(!H.dna.features["moth_fluff"] || H.dna.features["moth_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||
bodyparts_to_add -= "moth_fluff"
|
||||
|
||||
if("wings_open" in mutant_bodyparts)
|
||||
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))
|
||||
bodyparts_to_add -= "wings_open"
|
||||
@@ -724,10 +729,14 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
S = GLOB.wings_list[H.dna.features["wings"]]
|
||||
if("wingsopen")
|
||||
S = GLOB.wings_open_list[H.dna.features["wings"]]
|
||||
if("deco_wings")
|
||||
S = GLOB.deco_wings_list[H.dna.features["deco_wings"]]
|
||||
if("legs")
|
||||
S = GLOB.legs_list[H.dna.features["legs"]]
|
||||
if("moth_wings")
|
||||
S = GLOB.moth_wings_list[H.dna.features["moth_wings"]]
|
||||
if("moth_fluff")
|
||||
S = GLOB.moth_fluffs_list[H.dna.features["moth_fluff"]]
|
||||
if("moth_markings")
|
||||
S = GLOB.moth_markings_list[H.dna.features["moth_markings"]]
|
||||
if("caps")
|
||||
@@ -775,6 +784,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
bodypart = "snout"
|
||||
if(bodypart == "xenohead")
|
||||
bodypart = "xhead"
|
||||
if(bodypart == "moth_wings" || bodypart == "deco_wings")
|
||||
bodypart = "moth_wings"
|
||||
|
||||
if(S.gender_specific)
|
||||
accessory_overlay.icon_state = "[g]_[bodypart]_[S.icon_state]_[layertext]"
|
||||
@@ -826,6 +837,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
accessory_overlay.color = "#[H.facial_hair_color]"
|
||||
if(EYECOLOR)
|
||||
accessory_overlay.color = "#[H.eye_color]"
|
||||
if(WINGCOLOR)
|
||||
accessory_overlay.color = "#[H.wing_color]"
|
||||
else
|
||||
accessory_overlay.color = forced_colour
|
||||
else
|
||||
@@ -891,6 +904,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
extra_accessory_overlay.color = "#[H.facial_hair_color]"
|
||||
if(EYECOLOR)
|
||||
extra_accessory_overlay.color = "#[H.eye_color]"
|
||||
if(WINGCOLOR)
|
||||
extra_accessory_overlay.color = "#[H.wing_color]"
|
||||
standing += extra_accessory_overlay
|
||||
|
||||
if(S.extra2) //apply the extra overlay, if there is one
|
||||
@@ -923,6 +938,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]"
|
||||
else
|
||||
extra2_accessory_overlay.color = "#[H.hair_color]"
|
||||
if(WINGCOLOR)
|
||||
extra2_accessory_overlay.color = "#[H.wing_color]"
|
||||
standing += extra2_accessory_overlay
|
||||
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
id = "felinid"
|
||||
limbs_id = "human"
|
||||
|
||||
mutant_bodyparts = list("mam_ears", "mam_tail")
|
||||
default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None")
|
||||
mutant_bodyparts = list("mam_ears", "mam_tail", "deco_wings")
|
||||
default_features = list("mcolor" = "FFF", "mam_tail" = "Cat", "mam_ears" = "Cat", "wings" = "None", "deco_wings" = "None")
|
||||
|
||||
mutantears = /obj/item/organ/ears/cat
|
||||
mutanttail = /obj/item/organ/tail/cat
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
name = "Human"
|
||||
id = "human"
|
||||
default_color = "FFFFFF"
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY)
|
||||
mutant_bodyparts = list("ears", "tail_human", "wings", "taur") // CITADEL EDIT gives humans snowflake parts
|
||||
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "None")
|
||||
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR)
|
||||
mutant_bodyparts = list("ears", "tail_human", "wings", "taur", "deco_wings") // CITADEL EDIT gives humans snowflake parts
|
||||
default_features = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "wings" = "None", "taur" = "None", "deco_wings" = "None")
|
||||
use_skintones = 1
|
||||
skinned_type = /obj/item/stack/sheet/animalhide/human
|
||||
disliked_food = GROSS | RAW
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
id = "lizard"
|
||||
say_mod = "hisses"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS)
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,WINGCOLOR)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_REPTILE)
|
||||
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur")
|
||||
mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings")
|
||||
mutanttongue = /obj/item/organ/tongue/lizard
|
||||
mutanttail = /obj/item/organ/tail/lizard
|
||||
coldmod = 1.5
|
||||
heatmod = 0.67
|
||||
default_features = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "taur" = "None")
|
||||
default_features = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "taur" = "None", "deco_wings" = "None")
|
||||
attack_verb = "slash"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
default_color = "00FF00"
|
||||
species_traits = list(LIPS, NOEYES)
|
||||
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
|
||||
mutant_bodyparts = list("moth_wings")
|
||||
default_features = list("moth_wings" = "Plain")
|
||||
mutant_bodyparts = list("moth_wings", "moth_fluff")
|
||||
default_features = list("moth_wings" = "Plain", "moth_fluff" = "Plain")
|
||||
attack_verb = "slash"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
say_mod = "rattles"
|
||||
sexes = 0
|
||||
meat = /obj/item/stack/sheet/mineral/plasma
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
|
||||
species_traits = list(NOBLOOD,NOTRANSSTING)
|
||||
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
|
||||
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
|
||||
mutantlungs = /obj/item/organ/lungs/plasmaman
|
||||
|
||||
@@ -701,6 +701,52 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/apc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
if(the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)
|
||||
if(!has_electronics)
|
||||
if(stat & BROKEN)
|
||||
to_chat(user, "<span class='warning'>[src]'s frame is too damaged to support a circuit.</span>")
|
||||
return FALSE
|
||||
return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1)
|
||||
else if(!cell)
|
||||
if(stat & MAINT)
|
||||
to_chat(user, "<span class='warning'>There's no connector for a power cell.</span>")
|
||||
return FALSE
|
||||
return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 50, "cost" = 10) //16 for a wall
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] has both electronics and a cell.</span>")
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/power/apc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
switch(passed_mode)
|
||||
if(RCD_UPGRADE_SIMPLE_CIRCUITS)
|
||||
if(!has_electronics)
|
||||
if(stat & BROKEN)
|
||||
to_chat(user, "<span class='warning'>[src]'s frame is too damaged to support a circuit.</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] fabricates a circuit and places it into [src].</span>", \
|
||||
"<span class='notice'>You adapt a power control board and click it into place in [src]'s guts.</span>")
|
||||
has_electronics = TRUE
|
||||
locked = TRUE
|
||||
return TRUE
|
||||
else if(!cell)
|
||||
if(stat & MAINT)
|
||||
to_chat(user, "<span class='warning'>There's no connector for a power cell.</span>")
|
||||
return FALSE
|
||||
var/obj/item/stock_parts/cell/crap/empty/C = new(src)
|
||||
C.forceMove(src)
|
||||
cell = C
|
||||
chargecount = 0
|
||||
user.visible_message("<span class='notice'>[user] fabricates a weak power cell and places it into [src].</span>", \
|
||||
"<span class='warning'>Your [the_rcd.name] whirrs with strain as you create a weak power cell and place it into [src]!</span>")
|
||||
update_icon()
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] has both electronics and a cell.</span>")
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/power/apc/AltClick(mob/user)
|
||||
..()
|
||||
if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc))
|
||||
|
||||
@@ -323,6 +323,8 @@
|
||||
var/BR = brightness
|
||||
var/PO = bulb_power
|
||||
var/CO = bulb_colour
|
||||
if(color)
|
||||
CO = color
|
||||
var/area/A = get_area(src)
|
||||
if (A && A.fire)
|
||||
CO = bulb_emergency_colour
|
||||
@@ -360,6 +362,9 @@
|
||||
else
|
||||
removeStaticPower(static_power_used, STATIC_LIGHT)
|
||||
|
||||
/obj/machinery/light/update_atom_colour()
|
||||
. = ..()
|
||||
update()
|
||||
|
||||
/obj/machinery/light/process()
|
||||
if (!cell)
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
|
||||
else //Smart spread
|
||||
sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread))
|
||||
|
||||
before_firing(target,user)
|
||||
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd))
|
||||
shoot_with_empty_chamber(user)
|
||||
firing_burst = FALSE
|
||||
@@ -281,6 +281,7 @@
|
||||
to_chat(user, "<span class='notice'> [src] is lethally chambered! You don't want to risk harming anyone...</span>")
|
||||
return
|
||||
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
|
||||
before_firing(target,user)
|
||||
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd))
|
||||
shoot_with_empty_chamber(user)
|
||||
return
|
||||
@@ -470,6 +471,9 @@
|
||||
qdel(pin)
|
||||
pin = new /obj/item/firing_pin
|
||||
|
||||
//Happens before the actual projectile creation
|
||||
/obj/item/gun/proc/before_firing(atom/target,mob/user)
|
||||
return
|
||||
/////////////
|
||||
// ZOOMING //
|
||||
/////////////
|
||||
|
||||
@@ -0,0 +1,389 @@
|
||||
#define DUEL_IDLE 1
|
||||
#define DUEL_PREPARATION 2
|
||||
#define DUEL_READY 3
|
||||
#define DUEL_COUNTDOWN 4
|
||||
#define DUEL_FIRING 5
|
||||
|
||||
//paper rock scissors
|
||||
#define DUEL_SETTING_A "wide"
|
||||
#define DUEL_SETTING_B "cone"
|
||||
#define DUEL_SETTING_C "pinpoint"
|
||||
|
||||
#define DUEL_HUGBOX_NONE 0 //dismember head
|
||||
#define DUEL_HUGBOX_LETHAL 1 //200 damage to chest
|
||||
#define DUEL_HUGBOX_NONLETHAL 2 //stamcrit
|
||||
|
||||
/datum/duel
|
||||
var/obj/item/gun/energy/dueling/gun_A
|
||||
var/obj/item/gun/energy/dueling/gun_B
|
||||
var/state = DUEL_IDLE
|
||||
var/required_distance = 5
|
||||
var/list/confirmations = list()
|
||||
var/list/fired = list()
|
||||
var/countdown_length = 10
|
||||
var/countdown_step = 0
|
||||
var/static/next_id = 1
|
||||
var/id
|
||||
|
||||
/datum/duel/New()
|
||||
id = next_id++
|
||||
|
||||
/datum/duel/proc/try_begin()
|
||||
//Check if both guns are held and if so begin.
|
||||
var/mob/living/A = get_duelist(gun_A)
|
||||
var/mob/living/B = get_duelist(gun_B)
|
||||
if(!A || !B)
|
||||
message_duelists("<span class='warning'>To begin the duel, both participants need to be holding paired dueling pistols.</span>")
|
||||
return
|
||||
begin()
|
||||
|
||||
/datum/duel/proc/begin()
|
||||
state = DUEL_PREPARATION
|
||||
confirmations.Cut()
|
||||
fired.Cut()
|
||||
countdown_step = countdown_length
|
||||
|
||||
message_duelists("<span class='notice'>Set your gun setting and move [required_distance] steps away from your opponent.</span>")
|
||||
|
||||
START_PROCESSING(SSobj,src)
|
||||
|
||||
/datum/duel/proc/get_duelist(obj/gun)
|
||||
var/mob/living/G = gun.loc
|
||||
if(!istype(G) || !G.is_holding(gun))
|
||||
return null
|
||||
return G
|
||||
|
||||
/datum/duel/proc/message_duelists(message)
|
||||
var/mob/living/LA = get_duelist(gun_A)
|
||||
if(LA)
|
||||
to_chat(LA,message)
|
||||
var/mob/living/LB = get_duelist(gun_B)
|
||||
if(LB)
|
||||
to_chat(LB,message)
|
||||
|
||||
/datum/duel/proc/other_gun(obj/item/gun/energy/dueling/G)
|
||||
return G == gun_A ? gun_B : gun_A
|
||||
|
||||
/datum/duel/proc/end()
|
||||
message_duelists("<span class='notice'>Duel finished. Re-engaging safety.</span>")
|
||||
STOP_PROCESSING(SSobj,src)
|
||||
state = DUEL_IDLE
|
||||
|
||||
/datum/duel/process()
|
||||
switch(state)
|
||||
if(DUEL_PREPARATION)
|
||||
if(check_positioning())
|
||||
confirm_positioning()
|
||||
else if (!get_duelist(gun_A) && !get_duelist(gun_B))
|
||||
end()
|
||||
if(DUEL_READY)
|
||||
if(!check_positioning())
|
||||
back_to_prep()
|
||||
else if(confirmations.len == 2)
|
||||
confirm_ready()
|
||||
if(DUEL_COUNTDOWN)
|
||||
if(!check_positioning())
|
||||
back_to_prep()
|
||||
else
|
||||
countdown_step()
|
||||
if(DUEL_FIRING)
|
||||
if(check_fired())
|
||||
end()
|
||||
|
||||
/datum/duel/proc/back_to_prep()
|
||||
message_duelists("<span class='notice'>Positions invalid. Please move to valid positions [required_distance] steps aways from each other to continue.</span>")
|
||||
state = DUEL_PREPARATION
|
||||
confirmations.Cut()
|
||||
countdown_step = countdown_length
|
||||
|
||||
/datum/duel/proc/confirm_positioning()
|
||||
message_duelists("<span class='notice'>Position confirmed. Confirm readiness by pulling the trigger once.</span>")
|
||||
state = DUEL_READY
|
||||
|
||||
/datum/duel/proc/confirm_ready()
|
||||
message_duelists("<span class='notice'>Readiness confirmed. Starting countdown. Commence firing at zero mark.</span>")
|
||||
state = DUEL_COUNTDOWN
|
||||
|
||||
/datum/duel/proc/countdown_step()
|
||||
countdown_step--
|
||||
if(countdown_step == 0)
|
||||
state = DUEL_FIRING
|
||||
message_duelists("<span class='userdanger'>Fire!</span>")
|
||||
else
|
||||
message_duelists("<span class='userdanger'>[countdown_step]!</span>")
|
||||
|
||||
/datum/duel/proc/check_fired()
|
||||
if(fired.len == 2)
|
||||
return TRUE
|
||||
//Let's say if gun was dropped/stowed the user is finished
|
||||
if(!get_duelist(gun_A))
|
||||
return TRUE
|
||||
if(!get_duelist(gun_B))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/duel/proc/check_positioning()
|
||||
var/mob/living/A = get_duelist(gun_A)
|
||||
var/mob/living/B = get_duelist(gun_B)
|
||||
if(!A || !B)
|
||||
return FALSE
|
||||
if(!isturf(A.loc) || !isturf(B.loc))
|
||||
return FALSE
|
||||
if(get_dist(A,B) != required_distance)
|
||||
return FALSE
|
||||
for(var/turf/T in getline(get_turf(A),get_turf(B)))
|
||||
if(is_blocked_turf(T,TRUE))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/gun/energy/dueling
|
||||
name = "dueling pistol"
|
||||
desc = "High-tech dueling pistol. Launches chaff and projectile according to preset settings."
|
||||
icon_state = "dueling_pistol"
|
||||
item_state = "gun"
|
||||
ammo_x_offset = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/duel)
|
||||
automatic_charge_overlays = FALSE
|
||||
var/unlocked = FALSE
|
||||
var/setting = DUEL_SETTING_A
|
||||
var/datum/duel/duel
|
||||
var/mutable_appearance/setting_overlay
|
||||
var/hugbox = DUEL_HUGBOX_NONE
|
||||
|
||||
/obj/item/gun/energy/dueling/hugbox
|
||||
hugbox = DUEL_HUGBOX_LETHAL
|
||||
|
||||
/obj/item/gun/energy/dueling/hugbox/stamina
|
||||
hugbox = DUEL_HUGBOX_NONLETHAL
|
||||
|
||||
/obj/item/gun/energy/dueling/Initialize()
|
||||
. = ..()
|
||||
setting_overlay = mutable_appearance(icon,setting_iconstate())
|
||||
add_overlay(setting_overlay)
|
||||
|
||||
/obj/item/gun/energy/dueling/examine(mob/user)
|
||||
. = ..()
|
||||
if(duel)
|
||||
. += "Its linking number is [duel.id]."
|
||||
else
|
||||
. += "ERROR: No linking number on gun."
|
||||
|
||||
/obj/item/gun/energy/dueling/proc/setting_iconstate()
|
||||
switch(setting)
|
||||
if(DUEL_SETTING_A)
|
||||
return "duel_red"
|
||||
if(DUEL_SETTING_B)
|
||||
return "duel_green"
|
||||
if(DUEL_SETTING_C)
|
||||
return "duel_blue"
|
||||
return "duel_red"
|
||||
|
||||
/obj/item/gun/energy/dueling/attack_self(mob/living/user)
|
||||
. = ..()
|
||||
if(duel.state == DUEL_IDLE)
|
||||
duel.try_begin()
|
||||
else
|
||||
toggle_setting(user)
|
||||
|
||||
/obj/item/gun/energy/dueling/proc/toggle_setting(mob/living/user)
|
||||
switch(setting)
|
||||
if(DUEL_SETTING_A)
|
||||
setting = DUEL_SETTING_B
|
||||
if(DUEL_SETTING_B)
|
||||
setting = DUEL_SETTING_C
|
||||
if(DUEL_SETTING_C)
|
||||
setting = DUEL_SETTING_A
|
||||
to_chat(user,"<span class='notice'>You switch [src] setting to [setting] mode.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/gun/energy/dueling/update_icon(force_update)
|
||||
. = ..()
|
||||
if(setting_overlay)
|
||||
cut_overlay(setting_overlay)
|
||||
setting_overlay.icon_state = setting_iconstate()
|
||||
add_overlay(setting_overlay)
|
||||
|
||||
/obj/item/gun/energy/dueling/Destroy()
|
||||
. = ..()
|
||||
if(duel.gun_A == src)
|
||||
duel.gun_A = null
|
||||
if(duel.gun_B == src)
|
||||
duel.gun_B = null
|
||||
duel = null
|
||||
|
||||
/obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user)
|
||||
. = ..()
|
||||
switch(duel.state)
|
||||
if(DUEL_FIRING)
|
||||
return . && !duel.fired[src]
|
||||
if(DUEL_READY)
|
||||
return .
|
||||
else
|
||||
to_chat(user,"<span class='warning'>[src] is locked. Wait for FIRE signal before shooting.</span>")
|
||||
return FALSE
|
||||
|
||||
/obj/item/gun/energy/dueling/proc/is_duelist(mob/living/L)
|
||||
if(!istype(L))
|
||||
return FALSE
|
||||
if(!L.is_holding(duel.other_gun(src)))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/gun/energy/dueling/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
|
||||
if(duel.state == DUEL_READY)
|
||||
duel.confirmations[src] = TRUE
|
||||
to_chat(user,"<span class='notice'>You confirm your readiness.</span>")
|
||||
return
|
||||
else if(!is_duelist(target)) //I kinda want to leave this out just to see someone shoot a bystander or missing.
|
||||
to_chat(user,"<span class='warning'>[src] safety system prevents shooting anyone but your designated opponent.</span>")
|
||||
return
|
||||
else
|
||||
duel.fired[src] = TRUE
|
||||
. = ..()
|
||||
|
||||
/obj/item/gun/energy/dueling/before_firing(target,user)
|
||||
var/obj/item/ammo_casing/energy/duel/D = chambered
|
||||
D.setting = setting
|
||||
D.hugbox = hugbox
|
||||
|
||||
/obj/effect/temp_visual/dueling_chaff
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "shield-old"
|
||||
duration = 30
|
||||
var/setting
|
||||
|
||||
/obj/effect/temp_visual/dueling_chaff/update_icon()
|
||||
. = ..()
|
||||
switch(setting)
|
||||
if(DUEL_SETTING_A)
|
||||
color = "red"
|
||||
if(DUEL_SETTING_B)
|
||||
color = "green"
|
||||
if(DUEL_SETTING_C)
|
||||
color = "blue"
|
||||
|
||||
//Casing
|
||||
|
||||
/obj/item/ammo_casing/energy/duel
|
||||
e_cost = 0
|
||||
projectile_type = /obj/item/projectile/energy/duel
|
||||
var/setting
|
||||
var/hugbox = DUEL_HUGBOX_NONE
|
||||
|
||||
/obj/item/ammo_casing/energy/duel/ready_proj(atom/target, mob/living/user, quiet, zone_override)
|
||||
. = ..()
|
||||
var/obj/item/projectile/energy/duel/D = BB
|
||||
D.setting = setting
|
||||
D.hugbox = hugbox
|
||||
D.update_icon()
|
||||
|
||||
/obj/item/ammo_casing/energy/duel/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
|
||||
. = ..()
|
||||
var/obj/effect/temp_visual/dueling_chaff/C = new(get_turf(user))
|
||||
C.setting = setting
|
||||
C.update_icon()
|
||||
|
||||
//Projectile
|
||||
|
||||
/obj/item/projectile/energy/duel
|
||||
name = "dueling beam"
|
||||
icon_state = "declone"
|
||||
is_reflectable = FALSE
|
||||
homing = TRUE
|
||||
var/setting
|
||||
var/hugbox = DUEL_HUGBOX_NONE
|
||||
|
||||
/obj/item/projectile/energy/duel/update_icon()
|
||||
. = ..()
|
||||
switch(setting)
|
||||
if(DUEL_SETTING_A)
|
||||
color = "red"
|
||||
if(DUEL_SETTING_B)
|
||||
color = "green"
|
||||
if(DUEL_SETTING_C)
|
||||
color = "blue"
|
||||
|
||||
/obj/item/projectile/energy/duel/on_hit(atom/target, blocked)
|
||||
. = ..()
|
||||
var/turf/T = get_turf(target)
|
||||
var/obj/effect/temp_visual/dueling_chaff/C = locate() in T
|
||||
if(C)
|
||||
var/counter_setting
|
||||
switch(setting)
|
||||
if(DUEL_SETTING_A)
|
||||
counter_setting = DUEL_SETTING_B
|
||||
if(DUEL_SETTING_B)
|
||||
counter_setting = DUEL_SETTING_C
|
||||
if(DUEL_SETTING_C)
|
||||
counter_setting = DUEL_SETTING_A
|
||||
if(C.setting == counter_setting)
|
||||
return BULLET_ACT_BLOCK
|
||||
|
||||
var/mob/living/L = target
|
||||
if(!istype(target))
|
||||
return BULLET_ACT_BLOCK
|
||||
|
||||
switch(hugbox)
|
||||
if(DUEL_HUGBOX_NONE)
|
||||
var/obj/item/bodypart/B = L.get_bodypart(BODY_ZONE_HEAD)
|
||||
B.dismember()
|
||||
qdel(B)
|
||||
if(DUEL_HUGBOX_LETHAL)
|
||||
L.adjustBruteLoss(180)
|
||||
L.death() //Die, powergamers.
|
||||
if(DUEL_HUGBOX_NONLETHAL)
|
||||
L.adjustStaminaLoss(200, forced = TRUE) //Die, powergamers x 2
|
||||
L.Knockdown(100, override_hardstun = 100) //For good measure.
|
||||
|
||||
//Storage case.
|
||||
/obj/item/storage/lockbox/dueling
|
||||
name = "dueling pistol case"
|
||||
desc = "Let's solve this like gentlespacemen."
|
||||
icon_state = "medalbox+l"
|
||||
item_state = "syringe_kit"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
req_access = list(ACCESS_CAPTAIN)
|
||||
icon_locked = "medalbox+l"
|
||||
icon_closed = "medalbox"
|
||||
icon_broken = "medalbox+b"
|
||||
var/gun_type = /obj/item/gun/energy/dueling
|
||||
|
||||
/obj/item/storage/lockbox/dueling/ComponentInitialize()
|
||||
. = ..()
|
||||
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
|
||||
STR.max_w_class = WEIGHT_CLASS_SMALL
|
||||
STR.max_items = 2
|
||||
STR.can_hold = typecacheof(/obj/item/gun/energy/dueling)
|
||||
|
||||
/obj/item/storage/lockbox/dueling/update_icon()
|
||||
cut_overlays()
|
||||
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
|
||||
if(locked)
|
||||
icon_state = "medalbox+l"
|
||||
else
|
||||
icon_state = "medalbox"
|
||||
if(open)
|
||||
icon_state += "open"
|
||||
if(broken)
|
||||
icon_state += "+b"
|
||||
|
||||
/obj/item/storage/lockbox/dueling/PopulateContents()
|
||||
. = ..()
|
||||
var/obj/item/gun/energy/dueling/gun_A = new gun_type(src)
|
||||
var/obj/item/gun/energy/dueling/gun_B = new gun_type(src)
|
||||
var/datum/duel/D = new
|
||||
gun_A.duel = D
|
||||
gun_B.duel = D
|
||||
D.gun_A = gun_A
|
||||
D.gun_B = gun_B
|
||||
|
||||
/obj/item/storage/lockbox/dueling/hugbox
|
||||
gun_type = /obj/item/gun/energy/dueling/hugbox
|
||||
req_access = list(ACCESS_ARMORY)
|
||||
|
||||
/obj/item/storage/lockbox/dueling/hugbox/stamina
|
||||
gun_type = /obj/item/gun/energy/dueling/hugbox/stamina
|
||||
req_access = null
|
||||
@@ -488,6 +488,7 @@
|
||||
"pwr_game",
|
||||
"shamblers",
|
||||
"sugar",
|
||||
"pineapplejuice",
|
||||
"orangejuice",
|
||||
"grenadine",
|
||||
"limejuice",
|
||||
@@ -502,7 +503,8 @@
|
||||
)
|
||||
upgrade_reagents2 = list(
|
||||
"banana",
|
||||
"berryjuice"
|
||||
"berryjuice",
|
||||
"strawberryjuice"
|
||||
)
|
||||
upgrade_reagents3 = null
|
||||
emagged_reagents = list(
|
||||
@@ -554,6 +556,7 @@
|
||||
"hcider",
|
||||
"creme_de_menthe",
|
||||
"creme_de_cacao",
|
||||
"creme_de_coconut",
|
||||
"triple_sec",
|
||||
"sake",
|
||||
"applejack"
|
||||
|
||||
@@ -959,14 +959,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
/datum/reagent/consumable/ethanol/bahama_mama
|
||||
name = "Bahama Mama"
|
||||
id = "bahama_mama"
|
||||
description = "Tropical cocktail."
|
||||
description = "A tropical cocktail with a complex blend of flavors."
|
||||
color = "#FF7F3B" // rgb: 255, 127, 59
|
||||
boozepwr = 35
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "lime and orange"
|
||||
taste_description = "pineapple, coconut, and a hint of coffee"
|
||||
glass_icon_state = "bahama_mama"
|
||||
glass_name = "Bahama Mama"
|
||||
glass_desc = "Tropical cocktail."
|
||||
glass_desc = "A tropical cocktail with a complex blend of flavors."
|
||||
|
||||
/datum/reagent/consumable/ethanol/singulo
|
||||
name = "Singulo"
|
||||
@@ -1373,6 +1373,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/neurotoxin
|
||||
name = "Neurotoxin"
|
||||
id = "neurotoxin"
|
||||
description = "A strong neurotoxin that puts the subject into a death-like state."
|
||||
color = "#2E2E61" // rgb: 46, 46, 97
|
||||
boozepwr = 50
|
||||
@@ -1382,6 +1383,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "neurotoxinglass"
|
||||
glass_name = "Neurotoxin"
|
||||
glass_desc = "A drink that is guaranteed to knock you silly."
|
||||
pH = 4.3
|
||||
|
||||
/datum/reagent/consumable/ethanol/neurotoxin/proc/pickt()
|
||||
return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG))
|
||||
@@ -1417,6 +1419,26 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
M.adjustStaminaLoss(10)
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/neurosmash
|
||||
name = "Neurosmash"
|
||||
id = "neurosmash"
|
||||
description = "A mostly safe alcoholic drink for the true daredevils. Do not mix with Neurotoxin."
|
||||
color = "#2E2E61" // rgb: 46, 46, 97
|
||||
boozepwr = 60
|
||||
quality = DRINK_VERYGOOD
|
||||
taste_description = "a numbing sensation"
|
||||
glass_icon_state = "neurosmashglass"
|
||||
glass_name = "Neurosmash"
|
||||
glass_desc = "A mostly safe alcoholic drink for the true daredevils. Do not mix with Neurotoxin."
|
||||
|
||||
/datum/reagent/consumable/ethanol/neurosmash/on_mob_life(mob/living/carbon/M)
|
||||
if(holder.has_reagent("neurotoxin"))
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5*REM, 150)
|
||||
else
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.0*REM, 150)
|
||||
M.dizziness +=2
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/hippies_delight
|
||||
name = "Hippie's Delight"
|
||||
id = "hippiesdelight"
|
||||
@@ -1526,6 +1548,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_name = "Creme de Cacao"
|
||||
glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient."
|
||||
|
||||
datum/reagent/consumable/ethanol/creme_de_coconut
|
||||
name = "Creme de Coconut"
|
||||
id = "creme_de_coconut"
|
||||
description = "A coconut liqueur for smooth, creamy, tropical drinks."
|
||||
color = "#F7F0D0"
|
||||
boozepwr = 20
|
||||
taste_description = "a sweet milky flavor with notes of toasted sugar"
|
||||
glass_icon_state = "glass_white"
|
||||
glass_name = "Creme de Coconut"
|
||||
glass_desc = "An unintimidating glass of coconut liqueur."
|
||||
|
||||
/datum/reagent/consumable/ethanol/quadruple_sec
|
||||
name = "Quadruple Sec"
|
||||
id = "quadruple_sec"
|
||||
@@ -2240,7 +2273,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_name = "Gunfire"
|
||||
glass_desc = "It pops constantly as you look at it, giving off tiny sparks."
|
||||
|
||||
/datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/M)
|
||||
/datum/reagent/consumable/ethanol/gunfire/on_mob_life(mob/living/carbon/M)
|
||||
if (prob(3))
|
||||
to_chat(M,"<span class='notice'>You feel the gunfire pop in your mouth.</span>")
|
||||
return ..()
|
||||
@@ -2272,3 +2305,91 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_icon_state = "sins_delight"
|
||||
glass_name = "Sin's Delight"
|
||||
glass_desc = "You can smell the seven sins rolling off the top of the glass."
|
||||
|
||||
/datum/reagent/consumable/ethanol/painkiller
|
||||
name = "Painkiller"
|
||||
id = "painkiller"
|
||||
description = "Dulls your pain. Your emotional pain, that is."
|
||||
boozepwr = 20
|
||||
color = "#EAD677"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "sugary tartness"
|
||||
glass_icon_state = "painkiller"
|
||||
glass_name = "Painkiller"
|
||||
glass_desc = "A combination of tropical juices and rum. Surely this will make you feel better."
|
||||
|
||||
/datum/reagent/consumable/ethanol/pina_colada
|
||||
name = "Pina Colada"
|
||||
id = "pina_colada"
|
||||
description = "A fresh pineapple drink with coconut rum. Yum."
|
||||
boozepwr = 40
|
||||
color = "#FFF1B2"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "pineapple, coconut, and a hint of the ocean"
|
||||
glass_icon_state = "pina_colada"
|
||||
glass_name = "Pina Colada"
|
||||
glass_desc = "If you like pina coladas, and getting caught in the rain... well, you'll like this drink."
|
||||
|
||||
/datum/reagent/consumable/ethanol/strawberry_daiquiri
|
||||
name = "Strawberry Daiquiri"
|
||||
id = "strawberry_daiquiri"
|
||||
description = "Pink looking alcoholic drink."
|
||||
boozepwr = 20
|
||||
color = "#FF4A74"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "sweet strawberry, lime and the ocean breeze"
|
||||
glass_icon_state = "strawberry_daiquiri"
|
||||
glass_name = "Strawberry Daiquiri"
|
||||
glass_desc = "Pink looking drink with flowers and a big straw to sip it. Looks sweet and refreshing, perfect for warm days."
|
||||
|
||||
/datum/reagent/consumable/ethanol/liz_fizz
|
||||
name = "Liz Fizz"
|
||||
id = "liz_fizz"
|
||||
description = "Triple citrus layered with some ice and cream."
|
||||
boozepwr = 0
|
||||
color = "#D8FF59"
|
||||
taste_description = "brain freezing sourness"
|
||||
glass_icon_state = "liz_fizz"
|
||||
glass_name = "Liz Fizz"
|
||||
glass_desc = "Looks like a citrus sherbet seperated in layers? Why would anyone want that is beyond you."
|
||||
|
||||
/datum/reagent/consumable/ethanol/miami_vice
|
||||
name = "Miami Vice"
|
||||
id = "miami_vice"
|
||||
description = "A drink layering Pina Colada and Strawberry Daiquiri"
|
||||
boozepwr = 30
|
||||
color = "#D8FF59"
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "sweet and refreshing flavor, complemented with strawberries and coconut, and hints of citrus"
|
||||
glass_icon_state = "miami_vice"
|
||||
glass_name = "Miami Vice"
|
||||
glass_desc = "Strawberries and coconut, like yin and yang."
|
||||
|
||||
/datum/reagent/consumable/ethanol/malibu_sunset
|
||||
name = "Malibu Sunset"
|
||||
id = "malibu_sunset"
|
||||
description = "A drink consisting of creme de coconut and tropical juices"
|
||||
boozepwr = 20
|
||||
color = "#FF9473"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "coconut, with orange and grenadine accents"
|
||||
glass_icon_state = "malibu_sunset"
|
||||
glass_name = "Malibu Sunset"
|
||||
glass_desc = "Tropical looking drinks, with ice cubes hovering on the surface and grenadine coloring the bottom."
|
||||
|
||||
/datum/reagent/consumable/ethanol/hotlime_miami
|
||||
name = "Hotlime Miami"
|
||||
id = "hotlime_miami"
|
||||
description = "The essence of the 90's, if they were a bloody mess that is."
|
||||
boozepwr = 40
|
||||
color = "#A7FAE8"
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "coconut and aesthetic violence"
|
||||
glass_icon_state = "hotlime_miami"
|
||||
glass_name = "Hotlime Miami"
|
||||
glass_desc = "This looks very aesthetically pleasing."
|
||||
|
||||
/datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/M)
|
||||
M.set_drugginess(50)
|
||||
M.adjustStaminaLoss(-2)
|
||||
return ..()
|
||||
@@ -126,6 +126,15 @@
|
||||
glass_name = "glass of lemon juice"
|
||||
glass_desc = "Sour..."
|
||||
|
||||
/datum/reagent/consumable/strawberryjuice
|
||||
name = "Strawberry Juice"
|
||||
id = "strawberryjuice"
|
||||
description = "Refreshing seasonal summer drink."
|
||||
color = "#F2163A"
|
||||
taste_description = "strawberry"
|
||||
glass_name = "glass of strawberry juice"
|
||||
glass_desc = "Refreshing seasonal summer drink."
|
||||
|
||||
/datum/reagent/consumable/banana
|
||||
name = "Banana Juice"
|
||||
id = "banana"
|
||||
@@ -816,6 +825,15 @@
|
||||
taste_description = "parsnip"
|
||||
glass_name = "glass of parsnip juice"
|
||||
|
||||
/datum/reagent/consumable/pineapplejuice
|
||||
name = "Pineapple Juice"
|
||||
id = "pineapplejuice"
|
||||
description = "Tart, tropical, and hotly debated."
|
||||
color = "#F7D435"
|
||||
taste_description = "pineapple"
|
||||
glass_name = "glass of pineapple juice"
|
||||
glass_desc = "Tart, tropical, and hotly debated."
|
||||
|
||||
/datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink
|
||||
name = "Peach Juice"
|
||||
id = "peachjuice"
|
||||
|
||||
@@ -1586,17 +1586,20 @@
|
||||
name = "anomolous virus food"
|
||||
color = "#ffa6ff" //rgb: 255,166,255
|
||||
taste_description = "a bad idea"
|
||||
id = "laughtervirusfood"
|
||||
|
||||
/datum/reagent/consumable/virus_food/advvirusfood
|
||||
name = "highly unstable virus food"
|
||||
color = "#ffffff" //rgb: 255,255,255 ITS PURE WHITE CMON
|
||||
taste_description = "an EXTREMELY bad idea"
|
||||
id = "advvirusfood"
|
||||
|
||||
/datum/reagent/consumable/virus_food/viralbase
|
||||
name = "Experimental viral base"
|
||||
description = "Recently discovered by Nanotrasen's top scientists after years of research, this substance can be used as the base for extremely rare and extremely dangerous viruses once exposed to uranium."
|
||||
color = "#fff0da"
|
||||
taste_description = "tears of scientists"
|
||||
id = "viralbase"
|
||||
|
||||
/datum/reagent/colorful_reagent/on_mob_life(mob/living/carbon/M)
|
||||
if(!no_mob_color)
|
||||
|
||||
@@ -83,11 +83,11 @@
|
||||
SplashReagents(target, TRUE)
|
||||
|
||||
/obj/item/reagent_containers/proc/bartender_check(atom/target)
|
||||
. = FALSE
|
||||
if(target.CanPass(src, get_turf(src)) && thrownby && thrownby.actions)
|
||||
for(var/datum/action/innate/drink_fling/D in thrownby.actions)
|
||||
if(D.active)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/reagent_containers/proc/ForceResetRotation()
|
||||
transform = initial(transform)
|
||||
|
||||
@@ -423,6 +423,26 @@
|
||||
////////////Tools//////////////
|
||||
///////////////////////////////
|
||||
|
||||
/datum/design/rcd_upgrade/frames
|
||||
name = "RCD frames designs upgrade"
|
||||
desc = "Adds the computer frame and machine frame to the RCD."
|
||||
id = "rcd_upgrade_frames"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
|
||||
build_path = /obj/item/rcd_upgrade/frames
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rcd_upgrade/simple_circuits
|
||||
name = "RCD simple circuits designs upgrade"
|
||||
desc = "Adds the simple circuits to the RCD."
|
||||
id = "rcd_upgrade_simple_circuits"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 1500, MAT_TITANIUM = 2000)
|
||||
build_path = /obj/item/rcd_upgrade/simple_circuits
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/exwelder
|
||||
name = "Experimental Welding Tool"
|
||||
desc = "An experimental welder capable of self-fuel generation."
|
||||
@@ -453,6 +473,26 @@
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/rcd_loaded
|
||||
name = "Rapid Construction Device (RCD)"
|
||||
desc = "A tool that can construct and deconstruct walls, airlocks and floors on the fly."
|
||||
id = "rcd_loaded"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL=48000, MAT_GLASS=32000) // costs more than what it did in the autolathe, this one comes loaded.
|
||||
build_path = /obj/item/construction/rcd/loaded
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/pipe_dispenser
|
||||
name = "Rapid Pipe Dispenser (RPD)"
|
||||
desc = "A tool that can construct and deconstruct pipes on the fly."
|
||||
id = "pipe_dispenser"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
|
||||
build_path = /obj/item/pipe_dispenser
|
||||
category = list("Equipment")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/alienwrench
|
||||
name = "Alien Wrench"
|
||||
desc = "An advanced wrench obtained through Abductor technology."
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
display_name = "Advanced Engineering"
|
||||
description = "Pushing the boundaries of physics, one chainsaw-fist at a time."
|
||||
prereq_ids = list("engineering", "emp_basic")
|
||||
design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "double_emergency_oxygen")
|
||||
design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "double_emergency_oxygen","rcd_loaded", "pipe_dispenser","rcd_upgrade_frames", "rcd_upgrade_simple_circuits")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
|
||||
export_price = 5000
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
/obj/item/storage/bag/construction = 5,
|
||||
/obj/item/clothing/glasses/welding = 5,
|
||||
/obj/item/multitool = 5,
|
||||
/obj/item/construction/rcd/loaded = 3,
|
||||
/obj/item/construction/rcd/loaded/upgraded = 3,
|
||||
/obj/item/grenade/chem_grenade/smart_metal_foam = 10,
|
||||
/obj/item/geiger_counter = 6,
|
||||
/obj/item/stock_parts/cell/high = 10,
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
product_ads = "Guaranteed to protect your feet from industrial accidents!;Afraid of radiation? Then wear yellow!"
|
||||
vend_reply = "Thank you for using the EngiDrobe!"
|
||||
products = list(/obj/item/clothing/accessory/pocketprotector = 5,
|
||||
/obj/item/storage/backpack/duffelbag/engineering = 2,
|
||||
/obj/item/storage/backpack/duffelbag/engineering = 3,
|
||||
/obj/item/storage/backpack/industrial = 3,
|
||||
/obj/item/storage/backpack/satchel/eng = 3,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering = 3,
|
||||
@@ -71,7 +71,8 @@
|
||||
/obj/item/clothing/under/rank/engineer/skirt = 5,
|
||||
/obj/item/clothing/suit/hazardvest = 5,
|
||||
/obj/item/clothing/shoes/workboots = 5,
|
||||
/obj/item/clothing/head/hardhat = 5)
|
||||
/obj/item/clothing/head/hardhat = 5,
|
||||
/obj/item/clothing/head/hardhat/weldhat = 3)
|
||||
refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe
|
||||
|
||||
/obj/item/vending_refill/wardrobe/engi_wardrobe
|
||||
@@ -87,7 +88,8 @@
|
||||
/obj/item/storage/backpack/duffelbag/engineering = 3,
|
||||
/obj/item/storage/backpack/satchel/eng = 3,
|
||||
/obj/item/storage/backpack/industrial = 3,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 5,
|
||||
/obj/item/clothing/head/hardhat/weldhat/dblue = 3,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3,
|
||||
/obj/item/clothing/under/rank/atmospheric_technician = 5,
|
||||
/obj/item/clothing/under/rank/atmospheric_technician/skirt = 5,
|
||||
/obj/item/clothing/shoes/sneakers/black = 5)
|
||||
|
||||
@@ -146,9 +146,6 @@ LOG_MANIFEST
|
||||
## Enable logging pictures
|
||||
# LOG_PICTURES
|
||||
|
||||
## log cloning actions
|
||||
LOG_CLONING
|
||||
|
||||
##Log camera pictures - Must have picture logging enabled
|
||||
PICTURE_LOGGING_CAMERA
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 46 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user