Merge pull request #1 from quotefox/master

a
This commit is contained in:
zeskorion
2020-02-12 10:02:52 -08:00
committed by GitHub
129 changed files with 338746 additions and 10369 deletions
+7
View File
@@ -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
+9
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+177
View File
@@ -0,0 +1,177 @@
## Hyper Station 13
Based and maintained from Citadel Station.
[![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
[![Krihelimeter](http://www.krihelinator.xyz/badge/quotefox/Hyper-Station-13)](http://www.krihelinator.xyz)
[![Percentage of issues still open](http://isitmaintained.com/badge/open/quotefox/Hyper-Station-13.svg)](http://isitmaintained.com/project/quotefox/Hyper-Station-13 "Percentage of issues still open") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/quotefox/Hyper-Station-13.svg)](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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+238 -41
View File
@@ -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
View File
@@ -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
View File
@@ -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
"}
+477 -53
View File
@@ -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
"}
+1
View File
@@ -0,0 +1 @@
#define FORCE_MAP "_maps/boxstation.json"
+1
View File
@@ -115,6 +115,7 @@
#define DRINKSBLOOD 15
#define NOEYES 16
#define MARKINGS 17
#define WINGCOLOR 18
//organ slots
#define ORGAN_SLOT_BRAIN "brain"
+2 -2
View File
@@ -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"
+5
View File
@@ -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
-1
View File
@@ -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)
-4
View File
@@ -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)
+1
View File
@@ -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)
-4
View File
@@ -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]")
+4 -1
View File
@@ -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]
+6 -1
View File
@@ -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),
+3
View File
@@ -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))
+2
View File
@@ -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)
-2
View File
@@ -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
+8
View File
@@ -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
View File
@@ -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)
-3
View File
@@ -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"
-8
View File
@@ -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)
+37 -90
View File
@@ -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)
+63 -122
View File
@@ -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)
+3
View File
@@ -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
+15
View File
@@ -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
+3 -3
View File
@@ -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)
+14
View File
@@ -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)
. = ..()
+1 -1
View File
@@ -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
View File
@@ -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
+119 -70
View File
@@ -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
+2 -2
View File
@@ -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
+29
View File
@@ -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'
+1
View File
@@ -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"
+1 -1
View File
@@ -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
+4 -1
View File
@@ -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."
+21 -1
View File
@@ -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
-1
View File
@@ -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"
+2
View File
@@ -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()
+1 -1
View File
@@ -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))
+34 -4
View File
@@ -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"
+38 -78
View File
@@ -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',
)
)
+52
View File
@@ -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];'>&nbsp;&nbsp;&nbsp;</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)
+11 -21
View File
@@ -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>")
+78 -6
View File
@@ -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
+1
View File
@@ -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
+1
View File
@@ -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
+46
View File
@@ -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))
+5
View File
@@ -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)
+5 -1
View File
@@ -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)
+1 -1
View File
@@ -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."
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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,
+5 -3
View File
@@ -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)
-3
View File
@@ -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