Merge remote-tracking branch 'upstream/master'

This commit is contained in:
CygnusB
2020-06-25 01:22:55 -03:00
485 changed files with 102675 additions and 80445 deletions
+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
+1 -1
View File
@@ -1,4 +1,4 @@
FROM tgstation/byond:512.1484 as base
FROM tgstation/byond:512.1488 as base
FROM base as build_base
+2
View File
@@ -2,6 +2,8 @@
Based and maintained from Citadel Station.
## Warning you will need Byond Compiler [513.1525] or higher to compile the source code.
[![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)
@@ -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
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
"}
+23 -20
View File
@@ -19,11 +19,11 @@
//organ defines
#define COCK_SIZE_MIN 1
#define COCK_SIZE_MAX 20
#define COCK_SIZE_MAX 36
#define COCK_GIRTH_RATIO_MAX 1.25
#define COCK_GIRTH_RATIO_DEF 0.75
#define COCK_GIRTH_RATIO_MIN 0.5
#define COCK_GIRTH_RATIO_MAX 0.42
#define COCK_GIRTH_RATIO_DEF 0.25
#define COCK_GIRTH_RATIO_MIN 0.15
#define KNOT_GIRTH_RATIO_MAX 3
#define KNOT_GIRTH_RATIO_DEF 2.1
@@ -32,19 +32,19 @@
#define BALLS_VOLUME_BASE 25
#define BALLS_VOLUME_MULT 1
#define BALLS_SIZE_MIN 1
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
#define BALLS_SIZE_MIN 1 //Hyper - Unchanged
#define BALLS_SIZE_DEF 8 //Changed from 2
#define BALLS_SIZE_MAX 40 //Changed from 3
#define BALLS_SACK_SIZE_MIN 1
#define BALLS_SACK_SIZE_DEF 8
#define BALLS_SACK_SIZE_MAX 40
#define CUM_RATE 0.035
#define CUM_RATE 5
#define CUM_RATE_MULT 1
#define CUM_EFFICIENCY 1//amount of nutrition required per life()
#define CUM_EFFICIENCY 1 //amount of nutrition required per life()
#define EGG_GIRTH_MIN 1//inches
#define EGG_GIRTH_MIN 1 //inches
#define EGG_GIRTH_DEF 6
#define EGG_GIRTH_MAX 16
@@ -52,25 +52,28 @@
#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume.
#define BREASTS_SIZE_FLAT 0
#define BREASTS_SIZE_A 1
#define BREASTS_SIZE_AA 1.5
#define BREASTS_SIZE_B 2
#define BREASTS_SIZE_BB 2.5
#define BREASTS_SIZE_C 3
#define BREASTS_SIZE_CC 3.5
#define BREASTS_SIZE_D 4
#define BREASTS_SIZE_DD 4.5
#define BREASTS_SIZE_E 5
#define BREASTS_SIZE_EE 5.5
#define BREASTS_SIZE_F 6
#define BREASTS_SIZE_FF 6.5
#define BREASTS_SIZE_G 7
#define BREASTS_SIZE_GG 7.5//Are these even real sizes? The world may never know because cup sizes make no fucking sense.
#define BREASTS_SIZE_H 8
#define BREASTS_SIZE_HH 8.5//Largest size, ever. For now.
#define BREASTS_SIZE_I 9
#define BREASTS_SIZE_J 10
#define BREASTS_SIZE_K 11
#define BREASTS_SIZE_L 12
#define BREASTS_SIZE_M 13
#define BREASTS_SIZE_N 14
#define BREASTS_SIZE_O 15
#define BREASTS_SIZE_HUGE 16
#define BREASTS_SIZE_MASSIVE 17
#define BREASTS_SIZE_GIGA 25
#define BREASTS_SIZE_MIN BREASTS_SIZE_A
#define BREASTS_SIZE_DEF BREASTS_SIZE_C
#define BREASTS_SIZE_MAX BREASTS_SIZE_HH
#define BREASTS_SIZE_DEF BREASTS_SIZE_D
#define BREASTS_SIZE_MAX BREASTS_SIZE_GIGA
#define MILK_RATE 5
#define MILK_RATE_MULT 1
+8 -8
View File
@@ -4,15 +4,15 @@
#define COLOR_INPUT_ENABLED "#D3B5B5"
#define COLOR_DARKMODE_INFO_BUTTONS_BG "#40628A"
#define COLOR_DARKMODE_ISSUE_BUTTON_BG "#ce4242"
#define COLOR_DARKMODE_BACKGROUND "#202020"
#define COLOR_DARKMODE_DARKBACKGROUND "#171717"
#define COLOR_DARKMODE_TEXT "#f0f0f0"
#define COLOR_DARKMODE_ISSUE_BUTTON_BG "#A92C2C"
#define COLOR_DARKMODE_BACKGROUND "#272727"
#define COLOR_DARKMODE_DARKBACKGROUND "#242424"
#define COLOR_DARKMODE_TEXT "#E0E0E0"
#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90b3dd"
#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "#ef7f7f"
#define COLOR_WHITEMODE_BACKGROUND "#eeeeee"
#define COLOR_WHITEMODE_DARKBACKGROUND "#dddddd"
#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90B3DD"
#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "##EF7F7F"
#define COLOR_WHITEMODE_BACKGROUND "#F0F0F0"
#define COLOR_WHITEMODE_DARKBACKGROUND "#E6E6E6"
#define COLOR_WHITEMODE_TEXT "#000000"
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
+2
View File
@@ -227,6 +227,8 @@
//Mood
#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code.
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code.
#define COMSIG_INCREASE_SANITY "decrease_sanity" //Called when you want to increase sanity from anywhere in the code.
#define COMSIG_DECREASE_SANITY "increase_sanity" //Same as above but to decrease sanity instead.
//NTnet
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
+724
View File
@@ -0,0 +1,724 @@
// All signals. Format:
// When the signal is called: (signal arguments)
// All signals send the source datum of the signal as the first argument
// global signals
// These are signals which can be listened to by any component on any parent
// start global signals with "!", this used to be necessary but now it's just a formatting choice
///from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
#define COMSIG_GLOB_NEW_Z "!new_z"
/// called after a successful var edit somewhere in the world: (list/args)
#define COMSIG_GLOB_VAR_EDIT "!var_edit"
/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
#define COMSIG_GLOB_EXPLOSION "!explosion"
/// mob was created somewhere : (mob)
#define COMSIG_GLOB_MOB_CREATED "!mob_created"
/// mob died somewhere : (mob , gibbed)
#define COMSIG_GLOB_MOB_DEATH "!mob_death"
/// global living say plug - use sparingly: (mob/speaker , message)
#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special"
/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic)
#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic"
#define COMPONENT_GLOB_BLOCK_CINEMATIC (1<<0)
/// ingame button pressed (/obj/machinery/button/button)
#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed"
/// signals from globally accessible objects
///from SSsun when the sun changes position : (azimuth)
#define COMSIG_SUN_MOVED "sun_moved"
//////////////////////////////////////////////////////////////////
// /datum signals
/// when a component is added to a datum: (/datum/component)
#define COMSIG_COMPONENT_ADDED "component_added"
/// before a component is removed from a datum because of RemoveComponent: (/datum/component)
#define COMSIG_COMPONENT_REMOVING "component_removing"
/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation
#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted"
/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called
#define COMSIG_PARENT_QDELETING "parent_qdeleting"
/// generic topic handler (usr, href_list)
#define COMSIG_TOPIC "handle_topic"
/// fires on the target datum when an element is attached to it (/datum/element)
#define COMSIG_ELEMENT_ATTACH "element_attach"
/// fires on the target datum when an element is attached to it (/datum/element)
#define COMSIG_ELEMENT_DETACH "element_detach"
// /atom signals
///from base of atom/proc/Initialize(): sent any time a new atom is created
#define COMSIG_ATOM_CREATED "atom_created"
//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
///from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMSIG_PARENT_ATTACKBY "atom_attackby"
///Return this in response if you don't want afterattack to be called
#define COMPONENT_NO_AFTERATTACK (1<<0)
///from base of atom/attack_hulk(): (/mob/living/carbon/human)
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack"
///from base of atom/animal_attack(): (/mob/user)
#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal"
///from base of atom/examine(): (/mob)
#define COMSIG_PARENT_EXAMINE "atom_examine"
///from base of atom/get_examine_name(): (/mob, list/overrides)
#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name"
//Positions for overrides list
#define EXAMINE_POSITION_ARTICLE (1<<0)
#define EXAMINE_POSITION_BEFORE (1<<1)
//End positions
#define COMPONENT_EXNAME_CHANGED (1<<0)
///from base of atom/update_icon(): ()
#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon"
#define COMSIG_ATOM_NO_UPDATE_ICON_STATE (1<<0)
#define COMSIG_ATOM_NO_UPDATE_OVERLAYS (1<<1)
///from base of atom/update_overlays(): (list/new_overlays)
#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays"
///from base of atom/update_icon(): (signalOut, did_anything)
#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon"
///from base of atom/Entered(): (atom/movable/entering, /atom)
#define COMSIG_ATOM_ENTERED "atom_entered"
///from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
#define COMSIG_ATOM_EXIT "atom_exit"
#define COMPONENT_ATOM_BLOCK_EXIT (1<<0)
///from base of atom/Exited(): (atom/movable/exiting, atom/newloc)
#define COMSIG_ATOM_EXITED "atom_exited"
///from base of atom/Bumped(): (/atom/movable)
#define COMSIG_ATOM_BUMPED "atom_bumped"
///from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
///from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
#define COMSIG_ATOM_FIRE_ACT "atom_fire_act"
///from base of atom/bullet_act(): (/obj/projectile, def_zone)
#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act"
///from base of atom/blob_act(): (/obj/structure/blob)
#define COMSIG_ATOM_BLOB_ACT "atom_blob_act"
///from base of atom/acid_act(): (acidpwr, acid_volume)
#define COMSIG_ATOM_ACID_ACT "atom_acid_act"
///from base of atom/emag_act(): (/mob/user)
#define COMSIG_ATOM_EMAG_ACT "atom_emag_act"
///from base of atom/rad_act(intensity)
#define COMSIG_ATOM_RAD_ACT "atom_rad_act"
///from base of atom/narsie_act(): ()
#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act"
///from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode)
#define COMSIG_ATOM_RCD_ACT "atom_rcd_act"
///from base of atom/singularity_pull(): (S, current_size)
#define COMSIG_ATOM_SING_PULL "atom_sing_pull"
///from obj/machinery/bsa/full/proc/fire(): ()
#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass"
#define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0)
///from base of atom/set_light(): (l_range, l_power, l_color)
#define COMSIG_ATOM_SET_LIGHT "atom_set_light"
///from base of atom/setDir(): (old_dir, new_dir)
#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change"
///from base of atom/handle_atom_del(): (atom/deleted)
#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del"
///from base of atom/has_gravity(): (turf/location, list/forced_gravities)
#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity"
///from proc/get_rad_contents(): ()
#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe"
#define COMPONENT_BLOCK_RADIATION (1<<0)
///from base of datum/radiation_wave/radiate(): (strength)
#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam"
#define COMPONENT_BLOCK_CONTAMINATION (1<<0)
///from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width)
#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass"
#define COMPONENT_RAD_WAVE_HANDLED (1<<0)
///from internal loop in atom/movable/proc/CanReach(): (list/next)
#define COMSIG_ATOM_CANREACH "atom_can_reach"
#define COMPONENT_BLOCK_REACH (1<<0)
///from base of atom/screwdriver_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act"
///from base of atom/wrench_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act"
///from base of atom/multitool_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act"
///from base of atom/welder_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WELDER_ACT "atom_welder_act"
///from base of atom/wirecutter_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act"
///from base of atom/crowbar_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act"
///from base of atom/analyser_act(): (mob/living/user, obj/item/I)
#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act"
#define COMPONENT_BLOCK_TOOL_ATTACK (1<<0)
///called when teleporting into a protected turf: (channel, turf/origin)
#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport"
#define COMPONENT_BLOCK_TELEPORT (1<<0)
///called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers)
#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view"
///called when an atom starts orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin"
///called when an atom stops orbiting another atom: (atom)
#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop"
/////////////////
///from base of atom/attack_ghost(): (mob/dead/observer/ghost)
#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost"
///from base of atom/attack_hand(): (mob/user)
#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand"
///from base of atom/attack_paw(): (mob/user)
#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw"
#define COMPONENT_NO_ATTACK_HAND (1<<0) //works on all 3.
//This signal return value bitflags can be found in __DEFINES/misc.dm
///called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels)
#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact"
///called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force)
#define COMSIG_ATOM_START_PULL "movable_start_pull"
///called on /living when someone starts pulling it (atom/movable/puller, state, force)
#define COMSIG_LIVING_START_PULL "living_start_pull"
/////////////////
///from base of area/Entered(): (/area)
#define COMSIG_ENTER_AREA "enter_area"
///from base of area/Exited(): (/area)
#define COMSIG_EXIT_AREA "exit_area"
///from base of atom/Click(): (location, control, params, mob/user)
#define COMSIG_CLICK "atom_click"
///from base of atom/ShiftClick(): (/mob)
#define COMSIG_CLICK_SHIFT "shift_click"
#define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye.
///from base of atom/CtrlClickOn(): (/mob)
#define COMSIG_CLICK_CTRL "ctrl_click"
///from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_ALT "alt_click"
///from base of atom/CtrlShiftClick(/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click"
///from base of atom/MouseDrop(): (/atom/over, /mob/user)
#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto"
#define COMPONENT_NO_MOUSEDROP (1<<0)
///from base of atom/MouseDrop_T: (/atom/from, /mob/user)
#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto"
// /area signals
///from base of area/Entered(): (atom/movable/M)
#define COMSIG_AREA_ENTERED "area_entered"
///from base of area/Exited(): (atom/movable/M)
#define COMSIG_AREA_EXITED "area_exited"
// /turf signals
///from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps)
#define COMSIG_TURF_CHANGE "turf_change"
///from base of atom/has_gravity(): (atom/asker, list/forced_gravities)
#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity"
///from base of turf/New(): (turf/source, direction)
#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new"
// /atom/movable signals
///from base of atom/movable/Moved(): (/atom)
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
///from base of atom/movable/Moved(): (/atom, dir)
#define COMSIG_MOVABLE_MOVED "movable_moved"
///from base of atom/movable/Cross(): (/atom/movable)
#define COMSIG_MOVABLE_CROSS "movable_cross"
///from base of atom/movable/Crossed(): (/atom/movable)
#define COMSIG_MOVABLE_CROSSED "movable_crossed"
///from base of atom/movable/Uncross(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSS "movable_uncross"
#define COMPONENT_MOVABLE_BLOCK_UNCROSS (1<<0)
///from base of atom/movable/Uncrossed(): (/atom/movable)
#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed"
///from base of atom/movable/Bump(): (/atom)
#define COMSIG_MOVABLE_BUMP "movable_bump"
///from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum)
#define COMSIG_MOVABLE_IMPACT "movable_impact"
#define COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH (1<<0) //if true, flip if the impact will push what it hits
#define COMPONENT_MOVABLE_IMPACT_NEVERMIND (1<<1) //return true if you destroyed whatever it was you're impacting and there won't be anything for hitby() to run on
///from base of mob/living/hitby(): (mob/living/target, hit_zone)
#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone"
///from base of atom/movable/buckle_mob(): (mob, force)
#define COMSIG_MOVABLE_BUCKLE "buckle"
///from base of atom/movable/unbuckle_mob(): (mob, force)
#define COMSIG_MOVABLE_UNBUCKLE "unbuckle"
///from base of atom/movable/throw_at(): (list/args)
#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw"
#define COMPONENT_CANCEL_THROW (1<<0)
///from base of atom/movable/throw_at(): (datum/thrownthing, spin)
#define COMSIG_MOVABLE_POST_THROW "movable_post_throw"
///from base of atom/movable/onTransitZ(): (old_z, new_z)
#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit"
///called when the movable is placed in an unaccessible area, used for stationloving: ()
#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded"
///from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode))
#define COMSIG_MOVABLE_HEAR "movable_hear"
#define HEARING_MESSAGE 1
#define HEARING_SPEAKER 2
// #define HEARING_LANGUAGE 3
#define HEARING_RAW_MESSAGE 4
/* #define HEARING_RADIO_FREQ 5
#define HEARING_SPANS 6
#define HEARING_MESSAGE_MODE 7 */
///called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source)
#define COMSIG_MOVABLE_DISPOSING "movable_disposing"
// /mob signals
///from base of /mob/Login(): ()
#define COMSIG_MOB_LOGIN "mob_login"
///from base of /mob/Logout(): ()
#define COMSIG_MOB_LOGOUT "mob_logout"
///from base of mob/death(): (gibbed)
#define COMSIG_MOB_DEATH "mob_death"
///from base of mob/set_stat(): (new_stat)
#define COMSIG_MOB_STATCHANGE "mob_statchange"
///from base of mob/clickon(): (atom/A, params)
#define COMSIG_MOB_CLICKON "mob_clickon"
///from base of mob/MiddleClickOn(): (atom/A)
#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon"
///from base of mob/AltClickOn(): (atom/A)
#define COMSIG_MOB_ALTCLICKON "mob_altclickon"
#define COMSIG_MOB_CANCEL_CLICKON (1<<0)
///from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj
#define COMSIG_MOB_ALLOWED "mob_allowed"
///from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources)
#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic"
#define COMPONENT_BLOCK_MAGIC (1<<0)
///from base of mob/create_mob_hud(): ()
#define COMSIG_MOB_HUD_CREATED "mob_hud_created"
///from base of atom/attack_hand(): (mob/user)
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand"
///from base of /obj/item/attack(): (mob/M, mob/user)
#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack"
#define COMPONENT_ITEM_NO_ATTACK (1<<0)
///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone)
#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage"
///from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters)
#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted"
///from base of mob/RangedAttack(): (atom/A, params)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
///from base of /mob/throw_item(): (atom/target)
#define COMSIG_MOB_THROW "mob_throw"
///from base of /mob/verb/examinate(): (atom/target)
#define COMSIG_MOB_EXAMINATE "mob_examinate"
///from base of /mob/update_sight(): ()
#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight"
////from /mob/living/say(): ()
#define COMSIG_MOB_SAY "mob_say"
#define COMPONENT_UPPERCASE_SPEECH (1<<0)
// used to access COMSIG_MOB_SAY argslist
#define SPEECH_MESSAGE 1
// #define SPEECH_BUBBLE_TYPE 2
#define SPEECH_SPANS 3
/* #define SPEECH_SANITIZE 4
#define SPEECH_LANGUAGE 5
#define SPEECH_IGNORE_SPAM 6
#define SPEECH_FORCED 7 */
///from /mob/say_dead(): (mob/speaker, message)
#define COMSIG_MOB_DEADSAY "mob_deadsay"
#define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
///from /mob/living/emote(): ()
#define COMSIG_MOB_EMOTE "mob_emote"
///from base of mob/swap_hand(): (obj/item)
#define COMSIG_MOB_SWAP_HANDS "mob_swap_hands"
#define COMPONENT_BLOCK_SWAP (1<<0)
// /mob/living signals
///from base of mob/living/resist() (/mob/living)
#define COMSIG_LIVING_RESIST "living_resist"
///from base of mob/living/IgniteMob() (/mob/living)
#define COMSIG_LIVING_IGNITED "living_ignite"
///from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished"
///from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act"
///sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check)
#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented"
///sent by stuff like stunbatons and tasers: ()
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock"
///from base of mob/living/revive() (full_heal, admin_revive)
#define COMSIG_LIVING_REVIVE "living_revive"
///from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs"
///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment
#define COMSIG_LIVING_ATTACH_LIMB "living_attach_limb"
#define COMPONENT_NO_ATTACH (1<<0)
///sent from borg recharge stations: (amount, repairs)
#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge"
///sent when a mob/login() finishes: (client)
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login"
///sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation)
#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon"
//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!
///from base of mob/living/Stun() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_STUN "living_stun"
///from base of mob/living/Knockdown() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown"
///from base of mob/living/Paralyze() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze"
///from base of mob/living/Immobilize() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize"
///from base of mob/living/Unconscious() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious"
///from base of mob/living/Sleeping() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping"
#define COMPONENT_NO_STUN (1<<0) //For all of them
///from base of /mob/living/can_track(): (mob/user)
#define COMSIG_LIVING_CAN_TRACK "mob_cantrack"
#define COMPONENT_CANT_TRACK (1<<0)
// /mob/living/carbon signals
///from base of mob/living/carbon/soundbang_act(): (list(intensity))
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang"
///from /item/organ/proc/Insert() (/obj/item/organ/)
#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ"
///from /item/organ/proc/Remove() (/obj/item/organ/)
#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ"
///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
#define COMSIG_CARBON_EQUIP_HAT "carbon_equip_hat"
///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent)
#define COMSIG_CARBON_UNEQUIP_HAT "carbon_unequip_hat"
///defined twice, in carbon and human's topics, fired when interacting with a valid embedded_object to pull it out (mob/living/carbon/target, /obj/item, /obj/item/bodypart/L)
#define COMSIG_CARBON_EMBED_RIP "item_embed_start_rip"
///called when removing a given item from a mob, from mob/living/carbon/remove_embedded_object(mob/living/carbon/target, /obj/item)
#define COMSIG_CARBON_EMBED_REMOVAL "item_embed_remove_safe"
// /mob/living/simple_animal/hostile signals
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMPONENT_HOSTILE_NO_ATTACK (1<<0)
// /obj signals
///from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct"
///called in /obj/structure/setAnchored(): (value)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored"
///from base of code/game/machinery
#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench"
///from base of /turf/proc/levelupdate(). (intact) true to hide and false to unhide
#define COMSIG_OBJ_HIDE "obj_hide"
// /obj/machinery signals
///from /obj/machinery/obj_break(damage_flag): (damage_flag)
#define COMSIG_MACHINERY_BROKEN "machinery_broken"
///from base power_change() when power is lost
#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost"
///from base power_change() when power is restored
#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored"
// /obj/item signals
///from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
#define COMSIG_ITEM_ATTACK "item_attack"
///from base of obj/item/attack_self(): (/mob)
#define COMSIG_ITEM_ATTACK_SELF "item_attack_self"
#define COMPONENT_NO_INTERACT (1<<0)
///from base of obj/item/attack_obj(): (/obj, /mob)
#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj"
#define COMPONENT_NO_ATTACK_OBJ (1<<0)
///from base of obj/item/pre_attack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack"
#define COMPONENT_NO_ATTACK (1<<0)
///from base of obj/item/afterattack(): (atom/target, mob/user, params)
#define COMSIG_ITEM_AFTERATTACK "item_afterattack"
///from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params)
#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted"
///from base of obj/item/equipped(): (/mob/equipper, slot)
#define COMSIG_ITEM_EQUIPPED "item_equip"
///from base of obj/item/dropped(): (mob/user)
#define COMSIG_ITEM_DROPPED "item_drop"
///from base of obj/item/pickup(): (/mob/taker)
#define COMSIG_ITEM_PICKUP "item_pickup"
///from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone"
///return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul"
///called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user)
#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval"
#define COMPONENT_BLOCK_MARK_RETRIEVAL (1<<0)
///from base of obj/item/hit_reaction(): (list/args)
#define COMSIG_ITEM_HIT_REACT "item_hit_react"
///called on item when crossed by something (): (/atom/movable, mob/living/crossed)
#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed"
///called on item when microwaved (): (obj/machinery/microwave/M)
#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act"
///from base of item/sharpener/attackby(): (amount, max)
#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act"
#define COMPONENT_BLOCK_SHARPEN_APPLIED (1<<0)
#define COMPONENT_BLOCK_SHARPEN_BLOCKED (1<<1)
#define COMPONENT_BLOCK_SHARPEN_ALREADY (1<<2)
#define COMPONENT_BLOCK_SHARPEN_MAXED (1<<3)
///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user)
#define COMSIG_TOOL_IN_USE "tool_in_use"
///from base of [/obj/item/proc/tool_start_check]: (mob/living/user)
#define COMSIG_TOOL_START_USE "tool_start_use"
///from [/obj/item/proc/disableEmbedding]:
#define COMSIG_ITEM_DISABLE_EMBED "item_disable_embed"
///from [/obj/effect/mine/proc/triggermine]:
#define COMSIG_MINE_TRIGGERED "minegoboom"
// /obj/item signals for economy
///called when an item is sold by the exports subsystem
#define COMSIG_ITEM_SOLD "item_sold"
///called when a wrapped up structure is opened by hand
#define COMSIG_STRUCTURE_UNWRAPPED "structure_unwrapped"
#define COMSIG_ITEM_UNWRAPPED "item_unwrapped"
///called when a wrapped up item is opened by hand
#define COMSIG_ITEM_SPLIT_VALUE (1<<0)
///called when getting the item's exact ratio for cargo's profit.
#define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits"
///called when getting the item's exact ratio for cargo's profit, without selling the item.
#define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry"
// /obj/item/clothing signals
///from base of obj/item/clothing/shoes/proc/step_action(): ()
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action"
///from base of /obj/item/clothing/suit/space/proc/toggle_spacesuit(): (obj/item/clothing/suit/space/suit)
#define COMSIG_SUIT_SPACE_TOGGLE "suit_space_toggle"
// /obj/item/implant signals
///from base of /obj/item/implant/proc/activate(): ()
#define COMSIG_IMPLANT_ACTIVATED "implant_activated"
///from base of /obj/item/implant/proc/implant(): (list/args)
#define COMSIG_IMPLANT_IMPLANTING "implant_implanting"
#define COMPONENT_STOP_IMPLANTING (1<<0)
///called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant)
#define COMSIG_IMPLANT_OTHER "implant_other"
//#define COMPONENT_STOP_IMPLANTING (1<<0) //The name makes sense for both
#define COMPONENT_DELETE_NEW_IMPLANT (1<<1)
#define COMPONENT_DELETE_OLD_IMPLANT (1<<2)
///called on implants being implanted into someone with an uplink implant: (datum/component/uplink)
#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists"
//This uses all return values of COMSIG_IMPLANT_OTHER
// /obj/item/pda signals
///called on pda when the user changes the ringtone: (mob/living/user, new_ringtone)
#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone"
#define COMPONENT_STOP_RINGTONE_CHANGE (1<<0)
#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate"
#define COMPONENT_PDA_NO_DETONATE (1<<0)
// /obj/item/radio signals
///called from base of /obj/item/radio/proc/set_frequency(): (list/args)
#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency"
// /obj/item/pen signals
///called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
#define COMSIG_PEN_ROTATED "pen_rotated"
// /obj/item/gun signals
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_MOB_FIRED_GUN "mob_fired_gun"
// /obj/item/grenade signals
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_GRENADE_PRIME "grenade_prime"
///called in /obj/item/gun/process_fire (user, target, params, zone_override)
#define COMSIG_GRENADE_ARMED "grenade_armed"
// /obj/projectile signals (sent to the firer)
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_SELF_ON_HIT "projectile_self_on_hit"
///from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit"
///from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire"
///from the base of /obj/projectile/proc/fire(): ()
#define COMSIG_PROJECTILE_FIRE "projectile_fire"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PROJECTILE_RANGE_OUT "projectile_range_out"
///sent when trying to force an embed (mainly for projectiles, only used in the embed element)
#define COMSIG_EMBED_TRY_FORCE "item_try_embed"
///sent to targets during the process_hit proc of projectiles
#define COMSIG_PELLET_CLOUD_INIT "pellet_cloud_init"
// /obj/mecha signals
///sent from mecha action buttons to the mecha they're linked to
#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate"
// /mob/living/carbon/human signals
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker)
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby"
///Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted)
#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit"
///Whenever EquipRanked is called, called after job is set
#define COMSIG_JOB_RECEIVED "job_received"
// /datum/species signals
///from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species)
#define COMSIG_SPECIES_GAIN "species_gain"
///from datum/species/on_species_loss(): (datum/species/lost_species)
#define COMSIG_SPECIES_LOSS "species_loss"
// /datum/song signals
///sent to the instrument when a song starts playing
#define COMSIG_SONG_START "song_start"
///sent to the instrument when a song stops playing
#define COMSIG_SONG_END "song_end"
/*******Component Specific Signals*******/
//Janitor
///(): Returns bitflags of wet values.
#define COMSIG_TURF_IS_WET "check_turf_wet"
///(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
#define COMSIG_TURF_MAKE_DRY "make_turf_try"
///called on an object to clean it of cleanables. Usualy with soap: (num/strength)
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act"
//Creamed
///called when you wash your face at a sink: (num/strength)
#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act"
//Food
///from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
#define COMSIG_FOOD_EATEN "food_eaten"
//Gibs
///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases)
#define COMSIG_GIBS_STREAK "gibs_streak"
//Mood
///called when you send a mood event from anywhere in the code.
#define COMSIG_ADD_MOOD_EVENT "add_mood"
///Mood event that only RnD members listen for
#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood"
///called when you clear a mood event from anywhere in the code.
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood"
//NTnet
///called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive"
//Nanites
///() returns TRUE if nanites are found
#define COMSIG_HAS_NANITES "has_nanites"
///() returns TRUE if nanites have stealth
#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy"
///() deletes the nanite component
#define COMSIG_NANITE_DELETE "nanite_delete"
///(list/nanite_programs) - makes the input list a copy the nanites' program list
#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs"
///(amount) Returns nanite amount
#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume"
///(amount) Sets current nanite volume to the given amount
#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume"
///(amount) Adjusts nanite volume by the given amount
#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust"
///(amount) Sets maximum nanite volume to the given amount
#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume"
///(amount(0-100)) Sets cloud ID to the given amount
#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud"
///(method) Modify cloud sync status. Method can be toggle, enable or disable
#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync"
///(amount) Sets safety threshold to the given amount
#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety"
///(amount) Sets regeneration rate to the given amount
#define COMSIG_NANITE_SET_REGEN "nanite_set_regen"
///(code(1-9999)) Called when sending a nanite signal to a mob.
#define COMSIG_NANITE_SIGNAL "nanite_signal"
///(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob.
#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal"
///(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
#define COMSIG_NANITE_SCAN "nanite_scan"
///(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
#define COMSIG_NANITE_UI_DATA "nanite_ui_data"
///(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program"
///Installation successful
#define COMPONENT_PROGRAM_INSTALLED (1<<0)
///Installation failed, but there are still nanites
#define COMPONENT_PROGRAM_NOT_INSTALLED (1<<1)
///(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
#define COMSIG_NANITE_SYNC "nanite_sync"
// /datum/component/storage signals
///() - returns bool.
#define COMSIG_CONTAINS_STORAGE "is_storage"
///(obj/item/inserting, mob/user, silent, force) - returns bool
#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert"
///(mob/show_to, force) - returns bool.
#define COMSIG_TRY_STORAGE_SHOW "storage_show_to"
///(mob/hide_from) - returns bool
#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from"
///returns bool
#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all"
///(newstate)
#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state"
///() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST!
#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate"
///(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types.
#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type"
///(type, amount = INFINITY, force = FALSE). Force will ignore max_items, and amount is normally clamped to max_items.
#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type"
///(obj, new_loc, force = FALSE) - returns bool
#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj"
///(loc) - returns bool - if loc is null it will dump at parent location.
#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty"
///(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE)
#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory"
///(obj/item/insertion_candidate, mob/user, silent) - returns bool
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip"
// /datum/component/two_handed signals
///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
#define COMSIG_TWOHANDED_WIELD "twohanded_wield"
#define COMPONENT_TWOHANDED_BLOCK_WIELD (1<<0)
///from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user)
#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield"
// /datum/action signals
///from base of datum/action/proc/Trigger(): (datum/action)
#define COMSIG_ACTION_TRIGGER "action_trigger"
#define COMPONENT_ACTION_BLOCK_TRIGGER (1<<0)
//Xenobio hotkeys
///from slime CtrlClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl"
///from slime AltClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt"
///from slime ShiftClickOn(): (/mob)
#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift"
///from turf ShiftClickOn(): (/mob)
#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift"
///from turf AltClickOn(): (/mob)
#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt"
///from monkey CtrlClickOn(): (/mob)
#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl"
+1 -1
View File
@@ -56,7 +56,7 @@
#define isgolem(A) (is_species(A, /datum/species/golem))
#define islizard(A) (is_species(A, /datum/species/lizard))
#define isplasmaman(A) (is_species(A, /datum/species/plasmaman))
#define ispodperson(A) (is_species(A, /datum/species/podperson))
#define ispodperson(A) (is_species(A, /datum/species/pod))
#define isflyperson(A) (is_species(A, /datum/species/fly))
#define isjellyperson(A) (is_species(A, /datum/species/jelly))
#define isslimeperson(A) (is_species(A, /datum/species/jelly/slime))
+1
View File
@@ -75,6 +75,7 @@
#define AREA_LAYER 10
#define MASSIVE_OBJ_LAYER 11
#define POINT_LAYER 12
#define CHAT_LAYER 12.1
#define LIGHTING_PLANE 15
#define LIGHTING_LAYER 15
-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 -1
View File
@@ -63,7 +63,7 @@ require only minor tweaks.
#define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE)
#define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE)
#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE)
#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 5)
#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 1)
#define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5)
#define DL_NAME "name"
+3
View File
@@ -496,3 +496,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define VOMIT_TOXIC 1
#define VOMIT_PURPLE 2
//Misc text define. Does 4 spaces. Used as a makeshift tabulator.
#define FOURSPACES "&nbsp;&nbsp;&nbsp;&nbsp;"
+6
View File
@@ -62,6 +62,7 @@
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
#define MONKEY_BODYPART "monkey"
#define TERATOMA_BODYPART "teratoma"
#define ALIEN_BODYPART "alien"
#define LARVA_BODYPART "larva"
#define DEVIL_BODYPART "devil"
@@ -116,6 +117,8 @@
#define BIOWARE_GENERIC "generic"
#define BIOWARE_NERVES "nerves"
#define BIOWARE_CIRCULATION "circulation"
#define BIOWARE_LIGAMENTS "ligaments"
#define BIOWARE_DISSECTION "dissected"
//Health hud screws for carbon mobs
#define SCREWYHUD_NONE 0
@@ -264,3 +267,6 @@
#define BODYPART_LIFE_UPDATE_HEALTH (1<<0)
#define HUMAN_FIRE_STACK_ICON_NUM 3
#define PULL_PRONE_SLOWDOWN 0.6
#define HUMAN_CARRY_SLOWDOWN 0
+7 -1
View File
@@ -32,4 +32,10 @@
#define MOVESPEED_ID_SANITY "MOOD_SANITY"
#define MOVESPEED_ID_TASED_STATUS "TASED"
#define MOVESPEED_ID_TASED_STATUS "MOOD_SANITY"
#define MOVESPEED_ID_PRONE_DRAGGING "PRONE_DRAG"
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
#define MOVESPEED_ID_SHRUNK "SHRINK_SPEED_MODIFIER"
#define MOVESPEED_ID_GROW "GROWTH_SPEED_MODIFIER"
+14
View File
@@ -34,3 +34,17 @@
#define DEL_REAGENT 1 // reagent deleted (fully cleared)
#define ADD_REAGENT 2 // reagent added
#define REM_REAGENT 3 // reagent removed (may still exist)
//reagent bitflags, used for altering how they works
#define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body
#define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing
#define REAGENT_ONLYINVERSE (1<<2) //Only invert chem, no splitting
#define REAGENT_ONMOBMERGE (1<<3) //Call on_mob_life proc when reagents are merging.
#define REAGENT_INVISIBLE (1<<4) //Doesn't appear on handheld health analyzers.
#define REAGENT_FORCEONNEW (1<<5) //Forces a on_new() call without a data overhead
#define REAGENT_SNEAKYNAME (1<<6) //When inverted, the inverted chem uses the name of the original chem
#define REAGENT_SPLITRETAINVOL (1<<7) //Retains initial volume of chem when splitting
//Chemical reaction flags, for determining reaction specialties
#define REACTION_CLEAR_IMPURE (1<<0) //Convert into impure/pure on reaction completion
#define REACTION_CLEAR_INVERSE (1<<1) //Convert into inverse on reaction completion when purity is low enough
+1
View File
@@ -36,6 +36,7 @@
#define MED_BOT (1<<4) // Medibots
#define HONK_BOT (1<<5) // Honkbots & ED-Honks
#define FIRE_BOT (1<<6) // Firebots
#define HUG_BOT (1<<7) // Hugbots
//AI notification defines
#define NEW_BORG 1
+2
View File
@@ -44,6 +44,7 @@
#define MODE_KEY_VOCALCORDS "x"
#define MODE_MONKEY "monkeyhive"
#define MODE_SING "%"
//Spans. Robot speech, italics, etc. Applied in compose_message().
#define SPAN_ROBOT "robot"
@@ -54,6 +55,7 @@
#define SPAN_REALLYBIG "reallybig"
#define SPAN_COMMAND "command_headset"
#define SPAN_CLOWN "clown"
#define SPAN_SINGING "singing"
//bitflag #defines for return value of the radio() proc.
#define ITALICS 1
+4 -2
View File
@@ -83,7 +83,8 @@
#define INIT_ORDER_SHUTTLE -21
#define INIT_ORDER_MINOR_MAPPING -40
#define INIT_ORDER_PATH -50
#define INIT_ORDER_PERSISTENCE -100
#define INIT_ORDER_PERSISTENCE -95
#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init.
// Subsystem fire priority, from lowest to highest priority
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
@@ -97,7 +98,7 @@
#define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_WET_FLOORS 20
#define FIRE_PRIORITY_AIR 20
#define FIRE_PRIORITY_NPC 20
#define FIRE_PRIORITY_NPC 80
#define FIRE_PRIORITY_PROCESS 25
#define FIRE_PRIORITY_THROWING 25
#define FIRE_PRIORITY_SPACEDRIFT 30
@@ -114,6 +115,7 @@
#define FIRE_PRIORITY_MOBS 100
#define FIRE_PRIORITY_TGUI 110
#define FIRE_PRIORITY_TICKER 200
#define FIRE_PRIORITY_CHAT 400
#define FIRE_PRIORITY_OVERLAYS 500
#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost.
+7
View File
@@ -95,12 +95,15 @@
#define TRAIT_NOHUNGER "no_hunger"
#define TRAIT_EASYDISMEMBER "easy_dismember"
#define TRAIT_LIMBATTACHMENT "limb_attach"
#define TRAIT_NOLIMBDISABLE "no_limb_disable"
#define TRAIT_EASYLIMBDISABLE "easy_limb_disable"
#define TRAIT_TOXINLOVER "toxinlover"
#define TRAIT_NOBREATH "no_breath"
#define TRAIT_ANTIMAGIC "anti_magic"
#define TRAIT_HOLY "holy"
#define TRAIT_DEPRESSION "depression"
#define TRAIT_JOLLY "jolly"
#define TRAIT_HEADPAT_SLUT "headpat_slut"
#define TRAIT_NOCRITDAMAGE "no_crit"
#define TRAIT_NOSLIPWATER "noslip_water"
#define TRAIT_NOSLIPALL "noslip_all"
@@ -118,6 +121,7 @@
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_CALCIUM_HEALER "calcium_healer"
#define TRAIT_BEEFRIEND "beefriend"
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
@@ -125,6 +129,7 @@
// item traits
#define TRAIT_NODROP "nodrop"
//roundstart traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia"
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
@@ -145,6 +150,7 @@
#define TRAIT_MUSICIAN "musician"
#define TRAIT_CROCRIN_IMMUNE "crocin_immune"
#define TRAIT_NYMPHO "nymphomania"
#define TRAIT_FLUID_LEAK "leaky_fluids"
#define TRAIT_MASO "masochism"
#define TRAIT_HIGH_BLOOD "high_blood"
#define TRAIT_PHARMA "hepatic_pharmacokinesis"
@@ -155,6 +161,7 @@
#define TRAIT_CULT_EYES "cult_eyes"
#define TRAIT_XRAY_VISION "xray_vision"
#define TRAIT_THERMAL_VISION "thermal_vision"
//#define TRAIT_CUM_PLUS "cum_plus"
// common trait sources
+2
View File
@@ -21,6 +21,8 @@
#define LAZYCLEARLIST(L) if(L) L.Cut()
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
#define reverseList(L) reverseRange(L.Copy())
#define LAZYADDASSOC(L, K, V) if(!L) { L = list(); } L[K] += list(V);
#define LAZYREMOVEASSOC(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; }
// binary search sorted insert
// IN: Object to be inserted
-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]")
+1 -1
View File
@@ -54,7 +54,7 @@
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", "f", "g", "h") //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", "i", "j", "k", "l", "m", "n", "o") //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)
+11 -11
View File
@@ -280,34 +280,34 @@
if(GLOB.round_id)
var/statspage = CONFIG_GET(string/roundstatsurl)
var/info = statspage ? "<a href='?action=openLink&link=[url_encode(statspage)][GLOB.round_id]'>[GLOB.round_id]</a>" : GLOB.round_id
parts += "[GLOB.TAB]Round ID: <b>[info]</b>"
parts += "[FOURSPACES]Round ID: <b>[info]</b>"
var/list/voting_results = SSvote.stored_gamemode_votes
if(length(voting_results))
parts += "[GLOB.TAB]Voting: "
parts += "[FOURSPACES]Voting: "
var/total_score = 0
for(var/choice in voting_results)
var/score = voting_results[choice]
total_score += score
parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]"
parts += "[FOURSPACES][FOURSPACES][choice]: [score]"
parts += "[GLOB.TAB]Shift Duration: <B>[DisplayTimeText(world.time - SSticker.round_start_time)]</B>"
parts += "[GLOB.TAB]Station Integrity: <B>[mode.station_was_nuked ? "<span class='redtext'>Destroyed</span>" : "[popcount["station_integrity"]]%"]</B>"
parts += "[FOURSPACES]Shift Duration: <B>[DisplayTimeText(world.time - SSticker.round_start_time)]</B>"
parts += "[FOURSPACES]Station Integrity: <B>[mode.station_was_nuked ? "<span class='redtext'>Destroyed</span>" : "[popcount["station_integrity"]]%"]</B>"
var/total_players = GLOB.joined_player_list.len
if(total_players)
parts+= "[GLOB.TAB]Total Population: <B>[total_players]</B>"
parts+= "[FOURSPACES]Total Population: <B>[total_players]</B>"
if(station_evacuated)
parts += "<BR>[GLOB.TAB]Evacuation Rate: <B>[popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)</B>"
parts += "[GLOB.TAB](on emergency shuttle): <B>[popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)</B>"
parts += "[GLOB.TAB]Survival Rate: <B>[popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)</B>"
parts += "<BR>[FOURSPACES]Evacuation Rate: <B>[popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)</B>"
parts += "[FOURSPACES](on emergency shuttle): <B>[popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)</B>"
parts += "[FOURSPACES]Survival Rate: <B>[popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)</B>"
if(SSblackbox.first_death)
var/list/ded = SSblackbox.first_death
if(ded.len)
parts += "[GLOB.TAB]First Death: <b>[ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]</b>"
parts += "[FOURSPACES]First Death: <b>[ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]</b>"
//ignore this comment, it fixes the broken sytax parsing caused by the " above
else
parts += "[GLOB.TAB]<i>Nobody died this shift!</i>"
parts += "[FOURSPACES]<i>Nobody died this shift!</i>"
return parts.Join("<br>")
/client/proc/roundend_report_file()
+19 -4
View File
@@ -171,12 +171,27 @@ GLOBAL_LIST_INIT(bitfields, list(
"rad_flags" = list(
"RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS,
"RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE,
),
),
"disease_flags" = list(
"CURABLE" = CURABLE,
"CAN_CARRY" = CAN_CARRY,
"CAN_RESIST" = CAN_RESIST
),
),
"chemical_flags" = list(
"REAGENT_DEAD_PROCESS" = REAGENT_DEAD_PROCESS,
"REAGENT_DONOTSPLIT" = REAGENT_DONOTSPLIT,
"REAGENT_ONLYINVERSE" = REAGENT_ONLYINVERSE,
"REAGENT_ONMOBMERGE" = REAGENT_ONMOBMERGE,
"REAGENT_INVISIBLE" = REAGENT_INVISIBLE,
"REAGENT_FORCEONNEW" = REAGENT_FORCEONNEW,
"REAGENT_SNEAKYNAME" = REAGENT_SNEAKYNAME,
"REAGENT_SPLITRETAINVOL" = REAGENT_SPLITRETAINVOL
),
"clear_conversion" = list(
"REACTION_CLEAR_IMPURE" = REACTION_CLEAR_IMPURE,
"REACTION_CLEAR_INVERSE" = REACTION_CLEAR_INVERSE
),
"organ_flags" = list(
"ORGAN_SYNTHETIC" = ORGAN_SYNTHETIC,
@@ -185,5 +200,5 @@ GLOBAL_LIST_INIT(bitfields, list(
"ORGAN_EXTERNAL" = ORGAN_EXTERNAL,
"ORGAN_VITAL" = ORGAN_VITAL,
"ORGAN_NO_SPOIL" = ORGAN_NO_SPOIL
),
))
),
))
+4
View File
@@ -13,6 +13,8 @@
#define POLL_IGNORE_GOLEM "golem"
#define POLL_IGNORE_SWARMER "swarmer"
#define POLL_IGNORE_DRONE "drone"
#define POLL_IGNORE_DEMON "demon"
#define POLL_IGNORE_WIZARD "wizard"
GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_SENTIENCE_POTION = "Sentience potion",
@@ -28,6 +30,8 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_GOLEM = "Golems",
POLL_IGNORE_SWARMER = "Swarmer shells",
POLL_IGNORE_DRONE = "Drone shells",
POLL_IGNORE_DEMON = "Demons",
POLL_IGNORE_WIZARD = "Wizards",
))
GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore())
-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)
-2
View File
@@ -6,8 +6,6 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
GLOBAL_VAR_INIT(fileaccess_timer, 0)
GLOBAL_VAR_INIT(TAB, "&nbsp;&nbsp;&nbsp;&nbsp;")
GLOBAL_DATUM_INIT(data_core, /datum/datacore, new)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
@@ -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
+67
View File
@@ -0,0 +1,67 @@
SUBSYSTEM_DEF(chat)
name = "Chat"
flags = SS_TICKER|SS_NO_INIT
wait = 1
priority = FIRE_PRIORITY_CHAT
init_order = INIT_ORDER_CHAT
var/list/payload = list()
/datum/controller/subsystem/chat/fire()
for(var/i in payload)
var/client/C = i
C << output(payload[C], "browseroutput:output")
payload -= C
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE)
if(!target || !message)
return
if(!istext(message))
stack_trace("to_chat called with invalid input type")
return
if(target == world)
target = GLOB.clients
//Some macros remain in the string even after parsing and fuck up the eventual output
message = replacetext(message, "\improper", "")
message = replacetext(message, "\proper", "")
if(handle_whitespace)
message = replacetext(message, "\n", "<br>")
message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
message += "<br>"
//url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
//Do the double-encoding here to save nanoseconds
var/twiceEncoded = url_encode(url_encode(message))
if(islist(target))
for(var/I in target)
var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
continue
if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
C.chatOutput.messageQueue += message
continue
payload[C] += twiceEncoded
else
var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible
if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file.
return
if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue
C.chatOutput.messageQueue += message
return
payload[C] += twiceEncoded
+1 -1
View File
@@ -1,6 +1,6 @@
SUBSYSTEM_DEF(npcpool)
name = "NPC Pool"
flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND
flags = SS_KEEP_TIMING | SS_NO_INIT
priority = FIRE_PRIORITY_NPC
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+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"
@@ -138,6 +138,8 @@
friend_talk(message)
/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
if (client?.prefs.chat_on_map && (client.prefs.see_chat_non_mob || ismob(speaker)))
create_chat_message(speaker, message_language, raw_message, spans, message_mode)
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode))
/mob/camera/imaginary_friend/proc/friend_talk(message)
+244
View File
@@ -0,0 +1,244 @@
#define CHAT_MESSAGE_SPAWN_TIME 0.2 SECONDS
#define CHAT_MESSAGE_LIFESPAN 5 SECONDS
#define CHAT_MESSAGE_EOL_FADE 0.7 SECONDS
#define CHAT_MESSAGE_EXP_DECAY 0.7 // Messages decay at pow(factor, idx in stack)
#define CHAT_MESSAGE_HEIGHT_DECAY 0.9 // Increase message decay based on the height of the message
#define CHAT_MESSAGE_APPROX_LHEIGHT 11 // Approximate height in pixels of an 'average' line, used for height decay
#define CHAT_MESSAGE_WIDTH 96 // pixels
#define CHAT_MESSAGE_MAX_LENGTH 110 // characters
#define WXH_TO_HEIGHT(x) text2num(copytext((x), findtextEx((x), "x") + 1)) // thanks lummox
/**
* # Chat Message Overlay
*
* Datum for generating a message overlay on the map
*/
/datum/chatmessage
/// The visual element of the chat messsage
var/image/message
/// The location in which the message is appearing
var/atom/message_loc
/// The client who heard this message
var/client/owned_by
/// Contains the scheduled destruction time
var/scheduled_destruction
/// Contains the approximate amount of lines for height decay
var/approx_lines
/**
* Constructs a chat message overlay
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = list(), lifespan = CHAT_MESSAGE_LIFESPAN)
. = ..()
if (!istype(target))
CRASH("Invalid target given for chatmessage")
if(QDELETED(owner) || !istype(owner) || !owner.client)
stack_trace("/datum/chatmessage created with [isnull(owner) ? "null" : "invalid"] mob owner")
qdel(src)
return
INVOKE_ASYNC(src, .proc/generate_image, text, target, owner, extra_classes, lifespan)
/datum/chatmessage/Destroy()
if (owned_by)
if (owned_by.seen_messages)
LAZYREMOVEASSOC(owned_by.seen_messages, message_loc, src)
owned_by.images.Remove(message)
owned_by = null
message_loc = null
message = null
return ..()
/**
* Calls qdel on the chatmessage when its parent is deleted, used to register qdel signal
*/
/datum/chatmessage/proc/on_parent_qdel()
qdel(src)
/**
* Generates a chat message image representation
*
* Arguments:
* * text - The text content of the overlay
* * target - The target atom to display the overlay at
* * owner - The mob that owns this overlay, only this mob will be able to view it
* * extra_classes - Extra classes to apply to the span that holds the text
* * lifespan - The lifespan of the message in deciseconds
*/
/datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan)
// Register client who owns this message
owned_by = owner.client
RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/on_parent_qdel)
// Clip message
var/maxlen = owned_by.prefs.max_chat_length
if (length_char(text) > maxlen)
text = copytext_char(text, 1, maxlen + 1) + "..." // BYOND index moment
// Calculate target color if not already present
if (!target.chat_color || target.chat_color_name != target.name)
target.chat_color = colorize_string(target.name)
target.chat_color_darkened = colorize_string(target.name, 0.85, 0.85)
target.chat_color_name = target.name
// Get rid of any URL schemes that might cause BYOND to automatically wrap something in an anchor tag
var/static/regex/url_scheme = new(@"[A-Za-z][A-Za-z0-9+-\.]*:\/\/", "g")
text = replacetext(text, url_scheme, "")
// Reject whitespace
var/static/regex/whitespace = new(@"^\s*$")
if (whitespace.Find(text))
qdel(src)
return
// Non mobs speakers can be small
if (!ismob(target))
extra_classes |= "small"
// Append radio icon if from a virtual speaker
if (extra_classes.Find("virtual-speaker"))
var/image/r_icon = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "radio")
text = "\icon[r_icon]&nbsp;" + text
// We dim italicized text to make it more distinguishable from regular text
var/tgt_color = extra_classes.Find("italics") ? target.chat_color_darkened : target.chat_color
// Approximate text height
// Note we have to replace HTML encoded metacharacters otherwise MeasureText will return a zero height
// BYOND Bug #2563917
// Construct text
var/static/regex/html_metachars = new(@"&[A-Za-z]{1,7};", "g")
var/complete_text = "<span class='center maptext [extra_classes.Join(" ")]' style='color: [tgt_color]'>[text]</span>"
var/mheight = WXH_TO_HEIGHT(owned_by.MeasureText(replacetext(complete_text, html_metachars, "m"), null, CHAT_MESSAGE_WIDTH))
approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT)
// Translate any existing messages upwards, apply exponential decay factors to timers
message_loc = target
if (owned_by.seen_messages)
var/idx = 1
var/combined_height = approx_lines
for(var/msg in owned_by.seen_messages[message_loc])
var/datum/chatmessage/m = msg
animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME)
combined_height += m.approx_lines
var/sched_remaining = m.scheduled_destruction - world.time
if (sched_remaining > CHAT_MESSAGE_SPAWN_TIME)
var/remaining_time = (sched_remaining) * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height)
m.scheduled_destruction = world.time + remaining_time
addtimer(CALLBACK(m, .proc/end_of_life), remaining_time, TIMER_UNIQUE|TIMER_OVERRIDE)
// Build message image
message = image(loc = message_loc, layer = CHAT_LAYER)
message.plane = GAME_PLANE
message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART
message.alpha = 0
message.pixel_y = owner.bound_height * 0.95
message.maptext_width = CHAT_MESSAGE_WIDTH
message.maptext_height = mheight
message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5
message.maptext = complete_text
// View the message
LAZYADDASSOC(owned_by.seen_messages, message_loc, src)
owned_by.images |= message
animate(message, alpha = 255, time = CHAT_MESSAGE_SPAWN_TIME)
// Prepare for destruction
scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE)
addtimer(CALLBACK(src, .proc/end_of_life), lifespan - CHAT_MESSAGE_EOL_FADE, TIMER_UNIQUE|TIMER_OVERRIDE)
/**
* Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion
*/
/datum/chatmessage/proc/end_of_life(fadetime = CHAT_MESSAGE_EOL_FADE)
animate(message, alpha = 0, time = fadetime, flags = ANIMATION_PARALLEL)
QDEL_IN(src, fadetime)
/**
* Creates a message overlay at a defined location for a given speaker
*
* Arguments:
* * speaker - The atom who is saying this message
* * message_language - The language that the message is said in
* * raw_message - The text content of the message
* * spans - Additional classes to be added to the message
* * message_mode - Bitflags relating to the mode of the message
*/
/mob/proc/create_chat_message(atom/movable/speaker, datum/language/message_language, raw_message, list/spans, message_mode)
// Ensure the list we are using, if present, is a copy so we don't modify the list provided to us
spans = spans ? spans.Copy() : list()
// Check for virtual speakers (aka hearing a message through a radio)
var/atom/movable/originalSpeaker = speaker
if (istype(speaker, /atom/movable/virtualspeaker))
var/atom/movable/virtualspeaker/v = speaker
speaker = v.source
spans |= "virtual-speaker"
// Ignore virtual speaker (most often radio messages) from ourself
if (originalSpeaker != src && speaker == src)
return
// Display visual above source
new /datum/chatmessage(lang_treat(speaker, message_language, raw_message, spans, null, TRUE), speaker, src, spans)
// Tweak these defines to change the available color ranges
#define CM_COLOR_SAT_MIN 0.6
#define CM_COLOR_SAT_MAX 0.7
#define CM_COLOR_LUM_MIN 0.65
#define CM_COLOR_LUM_MAX 0.75
/**
* Gets a color for a name, will return the same color for a given string consistently within a round.atom
*
* Note that this proc aims to produce pastel-ish colors using the HSL colorspace. These seem to be favorable for displaying on the map.
*
* Arguments:
* * name - The name to generate a color for
* * sat_shift - A value between 0 and 1 that will be multiplied against the saturation
* * lum_shift - A value between 0 and 1 that will be multiplied against the luminescence
*/
/datum/chatmessage/proc/colorize_string(name, sat_shift = 1, lum_shift = 1)
// seed to help randomness
var/static/rseed = rand(1,26)
// get hsl using the selected 6 characters of the md5 hash
var/hash = copytext(md5(name + GLOB.round_id), rseed, rseed + 6)
var/h = hex2num(copytext(hash, 1, 3)) * (360 / 255)
var/s = (hex2num(copytext(hash, 3, 5)) >> 2) * ((CM_COLOR_SAT_MAX - CM_COLOR_SAT_MIN) / 63) + CM_COLOR_SAT_MIN
var/l = (hex2num(copytext(hash, 5, 7)) >> 2) * ((CM_COLOR_LUM_MAX - CM_COLOR_LUM_MIN) / 63) + CM_COLOR_LUM_MIN
// adjust for shifts
s *= clamp(sat_shift, 0, 1)
l *= clamp(lum_shift, 0, 1)
// convert to rgb
var/h_int = round(h/60) // mapping each section of H to 60 degree sections
var/c = (1 - abs(2 * l - 1)) * s
var/x = c * (1 - abs((h / 60) % 2 - 1))
var/m = l - c * 0.5
x = (x + m) * 255
c = (c + m) * 255
m *= 255
switch(h_int)
if(0)
return "#[num2hex(c, 2)][num2hex(x, 2)][num2hex(m, 2)]"
if(1)
return "#[num2hex(x, 2)][num2hex(c, 2)][num2hex(m, 2)]"
if(2)
return "#[num2hex(m, 2)][num2hex(c, 2)][num2hex(x, 2)]"
if(3)
return "#[num2hex(m, 2)][num2hex(x, 2)][num2hex(c, 2)]"
if(4)
return "#[num2hex(x, 2)][num2hex(m, 2)][num2hex(c, 2)]"
if(5)
return "#[num2hex(c, 2)][num2hex(m, 2)][num2hex(x, 2)]"
+7 -7
View File
@@ -3,7 +3,7 @@
var/volume
var/e_range
/datum/component/footstep/Initialize(volume_ = 0.4, e_range_ = -1)
/datum/component/footstep/Initialize(volume_ = 0.5, e_range_ = -1)
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
volume = volume_
@@ -32,7 +32,7 @@
return
if(ishuman(C) && C.m_intent == MOVE_INTENT_WALK)
v /= 2
e -= 4
e -= 5
steps++
if(steps >= 3)
@@ -58,7 +58,7 @@
if(isclawfoot(LM))
if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps
v /= 3
e -= 4
e -= 5
playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]),
GLOB.clawfootstep[T.clawfootstep][2] * v,
@@ -89,20 +89,20 @@
return
if(ishuman(LM)) //for proper humans, they're special
var/mob/living/carbon/human/H = LM
var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET) || (H.shoes && (H.shoes.body_parts_covered & FEET)))
var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature
playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
return
if(feetCover) //are we wearing shoes
if(H.shoes || feetCover) //are we wearing shoes
playsound(T, pick(GLOB.footstep[T.footstep][1]),
GLOB.footstep[T.footstep][2] * v,
TRUE,
GLOB.footstep[T.footstep][3] + e)
if(!feetCover) //are we NOT wearing shoes
if((!H.shoes && !feetCover)) //are we NOT wearing shoes
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
GLOB.barefootstep[T.barefootstep][2] * v,
TRUE,
GLOB.barefootstep[T.barefootstep][3] + e)
GLOB.barefootstep[T.barefootstep][3] + e)
+17 -13
View File
@@ -21,6 +21,8 @@
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
RegisterSignal(parent, COMSIG_INCREASE_SANITY, .proc/IncreaseSanity)
RegisterSignal(parent, COMSIG_DECREASE_SANITY, .proc/DecreaseSanity)
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
var/mob/living/owner = parent
@@ -129,23 +131,23 @@
switch(mood_level)
if(1)
DecreaseSanity(0.2)
DecreaseSanity(src, 0.2)
if(2)
DecreaseSanity(0.125, SANITY_CRAZY)
DecreaseSanity(src, 0.125, SANITY_CRAZY)
if(3)
DecreaseSanity(0.075, SANITY_UNSTABLE)
DecreaseSanity(src, 0.075, SANITY_UNSTABLE)
if(4)
DecreaseSanity(0.025, SANITY_DISTURBED)
DecreaseSanity(src, 0.025, SANITY_DISTURBED)
if(5)
IncreaseSanity(0.1)
IncreaseSanity(src, 0.1)
if(6)
IncreaseSanity(0.15)
IncreaseSanity(src, 0.15)
if(7)
IncreaseSanity(0.20)
IncreaseSanity(src, 0.20)
if(8)
IncreaseSanity(0.25, SANITY_GREAT)
IncreaseSanity(src, 0.25, SANITY_GREAT)
if(9)
IncreaseSanity(0.4, SANITY_GREAT)
IncreaseSanity(src, 0.4, SANITY_GREAT)
if(insanity_effect != holdmyinsanityeffect)
if(insanity_effect > holdmyinsanityeffect)
@@ -218,9 +220,9 @@
master.crit_threshold = (master.crit_threshold - insanity_effect) + newval
insanity_effect = newval
/datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE)
/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE)
if(sanity < minimum) //This might make KevinZ stop fucking pinging me.
IncreaseSanity(0.5)
IncreaseSanity(src, 0.5)
else
sanity = max(minimum, sanity - amount)
if(sanity < SANITY_UNSTABLE)
@@ -229,13 +231,13 @@
else
insanity_effect = (MINOR_INSANITY_PEN)
/datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL)
/datum/component/mood/proc/IncreaseSanity(datum/source, amount, maximum = SANITY_NEUTRAL)
// Disturbed stops you from getting any more sane - I'm just gonna bung this in here
var/mob/living/owner = parent
if(HAS_TRAIT(owner, TRAIT_UNSTABLE))
return
if(sanity > maximum)
DecreaseSanity(0.5) //Removes some sanity to go back to our current limit.
DecreaseSanity(src, 0.5) //Removes some sanity to go back to our current limit.
else
sanity = min(maximum, sanity + amount)
if(sanity > SANITY_CRAZY)
@@ -262,6 +264,8 @@
if(the_event.timeout)
addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE)
return the_event
/datum/component/mood/proc/clear_event(datum/source, category)
var/datum/mood_event/event = mood_events[category]
if(!event)
+58 -30
View File
@@ -18,6 +18,7 @@
var/ride_check_rider_incapacitated = FALSE
var/ride_check_rider_restrained = FALSE
var/ride_check_ridden_incapacitated = FALSE
var/list/offhands = list() // keyed list containing all the current riding offsets associated by mob
/datum/component/riding/Initialize()
if(!ismovableatom(parent))
@@ -162,12 +163,12 @@
if(!Process_Spacemove(direction) || !isturf(AM.loc))
return
step(AM, direction)
if((direction & (direction - 1)) && (AM.loc == next)) //moved diagonally
last_move_diagonal = TRUE
else
last_move_diagonal = FALSE
handle_vehicle_layer()
handle_vehicle_offsets()
else
@@ -195,21 +196,47 @@
. = ..()
RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee)
/datum/component/riding/human/vehicle_mob_unbuckle(datum/source, mob/living/M, force = FALSE)
var/mob/living/carbon/human/H = parent
H.remove_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING)
. = ..()
/datum/component/riding/human/vehicle_mob_buckle(datum/source, mob/living/M, force = FALSE)
. = ..()
var/mob/living/carbon/human/H = parent
H.add_movespeed_modifier(MOVESPEED_ID_HUMAN_CARRYING, multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN)
/datum/component/riding/human/proc/on_host_unarmed_melee(atom/target)
var/mob/living/carbon/human/AM = parent
if(AM.a_intent == INTENT_DISARM && (target in AM.buckled_mobs))
var/mob/living/carbon/human/H = parent
if(H.a_intent == INTENT_DISARM && (target in H.buckled_mobs))
force_dismount(target)
/datum/component/riding/human/handle_vehicle_layer()
var/atom/movable/AM = parent
if(AM.buckled_mobs && AM.buckled_mobs.len)
if(AM.dir == SOUTH)
AM.layer = ABOVE_MOB_LAYER
for(var/mob/M in AM.buckled_mobs) //ensure proper layering of piggyback and carry, sometimes weird offsets get applied
M.layer = MOB_LAYER
if(!AM.buckle_lying)
if(AM.dir == SOUTH)
AM.layer = ABOVE_MOB_LAYER
else
AM.layer = OBJ_LAYER
else
AM.layer = OBJ_LAYER
if(AM.dir == NORTH)
AM.layer = OBJ_LAYER
else
AM.layer = ABOVE_MOB_LAYER
else
AM.layer = MOB_LAYER
/datum/component/riding/human/get_offsets(pass_index)
var/mob/living/carbon/human/H = parent
if(H.buckle_lying)
return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(0, 6), TEXT_WEST = list(0, 6))
else
return list(TEXT_NORTH = list(0, 6), TEXT_SOUTH = list(0, 6), TEXT_EAST = list(-6, 4), TEXT_WEST = list( 6, 4))
/datum/component/riding/human/force_dismount(mob/living/user)
var/atom/movable/AM = parent
AM.unbuckle_mob(user)
@@ -273,33 +300,34 @@
M.throw_at(target, 14, 5, AM)
M.Knockdown(60)
/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1)
var/atom/movable/AM = parent
var/amount_equipped = 0
/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1, mob/living/riding_target_override)
var/list/equipped
var/mob/living/L = riding_target_override ? riding_target_override : user
for(var/amount_needed = amount_required, amount_needed > 0, amount_needed--)
var/obj/item/riding_offhand/inhand = new /obj/item/riding_offhand(user)
inhand.rider = user
inhand.parent = AM
if(user.put_in_hands(inhand, TRUE))
amount_equipped++
else
var/obj/item/riding_offhand/inhand = new
inhand.rider = L
inhand.parent = parent
if(!user.put_in_hands(inhand, TRUE))
qdel(inhand) // it isn't going to be added to offhands anyway
break
LAZYADD(equipped, inhand)
var/amount_equipped = LAZYLEN(equipped)
if(amount_equipped)
LAZYADD(offhands[L], equipped)
if(amount_equipped >= amount_required)
return TRUE
else
unequip_buckle_inhands(user)
return FALSE
unequip_buckle_inhands(L)
return FALSE
/datum/component/riding/proc/unequip_buckle_inhands(mob/living/carbon/user)
var/atom/movable/AM = parent
for(var/obj/item/riding_offhand/O in user.contents)
if(O.parent != AM)
CRASH("RIDING OFFHAND ON WRONG MOB")
continue
if(O.selfdeleting)
continue
else
qdel(O)
for(var/a in offhands[user])
LAZYREMOVE(offhands[user], a)
if(a) //edge cases null entries
var/obj/item/riding_offhand/O = a
if(O.parent != parent)
CRASH("RIDING OFFHAND ON WRONG MOB")
else if(!O.selfdeleting)
qdel(O)
return TRUE
/obj/item/riding_offhand
@@ -318,7 +346,7 @@
. = ..()
/obj/item/riding_offhand/equipped()
if(loc != rider)
if(loc != rider && loc != parent)
selfdeleting = TRUE
qdel(src)
. = ..()
@@ -328,4 +356,4 @@
if(selfdeleting)
if(rider in AM.buckled_mobs)
AM.unbuckle_mob(rider)
. = ..()
. = ..()
+2
View File
@@ -354,10 +354,12 @@
else
RemoveSymptom(pick(symptoms))
symptoms += S
S.OnAdd(src)
// Simply removes the symptom.
/datum/disease/advance/proc/RemoveSymptom(datum/symptom/S)
symptoms -= S
S.OnRemove(src)
// Neuter a symptom, so it will only affect stats
/datum/disease/advance/proc/NeuterSymptom(datum/symptom/S)
@@ -2,7 +2,7 @@
name = "Bee Infestation"
desc = "Causes the host to cough toxin bees and occasionally synthesize toxin."
stealth = -2
resistance = 2
resistance = 14
stage_speed = 1
transmittable = 1
level = 9
@@ -11,14 +11,15 @@
symptom_delay_max = 20
var/honey = FALSE
var/toxic_bees= FALSE
threshold_desc = "<b>Resistance 14:</b> Host synthesizes honey instead of toxins, bees now sting with honey instead of toxin.<br>\
<b>Transmission 10:</b> Bees now contain a completely random toxin, unless resistance exceeds 14"
threshold_desc = "<b>Resistance 14:</b> The bees become symbiotic with the host, synthesizing honey and no longer stinging the stomach lining, and no longer attacking the host.<br>\
<b>Transmission 10:</b> Bees now contain a completely random toxin, unless resistance exceeds 14"
/datum/symptom/beesease/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["resistance"] >= 14)
honey = TRUE
severity = 0
if(A.properties["transmittable"] >= 10)
toxic_bees = TRUE
@@ -38,18 +39,20 @@
to_chat(M, "<span class='notice'>You can't get the taste of honey out of your mouth!.</span>")
M.reagents.add_reagent(/datum/reagent/consumable/honey, 2)
else
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
M.adjustToxLoss(5)
M.updatehealth()
if(4, 5)
if(honey)
ADD_TRAIT(M, TRAIT_BEEFRIEND, DISEASE_TRAIT)
if(prob(15))
to_chat(M, "<span class='notice'>Your stomach squirms.</span>")
if(prob(15))
if(prob(25))
if(honey)
to_chat(M, "<span class='notice'>You can't get the taste of honey out of your mouth!.</span>")
M.reagents.add_reagent_list(list(/datum/reagent/consumable/honey = 5, /datum/reagent/medicine/insulin = 15)) //honey rooooughly equivalent to 1.5u omnizine. due to how honey synthesizes 7.5 sugar per unit, the large amounts of insulin are necessary to prevent hyperglycaemic shock due to the bees
M.reagents.add_reagent_list(list(/datum/reagent/consumable/honey = 10, /datum/reagent/consumable/honey/special = 5, /datum/reagent/medicine/insulin = 5)) //insulin prevents hyperglycemic shock
else
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
to_chat(M, "<span class='danger'>Your stomach stings painfully.</span>")
M.adjustToxLoss(5)
M.updatehealth()
if(prob(10))
@@ -60,10 +63,12 @@
if(prob(10))
M.visible_message("<span class='danger'>[M] coughs up a bee!</span>", \
"<span class='userdanger'>You cough up a bee!</span>")
if(honey)
var/mob/living/simple_animal/hostile/poison/bees/B = new(M.loc)
B.assign_reagent(GLOB.chemical_reagents_list[/datum/reagent/consumable/honey])
else if(toxic_bees)
if(toxic_bees)
new /mob/living/simple_animal/hostile/poison/bees/toxin(M.loc)
else
new /mob/living/simple_animal/hostile/poison/bees(M.loc)
/datum/symptom/beesease/End(datum/disease/advance/A)
if(!..())
return
REMOVE_TRAIT(A.affected_mob, TRAIT_BEEFRIEND, DISEASE_TRAIT)
@@ -1,76 +1,6 @@
/*
//////////////////////////////////////
Choking
Very very noticable.
Lowers resistance.
Decreases stage speed.
Decreases transmittablity tremendously.
Moderate Level.
Bonus
Inflicts spikes of oxyloss
//////////////////////////////////////
*/
/datum/symptom/choking
name = "Choking"
desc = "The virus causes inflammation of the host's air conduits, leading to intermittent choking."
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -4
level = 3
severity = 3
base_message_chance = 15
symptom_delay_min = 10
symptom_delay_max = 30
threshold_desc = "<b>Stage Speed 8:</b> Causes choking more frequently.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
/datum/symptom/choking/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 8)
symptom_delay_min = 7
symptom_delay_max = 24
if(A.properties["stealth"] >= 4)
suppress_warning = TRUE
/datum/symptom/choking/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
if(prob(base_message_chance) && !suppress_warning)
to_chat(M, "<span class='warning'>[pick("You're having difficulty breathing.", "Your breathing becomes heavy.")]</span>")
if(3, 4)
if(!suppress_warning)
to_chat(M, "<span class='warning'>[pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")]</span>")
else
to_chat(M, "<span class='warning'>You feel very [pick("dizzy","woozy","faint")].</span>") //fake bloodloss messages
Choke_stage_3_4(M, A)
M.emote("gasp")
else
to_chat(M, "<span class='userdanger'>[pick("You're choking!", "You can't breathe!")]</span>")
Choke(M, A)
M.emote("gasp")
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
M.adjustOxyLoss(rand(6,13))
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
M.adjustOxyLoss(rand(10,18))
return 1
/*
//////////////////////////////////////
Asphyxiation
Very very noticable.
@@ -20,9 +20,9 @@ Bonus
name = "Spontaneous Combustion"
desc = "The virus turns fat into an extremely flammable compound, and raises the body's temperature, making the host burst into flames spontaneously."
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -4
resistance = -2
stage_speed = -3
transmittable = -3
level = 6
severity = 5
base_message_chance = 20
@@ -73,12 +73,16 @@ Bonus
return 1
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
M.adjust_fire_stacks(3 * power)
if(HAS_TRAIT(M, TRAIT_FAT))
M.adjust_fire_stacks(6 * power)
else
M.adjust_fire_stacks(3 * power)
M.take_overall_damage(burn = 5 * power, required_status = BODYPART_ORGANIC)
if(infective)
A.spread(4)
return 1
/*
//////////////////////////////////////
@@ -152,7 +156,7 @@ Bonus
M.IgniteMob()
to_chat(M, "<span class='userdanger'>Your skin erupts into an inferno!</span>")
M.emote("scream")
/datum/symptom/alkali/proc/Alkali_fire_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = 6 * power
M.adjust_fire_stacks(get_stacks)
@@ -1,78 +1,82 @@
/*
//////////////////////////////////////
DNA Saboteur
Very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
Cleans the DNA of a person and then randomly gives them a trait.
//////////////////////////////////////
*/
/datum/symptom/genetic_mutation
name = "Deoxyribonucleic Acid Saboteur"
desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
stealth = -2
resistance = -3
stage_speed = 0
transmittable = -3
level = 6
severity = 4
var/list/possible_mutations
var/archived_dna = null
base_message_chance = 50
symptom_delay_min = 60
symptom_delay_max = 120
var/no_reset = FALSE
threshold_desc = "<b>Resistance 8:</b> Causes two harmful mutations at once.<br>\
<b>Stage Speed 10:</b> Increases mutation frequency.<br>\
<b>Stealth 5:</b> The mutations persist even if the virus is cured."
/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/C = A.affected_mob
if(!C.has_dna())
return
switch(A.stage)
if(4, 5)
to_chat(C, "<span class='warning'>[pick("Your skin feels itchy.", "You feel light headed.")]</span>")
C.dna.remove_mutation_group(possible_mutations)
for(var/i in 1 to power)
C.randmut(possible_mutations)
// Archive their DNA before they were infected.
/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stealth"] >= 5) //don't restore dna after curing
no_reset = TRUE
if(A.properties["stage_rate"] >= 10) //mutate more often
symptom_delay_min = 20
symptom_delay_max = 60
if(A.properties["resistance"] >= 8) //mutate twice
power = 2
possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT]
var/mob/living/carbon/M = A.affected_mob
if(M)
if(!M.has_dna())
return
archived_dna = M.dna.mutation_index
// Give them back their old DNA when cured.
/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
if(!..())
return
if(!no_reset)
var/mob/living/carbon/M = A.affected_mob
if(M && archived_dna)
if(!M.has_dna())
return
M.dna.mutation_index = archived_dna
M.domutcheck()
/*
//////////////////////////////////////
DNA Saboteur
Very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
Cleans the DNA of a person and then randomly gives them a trait.
//////////////////////////////////////
*/
/datum/symptom/genetic_mutation
name = "Deoxyribonucleic Acid Saboteur"
desc = "The virus bonds with the DNA of the host, causing damaging mutations until removed."
stealth = -2
resistance = -3
stage_speed = 0
transmittable = -3
level = 6
severity = 4
var/list/possible_mutations
var/archived_dna = null
base_message_chance = 50
symptom_delay_min = 60
symptom_delay_max = 120
var/no_reset = FALSE
threshold_desc = "<b>Resistance 8:</b> Causes two harmful mutations at once.<br>\
<b>Stage Speed 10:</b> Increases mutation frequency.<br>\
<b>Stage Speed 14:</b> Mutations will be beneficial.<br>\
<b>Stealth 5:</b> The mutations persist even if the virus is cured."
/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/C = A.affected_mob
if(!C.has_dna())
return
switch(A.stage)
if(4, 5)
to_chat(C, "<span class='warning'>[pick("Your skin feels itchy.", "You feel light headed.")]</span>")
C.dna.remove_mutation_group(possible_mutations)
for(var/i in 1 to power)
C.randmut(possible_mutations)
// Archive their DNA before they were infected.
/datum/symptom/genetic_mutation/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stealth"] >= 5) //don't restore dna after curing
no_reset = TRUE
if(A.properties["stage_rate"] >= 10) //mutate more often
symptom_delay_min = 20
symptom_delay_max = 60
if(A.properties["resistance"] >= 8) //mutate twice
power = 2
if(A.properties["stage_rate"] >= 14)
possible_mutations = (GLOB.good_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT]
else
possible_mutations = (GLOB.bad_mutations | GLOB.not_good_mutations) - GLOB.all_mutations[RACEMUT]
var/mob/living/carbon/M = A.affected_mob
if(M)
if(!M.has_dna())
return
archived_dna = M.dna.mutation_index
// Give them back their old DNA when cured.
/datum/symptom/genetic_mutation/End(datum/disease/advance/A)
if(!..())
return
if(!no_reset)
var/mob/living/carbon/M = A.affected_mob
if(M && archived_dna)
if(!M.has_dna())
return
M.dna.mutation_index = archived_dna
M.domutcheck()
@@ -18,23 +18,23 @@ Bonus
/datum/symptom/hallucigen
name = "Hallucigen"
desc = "The virus stimulates the brain, causing occasional hallucinations."
stealth = -2
stealth = 1
resistance = -3
stage_speed = -3
stage_speed = -1
transmittable = -1
level = 5
severity = 2
base_message_chance = 25
symptom_delay_min = 25
symptom_delay_max = 90
symptom_delay_min = 10
symptom_delay_max = 70
var/fake_healthy = FALSE
threshold_desc = "<b>Stage Speed 7:</b> Increases the amount of hallucinations.<br>\
<b>Stealth 4:</b> The virus mimics positive symptoms.."
<b>Stealth 2:</b> The virus mimics positive symptoms.."
/datum/symptom/hallucigen/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stealth"] >= 4) //fake good symptom messages
if(A.properties["stealth"] >= 2) //fake good symptom messages
fake_healthy = TRUE
base_message_chance = 50
if(A.properties["stage_rate"] >= 7) //stronger hallucinations
+415 -466
View File
@@ -1,466 +1,415 @@
/datum/symptom/heal
name = "Basic Healing (does nothing)" //warning for adminspawn viruses
desc = "You should not be seeing this."
stealth = 0
resistance = 0
stage_speed = 0
transmittable = 0
level = -1 //not obtainable
base_message_chance = 20 //here used for the overlays
symptom_delay_min = 1
symptom_delay_max = 1
var/passive_message = "" //random message to infected but not actively healing people
threshold_desc = "<b>Stage Speed 6:</b> Doubles healing speed.<br>\
<b>Stealth 4:</b> Healing will no longer be visible to onlookers."
/datum/symptom/heal/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 6) //stronger healing
power = 2
/datum/symptom/heal/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
var/effectiveness = CanHeal(A)
if(!effectiveness)
if(passive_message && prob(2) && passive_message_condition(M))
to_chat(M, passive_message)
return
else
Heal(M, A, effectiveness)
return
/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
return power
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
return TRUE
/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
return TRUE
/datum/symptom/heal/starlight
name = "Starlight Condensation"
desc = "The virus reacts to direct starlight, producing regenerative chemicals. Works best against toxin-based damage."
stealth = -1
resistance = -2
stage_speed = 0
transmittable = 1
level = 6
passive_message = "<span class='notice'>You miss the feeling of starlight on your skin.</span>"
var/nearspace_penalty = 0.3
threshold_desc = "<b>Stage Speed 6:</b> Increases healing speed.<br>\
<b>Transmission 6:</b> Removes penalty for only being close to space."
/datum/symptom/heal/starlight/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["transmittable"] >= 6)
nearspace_penalty = 1
if(A.properties["stage_rate"] >= 6)
power = 2
/datum/symptom/heal/starlight/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
if(istype(get_turf(M), /turf/open/space))
return power
else
for(var/turf/T in view(M, 2))
if(istype(T, /turf/open/space))
return power * nearspace_penalty
/datum/symptom/heal/starlight/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = actual_power
if(M.getToxLoss() && prob(5))
to_chat(M, "<span class='notice'>Your skin tingles as the starlight seems to heal you.</span>")
M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
return
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
M.update_damage_overlays()
return 1
/datum/symptom/heal/starlight/passive_message_condition(mob/living/M)
if(M.getBruteLoss() || M.getFireLoss() || M.getToxLoss())
return TRUE
return FALSE
/datum/symptom/heal/chem
name = "Toxolysis"
stealth = 0
resistance = -2
stage_speed = 2
transmittable = -2
level = 7
var/food_conversion = FALSE
desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
threshold_desc = "<b>Resistance 7:</b> Increases chem removal speed.<br>\
<b>Stage Speed 6:</b> Consumed chemicals nourish the host."
/datum/symptom/heal/chem/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 6)
food_conversion = TRUE
if(A.properties["resistance"] >= 7)
power = 2
/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
M.reagents.remove_reagent(R.id, actual_power)
if(food_conversion)
M.nutrition += 0.3
if(prob(2))
to_chat(M, "<span class='notice'>You feel a mild warmth as your blood purifies itself.</span>")
return 1
/datum/symptom/heal/metabolism
name = "Metabolic Boost"
stealth = -1
resistance = -2
stage_speed = 2
transmittable = 1
level = 7
var/triple_metabolism = FALSE
var/reduced_hunger = FALSE
desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\
but also causing increased hunger."
threshold_desc = "<b>Stealth 3:</b> Reduces hunger rate.<br>\
<b>Stage Speed 10:</b> Chemical metabolization is tripled instead of doubled."
/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 10)
triple_metabolism = TRUE
if(A.properties["stealth"] >= 3)
reduced_hunger = TRUE
/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
if(!istype(C))
return
C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
if(triple_metabolism)
C.reagents.metabolize(C, can_overdose=TRUE)
C.overeatduration = max(C.overeatduration - 2, 0)
var/lost_nutrition = 9 - (reduced_hunger * 5)
C.nutrition = max(C.nutrition - (lost_nutrition * HUNGER_FACTOR), 0) //Hunger depletes at 10x the normal speed
if(prob(2))
to_chat(C, "<span class='notice'>You feel an odd gurgle in your stomach, as if it was working much faster than normal.</span>")
return 1
/datum/symptom/heal/darkness
name = "Nocturnal Regeneration"
desc = "The virus is able to mend the host's flesh when in conditions of low light, repairing physical damage. More effective against brute damage."
stealth = 2
resistance = -1
stage_speed = -2
transmittable = -1
level = 6
passive_message = "<span class='notice'>You feel tingling on your skin as light passes over it.</span>"
threshold_desc = "<b>Stage Speed 8:</b> Doubles healing speed."
/datum/symptom/heal/darkness/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 8)
power = 2
/datum/symptom/heal/darkness/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
var/light_amount = 0
if(isturf(M.loc)) //else, there's considered to be no light
var/turf/T = M.loc
light_amount = min(1,T.get_lumcount()) - 0.5
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
return power
/datum/symptom/heal/darkness/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = 2 * actual_power
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
return
if(prob(5))
to_chat(M, "<span class='notice'>The darkness soothes and mends your wounds.</span>")
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5)) //more effective on brute
M.update_damage_overlays()
return 1
/datum/symptom/heal/darkness/passive_message_condition(mob/living/M)
if(M.getBruteLoss() || M.getFireLoss())
return TRUE
return FALSE
/datum/symptom/heal/coma
name = "Regenerative Coma"
desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
stealth = 0
resistance = 2
stage_speed = -3
transmittable = -2
level = 8
passive_message = "<span class='notice'>The pain from your wounds makes you feel oddly sleepy...</span>"
var/deathgasp = FALSE
var/active_coma = FALSE //to prevent multiple coma procs
threshold_desc = "<b>Stealth 2:</b> Host appears to die when falling into a coma.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
/datum/symptom/heal/coma/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 7)
power = 1.5
if(A.properties["stealth"] >= 2)
deathgasp = TRUE
/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
return power
else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
return power * 0.9
else if(M.stat == SOFT_CRIT)
return power * 0.5
else if(M.IsSleeping())
return power * 0.25
else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
to_chat(M, "<span class='warning'>You feel yourself slip into a regenerative coma...</span>")
active_coma = TRUE
addtimer(CALLBACK(src, .proc/coma, M), 60)
/datum/symptom/heal/coma/proc/coma(mob/living/M)
if(deathgasp)
M.emote("deathgasp")
M.fakedeath("regenerative_coma")
M.update_stat()
M.update_canmove()
addtimer(CALLBACK(src, .proc/uncoma, M), 300)
/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
if(!active_coma)
return
active_coma = FALSE
M.cure_fakedeath("regenerative_coma")
M.update_stat()
M.update_canmove()
/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = 4 * actual_power
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
return
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
M.update_damage_overlays()
if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
uncoma(M)
return 1
/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
if((M.getBruteLoss() + M.getFireLoss()) > 30)
return TRUE
return FALSE
/datum/symptom/heal/water
name = "Tissue Hydration"
desc = "The virus uses excess water inside and outside the body to repair damaged tissue cells. More effective against burns."
stealth = 0
resistance = -1
stage_speed = 0
transmittable = 1
level = 6
passive_message = "<span class='notice'>Your skin feels oddly dry...</span>"
var/absorption_coeff = 1
threshold_desc = "<b>Resistance 5:</b> Water is consumed at a much slower rate.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
/datum/symptom/heal/water/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 7)
power = 2
if(A.properties["stealth"] >= 2)
absorption_coeff = 0.25
/datum/symptom/heal/water/CanHeal(datum/disease/advance/A)
. = 0
var/mob/living/M = A.affected_mob
if(M.fire_stacks < 0)
M.fire_stacks = min(M.fire_stacks + 1 * absorption_coeff, 0)
. += power
if(M.reagents.has_reagent("holywater"))
M.reagents.remove_reagent("holywater", 0.5 * absorption_coeff)
. += power * 0.75
else if(M.reagents.has_reagent("water"))
M.reagents.remove_reagent("water", 0.5 * absorption_coeff)
. += power * 0.5
/datum/symptom/heal/water/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = 2 * actual_power
var/list/parts = M.get_damaged_bodyparts(1,1) //more effective on burns
if(!parts.len)
return
if(prob(5))
to_chat(M, "<span class='notice'>You feel yourself absorbing the water around you to soothe your damaged skin.</span>")
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len))
M.update_damage_overlays()
return 1
/datum/symptom/heal/water/passive_message_condition(mob/living/M)
if(M.getBruteLoss() || M.getFireLoss())
return TRUE
return FALSE
/datum/symptom/heal/plasma
name = "Plasma Fixation"
desc = "The virus draws plasma from the atmosphere and from inside the body to heal and stabilize body temperature."
stealth = 0
resistance = 3
stage_speed = -2
transmittable = -2
level = 8
passive_message = "<span class='notice'>You feel an odd attraction to plasma.</span>"
var/temp_rate = 1
threshold_desc = "<b>Transmission 6:</b> Increases temperature adjustment rate.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 7)
power = 2
if(A.properties["transmittable"] >= 6)
temp_rate = 4
/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
var/datum/gas_mixture/environment
var/plasmamount
. = 0
if(M.loc)
environment = M.loc.return_air()
if(environment)
plasmamount = environment.gases[/datum/gas/plasma]
if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see
. += power * 0.5
if(M.reagents.has_reagent("plasma"))
. += power * 0.75
/datum/symptom/heal/plasma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = 4 * actual_power
if(prob(5))
to_chat(M, "<span class='notice'>You feel yourself absorbing plasma inside and around you...</span>")
if(M.bodytemperature > BODYTEMP_NORMAL)
M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,BODYTEMP_NORMAL)
if(prob(5))
to_chat(M, "<span class='notice'>You feel less hot.</span>")
else if(M.bodytemperature < (BODYTEMP_NORMAL + 1))
M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0,BODYTEMP_NORMAL)
if(prob(5))
to_chat(M, "<span class='notice'>You feel warmer.</span>")
M.adjustToxLoss(-heal_amt)
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
return
if(prob(5))
to_chat(M, "<span class='notice'>The pain from your wounds fades rapidly.</span>")
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
M.update_damage_overlays()
return 1
/datum/symptom/heal/radiation
name = "Radioactive Resonance"
desc = "The virus uses radiation to fix damage through dna mutations."
stealth = -1
resistance = -2
stage_speed = 2
transmittable = -3
level = 6
symptom_delay_min = 1
symptom_delay_max = 1
passive_message = "<span class='notice'>Your skin glows faintly for a moment.</span>"
var/cellular_damage = FALSE
threshold_desc = "<b>Transmission 6:</b> Additionally heals cellular damage.<br>\
<b>Resistance 7:</b> Increases healing speed."
/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["resistance"] >= 7)
power = 2
if(A.properties["transmittable"] >= 6)
cellular_damage = TRUE
/datum/symptom/heal/radiation/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
switch(M.radiation)
if(0)
return FALSE
if(1 to RAD_MOB_SAFE)
return 0.25
if(RAD_MOB_SAFE to RAD_BURN_THRESHOLD)
return 0.5
if(RAD_BURN_THRESHOLD to RAD_MOB_MUTATE)
return 0.75
if(RAD_MOB_MUTATE to RAD_MOB_KNOCKDOWN)
return 1
else
return 1.5
/datum/symptom/heal/radiation/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = actual_power
if(cellular_damage)
M.adjustCloneLoss(-heal_amt * 0.5)
M.adjustToxLoss(-(2 * heal_amt))
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
return
if(prob(4))
to_chat(M, "<span class='notice'>Your skin glows faintly, and you feel your wounds mending themselves.</span>")
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
M.update_damage_overlays()
return 1
/datum/symptom/heal
name = "Basic Healing (does nothing)" //warning for adminspawn viruses
desc = "You should not be seeing this."
stealth = 0
resistance = 0
stage_speed = 0
transmittable = 0
level = -1 //not obtainable
base_message_chance = 20 //here used for the overlays
symptom_delay_min = 1
symptom_delay_max = 1
var/passive_message = "" //random message to infected but not actively healing people
threshold_desc = "<b>Stage Speed 6:</b> Doubles healing speed.<br>\
<b>Stealth 4:</b> Healing will no longer be visible to onlookers."
/datum/symptom/heal/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 6) //stronger healing
power = 2
/datum/symptom/heal/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
var/effectiveness = CanHeal(A)
if(!effectiveness)
if(passive_message && prob(2) && passive_message_condition(M))
to_chat(M, passive_message)
return
else
Heal(M, A, effectiveness)
return
/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
return power
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A, actual_power)
return TRUE
/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
return TRUE
/datum/symptom/heal/chem
name = "Toxolysis"
stealth = 0
resistance = -2
stage_speed = 2
transmittable = -2
level = 7
var/food_conversion = FALSE
desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
threshold_desc = "<b>Resistance 7:</b> Increases chem removal speed.<br>\
<b>Stage Speed 6:</b> Consumed chemicals nourish the host."
/datum/symptom/heal/chem/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 6)
food_conversion = TRUE
if(A.properties["resistance"] >= 7)
power = 2
/datum/symptom/heal/chem/Heal(mob/living/M, datum/disease/advance/A, actual_power)
for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
M.reagents.remove_reagent(R.id, actual_power)
if(food_conversion)
M.nutrition += 0.3
if(prob(2))
to_chat(M, "<span class='notice'>You feel a mild warmth as your blood purifies itself.</span>")
return 1
/datum/symptom/heal/coma
name = "Regenerative Coma"
desc = "The virus causes the host to fall into a death-like coma when severely damaged, then rapidly fixes the damage."
stealth = 0
resistance = 2
stage_speed = -3
transmittable = -2
level = 8
passive_message = "<span class='notice'>The pain from your wounds makes you feel oddly sleepy...</span>"
var/deathgasp = FALSE
var/active_coma = FALSE //to prevent multiple coma procs
threshold_desc = "<b>Stealth 2:</b> Host appears to die when falling into a coma.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
/datum/symptom/heal/coma/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 7)
power = 1.5
if(A.properties["stealth"] >= 2)
deathgasp = TRUE
/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
return power
else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
return power * 0.9
else if(M.stat == SOFT_CRIT)
return power * 0.5
else if(M.IsSleeping())
return power * 0.25
else if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma)
to_chat(M, "<span class='warning'>You feel yourself slip into a regenerative coma...</span>")
active_coma = TRUE
addtimer(CALLBACK(src, .proc/coma, M), 60)
/datum/symptom/heal/coma/proc/coma(mob/living/M)
if(deathgasp)
M.emote("deathgasp")
M.fakedeath("regenerative_coma")
M.update_stat()
M.update_canmove()
addtimer(CALLBACK(src, .proc/uncoma, M), 300)
/datum/symptom/heal/coma/proc/uncoma(mob/living/M)
if(!active_coma)
return
active_coma = FALSE
M.cure_fakedeath("regenerative_coma")
M.update_stat()
M.update_canmove()
/datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power)
var/heal_amt = 4 * actual_power
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
return
for(var/obj/item/bodypart/L in parts)
if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len))
M.update_damage_overlays()
if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0)
uncoma(M)
return 1
/datum/symptom/heal/coma/passive_message_condition(mob/living/M)
if((M.getBruteLoss() + M.getFireLoss()) > 30)
return TRUE
return FALSE
/*
//////////////////////////////////////
im not even gonna bother with these for the following symptoms. typed em out, code was deleted, had to start over, read the symptoms yourself.
//////////////////////////////////////
*/
/datum/symptom/EMP
name = "Organic Flux Induction"
desc = "Causes electromagnetic interference around the subject"
stealth = -2
resistance = -1
stage_speed = 0
transmittable = -2
level = 6
severity = 4
symptom_delay_min = 15
symptom_delay_max = 40
var/bigemp = FALSE
var/cellheal = FALSE
threshold_desc = "<b>Stealth 4:</b> The disease resets cell DNA, quickly curing cell damage and mutations<br>\
<b>transmission 8:</b> The EMP affects electronics adjacent to the subject as well."
/datum/symptom/EMP/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stealth"] >= 4)
cellheal = TRUE
if(A.properties["transmittable"] >= 8)
bigemp = TRUE
/datum/symptom/EMP/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.emp_act(EMP_HEAVY)
if(cellheal)
M.adjustCloneLoss(-40)
M.reagents.add_reagent(/datum/reagent/medicine/mutadone = 1)
if(bigemp)
empulse(M.loc, 0, 1)
to_chat(M, "<span class='userdanger'>[pick("Your mind fills with static!.", "You feel a jolt!", "Your sense of direction flickers out!")]</span>")
else
to_chat(M, "<span class='notice'>[pick("You feel a slight tug toward the station's wall.", "Nearby electronics flicker", "Your hair stands on end")]</span>")
return
/datum/symptom/sweat
name = "Hyperperspiration"
desc = "Causes the host to sweat profusely, leaving small water puddles and extnguishing small fires"
stealth = 1
resistance = -1
stage_speed = 0
transmittable = 1
level = 6
severity = 4
symptom_delay_min = 10
symptom_delay_max = 30
var/bigsweat = FALSE
var/toxheal = FALSE
threshold_desc = "<b>transmission 6:</b> The sweat production ramps up to the point that it cleans messes and puts out fires in the general vicinity<br>\
<b>transmission 8:</b> The EMP affects electronics adjacent to the subject as well."
/datum/symptom/sweat/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["transmittable"] >= 8)
toxheal = TRUE
if(A.properties["transmittable"] >= 6)
bigsweat = TRUE
/datum/symptom/sweat/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.adjust_fire_stacks(-5)
if(prob(30))
var/turf/open/OT = get_turf(M)
if(istype(OT))
to_chat(M, "<span class='danger'>The sweat pools into a puddle!</span>")
OT.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
if(bigsweat)
var/obj/effect/sweatsplash/S = new(M.loc)
if(toxheal)
for(var/datum/reagent/R in M.reagents.reagent_list) //Not just toxins!
M.reagents.remove_reagent(R.type, 5)
S.reagents.add_reagent(R.type, 5)
M.adjustToxLoss(-20, forced = TRUE)
S.splash()
to_chat(M, "<span class='userdanger'>You sweat out nearly everything in your body!</span>")
else
to_chat(M, "<span class='notice'>[pick("You feel moist.", "Your clothes are soaked", "You're sweating buckets")]</span>")
return
/obj/effect/sweatsplash
name = "Sweatsplash"
/obj/effect/sweatsplash/Initialize()
create_reagents(1000)
reagents.add_reagent(/datum/reagent/water, 10)
reagents.add_reagent(/datum/reagent/space_cleaner, 10)
obj/effect/sweatsplash/proc/splash()
chem_splash(loc, 2, list(reagents))
qdel(src)
/datum/symptom/teleport
name = "Thermal Retrostable Displacement"
desc = "When too hot or cold, the subject will return to a recent location they experienced safe homeostasis"
stealth = 1
resistance = 2
stage_speed = -2
transmittable = -3
level = 8
severity = 0
symptom_delay_min = 1
symptom_delay_max = 1
var/telethreshold = 0
var/burnheal = FALSE
var/turf/open/location_return = null
var/cooldowntimer = 0
threshold_desc = "<b>Resistance 8:</b> The disease acts on a smaller scale, resetting burnt tissue back to a state of health<br>\
<b>Transmission 8:</b> The disease becomes more active, activating in a smaller temperature range."
/datum/symptom/teleport/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["resistance"] >= 8)
burnheal = TRUE
if(A.properties["transmittable"] >= 8)
telethreshold = 25
power = 2
/datum/symptom/teleport/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(4, 5)
if(burnheal)
M.adjustFireLoss(-1 * power)
if(prob(5) && (M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT || M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT))
location_return = get_turf(M) //sets up return point
if(prob(50))
to_chat(M, "<span class='userwarning'>The lukewarm temperature makes you feel strange!</span>")
if(cooldowntimer == 0 && (M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT - telethreshold || M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT + telethreshold || (burnheal && M.getFireLoss() > 75 - telethreshold)))
do_sparks(5,FALSE,M)
to_chat(M, "<span class='userdanger'>The change in temperature shocks you back to a previous spacial state!</span>")
do_teleport(M, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home
do_sparks(5,FALSE,M)
cooldowntimer = 10
if(burnheal)
M.adjust_fire_stacks(-10)
if(cooldowntimer > 0)
cooldowntimer --
else
if(prob(7))
to_chat(M, "<span class='notice'>[pick("Your warm breath fizzles out of existence.", "You feel attracted to temperate climates", "You feel like you're forgetting something")]</span>")
return
/datum/symptom/growth
name = "Pituitary Disruption"
desc = "Causes uncontrolled growth in the subject"
stealth = -3
resistance = -2
stage_speed = 1
transmittable = -2
level = 7
severity = 4
symptom_delay_min = 1
symptom_delay_max = 1
var/current_size = 1
var/tetsuo = FALSE
var/bruteheal = FALSE
threshold_desc = "<b>Stage Speed 8:</b> The disease heals brute damage at a fast rate, but causes expulsion of benign tumors<br>\
<b>Stage Speed 12:</b> The disease heals brute damage incredibly fast, but deteriorates cell health and causes tumors to become more advanced."
/datum/symptom/growth/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stage_rate"] >= 8)
bruteheal = TRUE
if(A.properties["stage_rate"] >= 12)
tetsuo = TRUE
/datum/symptom/growth/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
var/newsize = current_size
switch(A.stage)
if(4, 5)
switch(A.properties["stage_rate"])
if(5 to 8)
newsize = 1.25
if(9 to 12)
newsize = 1.5
if(13 to 16)
newsize = 1.75
if(17 to INFINITY)
newsize = 2
M.resize = newsize/current_size
current_size = newsize
M.update_transform()
if(prob(5) && bruteheal)
to_chat(M, "<span class='userdanger'>You retch, and a splatter of gore escapes your gullet</span>")
M.Knockdown(40)
new /obj/effect/gibspawner/generic(M.loc)
if(prob(80))
new /obj/effect/spawner/lootdrop/teratoma/minor(M.loc)
if(tetsuo && prob(30))
new /obj/effect/spawner/lootdrop/teratoma/major(M.loc)
if(tetsuo && prob(10) && A.affected_mob.job == "Clown")
new /obj/effect/spawner/lootdrop/teratoma/major/clown(M.loc)
if(tetsuo)
M.adjustBruteLoss(-5)
if(prob(20))
M.adjustCloneLoss(1)
else if(bruteheal)
M.adjustBruteLoss(-1)
else
if(prob(5))
to_chat(M, "<span class='notice'>[pick("You feel bloated.", "The station seems small", "You are the strongest")]</span>")
return
/obj/effect/mob_spawn/teratomamonkey //spawning these is one of the downsides of overclocking the symptom
name = "fleshy mass"
desc = "A writhing mass of flesh."
icon = 'icons/mob/blob.dmi'
icon_state = "blob_spore_temp"
density = FALSE
anchored = FALSE
mob_type = /mob/living/carbon/monkey/tumor
mob_name = "a living tumor"
death = FALSE
roundstart = FALSE
flavour_text = {"
<b>You are a living teratoma, and your existence is misery. You feel the need to spread woe about the station- but not to kill.
"}
/obj/effect/mob_spawn/teratomamonkey/Initialize()
. = ..()
var/area/A = get_area(src)
if(A)
notify_ghosts("A living tumor has been born in [A.name].", 'sound/effects/splat.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
/obj/effect/mob_spawn/teratomamonkey/attack_hand(mob/living/user)
. = ..()
if(.)
return
to_chat(user, "<span class='notice'>Ew... It would be a bad idea to touch this. It could probably be destroyed with the extreme heat of a welder.</span>")
/obj/effect/mob_spawn/teratomamonkey/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_WELDER && user.a_intent != INTENT_HARM)
user.visible_message("<span class='warning'>[usr.name] destroys [src].</span>",
"<span class='notice'>You hold the welder to [src], and it violently bursts!</span>",
"<span class='italics'>You hear a gurgling noise</span>")
new /obj/effect/gibspawner/human(get_turf(src))
qdel(src)
else
..()
@@ -15,13 +15,13 @@ Bonus
/datum/symptom/narcolepsy
name = "Narcolepsy"
desc = "The virus causes a hormone imbalance, making the host sleepy and narcoleptic."
stealth = -1
stealth = 1
resistance = -2
stage_speed = -3
transmittable = -4
transmittable = -2
level = 6
symptom_delay_min = 15
symptom_delay_max = 80
symptom_delay_min = 10
symptom_delay_max = 30
severity = 4
var/sleep_level = 0
var/sleepy_ticks = 0
@@ -35,8 +35,8 @@ Bonus
if(A.properties["transmittable"] >= 7) //stamina damage
stamina = TRUE
if(A.properties["resistance"] >= 10) //act more often
symptom_delay_min = 10
symptom_delay_max = 60
symptom_delay_min = 5
symptom_delay_max = 20
/datum/symptom/narcolepsy/Activate(var/datum/disease/advance/A)
var/mob/living/M = A.affected_mob
+66 -52
View File
@@ -1,52 +1,66 @@
/*
//////////////////////////////////////
Self-Respiration
Slightly hidden.
Lowers resistance significantly.
Decreases stage speed significantly.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
The body generates salbutamol.
//////////////////////////////////////
*/
/datum/symptom/oxygen
name = "Self-Respiration"
desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
stealth = 1
resistance = -3
stage_speed = -3
transmittable = -4
level = 6
base_message_chance = 5
symptom_delay_min = 1
symptom_delay_max = 1
var/regenerate_blood = FALSE
threshold_desc = "<b>Resistance 8:</b>Additionally regenerates lost blood.<br>"
/datum/symptom/oxygen/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["resistance"] >= 8) //blood regeneration
regenerate_blood = TRUE
/datum/symptom/oxygen/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.adjustOxyLoss(-7, 0)
M.losebreath = max(0, M.losebreath - 4)
if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio))
M.blood_volume += 1
else
if(prob(base_message_chance))
to_chat(M, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
return
/*
//////////////////////////////////////
Self-Respiration
Slightly hidden.
Lowers resistance significantly.
Decreases stage speed significantly.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
The body generates salbutamol.
//////////////////////////////////////
*/
/datum/symptom/oxygen
name = "Self-Respiration"
desc = "The virus rapidly synthesizes oxygen, effectively removing the need for breathing."
stealth = 1
resistance = -3
stage_speed = -3
transmittable = -4
level = 6
base_message_chance = 5
symptom_delay_min = 1
symptom_delay_max = 1
var/regenerate_blood = FALSE
threshold_desc = "<b>Resistance 8:</b> Additionally regenerates lost blood.<br>"
/datum/symptom/oxygen/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["resistance"] >= 8) //blood regeneration
regenerate_blood = TRUE
/datum/symptom/oxygen/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(4, 5)
ADD_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
M.adjustOxyLoss(-7, 0)
M.losebreath = max(0, M.losebreath - 4)
if(regenerate_blood && M.blood_volume < BLOOD_VOLUME_NORMAL)
M.blood_volume += 1
else
if(prob(base_message_chance))
to_chat(M, "<span class='notice'>[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]</span>")
return
/datum/symptom/oxygen/on_stage_change(new_stage, datum/disease/advance/A)
if(!..())
return FALSE
var/mob/living/carbon/M = A.affected_mob
if(A.stage <= 3)
REMOVE_TRAIT(M, TRAIT_NOBREATH, DISEASE_TRAIT)
return TRUE
/datum/symptom/oxygen/End(datum/disease/advance/A)
if(!..())
return
REMOVE_TRAIT(A.affected_mob, TRAIT_NOBREATH, DISEASE_TRAIT)
@@ -7,18 +7,15 @@
transmittable = 2
level = 8
severity = 4
symptom_delay_min = 1
symptom_delay_max = 4
symptom_delay_min = 10
symptom_delay_max = 40
var/fastrads = FALSE
var/radothers = FALSE
threshold_desc = "<b>Transmission 12:</b> Makes the host irradiate others around them as well.<br>\
<b>Speed 8:</b> Host takes radiation damage faster."
threshold_desc = "<b>Speed 8:</b> Host takes radiation damage faster."
/datum/symptom/radiation/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["transmission"] >= 10)
radothers = TRUE
if(A.properties["speed"] >= 8)
fastrads = TRUE
@@ -34,18 +31,12 @@
if(prob(50))
to_chat(M, "<span class='danger'>You feel like the atoms inside you are beginning to split...</span>")
if(4, 5)
if(fastrads)
radiate(M, 80)
else
radiate(M, 40)
if(radothers && A.stage == 5)
if(prob(40))
M.visible_message("<span class='danger'>[M] glows green for a moment!</span>", \
"<span class='userdanger'>You feel a massive wave of pain flow through you!</span>")
radiation_pulse(M, 20)
radiate(M)
/datum/symptom/radiation/proc/radiate(mob/living/carbon/M, chance)
if(prob(chance))
to_chat(M, "<span class='danger'>You feel a wave of pain throughout your body!</span>")
M.radiation += 4
/datum/symptom/radiation/proc/radiate(mob/living/carbon/M)
to_chat(M, "<span class='danger'>You feel a wave of pain throughout your body!</span>")
if(fastrads)
M.radiation += 150
else
M.radiation += 75
return 1
@@ -86,3 +86,46 @@ BONUS
H.update_body(0)
else
H.visible_message("<span class='warning'>[H] looks a bit dark...</span>", "<span class='notice'>Your skin suddenly appears darker...</span>")
/*
//////////////////////////////////////
Polyvitiligo
Not Noticeable.
Increases resistance slightly.
Increases stage speed.
Transmittable.
Low Level.
BONUS
Makes the host change color
//////////////////////////////////////
*/
/datum/symptom/polyvitiligo
name = "Polyvitiligo"
desc = "The virus replaces the melanin in the skin with reactive pigment."
stealth = 0
resistance = 1
stage_speed = 2
transmittable = 2
level = 0
severity = 1
base_message_chance = 50
symptom_delay_min = 45
symptom_delay_max = 90
/datum/symptom/polyvitiligo/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(5)
var/static/list/banned_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/invisible, /datum/reagent/colorful_reagent/crayonpowder/white)
var/color = pick(subtypesof(/datum/reagent/colorful_reagent/crayonpowder) - banned_reagents)
if(M.reagents.total_volume <= (M.reagents.maximum_volume/10)) // no flooding humans with 1000 units of colorful reagent
M.reagents.add_reagent(color, 5)
else
if (prob(50)) // spam
M.visible_message("<span class='warning'>[M] looks rather vibrant...</span>", "<span class='notice'>The colors, man, the colors...</span>")
@@ -26,8 +26,7 @@ Bonus
severity = 1
symptom_delay_min = 5
symptom_delay_max = 35
threshold_desc = "<b>Transmission 9:</b> The host will sneeze periodically, spreading the disease. <br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = "<b>Stealth 4:</b> The symptom remains hidden until active."
/datum/symptom/sneeze/Start(datum/disease/advance/A)
if(!..())
@@ -38,8 +37,6 @@ Bonus
/datum/symptom/sneeze/Activate(datum/disease/advance/A)
if(!..())
return
if(!A.properties["transmittable"] >= 9)
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
@@ -47,4 +44,3 @@ Bonus
M.emote("sniff")
else
M.emote("sneeze")
A.spread(4 + power)
@@ -8,12 +8,14 @@
level = 5
severity = 0
/datum/symptom/undead_adaptation/Start(datum/disease/advance/A)
if(!..())
return
/datum/symptom/undead_adaptation/OnAdd(datum/disease/advance/A)
A.process_dead = TRUE
A.infectable_biotypes |= MOB_UNDEAD
/datum/symptom/undead_adaptation/OnRemove(datum/disease/advance/A)
A.process_dead = FALSE
A.infectable_biotypes -= MOB_UNDEAD
/datum/symptom/inorganic_adaptation
name = "Inorganic Biology"
desc = "The virus can survive and replicate even in an inorganic environment, increasing its resistance and infection rate."
@@ -24,7 +26,8 @@
level = 5
severity = 0
/datum/symptom/inorganic_adaptation/Start(datum/disease/advance/A)
if(!..())
return
A.infectable_biotypes |= MOB_INORGANIC
/datum/symptom/inorganic_adaptation/OnAdd(datum/disease/advance/A)
A.infectable_biotypes |= MOB_INORGANIC
/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A)
A.infectable_biotypes -= MOB_INORGANIC
@@ -60,15 +60,26 @@
next_activation = world.time + rand(symptom_delay_min * 10, symptom_delay_max * 10)
return TRUE
/datum/symptom/proc/on_stage_change(new_stage, datum/disease/advance/A)
if(neutered)
return FALSE
return TRUE
/datum/symptom/proc/Copy()
var/datum/symptom/new_symp = new type
new_symp.name = name
new_symp.id = id
new_symp.neutered = neutered
return new_symp
/datum/symptom/proc/OnDeath(datum/disease/advance/A)
return !neutered
/datum/symptom/proc/generate_threshold_desc()
return
/datum/symptom/proc/OnAdd(datum/disease/advance/A) //Overload when a symptom needs to be active before processing, like changing biotypes.
return
/datum/symptom/proc/OnRemove(datum/disease/advance/A) //But dont forget to remove them too.
return
@@ -20,9 +20,9 @@ Bonus
name = "Hyphema"
desc = "The virus causes inflammation of the retina, leading to eye damage and eventually blindness."
stealth = -1
resistance = -4
resistance = -3
stage_speed = -4
transmittable = -3
transmittable = -2
level = 5
severity = 5
base_message_chance = 50
@@ -24,9 +24,9 @@ Bonus
name = "Vomiting"
desc = "The virus causes nausea and irritates the stomach, causing occasional vomit."
stealth = -2
resistance = -1
resistance = 1
stage_speed = 0
transmittable = 1
transmittable = 2
level = 3
severity = 3
base_message_chance = 100
@@ -60,4 +60,4 @@ Bonus
vomit(M)
/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
M.vomit(20, vomit_blood, distance = proj_vomit)
M.vomit(20, vomit_blood, stun = 0, distance = proj_vomit)
@@ -23,18 +23,18 @@ Bonus
stealth = -2
resistance = 2
stage_speed = -2
transmittable = -2
transmittable = -1
level = 3
severity = 3
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 45
threshold_desc = "<b>Stealth 4:</b> The symptom is less noticeable."
threshold_desc = "<b>Stealth 2:</b> The symptom is less noticeable."
/datum/symptom/weight_loss/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stealth"] >= 4) //warn less often
if(A.properties["stealth"] >= 2) //warn less often
base_message_chance = 25
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
+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)
+1 -1
View File
@@ -61,7 +61,7 @@
teamsize = 1
opendoors = FALSE
enforce_human = FALSE
roles = /datum/antagonist/greybois
roles = list(/datum/antagonist/greybois)
leader_role = /datum/antagonist/greybois/greygod
rename_team = "Emergency Assistants"
polldesc = "an Emergency Assistant"
-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.
@@ -169,3 +169,10 @@
/datum/mood_event/sad_empath/add_effects(mob/sadtarget)
description = "<span class='warning'>[sadtarget.name] seems upset...</span>\n"
/datum/mood_event/revenant_blight
description = "<span class='umbra'>Just give up, honk...</span>\n"
mood_change = -5
/datum/mood_event/revenant_blight/add_effects()
description = "<span class='umbra'>Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...</span>\n"
@@ -113,3 +113,8 @@
/datum/mood_event/happy_empath/add_effects(var/mob/happytarget)
description = "<span class='nicegreen'>[happytarget.name]'s happiness is infectious!</span>\n"
/datum/mood_event/lewd_headpat
description = "<span class='nicegreen'>I love headpats so much!</span>\n"
mood_change = 3
timeout = 2 MINUTES
+1 -1
View File
@@ -316,4 +316,4 @@
id = "advancedlab"
suffix = "advancedlab.dmm"
name = "Abductor Replication Lab"
description = "Some scientists tried and almost succeeded to recreate abductor tools. Somewhat slower and a bit less modern than their originals, these tools are the best you can get if you aren't an alien."
description = "Some scientists tried and almost succeeded to recreate abductor tools. Somewhat slower and a bit less modern than their originals, these tools are the best you can get if you aren't an alien."
+8 -5
View File
@@ -426,19 +426,20 @@
else
new /obj/effect/temp_visual/bleed(get_turf(owner))
/mob/living/proc/apply_necropolis_curse(set_curse)
/mob/living/proc/apply_necropolis_curse(set_curse, duration = 10 MINUTES)
var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
if(!set_curse)
set_curse = pick(CURSE_BLINDING, CURSE_SPAWNING, CURSE_WASTING, CURSE_GRASPING)
if(QDELETED(C))
apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse)
apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse, duration)
else
C.apply_curse(set_curse)
C.duration += 3000 //additional curses add 5 minutes
C.duration += duration * 0.5 //additional curses add half their duration
/datum/status_effect/necropolis_curse
id = "necrocurse"
duration = 6000 //you're cursed for 10 minutes have fun
duration = 10 MINUTES //you're cursed for 10 minutes have fun
tick_interval = 50
alert_type = null
var/curse_flags = NONE
@@ -446,7 +447,9 @@
var/effect_cooldown = 100
var/obj/effect/temp_visual/curse/wasting_effect = new
/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse)
/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse, _duration)
if(_duration)
duration = _duration
. = ..()
if(.)
apply_curse(set_curse)
+30
View File
@@ -203,3 +203,33 @@
/datum/quirk/bloodpressure/remove()
var/mob/living/M = quirk_holder
M.blood_ratio = 1
/datum/quirk/draconicspeaker
name = "Draconic speaker"
desc = "Due to your time spent around lizards, you can speak Draconic!"
value = 1
gain_text = "<span class='notice'>You feel sensitive to hissing noises and your tongue curls comfortably.</span>"
lose_text = "<span class='notice'>You forget how to speak Draconic!</span>"
/datum/quirk/draconicspeaker/add()
var/mob/living/M = quirk_holder
M.grant_language(/datum/language/draconic)
/datum/quirk/draconicspeaker/remove()
var/mob/living/M = quirk_holder
M.remove_language(/datum/language/draconic)
/datum/quirk/slimespeaker
name = "Slime speaker"
desc = "Due to your time spent around slimes, you can speak Slimespeak!"
value = 1
gain_text = "<span class='notice'>You feel sensitive to blorbling noises, and your throat produces melodic sounds.</span>"
lose_text = "<span class='notice'>You forget how to speak Slimespeak!</span>"
/datum/quirk/slimespeaker/add()
var/mob/living/M = quirk_holder
M.grant_language(/datum/language/slime)
/datum/quirk/slimespeaker/remove()
var/mob/living/M = quirk_holder
M.remove_language(/datum/language/slime)
+8 -1
View File
@@ -101,4 +101,11 @@
value = 0
medical_record_text = "Patient never skipped ass day."
gain_text = "<span class='notice'>Your ass rivals those of golems.</span>"
lose_text = "<span class='notice'>Your butt feels more squishy and slappable.</span>"
lose_text = "<span class='notice'>Your butt feels more squishy and slappable.</span>"
/datum/quirk/headpat_slut
name = "Headpat Slut"
desc = "You like headpats, alot, maybe even a little bit too much. Headpats give you a bigger mood boost and cause arousal"
mob_trait = TRAIT_HEADPAT_SLUT
value = 0
medical_record_text = "Patient seems overly affectionate"
@@ -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"
+1 -1
View File
@@ -471,4 +471,4 @@
// Abductor Replication Lab
/area/ruin/space/has_grav/powered/advancedlab
name = "Abductor Replication Lab"
icon_state = "yellow"
icon_state = "yellow"
+7 -8
View File
@@ -13,6 +13,13 @@
//HUD images that this atom can provide.
var/list/hud_possible
/// Last name used to calculate a color for the chatmessage overlays
var/chat_color_name
/// Last color calculated for the the chatmessage overlays
var/chat_color
/// A luminescence-shifted value of the last color calculated for chatmessage overlays
var/chat_color_darkened
//Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
@@ -598,14 +605,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)
+3 -2
View File
@@ -13,18 +13,19 @@
var/verb_ask = "asks"
var/verb_exclaim = "exclaims"
var/verb_whisper = "whispers"
var/verb_sing = "sings"
var/verb_yell = "yells"
var/speech_span
var/inertia_dir = 0
var/atom/inertia_last_loc
var/inertia_moving = 0
var/inertia_next_move = 0
var/inertia_move_delay = 7
var/inertia_move_delay = 10
var/pass_flags = 0
var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
var/list/client_mobs_in_contents // This contains all the client mobs within this container
var/list/acted_explosions //for explosion dodging
glide_size = 13
glide_size = 7
appearance_flags = TILE_BOUND|PIXEL_SCALE
var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm
var/floating = FALSE
+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)
+2 -2
View File
@@ -124,12 +124,12 @@
L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R
for(var/obj/item/implant/tracking/I in GLOB.tracked_implants)
if(!I.imp_in || !isliving(I.loc))
if(!I.imp_in || !I.allow_teleport || !isliving(I.imp_in))
continue
else
var/mob/living/M = I.loc
if(M.stat == DEAD)
if(M.timeofdeath + 6000 < world.time)
if(M.timeofdeath + I.lifespan_postmortem < world.time)
continue
if(is_eligible(I))
L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I
+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)
+9 -9
View File
@@ -180,7 +180,7 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/machinery/newscaster
name = "newscaster"
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
desc = "A standard Kinaris-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
verb_say = "beeps"
@@ -271,7 +271,7 @@ GLOBAL_LIST_EMPTY(allCasters)
switch(screen)
if(0)
dat += "Welcome to Newscasting Unit #[unit_no].<BR> Interface & News networks Operational."
dat += "<BR><FONT SIZE=1>Property of Nanotrasen Inc</FONT>"
dat += "<BR><FONT SIZE=1>Property of Kinaris Corp</FONT>"
if(GLOB.news_network.wanted_issue.active)
dat+= "<HR><A href='?src=[REF(src)];view_wanted=1'>Read Wanted Issue</A>"
dat+= "<HR><BR><A href='?src=[REF(src)];create_channel=1'>Create Feed Channel</A>"
@@ -616,14 +616,14 @@ GLOBAL_LIST_EMPTY(allCasters)
screen = 15
else
if(GLOB.news_network.wanted_issue.isAdminMsg)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
alert("The wanted issue has been distributed by a Kinaris higherup. You cannot edit it.","Ok")
return
GLOB.news_network.submitWanted(channel_name, msg, scanned_user, picture)
screen = 19
updateUsrDialog()
else if(href_list["cancel_wanted"])
if(GLOB.news_network.wanted_issue.isAdminMsg)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok")
alert("The wanted issue has been distributed by a Kinaris higherup. You cannot take it down.","Ok")
return
var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
@@ -636,21 +636,21 @@ GLOBAL_LIST_EMPTY(allCasters)
else if(href_list["censor_channel_author"])
var/datum/newscaster/feed_channel/FC = locate(href_list["censor_channel_author"])
if(FC.is_admin_channel)
alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
alert("This channel was created by a Kinaris Officer. You cannot censor it.","Ok")
return
FC.toggleCensorAuthor()
updateUsrDialog()
else if(href_list["censor_channel_story_author"])
var/datum/newscaster/feed_message/MSG = locate(href_list["censor_channel_story_author"])
if(MSG.is_admin_message)
alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
alert("This message was created by a Kinaris Officer. You cannot censor its author.","Ok")
return
MSG.toggleCensorAuthor()
updateUsrDialog()
else if(href_list["censor_channel_story_body"])
var/datum/newscaster/feed_message/MSG = locate(href_list["censor_channel_story_body"])
if(MSG.is_admin_message)
alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
alert("This channel was created by a Kinaris Officer. You cannot censor it.","Ok")
return
MSG.toggleCensorBody()
updateUsrDialog()
@@ -662,7 +662,7 @@ GLOBAL_LIST_EMPTY(allCasters)
else if(href_list["toggle_d_notice"])
var/datum/newscaster/feed_channel/FC = locate(href_list["toggle_d_notice"])
if(FC.is_admin_channel)
alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok")
alert("This channel was created by a Kinaris Officer. You cannot place a D-Notice upon it.","Ok")
return
FC.toggleCensorDclass()
updateUsrDialog()
@@ -864,7 +864,7 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/item/newspaper
name = "newspaper"
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
desc = "An issue of The Griffon, the newspaper circulating aboard Kin.Co Space Stations."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "newspaper"
lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
+5 -1
View File
@@ -210,13 +210,13 @@
add_fingerprint(user)
/obj/machinery/suit_storage_unit/proc/cook()
var/mob/living/mob_occupant = occupant
if(uv_cycles)
uv_cycles--
uv = TRUE
locked = TRUE
update_icon()
if(occupant)
var/mob/living/mob_occupant = occupant
if(uv_super)
mob_occupant.adjustFireLoss(rand(20, 36))
else
@@ -245,6 +245,7 @@
visible_message("<span class='notice'>[src]'s door slides open. The glowing yellow lights dim to a gentle green.</span>")
else
visible_message("<span class='warning'>[src]'s door slides open, barraging you with the nauseating smell of charred flesh.</span>")
mob_occupant.radiation = 0
playsound(src, 'sound/machines/airlockclose.ogg', 25, 1)
for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRONG)
@@ -307,6 +308,9 @@
/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
if(state_open && is_operational())
if(istype(I, /obj/item/clothing/head/mob_holder))
to_chat(user, "<span class='warning'>You can't quite fit that while you hold it!</span>")
return
if(istype(I, /obj/item/clothing/suit))
if(suit)
to_chat(user, "<span class='warning'>The unit already contains a suit!.</span>")
+40 -8
View File
@@ -1,3 +1,7 @@
GLOBAL_VAR_INIT(singularity_counter, 0)
#define METEOR_DISASTER_MODIFIER 0.5
////////////////////////////////////////
//Singularity beacon
////////////////////////////////////////
@@ -14,38 +18,58 @@
verb_say = "states"
var/cooldown = 0
var/active = 0
var/active = FALSE
var/meteor_buff = FALSE
var/icontype = "beacon"
/obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null)
if(active)
return FALSE
if(surplus() < 1500)
if(user)
to_chat(user, "<span class='notice'>The connected wire doesn't have enough current.</span>")
return
return FALSE
if(is_station_level(z))
increment_meteor_waves()
for(var/obj/singularity/singulo in GLOB.singularities)
if(singulo.z == z)
singulo.target = src
icon_state = "[icontype]1"
active = 1
active = TRUE
if(user)
to_chat(user, "<span class='notice'>You activate the beacon.</span>")
return TRUE
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user)
if(!active)
return FALSE
for(var/obj/singularity/singulo in GLOB.singularities)
if(singulo.target == src)
singulo.target = null
icon_state = "[icontype]0"
active = 0
active = FALSE
if(user)
to_chat(user, "<span class='notice'>You deactivate the beacon.</span>")
if(meteor_buff)
decrement_meteor_waves()
return TRUE
/obj/machinery/power/singularity_beacon/proc/increment_meteor_waves()
meteor_buff = TRUE
GLOB.singularity_counter++
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
/obj/machinery/power/singularity_beacon/proc/decrement_meteor_waves()
meteor_buff = FALSE
GLOB.singularity_counter--
for(var/datum/round_event_control/meteor_wave/W in SSevents.control)
W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER)
/obj/machinery/power/singularity_beacon/attack_ai(mob/user)
return
/obj/machinery/power/singularity_beacon/attack_hand(mob/user)
. = ..()
if(.)
@@ -86,6 +110,12 @@
if(!active)
return
var/is_on_station = is_station_level(z)
if(meteor_buff && !is_on_station)
decrement_meteor_waves()
else if(!meteor_buff && is_on_station)
increment_meteor_waves()
if(surplus() >= 1500)
add_load(1500)
if(cooldown <= world.time)
@@ -133,3 +163,5 @@
/obj/item/sbeacondrop/clownbomb
desc = "A label on it reads: <i>Warning: Activating this device will send a silly explosive to your location</i>."
droptype = /obj/machinery/syndicatebomb/badmin/clown
#undef METEOR_DISASTER_MODIFIER
+4
View File
@@ -219,6 +219,10 @@
update_icon()
return
if(istype(W, /obj/item/clothing/head/mob_holder))
to_chat(user, "<span class='warning'>It's too unweildy to put in this way.</span>")
return 1
else if(user.a_intent != INTENT_HARM)
if (!state_open)
+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
+7 -7
View File
@@ -178,7 +178,7 @@
/obj/structure/sign/poster/contraband
poster_item_name = "contraband poster"
poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities."
poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard space facilities."
poster_item_icon_state = "rolled_poster"
/obj/structure/sign/poster/contraband/random
@@ -264,7 +264,7 @@
/obj/structure/sign/poster/contraband/power
name = "Power"
desc = "A poster that positions the seat of power outside Nanotrasen."
desc = "A poster that positions the seat of power outside Kinaris.Co."
icon_state = "poster16"
/obj/structure/sign/poster/contraband/space_cube
@@ -425,8 +425,8 @@
icon_state = "poster1_legit"
/obj/structure/sign/poster/official/nanotrasen_logo
name = "Nanotrasen Logo"
desc = "A poster depicting the Nanotrasen logo."
name = "Kinaris Logo"
desc = "A poster depicting the Kinaris.Co logo."
icon_state = "poster2_legit"
/obj/structure/sign/poster/official/cleanliness
@@ -556,12 +556,12 @@
/obj/structure/sign/poster/official/pda_ad
name = "PDA Ad"
desc = "A poster advertising the latest PDA from Nanotrasen suppliers."
desc = "A poster advertising the latest PDA from Think-a-tronic suppliers."
icon_state = "poster28_legit"
/obj/structure/sign/poster/official/enlist
name = "Enlist" // but I thought deathsquad was never acknowledged
desc = "Enlist in the Nanotrasen Deathsquadron reserves today!"
desc = "Enlist in the Kinaris Deathsquadron reserves today!"
icon_state = "poster29_legit"
/obj/structure/sign/poster/official/nanomichi_ad
@@ -586,7 +586,7 @@
/obj/structure/sign/poster/official/no_erp
name = "No ERP"
desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Nanotrasen stations."
desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Kinaris stations."
icon_state = "poster34_legit"
/obj/structure/sign/poster/official/wtf_is_co2
@@ -172,6 +172,53 @@
/obj/item/organ/body_egg/alien_embryo = 1,
/obj/item/organ/regenerative_core = 2)
lootcount = 3
/obj/effect/spawner/lootdrop/teratoma/minor
name = "teratoma spawner"
loot = list(
/obj/item/organ/tongue = 5,
/obj/item/organ/tongue/lizard = 1,
/obj/item/organ/tail/cat = 1,
/obj/item/organ/stomach = 5,
/obj/item/organ/tongue/zombie = 1,
/obj/item/organ/tongue/fly = 1,
/obj/item/organ/stomach/fly = 1,
/obj/item/organ/ears = 5,
/obj/item/organ/ears/cat = 1,
/obj/item/organ/eyes = 5,
/obj/item/organ/heart = 5,
/obj/item/organ/liver = 5,
/obj/item/organ/tail/lizard = 1,
/obj/item/organ/appendix = 5,
/obj/effect/gibspawner/human = 1)
/obj/effect/spawner/lootdrop/teratoma/major
name = "advanced teratoma spawner"
loot = list(
/obj/item/organ/adamantine_resonator = 2,
/obj/item/organ/heart/gland/viral = 1,
/obj/item/organ/eyes/night_vision = 1,
/obj/item/organ/liver/plasmaman = 3,
/obj/item/organ/stomach/plasmaman = 3,
/obj/item/organ/lungs/plasmaman = 3,
/obj/item/organ/lungs/slime = 3,
/obj/item/organ/tongue/abductor = 1,
/obj/item/organ/tongue/bone = 3,
/obj/item/organ/tongue/bone/plasmaman = 1,
/obj/item/organ/vocal_cords/adamantine = 1,
/obj/effect/gibspawner/xeno = 1,
/obj/effect/mob_spawn/human/corpse/assistant = 1,
/obj/effect/mob_spawn/teratomamonkey = 5)
/obj/effect/spawner/lootdrop/teratoma/major/clown
name = "funny teratoma spawner"
loot = list(
/mob/living/simple_animal/hostile/retaliate/frog = 1,
/mob/living/simple_animal/hostile/retaliate/clown = 1,
/mob/living/simple_animal/hostile/retaliate/spaceman = 1,
/obj/item/clothing/mask/gas/clown_hat = 4,
/obj/item/clothing/shoes/clown_shoes = 3,
/obj/item/bikehorn = 5,
/obj/item/reagent_containers/food/snacks/pie/cream = 3)
/obj/effect/spawner/lootdrop/two_percent_xeno_egg_spawner
name = "2% chance xeno egg spawner"
+21
View File
@@ -160,6 +160,7 @@ RLD
var/mode = 1
var/ranged = FALSE
var/computer_dir = 1
var/airlock_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
@@ -281,6 +282,22 @@ RLD
return FALSE
return TRUE
/obj/item/construction/rcd/proc/change_airlock_direction(mob/user)
if(!user)
return
var/list/airlock_dirs = list(
"North/South" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlocknorthsouth"),
"East/West" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlockeastwest")
)
var/airlockdirs = show_radial_menu(user, src, airlock_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
return
switch(airlockdirs)
if("North/South")
airlock_dir = 1
if("East/West")
airlock_dir = 4
/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
if(!user)
return
@@ -486,6 +503,7 @@ RLD
if(mode == RCD_AIRLOCK)
choices += list(
"Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"),
"Change Direction" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlockrotation"),
"Change Airlock Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlocktype")
)
else if(mode == RCD_WINDOWGRILLE)
@@ -513,6 +531,9 @@ RLD
if("Change Access")
change_airlock_access(user)
return
if("Change Direction")
change_airlock_direction(user)
return
if("Change Airlock Type")
change_airlock_setting(user)
return
+1 -1
View File
@@ -32,7 +32,7 @@
AddComponent(/datum/component/slippery, 80)
/obj/item/soap/nanotrasen
desc = "A Nanotrasen brand bar of soap. Smells of plasma."
desc = "A Kinaris.Co brand bar of soap. Smells of plasma."
icon_state = "soapnt"
/obj/item/soap/homemade
@@ -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
+15 -1
View File
@@ -453,7 +453,7 @@ GENE SCANNER
if(M.reagents.reagent_list.len)
var/list/datum/reagent/reagents = list()
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R.invisible)
if(R.chemical_flags & REAGENT_INVISIBLE)
continue
reagents += R
@@ -475,6 +475,20 @@ GENE SCANNER
msg += "*---------*</span>"
to_chat(user, msg)
if(M.reagents.has_reagent("fermiTox"))
var/datum/reagent/fermiTox = M.reagents.has_reagent("fermiTox")
switch(fermiTox.volume)
if(5 to 10)
msg += "<span class='notice'>Subject contains a low amount of toxic isomers.</span>\n"
if(10 to 25)
msg += "<span class='danger'>Subject contains toxic isomers.</span>\n"
if(25 to 50)
msg += "<span class='danger'>Subject contains a substantial amount of toxic isomers.</span>\n"
if(50 to 95)
msg += "<span class='danger'>Subject contains a high amount of toxic isomers.</span>\n"
if(95 to INFINITY)
msg += "<span class='danger'>Subject contains a extremely dangerous amount of toxic isomers.</span>\n"
/obj/item/healthanalyzer/verb/toggle_mode()
set name = "Switch Verbosity"
set category = "Object"
+2
View File
@@ -1,5 +1,6 @@
/obj/item/restraints
breakouttime = 600
var/demoralize_criminals = TRUE // checked on carbon/carbon.dm to decide wheter to apply the handcuffed negative moodlet or not.
/obj/item/restraints/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -220,6 +221,7 @@
name = "fake handcuffs"
desc = "Fake handcuffs meant for gag purposes."
breakouttime = 10 //Deciseconds = 1s
demoralize_criminals = FALSE
/obj/item/restraints/handcuffs/fake/kinky
name = "kinky handcuffs"
+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
+30 -1
View File
@@ -249,7 +249,7 @@
return
var/obj/item/nullrod/holy_weapon
var/list/holy_weapons_list = typesof(/obj/item/nullrod) + list(
/obj/item/melee/transforming/energy/sword/cx/chaplain
/obj/item/twohanded/dualsaber/hypereutactic/chaplain
)
var/list/display_names = list()
for(var/V in holy_weapons_list)
@@ -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,7 +1,19 @@
/obj/item/implant/tracking
name = "tracking implant"
desc = "Track with this."
activated = 0
activated = FALSE
var/lifespan_postmortem = 10 MINUTES //for how many deciseconds after user death will the implant work?
var/allow_teleport = TRUE //will people implanted with this act as teleporter beacons?
/obj/item/implant/tracking/c38
name = "TRAC implant"
desc = "A smaller tracking implant that supplies power for only a few minutes."
var/lifespan = 5 MINUTES //how many deciseconds does the implant last?
allow_teleport = FALSE
/obj/item/implant/tracking/c38/Initialize()
. = ..()
QDEL_IN(src, lifespan)
/obj/item/implant/tracking/New()
..()
@@ -21,7 +33,7 @@
var/dat = {"<b>Implant Specifications:</b><BR>
<b>Name:</b> Tracking Beacon<BR>
<b>Life:</b> 10 minutes after death of host<BR>
<b>Important Notes:</b> None<BR>
<b>Important Notes:</b> Implant also works as a teleporter beacon.<BR>
<HR>
<b>Implant Details:</b> <BR>
<b>Function:</b> Continuously transmits low power signal. Useful for tracking.<BR>
+31 -31
View File
@@ -271,10 +271,10 @@
"}
/obj/item/book/manual/wiki/chemistry
name = "Chemistry Textbook"
name = "Guide to chems"
icon_state ="chemistrybook"
author = "Nanotrasen"
title = "Chemistry Textbook"
author = "Kin-Chems"
title = "Guide to chems"
page_link = "Guide_to_chemistry"
/obj/item/book/manual/wiki/engineering_construction
@@ -292,17 +292,17 @@
page_link = "Guide_to_engineering"
/obj/item/book/manual/wiki/engineering_singulo_tesla
name = "Singularity and Tesla for Dummies"
name = "Singularity 101"
icon_state ="bookEngineeringSingularitySafety"
author = "Engineering Encyclopedia"
title = "Singularity and Tesla for Dummies"
title = "Singularity 101"
page_link = "Singularity_and_Tesla_engines"
/obj/item/book/manual/wiki/security_space_law
name = "Space Law"
desc = "A set of Nanotrasen guidelines for keeping law and order on their space stations."
desc = "A set of Kin-Station guidelines for keeping law and order on their space stations."
icon_state = "bookSpaceLaw"
author = "Nanotrasen"
author = "Kin.Co PMC"
title = "Space Law"
page_link = "Space_Law"
@@ -311,10 +311,10 @@
return OXYLOSS
/obj/item/book/manual/wiki/infections
name = "Infections - Making your own pandemic!"
name = "Space CDC: Infections and you!"
icon_state = "bookInfections"
author = "Infections Encyclopedia"
title = "Infections - Making your own pandemic!"
title = "Space CDC: Infections and you!"
page_link = "Infections"
/obj/item/book/manual/wiki/telescience
@@ -325,16 +325,16 @@
page_link = "Guide_to_telescience"
/obj/item/book/manual/wiki/engineering_hacking
name = "Hacking"
name = "Hacking: A greytider's manual"
icon_state ="bookHacking"
author = "Engineering Encyclopedia"
title = "Hacking"
author = "The Greytider"
title = "Hacking: A greytider's manual"
page_link = "Hacking"
/obj/item/book/manual/wiki/detective
name = "The Film Noir: Proper Procedures for Investigations"
icon_state ="bookDetective"
author = "Nanotrasen"
author = "The Stranger"
title = "The Film Noir: Proper Procedures for Investigations"
page_link = "Detective"
@@ -346,17 +346,17 @@
page_link = "Guide_to_food_and_drinks"
/obj/item/book/manual/wiki/robotics_cyborgs
name = "Robotics for Dummies"
name = "The offical Robotics manual"
icon_state = "borgbook"
author = "XISC"
title = "Robotics for Dummies"
title = "The offical Robotics manual"
page_link = "Guide_to_robotics"
/obj/item/book/manual/wiki/research_and_development
name = "Research and Development 101"
name = "RnD: safe sciences"
icon_state = "rdbook"
author = "Dr. L. Ight"
title = "Research and Development 101"
title = "RnD: safe sciences"
page_link = "Guide_to_Research_and_Development"
/obj/item/book/manual/wiki/experimentor
@@ -369,37 +369,37 @@
/obj/item/book/manual/wiki/medical_cloning
name = "Cloning techniques of the 26th century"
icon_state ="bookCloning"
author = "Medical Journal, volume 3"
author = "Angel Paulson"
title = "Cloning techniques of the 26th century"
page_link = "Guide_to_genetics#Cloning"
/obj/item/book/manual/wiki/cooking_to_serve_man
name = "To Serve Man"
desc = "It's a cookbook!"
name = "Cooking for kids!"
desc = "It's a cooking datapad!"
icon_state ="cooked_book"
author = "the Kanamitan Empire"
title = "To Serve Man"
author = "Gordon Ramsay"
title = "Cooking for kids!"
page_link = "Guide_to_food_and_drinks"
/obj/item/book/manual/wiki/circuitry
name = "Circuitry for Dummies"
name = "Wiring and safety manual"
icon_state = "book1"
author = "Dr. Hans Asperger"
title = "Circuitry for Dummies"
title = "Wiring and safety manual"
page_link = "Guide_to_circuits"
/obj/item/book/manual/wiki/tcomms
name = "Subspace Telecommunications And You"
name = "Keeping communications"
icon_state = "book3"
author = "Engineering Encyclopedia"
title = "Subspace Telecommunications And You"
title = "Keeping communications"
page_link = "Guide_to_Telecommunications"
/obj/item/book/manual/wiki/atmospherics
name = "Lexica Atmosia"
name = "O2 & You"
icon_state = "book5"
author = "the City-state of Atmosia"
title = "Lexica Atmosia"
author = "the department of NT-Atmos"
title = "O2 & You"
page_link = "Guide_to_Atmospherics"
/obj/item/book/manual/wiki/medicine
@@ -410,10 +410,10 @@
page_link = "Guide_to_medicine"
/obj/item/book/manual/wiki/surgery
name = "Brain Surgery for Dummies"
name = "Surgery: step by step"
icon_state = "book4"
author = "Dr. F. Fran"
title = "Brain Surgery for Dummies"
title = "Surgery: step by step"
page_link = "Surgery"
/obj/item/book/manual/wiki/grenades
+91
View File
@@ -0,0 +1,91 @@
/obj/item/mesmetron
name = "Mesmetron"
desc = "An elaborate pocketwatch, with a captivating gold etching and an enchanting face..."
icon = 'icons/obj/pocketwatch.dmi'
icon_state = "pocketwatch"
item_state = "pocketwatch"
w_class = WEIGHT_CLASS_SMALL
throw_range = 7
throw_speed = 3
var/mob/living/carbon/subject = null
var/closed = FALSE
//Hypnotize someone
/obj/item/mesmetron/attack(mob/living/carbon/human/H, mob/living/user)
if(closed)
return
if(H.IsSleeping())
to_chat(user, "You can't hypnotize [H] whilst they're asleep!")
return
user.visible_message("<span class='warning'>[user] begins to mesmerizingly wave [src] like a pendulum before [H]'s very eyes!</span>")
if(!do_mob(user, H, 12 SECONDS))
return
if(!(user in view(1, loc)))
return
var/response = alert(H, "Do you wish to fall into a hypnotic sleep? (This will allow [user] to issue hypnotic suggestions)", "Hypnosis", "Yes", "No")
if(response == "Yes")
H.visible_message("<span class='warning'>[H] falls into a deep slumber!</span>", "<span class ='danger'>Your eyelids gently shut as you fall into a deep slumber. All you can hear is [user]'s voice as you commit to following all of their suggestions</span>")
H.SetSleeping(1200)
H.drowsyness = max(H.drowsyness, 40)
subject = H
return
//No
H.visible_message("<span class='warning'>[H]'s attention breaks, despite your attempts to hypnotize them! They clearly don't want this</span>", "<span class ='warning'>Your concentration breaks as you realise you have no interest in following [user]'s words!</span>")
//If there's a subject, open the suggestion interface
/obj/item/mesmetron/attack_self(mob/user)
if(closed)
return
if(!subject)
return
if(!subject.IsSleeping())
to_chat(user, "[subject] is awake and no longer under hypnosis!")
subject = null
return
var/response = alert(user, "Would you like to release your subject or give them a suggestion?", "Mesmetron", "Suggestion", "Release")
if(response == "Suggestion")
if(get_dist(user, subject) > 1)
to_chat(user, "You must stand in whisper range of [subject].")
return
text = input("What would you like to suggest?", "Hypnotic suggestion", null, null)
text = sanitize(text)
if(!text)
return
to_chat(user, "You whisper your suggestion in a smooth calming voice to [subject]")
to_chat(subject, "<span class='hypnophrase'>...[text]...</span>")
return
//Release
subject.visible_message("<span class='warning'>[subject] wakes up from their deep slumber!</span>", "<span class ='danger'>Your eyelids gently open as you see [user]'s face staring back at you</span>")
subject.SetSleeping(0)
subject = null
//Toggle open/close
/obj/item/mesmetron/AltClick(mob/user)
//Close it
if(icon_state == "pocketwatch")
icon_state = "pocketwatch_closed"
item_state = "pocketwatch_closed"
desc = "An elaborate pocketwatch, with a captivating gold etching. It's closed however and you can't see it's face"
closed = TRUE
return
//Open it
icon_state = "pocketwatch"
item_state = "pocketwatch"
desc = "An elaborate pocketwatch, with a captivating gold etching and an enchanting face..."
closed = FALSE
-11
View File
@@ -840,12 +840,6 @@
icon_state = "rae"
item_state = "rae"
/obj/item/toy/plush/mammal/winfre
desc = "An adorable stuffed toy of a pissed hyena. She looks unamused."
icon_state = "winfre"
item_state = "winfre"
attack_verb = list("cackled", "swirlie'd", "stepped on")
/obj/item/toy/plush/mammal/zed
desc = "A masked stuffed toy that resembles a fierce miner. He even comes with his own little crusher!"
icon_state = "zed"
@@ -931,11 +925,6 @@
icon_state = "marisol"
item_state = "marisol"
/obj/item/toy/plush/mammal/marilyn
desc = "A cute stuffed fox toy. Now, about that sponge bath..."
icon_state = "marilyn"
item_state = "marilyn"
/obj/item/toy/plush/catgirl
name = "feline plushie"
desc = "An adorable stuffed toy that resembles a feline."
+4 -3
View File
@@ -95,8 +95,9 @@
if(affecting.heal_damage(heal_brute, heal_burn))
C.update_damage_overlays()
if (fix_bone) //Fix broken bones on targeted limb
affecting.broken = 0
affecting.disabled = 0
if(affecting.broken == 1)
affecting.broken = 0
affecting.disabled = 0
else
to_chat(user, "<span class='notice'>Medicine won't work on a robotic limb!</span>")
else
@@ -108,7 +109,7 @@
name = "plaster gauze"
gender = PLURAL
singular_name = "plaster gauze"
desc = "A roll of plaster of paris that is extremely effective at aiding bone fratcutres, but does not heal wounds."
desc = "A roll of plaster of paris that is extremely effective at aiding bone fractures, but does not heal wounds."
icon_state = "pgauze"
self_delay = 300
max_amount = 10

Some files were not shown because too many files have changed in this diff Show More