Merge pull request #15 from Citadel-Station-13/master

Mergeee
This commit is contained in:
Thalpy
2019-06-18 22:51:43 +01:00
committed by GitHub
614 changed files with 14171 additions and 9990 deletions
+5
View File
@@ -111,6 +111,9 @@ The use of the : operator to override type safety checks is not allowed. You mus
### Type paths must begin with a /
eg: `/datum/thing`, not `datum/thing`
### Type paths must be lowercase
eg: `/datum/thing/blue`, not `datum/thing/BLUE` or `datum/thing/Blue`
### Datum type paths must began with "datum"
In DM, this is optional, but omitting it makes finding definitions harder.
@@ -240,6 +243,8 @@ This prevents nesting levels from getting deeper then they need to be.
* Queries must never specify the database, be it in code, or in text files in the repo.
* Primary keys are inherently immutable and you must never do anything to change the primary key of a row or entity. This includes preserving auto increment numbers of rows when copying data to a table in a conversion script. No amount of bitching about gaps in ids or out of order ids will save you from this policy.
### Mapping Standards
* TGM Format & Map Merge
* All new maps submitted to the repo through a pull request must be in TGM format (unless there is a valid reason present to have it in the default BYOND format.) This is done using the [Map Merge](https://github.com/tgstation/tgstation/wiki/Map-Merger) utility included in the repo to convert the file to TGM format.
-9
View File
@@ -1,9 +0,0 @@
[Round ID]: # (If you discovered this issue from playing tgstation hosted servers:)
[Round ID]: # (**INCLUDE THE ROUND ID**)
[Round ID]: # (It can be found in the Status panel or retrieved from https://atlantaned.space/statbus/round.php ! The round id let's us look up valuable information and logs for the round the bug happened.)
[Testmerges]: # (If you believe the issue to be caused by a test merge [OOC tab -> Show Server Revision], report it in the pull request's comment section instead.)
[Reproduction]: # (Explain your issue in detail, including the steps to reproduce it. Issues without proper reproduction steps or explanation are open to being ignored/closed by maintainers.)
[For Admins]: # (Oddities induced by var-edits and other admin tools are not necessarily bugs. Verify that your issues occur under regular circumstances before reporting them.)
+20
View File
@@ -0,0 +1,20 @@
---
name: Bug report
about: Create a report to help reproduce and fix the issue
---
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable -->
## Round ID:
<!--- **INCLUDE THE ROUND ID**
If you discovered this issue from playing tgstation hosted servers:
[Round ID]: # (It can be found in the Status panel or retrieved from https://atlantaned.space/statbus/round.php ! The round id let's us look up valuable information and logs for the round the bug happened.)-->
## Testmerges:
<!-- If you're certain the issue is to be caused by a test merge [OOC tab -> Show Server Revision], report it in the pull request's comment section rather than on the tracker(If you're unsure you can refer to the issue number by prefixing said number with #. The issue number can be found beside the title after submitting it to the tracker).If no testmerges are active, feel free to remove this section. -->
## Reproduction:
<!-- Explain your issue in detail, including the steps to reproduce it. Issues without proper reproduction steps or explanation are open to being ignored/closed by maintainers.-->
<!-- **For Admins:** Oddities induced by var-edits and other admin tools are not necessarily bugs. Verify that your issues occur under regular circumstances before reporting them. -->
@@ -0,0 +1,7 @@
---
name: Feature request
about: Suggest an idea for this project
---
Please be aware that feature discussions most often take place on the Citadel Station Discord and should not be requested here.
+14 -3
View File
@@ -1,6 +1,16 @@
[Changelogs]: # (Your PR should contain a detailed changelog of notable changes, titled and categorized appropriately. This includes, new features, sprites, sounds, balance changes, admin tools, map edits, removals, big refactors, config changes, hosting changes and important fixes. An example changelog has been provided below for you to edit. If you need additional help, read https://github.com/tgstation/tgstation/wiki/Changelogs)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull request process. -->
:cl: optional name here
## About The Pull Request
<!-- Describe The Pull Request. Please be sure every change is documented or this can delay review and even discourage maintainers from merging your PR! -->
## Why It's Good For The Game
<!-- Please add a short description of why you think these changes would benefit the game. If you can't justify it in words, it might not be worth adding. -->
## Changelog
:cl:
add: Added new things
add: Added more things
del: Removed old things
@@ -19,4 +29,5 @@ admin: messed with admin stuff
server: something server ops should know
/:cl:
[why]: # (Please add a short description [two lines down] of why you think these changes would benefit the game. If you can't justify it in words, it might not be worth adding.)
<!-- Both :cl:'s are required for the changelog to work! You can put your name to the right of the first :cl: if you want to overwrite your GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. -->
+4 -1
View File
@@ -1,5 +1,6 @@
language: generic
sudo: false
dist: xenial
branches:
except:
- ___TGS3TempBranch
@@ -14,6 +15,7 @@ matrix:
packages:
- python3
- python3-pip
- python3-setuptools
cache:
directories:
- tgui/node_modules
@@ -43,7 +45,8 @@ matrix:
- gcc-multilib
- g++-7
- g++-7-multilib
- libmariadbclient-dev:i386
- libmariadb-client-lgpl-dev:i386
- libmariadbd-dev
cache:
directories:
- $HOME/.cargo
@@ -209,6 +209,8 @@
dir = 8
},
/obj/item/malf_upgrade,
/obj/item/disk/tech_disk/illegal,
/obj/structure/safe,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aB" = (
@@ -272,7 +272,14 @@
/obj/machinery/light,
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
"Z" = (
/obj/item/disk/design_disk/plant_disk,
/obj/machinery/autolathe{
hacked = TRUE;
desc = "This autolathe seems to have its safety light off."
},
/turf/open/floor/plasteel/freezer,
/area/ruin/powered/seedvault)
(1,1,1) = {"
a
a
@@ -375,7 +382,7 @@ h
h
u
R
u
Z
Q
a
a
+711
View File
@@ -0,0 +1,711 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"c" = (
/turf/closed/mineral/random/high_chance,
/area/ruin/powered)
"d" = (
/turf/closed/wall/mineral/titanium/survival/pod,
/area/ruin/powered)
"e" = (
/obj/machinery/computer/arcade,
/turf/open/floor/engine,
/area/ruin/powered)
"f" = (
/obj/machinery/light{
dir = 1
},
/obj/machinery/vending/coffee,
/turf/open/floor/engine,
/area/ruin/powered)
"g" = (
/obj/item/coin,
/obj/item/toy/plush/random,
/turf/open/floor/engine,
/area/ruin/powered)
"h" = (
/obj/effect/mob_spawn/human/corpse/assistant,
/obj/effect/decal/cleanable/blood,
/obj/item/toy/plush/random,
/turf/open/floor/engine,
/area/ruin/powered)
"i" = (
/obj/machinery/light{
dir = 4
},
/obj/item/toy/plush/random,
/turf/open/floor/engine,
/area/ruin/powered)
"j" = (
/obj/machinery/light{
dir = 8
},
/turf/open/floor/engine,
/area/ruin/powered)
"k" = (
/obj/item/coin/gold,
/turf/open/floor/engine,
/area/ruin/powered)
"l" = (
/turf/open/floor/engine,
/area/ruin/powered)
"m" = (
/obj/item/coin/iron,
/turf/open/floor/engine,
/area/ruin/powered)
"n" = (
/obj/item/toy/plush/random,
/turf/open/floor/engine,
/area/ruin/powered)
"o" = (
/obj/item/kitchen/knife{
pixel_x = 5;
pixel_y = 11
},
/obj/item/toy/plush/random,
/turf/open/floor/engine,
/area/ruin/powered)
"p" = (
/turf/closed/wall/mineral/titanium/survival/nodiagonal,
/area/ruin/powered)
"q" = (
/turf/open/floor/light/colour_cycle/dancefloor_b,
/area/ruin/powered)
"r" = (
/turf/open/floor/light/colour_cycle/dancefloor_a,
/area/ruin/powered)
"s" = (
/obj/machinery/door/airlock/external/glass,
/obj/structure/fans/tiny,
/turf/open/floor/engine,
/area/ruin/powered)
"t" = (
/obj/item/trash/chips,
/turf/open/floor/engine,
/area/ruin/powered)
"u" = (
/obj/item/trash/cheesie,
/turf/open/floor/engine,
/area/ruin/powered)
"v" = (
/obj/item/coin,
/turf/open/floor/engine,
/area/ruin/powered)
"w" = (
/obj/item/coin/diamond,
/turf/open/floor/engine,
/area/ruin/powered)
"x" = (
/obj/machinery/jukebox/disco/indestructible,
/turf/open/floor/light/colour_cycle/dancefloor_b,
/area/ruin/powered)
"y" = (
/obj/machinery/light,
/turf/open/floor/engine,
/area/ruin/powered)
"z" = (
/obj/machinery/light{
dir = 4
},
/turf/open/floor/engine,
/area/ruin/powered)
"A" = (
/obj/machinery/door/airlock/external/glass,
/turf/open/floor/engine,
/area/ruin/powered)
"B" = (
/obj/machinery/vending/cola/random,
/turf/open/floor/engine,
/area/ruin/powered)
"C" = (
/obj/machinery/vending/snack/random,
/turf/open/floor/engine,
/area/ruin/powered)
"D" = (
/obj/item/trash/can,
/turf/open/floor/engine,
/area/ruin/powered)
"E" = (
/obj/item/trash/sosjerky,
/turf/open/floor/engine,
/area/ruin/powered)
"F" = (
/obj/structure/closet/crate/trashcart,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"G" = (
/obj/structure/chair/sofa/right,
/turf/open/floor/engine,
/area/ruin/powered)
"H" = (
/obj/structure/chair/sofa/left,
/obj/item/bedsheet/ian,
/turf/open/floor/engine,
/area/ruin/powered)
"I" = (
/obj/item/aiModule/toyAI,
/turf/open/floor/engine,
/area/ruin/powered)
"J" = (
/obj/item/twohanded/dualsaber/toy,
/turf/open/floor/light/colour_cycle/dancefloor_b,
/area/ruin/powered)
"K" = (
/obj/item/gun/energy/pumpaction/toy,
/turf/open/floor/engine,
/area/ruin/powered)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
b
b
b
b
a
a
a
a
a
a
a
a
a
a
a
a
"}
(3,1,1) = {"
a
a
a
b
b
b
b
b
b
b
b
a
a
a
b
b
b
b
a
a
"}
(4,1,1) = {"
a
a
a
b
b
b
b
b
b
b
b
a
a
b
b
b
b
b
b
a
"}
(5,1,1) = {"
a
a
a
b
b
c
c
c
c
b
b
b
b
b
b
c
c
c
b
b
"}
(6,1,1) = {"
a
a
a
b
c
c
c
c
c
b
b
b
b
c
c
c
c
c
c
b
"}
(7,1,1) = {"
a
a
a
b
c
c
d
d
d
d
d
d
d
d
d
d
c
c
c
b
"}
(8,1,1) = {"
a
a
a
b
c
c
d
e
j
l
l
K
j
G
B
d
c
c
b
b
"}
(9,1,1) = {"
a
a
a
b
c
c
d
e
k
l
v
l
l
H
C
d
c
c
b
a
"}
(10,1,1) = {"
a
a
b
b
c
c
d
e
l
I
l
l
l
k
B
d
c
c
b
a
"}
(11,1,1) = {"
a
a
b
c
c
c
d
e
l
l
w
l
y
d
d
p
c
b
b
a
"}
(12,1,1) = {"
a
a
b
c
c
c
d
e
m
J
r
q
l
A
l
s
b
b
b
a
"}
(13,1,1) = {"
a
b
b
c
c
c
d
f
l
r
x
r
l
d
d
d
b
b
b
a
"}
(14,1,1) = {"
a
b
b
c
c
c
d
e
l
q
r
q
D
A
l
s
b
b
b
a
"}
(15,1,1) = {"
a
b
b
b
c
c
d
e
t
u
l
E
y
d
d
p
b
b
b
a
"}
(16,1,1) = {"
a
b
b
b
c
c
d
e
g
n
t
k
l
l
B
d
c
b
b
a
"}
(17,1,1) = {"
a
b
b
c
c
c
d
e
h
o
D
l
D
l
C
d
c
c
b
b
"}
(18,1,1) = {"
a
a
b
c
c
c
d
e
i
n
E
l
z
m
B
d
c
c
c
b
"}
(19,1,1) = {"
a
a
b
c
c
c
d
d
d
d
d
d
d
d
d
d
c
c
c
b
"}
(20,1,1) = {"
a
a
b
b
c
c
c
c
c
c
b
F
b
c
c
c
c
c
c
b
"}
(21,1,1) = {"
a
a
a
b
c
c
c
c
c
c
b
b
b
c
c
c
c
c
b
b
"}
(22,1,1) = {"
a
a
a
b
b
c
c
c
c
b
b
b
b
b
b
c
c
b
b
a
"}
(23,1,1) = {"
a
a
a
a
b
b
b
b
b
b
a
b
b
b
b
b
b
b
a
a
"}
(24,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
b
b
b
b
b
a
a
a
"}
(25,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
b
b
a
a
a
a
"}
@@ -0,0 +1,731 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"c" = (
/turf/closed/mineral/random/high_chance,
/area/ruin/powered)
"d" = (
/turf/closed/wall/r_wall/rust,
/area/ruin/powered)
"e" = (
/obj/machinery/mecha_part_fabricator,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"f" = (
/turf/closed/wall/rust,
/area/ruin/powered)
"g" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/stack/sheet/glass/fifty,
/obj/item/stack/sheet/metal/fifty,
/turf/open/floor/plasteel,
/area/ruin/powered)
"h" = (
/obj/machinery/mecha_part_fabricator,
/obj/machinery/light{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"i" = (
/obj/structure/table,
/obj/machinery/light{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
/obj/item/stack/sheet/glass/fifty,
/obj/item/stack/sheet/metal/fifty,
/turf/open/floor/plasteel,
/area/ruin/powered)
"j" = (
/obj/structure/chair/sofa/right,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"k" = (
/turf/open/floor/plasteel,
/area/ruin/powered)
"l" = (
/obj/structure/chair/sofa/left,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"m" = (
/obj/machinery/computer/rdconsole/production{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"n" = (
/obj/effect/decal/cleanable/oil/streak,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"o" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"p" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"q" = (
/obj/machinery/light{
dir = 8
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/aug_manipulator,
/turf/open/floor/plasteel,
/area/ruin/powered)
"r" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/organ/cyberimp/chest/reviver,
/turf/open/floor/plasteel,
/area/ruin/powered)
"s" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/organ/cyberimp/arm/surgery,
/turf/open/floor/plasteel,
/area/ruin/powered)
"t" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/plasteel,
/area/ruin/powered)
"u" = (
/obj/machinery/light{
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"v" = (
/obj/machinery/porta_turret/syndicate/energy{
mode = 1
},
/turf/closed/wall/r_wall/rust,
/area/ruin/powered)
"w" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/computer/mech_bay_power_console{
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"x" = (
/obj/effect/decal/cleanable/oil,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"y" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1,
/turf/open/floor/plasteel,
/area/ruin/powered)
"z" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/storage/belt/utility/full,
/obj/item/clothing/glasses/welding,
/turf/open/floor/plasteel,
/area/ruin/powered)
"A" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/mmi/posibrain{
pixel_y = 9
},
/obj/item/mmi,
/turf/open/floor/plasteel,
/area/ruin/powered)
"B" = (
/obj/structure/table/optable,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"C" = (
/obj/machinery/mech_bay_recharge_port,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"D" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mech_bay_recharge_floor,
/area/ruin/powered)
"E" = (
/obj/machinery/computer/operating{
dir = 1
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"F" = (
/obj/structure/table,
/obj/effect/decal/cleanable/dirt,
/obj/item/autosurgeon{
name = "rusted autosurgeon";
desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert an organ of implant. But this rusted version looks like it could only manage one implant....";
uses = 1
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"G" = (
/obj/machinery/light,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/airalarm{
dir = 1;
pixel_y = -22
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"H" = (
/obj/effect/decal/cleanable/oil,
/obj/machinery/light,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/ruin/powered)
"I" = (
/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plasteel,
/area/ruin/powered)
"J" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer1{
dir = 4
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"K" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 4
},
/turf/closed/mineral/random/high_chance,
/area/ruin/powered)
"L" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 4
},
/turf/closed/wall/r_wall/rust,
/area/ruin/powered)
"M" = (
/obj/structure/mecha_wreckage/ripley,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"N" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 4
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"O" = (
/obj/machinery/turretid{
lethal = 1;
pixel_y = -25;
req_access = null
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
dir = 5
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"P" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
/area/ruin/powered)
"Q" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 1
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"R" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/open/floor/plasteel,
/area/ruin/powered)
"S" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{
dir = 9
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"T" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/tank/air{
dir = 8
},
/turf/open/floor/plasteel,
/area/ruin/powered)
"U" = (
/obj/machinery/door/airlock/external/glass,
/obj/structure/fans/tiny,
/turf/open/floor/plasteel,
/area/ruin/powered)
"V" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/reagent_dispensers/fueltank,
/turf/open/floor/plasteel,
/area/ruin/powered)
(1,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(2,1,1) = {"
a
a
a
a
a
a
b
b
b
b
a
a
a
a
a
a
a
a
a
a
"}
(3,1,1) = {"
a
a
a
a
b
b
c
c
c
c
J
b
b
a
a
a
a
a
a
a
"}
(4,1,1) = {"
a
a
a
b
c
c
c
c
c
c
K
c
b
b
b
a
a
a
a
a
"}
(5,1,1) = {"
a
a
b
c
c
d
d
d
d
d
L
d
c
c
b
a
a
a
a
a
"}
(6,1,1) = {"
a
a
b
c
d
d
m
q
w
C
M
d
d
c
b
a
a
a
a
a
"}
(7,1,1) = {"
a
b
b
c
d
e
n
o
x
D
N
f
d
v
b
a
a
a
a
a
"}
(8,1,1) = {"
a
b
c
c
d
g
o
o
y
Q
S
I
k
U
b
a
a
a
a
a
"}
(9,1,1) = {"
a
b
c
c
d
h
p
r
z
o
G
f
f
d
b
a
a
a
a
a
"}
(10,1,1) = {"
a
b
c
c
d
i
p
s
A
o
H
f
f
d
b
a
a
a
a
a
"}
(11,1,1) = {"
a
b
c
c
d
j
p
t
F
o
p
I
k
U
b
a
a
a
a
a
"}
(12,1,1) = {"
a
b
c
c
d
l
p
p
P
R
O
f
d
v
b
b
a
a
a
a
"}
(13,1,1) = {"
a
b
b
c
d
d
V
u
B
E
T
d
d
c
c
b
a
a
a
a
"}
(14,1,1) = {"
a
a
b
c
c
d
d
d
d
d
d
d
c
c
c
b
a
a
a
a
"}
(15,1,1) = {"
a
a
a
b
c
c
c
c
c
c
c
c
c
c
b
b
a
a
a
a
"}
(16,1,1) = {"
a
a
a
b
b
b
b
c
c
c
c
b
b
b
b
a
a
a
a
a
"}
(17,1,1) = {"
a
a
a
a
a
a
b
b
b
b
b
b
a
a
a
a
a
a
a
a
"}
(18,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(19,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
(20,1,1) = {"
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
"}
+196
View File
@@ -0,0 +1,196 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
/turf/template_noop,
/area/template_noop)
"b" = (
/obj/structure/lattice,
/turf/template_noop,
/area/template_noop)
"c" = (
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"d" = (
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"e" = (
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/structure/fans/tiny/invisible,
/obj/structure/closet/secure_closet/freezer,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"f" = (
/obj/structure/chair/sofa/left{
dir = 4
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"g" = (
/obj/item/flashlight/lamp/bananalamp{
brightness_on = 10
},
/obj/structure/table/wood,
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"h" = (
/obj/structure/table/wood,
/obj/machinery/computer/security/wooden_tv,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"i" = (
/obj/structure/chair/sofa/right{
dir = 4
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"j" = (
/obj/structure/sink/puddle,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"k" = (
/obj/structure/chair/sofa{
dir = 4
},
/mob/living/simple_animal/hostile/gorilla{
AIStatus = null;
desc = "There is no need to be upset.";
dir = 4;
name = "Familiar Gorilla"
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"l" = (
/obj/effect/overlay/palmtree_r,
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
"m" = (
/obj/item/grown/bananapeel,
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
(1,1,1) = {"
a
a
a
a
a
a
a
a
b
a
"}
(2,1,1) = {"
a
a
b
b
b
b
b
b
a
a
"}
(3,1,1) = {"
a
a
b
b
g
d
d
b
b
a
"}
(4,1,1) = {"
a
a
b
d
f
k
i
d
d
b
"}
(5,1,1) = {"
a
a
b
e
c
c
m
j
d
b
"}
(6,1,1) = {"
a
a
b
d
c
h
c
l
d
b
"}
(7,1,1) = {"
a
b
b
b
d
d
d
b
b
a
"}
(8,1,1) = {"
a
b
a
a
b
b
b
b
b
b
"}
(9,1,1) = {"
a
b
a
a
a
b
a
a
a
b
"}
(10,1,1) = {"
a
a
a
a
a
b
a
a
a
a
"}
+1 -3
View File
@@ -2183,9 +2183,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/turf/open/floor/plasteel/white{
icon_state = "whitepurple"
},
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/ancientstation/rnd)
"fU" = (
/obj/effect/decal/cleanable/dirt,
@@ -742,6 +742,7 @@
/turf/open/indestructible/paper,
/area/ruin/powered)
"cc" = (
/obj/item/book/granter/action/origami,
/mob/living/simple_animal/hostile/boss/paper_wizard,
/turf/open/indestructible/paper,
/area/ruin/powered)
+10 -4
View File
@@ -27901,8 +27901,8 @@
pixel_x = 30
},
/obj/machinery/light,
/mob/living/simple_animal/bot/cleanbot{
name = "C.L.E.A.N."
/obj/machinery/computer/crew{
dir = 1
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
@@ -31596,7 +31596,7 @@
/area/medical/sleeper)
"bwC" = (
/obj/machinery/computer/med_data{
dir = 4
dir = 3
},
/turf/open/floor/plasteel/white,
/area/medical/sleeper)
@@ -56882,6 +56882,12 @@
/obj/item/pen,
/turf/open/floor/plasteel/white,
/area/science/circuit)
"ium" = (
/mob/living/simple_animal/bot/cleanbot{
name = "C.L.E.A.N."
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"izv" = (
/obj/machinery/vending/clothing,
/obj/machinery/light/small{
@@ -94182,7 +94188,7 @@ blm
bmL
boi
bpw
bhh
ium
bsx
btX
bvj
+5
View File
@@ -35,3 +35,8 @@
//Overthrow time to update heads obj
#define OBJECTIVE_UPDATING_TIME 300
//Gangshit
#define NOT_DOMINATING -1
#define MAX_LEADERS_GANG 3
#define INITIAL_DOM_ATTEMPTS 3
+12 -10
View File
@@ -1,8 +1,5 @@
//LISTMOS
//indices of values in gas lists.
#define MOLES 1
#define ARCHIVE 2
#define GAS_META 3
#define META_GAS_SPECIFIC_HEAT 1
#define META_GAS_NAME 2
#define META_GAS_MOLES_VISIBLE 3
@@ -242,20 +239,25 @@
//HELPERS
#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
#define ADD_GAS(gas_id, out_list)\
var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id]; out_list[gas_id] = tmp_gaslist.Copy();
#define ASSERT_GAS(gas_id, gas_mixture) if (!gas_mixture.gases[gas_id]) { ADD_GAS(gas_id, gas_mixture.gases) };
#define QUANTIZE(variable) (round(variable,0.0000001))/*I feel the need to document what happens here. Basically this is used to catch most rounding errors, however it's previous value made it so that
once gases got hot enough, most procedures wouldnt occur due to the fact that the mole counts would get rounded away. Thus, we lowered it a few orders of magnititude */
//prefer this to gas_mixture/total_moles in performance critical areas
#define TOTAL_MOLES(cached_gases, out_var)\
out_var = 0;\
for(var/total_moles_id in cached_gases){\
out_var += cached_gases[total_moles_id][MOLES];\
out_var += cached_gases[total_moles_id];\
}
//Unomos - So for whatever reason, garbage collection actually drastically decreases the cost of atmos later in the round. Turning this into a define yields massively improved performance.
#define GAS_GARBAGE_COLLECT(GASGASGAS)\
var/list/CACHE_GAS = GASGASGAS;\
for(var/id in CACHE_GAS){\
if(QUANTIZE(CACHE_GAS[id]) <= 0)\
CACHE_GAS -= id;\
}
#define ARCHIVE_TEMPERATURE(gas) gas.temperature_archived = gas.temperature
GLOBAL_LIST_INIT(pipe_paint_colors, list(
"amethyst" = rgb(130,43,255), //supplymain
+2 -2
View File
@@ -33,8 +33,8 @@
#define BALLS_VOLUME_MULT 1
#define BALLS_SIZE_MIN 1
#define BALLS_SIZE_DEF 3
#define BALLS_SIZE_MAX 7
#define BALLS_SIZE_DEF 2
#define BALLS_SIZE_MAX 3
#define BALLS_SACK_SIZE_MIN 1
#define BALLS_SACK_SIZE_DEF 8
+3 -2
View File
@@ -142,8 +142,9 @@
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
// /obj signals
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag)
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
// /obj/item signals
#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user)
+2 -1
View File
@@ -102,7 +102,8 @@
#define CAT_SANDWICH "Sandwiches"
#define CAT_SOUP "Soups"
#define CAT_SPAGHETTI "Spaghettis"
#define CAT_SUSHI "Fish"
#define CAT_FISH "Fish"
#define CAT_ICE "Frozen"
#define RCD_FLOORWALL 1
#define RCD_AIRLOCK 2
-3
View File
@@ -56,9 +56,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define FLYING (1<<1)
#define VENTCRAWLING (1<<2)
// Flags for reagents
#define REAGENT_NOREACT (1<<0)
//Fire and Acid stuff, for resistance_flags
#define LAVA_PROOF (1<<0)
#define FIRE_PROOF (1<<1) //100% immune to fire damage (but not necessarily to lava or heat)
+3
View File
@@ -218,6 +218,9 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
//Gets the turf this atom inhabits
#define get_turf(A) (get_step(A, 0))
//Same as above except gets the area instead
#define get_area(A) (isarea(A) ? A : get_step(A, 0)?.loc)
//Ghost orbit types:
#define GHOST_ORBIT_CIRCLE "circle"
#define GHOST_ORBIT_TRIANGLE "triangle"
+4
View File
@@ -54,6 +54,10 @@
#define BODYPART_ORGANIC 1
#define BODYPART_ROBOTIC 2
#define BODYPART_NOT_DISABLED 0
#define BODYPART_DISABLED_DAMAGE 1
#define BODYPART_DISABLED_PARALYSIS 2
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
+2 -1
View File
@@ -2,7 +2,7 @@
#define LIQUID 2
#define GAS 3
// container_type defines
// reagents_flags defines
#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes.
#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes.
@@ -11,6 +11,7 @@
#define TRANSPARENT (1<<4) // Used on containers which you want to be able to see the reagents off.
#define AMOUNT_VISIBLE (1<<5) // For non-transparent containers that still have the general amount of reagents in them visible.
#define NO_REACT (1<<6) // Applied to a reagent holder, the contents will not react with each other.
// Is an open container for all intents and purposes.
#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT)
+4 -2
View File
@@ -33,7 +33,8 @@
#define ROLE_DRONE "drone"
#define ROLE_DEATHSQUAD "deathsquad"
#define ROLE_LAVALAND "lavaland"
#define ROLE_INTERNAL_AFFAIRS "internal affairs agent"
#define ROLE_INTERNAL_AFFAIRS "internal affairs agent"
#define ROLE_GANG "gangster"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
@@ -58,7 +59,8 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult,
ROLE_OVERTHROW = /datum/game_mode/overthrow,
ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs,
ROLE_SENTIENCE
ROLE_SENTIENCE,
ROLE_GANG = /datum/game_mode/gang
))
//Job defines for what happens when you fail to qualify for any job during job selection
+69 -1
View File
@@ -1,3 +1,61 @@
// trait accessor defines
#define ADD_TRAIT(target, trait, source) \
do { \
var/list/_L; \
if (!target.status_traits) { \
target.status_traits = list(); \
_L = target.status_traits; \
_L[trait] = list(source); \
} else { \
_L = target.status_traits; \
if (_L[trait]) { \
_L[trait] |= list(source); \
} else { \
_L[trait] = list(source); \
} \
} \
} while (0)
#define REMOVE_TRAIT(target, trait, sources) \
do { \
var/list/_L = target.status_traits; \
var/list/_S; \
if (sources && !islist(sources)) { \
_S = list(sources); \
} else { \
_S = sources\
}; \
if (_L && _L[trait]) { \
for (var/_T in _L[trait]) { \
if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \
_L[trait] -= _T \
} \
};\
if (!length(_L[trait])) { \
_L -= trait \
}; \
if (!length(_L)) { \
target.status_traits = null \
}; \
} \
} while (0)
#define REMOVE_TRAITS_NOT_IN(target, sources) \
do { \
var/list/_L = target.status_traits; \
var/list/_S = sources; \
if (_L) { \
for (var/_T in _L) { \
_L[_T] &= _S;\
if (!length(_L[_T])) { \
_L -= _T } \
};\
if (!length(_L)) { \
target.status_traits = null\
};\
}\
} while (0)
#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE)
#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE)
//mob traits
#define TRAIT_BLIND "blind"
#define TRAIT_MUTE "mute"
@@ -50,7 +108,13 @@
#define TRAIT_NOHARDCRIT "nohardcrit"
#define TRAIT_NOSOFTCRIT "nosoftcrit"
#define TRAIT_MINDSHIELD "mindshield"
#define TRAIT_PARALYSIS_L_ARM "para-l-arm" //These are used for brain-based paralysis, where replacing the limb won't fix it
#define TRAIT_PARALYSIS_R_ARM "para-r-arm"
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia"
@@ -72,6 +136,11 @@
#define TRAIT_CROCRIN_IMMUNE "crocin_immune"
#define TRAIT_NYMPHO "nymphomania"
#define TRAIT_MASO "masochism"
#define TRAIT_PARA "paraplegic"
#define TRAIT_EMPATH "empath"
#define TRAIT_FRIENDLY "friendly"
#define TRAIT_ASSBLASTUSA "assblastusa"
#define TRAIT_CULT_EYES "cult_eyes"
// common trait sources
#define TRAIT_GENERIC "generic"
@@ -94,4 +163,3 @@
#define STASIS_MUTE "stasis"
#define GENETICS_SPELL "genetics_spell"
#define EYES_COVERED "eyes_covered"
#define CULT_EYES "cult_eyes"
+19 -53
View File
@@ -58,8 +58,11 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list)
//Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm
GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
GLOBAL_LIST_EMPTY(balls_shapes_list)
GLOBAL_LIST_EMPTY(balls_shapes_icons)
GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(breasts_shapes_icons)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft"))
@@ -123,36 +126,36 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
/mob/living/carbon/proc/has_penis()
if(getorganslot("penis"))//slot shared with ovipositor
if(istype(getorganslot("penis"), /obj/item/organ/genital/penis))
return 1
return 0
return TRUE
return FALSE
/mob/living/carbon/proc/has_balls()
if(getorganslot("balls"))
if(istype(getorganslot("balls"), /obj/item/organ/genital/testicles))
return 1
return 0
return TRUE
return FALSE
/mob/living/carbon/proc/has_vagina()
if(getorganslot("vagina"))
return 1
return 0
return TRUE
return FALSE
/mob/living/carbon/proc/has_breasts()
if(getorganslot("breasts"))
return 1
return 0
return TRUE
return FALSE
/mob/living/carbon/proc/has_ovipositor()
if(getorganslot("penis"))//shared slot
if(istype(getorganslot("penis"), /obj/item/organ/genital/ovipositor))
return 1
return 0
return TRUE
return FALSE
/mob/living/carbon/human/proc/has_eggsack()
if(getorganslot("balls"))
if(istype(getorganslot("balls"), /obj/item/organ/genital/eggsack))
return 1
return 0
return TRUE
return FALSE
/mob/living/carbon/human/proc/is_bodypart_exposed(bodypart)
@@ -161,16 +164,16 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
L = get_equipped_items()
for(var/obj/item/I in L)
if(I.body_parts_covered & GROIN)
return 0
return 1
return FALSE
return TRUE
/mob/living/carbon/proc/is_chest_exposed(var/list/L)
if(!L)
L = get_equipped_items()
for(var/obj/item/I in L)
if(I.body_parts_covered & CHEST)
return 0
return 1
return FALSE
return TRUE
////////////////////////
//DANGER | DEBUG PROCS//
@@ -191,40 +194,3 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
H.give_vagina()
H.give_womb()
H.give_breasts()
/client/proc/test_mammal_overlays()
set name = "Mass Give Mammalitus"
set category = "Dangerous"
set desc = "Turns every human into a mammal with tails, ears, etc. WARNING: NOT FOR LIVE SERVER USAGE!!"
log_admin("[src] turned everyone into mammals.")
message_admins("[src] turned everyone into mammals.")
for(var/mob/living/carbon/human/H in GLOB.mob_list)
if(!H.dna)
continue
var/datum/dna/hdna = H.dna
H.set_species(/datum/species/mammal)
var/subspec = pick("Fox","Wolf","Fennec")
switch(subspec)
if("Wolf")
hdna.features["mam_tail"] = "Wolf"
hdna.features["mam_ears"] = "Wolf"
hdna.features["mam_snouts"] = "Wolf"
hdna.features["mam_body_markings"] = "Wolf"
hdna.features["mcolor"] = "555"
hdna.features["mcolor2"] = "999"
hdna.features["mcolor3"] = "999"
if("Fox")
hdna.features["mam_tail"] = "Fox"
hdna.features["mam_ears"] = "Fox"
hdna.features["mam_snouts"] = "Fox, Long"
hdna.features["mam_body_markings"] = "Fox"
hdna.features["mcolor"] = "f60"
hdna.features["mcolor2"] = "fff"
hdna.features["mcolor3"] = "fff"
if("Fennec")
hdna.features["mam_tail"] = "Fennec"
hdna.features["mam_ears"] = "Fennec"
hdna.features["mam_snouts"] = "Fox, Short"
hdna.features["mam_body_markings"] = "Fox"
H.regenerate_icons()
+2
View File
@@ -86,6 +86,8 @@
newA.contents += thing
thing.change_area(old_area, newA)
newA.reg_in_areas_in_z()
var/list/firedoors = oldA.firedoors
for(var/door in firedoors)
var/obj/machinery/door/firedoor/FD = door
-6
View File
@@ -8,12 +8,6 @@
#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL))
#define CULT_POLL_WAIT 2400
/proc/get_area(atom/A)
if(isarea(A))
return A
var/turf/T = get_turf(A)
return T ? T.loc : null
/proc/get_area_name(atom/X, format_text = FALSE)
var/area/A = isarea(X) ? X : get_area(X)
if(!A)
+8 -1
View File
@@ -46,7 +46,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list)
//genitals
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
for(var/K in GLOB.cock_shapes_list)
var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
GLOB.cock_shapes_icons[K] = value.icon_state
@@ -54,6 +53,14 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
for(var/K in GLOB.breasts_shapes_list)
var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]
GLOB.breasts_shapes_icons[K] = value.icon_state
init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
for(var/K in GLOB.balls_shapes_list)
var/datum/sprite_accessory/testicles/value = GLOB.balls_shapes_list[K]
GLOB.balls_shapes_icons[K] = value.icon_state
//END OF CIT CHANGES
//Species
+4 -1
View File
@@ -77,6 +77,8 @@
//CIT CHANGES - genitals and such
if(!GLOB.cock_shapes_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
if(!GLOB.balls_shapes_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
if(!GLOB.vagina_shapes_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
if(!GLOB.breasts_shapes_list.len)
@@ -168,6 +170,7 @@
"balls_amount" = 2,
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
"balls_size" = BALLS_SIZE_DEF,
"balls_shape" = "Pair",
"balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY,
@@ -185,7 +188,7 @@
"has_breasts" = FALSE,
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list),
"breasts_shape" = pick(GLOB.breasts_shapes_list),
"breasts_shape" = "Pair",
"breasts_fluid" = "milk",
"has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list),
+2 -4
View File
@@ -115,9 +115,6 @@ GLOBAL_LIST_INIT(bitfields, list(
"GOLIATH_RESISTANCE" = GOLIATH_RESISTANCE,
"GOLIATH_WEAKNESS" = GOLIATH_WEAKNESS
),
"reagents_holder_flags" = list(
"REAGENT_NOREACT" = REAGENT_NOREACT
),
"flags_1" = list(
"NOJAUNT_1" = NOJAUNT_1,
"UNUSED_RESERVATION_TURF_1" = UNUSED_RESERVATION_TURF_1,
@@ -158,13 +155,14 @@ GLOBAL_LIST_INIT(bitfields, list(
"SMOOTH_BORDER" = SMOOTH_BORDER,
"SMOOTH_QUEUED" = SMOOTH_QUEUED,
),
"container_type" = list(
"reagents_holder_flags" = list(
"INJECTABLE" = INJECTABLE,
"DRAWABLE" = DRAWABLE,
"REFILLABLE" = REFILLABLE,
"DRAINABLE" = DRAINABLE,
"TRANSPARENT" = TRANSPARENT,
"AMOUNT_VISIBLE" = AMOUNT_VISIBLE,
"NO_REACT" = NO_REACT,
),
"car_traits" = list(
"CAN_KIDNAP" = CAN_KIDNAP,
+49 -1
View File
@@ -40,6 +40,54 @@ GLOBAL_LIST_EMPTY(caps_list)
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things
GLOBAL_LIST_INIT(ai_core_display_screens, list(
":thinking:",
"Alien",
"Angel",
"Banned",
"Bliss",
"Blue",
"Clown",
"Database",
"Dorf",
"Firewall",
"Fuzzy",
"Gentoo",
"Glitchman",
"Gondola",
"Goon",
"Hades",
"Heartline",
"Helios",
"House",
"Inverted",
"Matrix",
"Monochrome",
"Murica",
"Nanotrasen",
"Not Malf",
"President",
"Random",
"Rainbow",
"Red",
"Red October",
"Static",
"Syndicat Meow",
"TechDemon",
"Text",
"Too Deep",
"Triumvirate",
"Triumvirate-M",
"Weird"))
/proc/resolve_ai_icon(input)
if(!input || !(input in GLOB.ai_core_display_screens))
return "ai"
else
if(input == "Random")
input = pick(GLOB.ai_core_display_screens - "Random")
return "ai-[lowertext(input)]"
GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))
//Backpacks
@@ -117,7 +165,7 @@ GLOBAL_LIST_INIT(TAGGERLOCATIONS, list("Disposals",
"CMO Office", "Chemistry", "Research", "RD Office",
"Robotics", "HoP Office", "Library", "Chapel", "Theatre",
"Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics",
"Circuitry", "Toxins", "Dormitories", "Virology",
"Circuitry", "Toxins", "Dormitories", "Virology",
"Xenobiology", "Law Office","Detective's Office"))
GLOBAL_LIST_INIT(station_prefixes, world.file2list("strings/station_prefixes.txt") + "")
@@ -109,5 +109,8 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
/obj/item/reagent_containers/pill/floorpill = 1,
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
/obj/item/storage/pill_bottle/penis_enlargement = 2,
/obj/item/clothing/shoes/wheelys = 1,
/obj/item/clothing/shoes/kindleKicks = 1,
/obj/item/autosurgeon/penis = 1,
"" = 3
))
+58 -17
View File
@@ -1,4 +1,7 @@
#define NEXT_PAGE_ID "__next__"
#define DEFAULT_CHECK_DELAY 20
GLOBAL_LIST_EMPTY(radial_menus)
/obj/screen/radial
icon = 'icons/mob/radial.dmi'
@@ -10,14 +13,19 @@
icon_state = "radial_slice"
var/choice
var/next_page = FALSE
var/tooltips = FALSE
/obj/screen/radial/slice/MouseEntered(location, control, params)
. = ..()
icon_state = "radial_slice_focus"
if(tooltips)
openToolTip(usr, src, params, title = name)
/obj/screen/radial/slice/MouseExited(location, control, params)
. = ..()
icon_state = "radial_slice"
if(tooltips)
closeToolTip(usr)
/obj/screen/radial/slice/Click(location, control, params)
if(usr.client == parent.current_user)
@@ -30,6 +38,14 @@
name = "Close Menu"
icon_state = "radial_center"
/obj/screen/radial/center/MouseEntered(location, control, params)
. = ..()
icon_state = "radial_center_focus"
/obj/screen/radial/center/MouseExited(location, control, params)
. = ..()
icon_state = "radial_center"
/obj/screen/radial/center/Click(location, control, params)
if(usr.client == parent.current_user)
parent.finished = TRUE
@@ -48,6 +64,9 @@
var/atom/anchor
var/image/menu_holder
var/finished = FALSE
var/datum/callback/custom_check_callback
var/next_check = 0
var/check_delay = DEFAULT_CHECK_DELAY
var/radius = 32
var/starting_angle = 0
@@ -57,7 +76,7 @@
var/max_elements
var/pages = 1
var/current_page = 1
var/hudfix_method = TRUE //TRUE to change anchor to user, FALSE to shift by py_shift
var/py_shift = 0
var/entry_animation = TRUE
@@ -75,7 +94,7 @@
restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth.
//Sets defaults
//These assume 45 deg min_angle
//These assume 45 deg min_angle
/datum/radial_menu/proc/restrict_to_dir(dir)
switch(dir)
if(NORTH)
@@ -91,18 +110,19 @@
starting_angle = 180
ending_angle = 45
/datum/radial_menu/proc/setup_menu()
/datum/radial_menu/proc/setup_menu(use_tooltips)
if(ending_angle > starting_angle)
zone = ending_angle - starting_angle
else
zone = 360 - starting_angle + ending_angle
max_elements = round(zone / min_angle)
var/paged = max_elements < choices.len
if(elements.len < max_elements)
var/elements_to_add = max_elements - elements.len
for(var/i in 1 to elements_to_add) //Create all elements
var/obj/screen/radial/new_element = new /obj/screen/radial/slice
var/obj/screen/radial/slice/new_element = new /obj/screen/radial/slice
new_element.tooltips = use_tooltips
new_element.parent = src
elements += new_element
@@ -163,7 +183,7 @@
else
E.pixel_y = py
E.pixel_x = px
//Visuals
E.alpha = 255
E.mouse_opacity = MOUSE_OPACITY_ICON
@@ -183,7 +203,7 @@
E.next_page = FALSE
if(choices_icons[choice_id])
E.add_overlay(choices_icons[choice_id])
/datum/radial_menu/New()
close_button = new
close_button.parent = src
@@ -200,7 +220,7 @@
/datum/radial_menu/proc/get_next_id()
return "c_[choices.len]"
/datum/radial_menu/proc/set_choices(list/new_choices)
/datum/radial_menu/proc/set_choices(list/new_choices, use_tooltips)
if(choices.len)
Reset()
for(var/E in new_choices)
@@ -211,7 +231,7 @@
var/I = extract_image(new_choices[E])
if(I)
choices_icons[id] = I
setup_menu()
setup_menu(use_tooltips)
/datum/radial_menu/proc/extract_image(E)
@@ -220,7 +240,7 @@
MA.layer = ABOVE_HUD_LAYER
MA.appearance_flags |= RESET_TRANSFORM
return MA
/datum/radial_menu/proc/next_page()
if(pages > 1)
@@ -243,28 +263,49 @@
if(current_user)
current_user.images -= menu_holder
/datum/radial_menu/proc/wait()
/datum/radial_menu/proc/wait(atom/user, atom/anchor, require_near = FALSE)
while (current_user && !finished && !selected_choice)
if(require_near && !in_range(anchor, user))
return
if(custom_check_callback && next_check < world.time)
if(!custom_check_callback.Invoke())
return
else
next_check = world.time + check_delay
stoplag(1)
/datum/radial_menu/Destroy()
Reset()
hide()
QDEL_NULL(custom_check_callback)
. = ..()
/*
Presents radial menu to user anchored to anchor (or user if the anchor is currently in users screen)
Presents radial menu to user anchored to anchor (or user if the anchor is currently in users screen)
Choices should be a list where list keys are movables or text used for element names and return value
and list values are movables/icons/images used for element icons
*/
/proc/show_radial_menu(mob/user,atom/anchor,list/choices)
/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE)
if(!user || !anchor || !length(choices))
return
if(!uniqueid)
uniqueid = "defmenu_[REF(user)]_[REF(anchor)]"
if(GLOB.radial_menus[uniqueid])
return
var/datum/radial_menu/menu = new
if(!user)
user = usr
GLOB.radial_menus[uniqueid] = menu
if(radius)
menu.radius = radius
if(istype(custom_check))
menu.custom_check_callback = custom_check
menu.anchor = anchor
menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud
menu.set_choices(choices)
menu.set_choices(choices, tooltips)
menu.show_to(user)
menu.wait()
menu.wait(user, anchor, require_near)
var/answer = menu.selected_choice
qdel(menu)
GLOB.radial_menus -= uniqueid
return answer
+76
View File
@@ -0,0 +1,76 @@
/*
A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked
*/
/obj/screen/radial/persistent/center
name = "Close Menu"
icon_state = "radial_center"
/obj/screen/radial/persistent/center/Click(location, control, params)
if(usr.client == parent.current_user)
parent.element_chosen(null,usr)
/obj/screen/radial/persistent/center/MouseEntered(location, control, params)
. = ..()
icon_state = "radial_center_focus"
/obj/screen/radial/persistent/center/MouseExited(location, control, params)
. = ..()
icon_state = "radial_center"
/datum/radial_menu/persistent
var/uniqueid
var/datum/callback/select_proc_callback
/datum/radial_menu/persistent/New()
close_button = new /obj/screen/radial/persistent/center
close_button.parent = src
/datum/radial_menu/persistent/element_chosen(choice_id,mob/user)
select_proc_callback.Invoke(choices_values[choice_id])
/datum/radial_menu/persistent/proc/change_choices(list/newchoices, tooltips)
if(!newchoices.len)
return
Reset()
set_choices(newchoices,tooltips)
/datum/radial_menu/persistent/Destroy()
QDEL_NULL(select_proc_callback)
GLOB.radial_menus -= uniqueid
Reset()
hide()
. = ..()
/*
Creates a persistent radial menu and shows it to the user, anchored to anchor (or user if the anchor is currently in users screen).
Choices should be a list where list keys are movables or text used for element names and return value
and list values are movables/icons/images used for element icons
Select_proc is the proc to be called each time an element on the menu is clicked, and should accept the chosen element as its final argument
Clicking the center button will return a choice of null
*/
/proc/show_radial_menu_persistent(mob/user, atom/anchor, list/choices, datum/callback/select_proc, uniqueid, radius, tooltips = FALSE)
if(!user || !anchor || !length(choices) || !select_proc)
return
if(!uniqueid)
uniqueid = "defmenu_[REF(user)]_[REF(anchor)]"
if(GLOB.radial_menus[uniqueid])
return
var/datum/radial_menu/persistent/menu = new
menu.uniqueid = uniqueid
GLOB.radial_menus[uniqueid] = menu
if(radius)
menu.radius = radius
menu.select_proc_callback = select_proc
menu.anchor = anchor
menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud
menu.set_choices(choices, tooltips)
menu.show_to(user)
return menu
+1 -1
View File
@@ -64,7 +64,7 @@
to_chat(user, "<span class='warning'>You're too exhausted.</span>") // CIT CHANGE - ditto
return // CIT CHANGE - ditto
if(force && user.has_trait(TRAIT_PACIFISM))
if(force && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "<span class='warning'>You don't want to harm other living beings!</span>")
return
+13 -5
View File
@@ -256,10 +256,13 @@ GLOBAL_LIST_EMPTY(the_station_areas)
/datum/controller/subsystem/mapping/proc/generate_station_area_list()
var/list/station_areas_blacklist = typecacheof(list(/area/space, /area/mine, /area/ruin, /area/asteroid/nearstation))
for(var/area/A in world)
var/turf/picked = safepick(get_area_turfs(A.type))
if(picked && is_station_level(picked.z))
if(!(A.type in GLOB.the_station_areas) && !is_type_in_typecache(A, station_areas_blacklist))
GLOB.the_station_areas.Add(A.type)
if (is_type_in_typecache(A, station_areas_blacklist))
continue
if (!A.contents.len || !A.unique)
continue
var/turf/picked = A.contents[1]
if (is_station_level(picked.z))
GLOB.the_station_areas += A.type
if(!GLOB.the_station_areas.len)
log_world("ERROR: Station areas list failed to generate!")
@@ -495,4 +498,9 @@ GLOBAL_LIST_EMPTY(the_station_areas)
clearing |= used_turfs //used turfs is an associative list, BUT, reserve_turfs() can still handle it. If the code above works properly, this won't even be needed as the turfs would be freed already.
unused_turfs.Cut()
used_turfs.Cut()
reserve_turfs(clearing)
reserve_turfs(clearing)
/datum/controller/subsystem/mapping/proc/reg_in_areas_in_z(list/areas)
for(var/B in areas)
var/area/A = B
A.reg_in_areas_in_z()
+2 -2
View File
@@ -116,7 +116,7 @@ SUBSYSTEM_DEF(throwing)
return
dist_travelled++
if (dist_travelled > MAX_THROWING_DIST)
finalize()
return
@@ -154,7 +154,7 @@ SUBSYSTEM_DEF(throwing)
/datum/thrownthing/proc/hitcheck()
for (var/thing in get_turf(thrownthing))
var/atom/movable/AM = thing
if (AM == thrownthing)
if (AM == thrownthing || (AM == thrower && !ismob(thrownthing)))
continue
if (AM.density && !(AM.pass_flags & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1))
finalize(hit=TRUE, target=AM)
+6 -1
View File
@@ -195,11 +195,16 @@
/datum/action/item_action/toggle_firemode
name = "Toggle Firemode"
/datum/action/item_action/rcl
/datum/action/item_action/rcl_col
name = "Change Cable Color"
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "rcl_rainbow"
/datum/action/item_action/rcl_gui
name = "Toggle Fast Wiring Gui"
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "rcl_gui"
/datum/action/item_action/startchainsaw
name = "Pull The Starting Cord"
+2 -2
View File
@@ -42,7 +42,7 @@
lose_text = "<span class='notice'>You feel smart again.</span>"
/datum/brain_trauma/mild/dumbness/on_gain()
owner.add_trait(TRAIT_DUMB, TRAUMA_TRAIT)
ADD_TRAIT(owner, TRAIT_DUMB, TRAUMA_TRAIT)
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious)
..()
@@ -55,7 +55,7 @@
..()
/datum/brain_trauma/mild/dumbness/on_lose()
owner.remove_trait(TRAIT_DUMB, TRAUMA_TRAIT)
REMOVE_TRAIT(owner, TRAIT_DUMB, TRAUMA_TRAIT)
owner.derpspeech = 0
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "dumb")
..()
+64 -14
View File
@@ -13,11 +13,11 @@
lose_text = "<span class='notice'>You suddenly remember how to speak.</span>"
/datum/brain_trauma/severe/mute/on_gain()
owner.add_trait(TRAIT_MUTE, TRAUMA_TRAIT)
ADD_TRAIT(owner, TRAIT_MUTE, TRAUMA_TRAIT)
..()
/datum/brain_trauma/severe/mute/on_lose()
owner.remove_trait(TRAIT_MUTE, TRAUMA_TRAIT)
REMOVE_TRAIT(owner, TRAIT_MUTE, TRAUMA_TRAIT)
..()
/datum/brain_trauma/severe/aphasia
@@ -60,18 +60,68 @@
/datum/brain_trauma/severe/paralysis
name = "Paralysis"
desc = "Patient's brain can no longer control its motor functions."
desc = "Patient's brain can no longer control part of its motor functions."
scan_desc = "cerebral paralysis"
gain_text = "<span class='warning'>You can't feel your body anymore!</span>"
lose_text = "<span class='notice'>You can feel your limbs again!</span>"
gain_text = ""
lose_text = ""
var/paralysis_type
var/list/paralysis_traits = list()
//for descriptions
/datum/brain_trauma/severe/paralysis/on_life()
owner.Knockdown(200, ignore_canknockdown = TRUE)
/datum/brain_trauma/severe/paralysis/New(specific_type)
if(specific_type)
paralysis_type = specific_type
if(!paralysis_type)
paralysis_type = pick("full","left","right","arms","legs","r_arm","l_arm","r_leg","l_leg")
var/subject
switch(paralysis_type)
if("full")
subject = "your body"
paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG)
if("left")
subject = "the left side of your body"
paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_L_LEG)
if("right")
subject = "the right side of your body"
paralysis_traits = list(TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_R_LEG)
if("arms")
subject = "your arms"
paralysis_traits = list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM)
if("legs")
subject = "your legs"
paralysis_traits = list(TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG)
if("r_arm")
subject = "your right arm"
paralysis_traits = list(TRAIT_PARALYSIS_R_ARM)
if("l_arm")
subject = "your left arm"
paralysis_traits = list(TRAIT_PARALYSIS_L_ARM)
if("r_leg")
subject = "your right leg"
paralysis_traits = list(TRAIT_PARALYSIS_R_LEG)
if("l_leg")
subject = "your left leg"
paralysis_traits = list(TRAIT_PARALYSIS_L_LEG)
gain_text = "<span class='warning'>You can't feel [subject] anymore!</span>"
lose_text = "<span class='notice'>You can feel [subject] again!</span>"
/datum/brain_trauma/severe/paralysis/on_gain()
..()
for(var/X in paralysis_traits)
ADD_TRAIT(owner, X, "trauma_paralysis")
owner.update_disabled_bodyparts()
/datum/brain_trauma/severe/paralysis/on_lose()
owner.SetKnockdown(0)
..()
for(var/X in paralysis_traits)
REMOVE_TRAIT(owner, X, "trauma_paralysis")
owner.update_disabled_bodyparts()
/datum/brain_trauma/severe/paralysis/paraplegic
//can_gain = FALSE maybe breaks.
paralysis_type = "legs"
resilience = TRAUMA_RESILIENCE_ABSOLUTE
/datum/brain_trauma/severe/narcolepsy
name = "Narcolepsy"
@@ -121,7 +171,7 @@
stress -= 4
/datum/brain_trauma/severe/monophobia/proc/check_alone()
if(owner.has_trait(TRAIT_BLIND))
if(HAS_TRAIT(owner, TRAIT_BLIND))
return TRUE
for(var/mob/M in oview(owner, 7))
if(!isliving(M)) //ghosts ain't people
@@ -183,11 +233,11 @@
lose_text = "<span class='notice'>You feel in control of your hands again.</span>"
/datum/brain_trauma/severe/discoordination/on_gain()
owner.add_trait(TRAIT_MONKEYLIKE, TRAUMA_TRAIT)
ADD_TRAIT(owner, TRAIT_MONKEYLIKE, TRAUMA_TRAIT)
..()
/datum/brain_trauma/severe/discoordination/on_lose()
owner.remove_trait(TRAIT_MONKEYLIKE, TRAUMA_TRAIT)
REMOVE_TRAIT(owner, TRAIT_MONKEYLIKE, TRAUMA_TRAIT)
..()
/datum/brain_trauma/severe/pacifism
@@ -198,9 +248,9 @@
lose_text = "<span class='notice'>You no longer feel compelled to not harm.</span>"
/datum/brain_trauma/severe/pacifism/on_gain()
owner.add_trait(TRAIT_PACIFISM, TRAUMA_TRAIT)
ADD_TRAIT(owner, TRAIT_PACIFISM, TRAUMA_TRAIT)
..()
/datum/brain_trauma/severe/pacifism/on_lose()
owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT)
..()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, TRAUMA_TRAIT)
..()
@@ -192,7 +192,7 @@
return //no random switching
/datum/brain_trauma/severe/split_personality/brainwashing/on_hear(message, speaker, message_language, raw_message, radio_freq)
if(owner.has_trait(TRAIT_DEAF) || owner == speaker)
if(HAS_TRAIT(owner, TRAIT_DEAF) || owner == speaker)
return message
if(findtext(message, codeword))
message = replacetext(message, codeword, "<span class='warning'>[codeword]</span>")
+2 -2
View File
@@ -24,7 +24,7 @@
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
if(H.has_trait(TRAIT_PIERCEIMMUNE))
if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE))
return
if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK)
@@ -46,7 +46,7 @@
return
var/damage = rand(min_damage, max_damage)
if(H.has_trait(TRAIT_LIGHT_STEP))
if(HAS_TRAIT(H, TRAIT_LIGHT_STEP))
damage *= 0.75
H.apply_damage(damage, BRUTE, picked_def_zone)
+1 -1
View File
@@ -23,7 +23,7 @@
if (!wearer)
STOP_PROCESSING(SSobj, src)
return
if(!wearer.has_trait(TRAIT_DEAF))
if(!HAS_TRAIT(wearer, TRAIT_DEAF))
var/obj/item/organ/ears/ears = wearer.getorganslot(ORGAN_SLOT_EARS)
if (ears)
ears.deaf = max(ears.deaf - 1, (ears.ear_damage < UNHEALING_EAR_DAMAGE ? 0 : 1)) // Do not clear deafness while above the unhealing ear damage threshold
+4 -4
View File
@@ -15,7 +15,7 @@
/datum/component/mood/Initialize()
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
START_PROCESSING(SSmood, src)
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
@@ -150,17 +150,17 @@
else
owner.crit_threshold -= (holdmyinsanityeffect - insanity_effect)
if(owner.has_trait(TRAIT_DEPRESSION))
if(HAS_TRAIT(owner, TRAIT_DEPRESSION))
if(prob(0.05))
add_event(null, "depression", /datum/mood_event/depression)
clear_event(null, "jolly")
if(owner.has_trait(TRAIT_JOLLY))
if(HAS_TRAIT(owner, TRAIT_JOLLY))
if(prob(0.05))
add_event(null, "jolly", /datum/mood_event/jolly)
clear_event(null, "depression")
holdmyinsanityeffect = insanity_effect
HandleNutrition(owner)
/datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE)
@@ -6,6 +6,8 @@
/datum/component/storage/concrete
var/drop_all_on_deconstruct = TRUE
var/drop_all_on_destroy = FALSE
var/drop_all_on_break = FALSE
var/unlock_on_break = FALSE
var/transfer_contents_on_component_transfer = FALSE
var/list/datum/component/storage/slaves = list()
@@ -16,6 +18,7 @@
. = ..()
RegisterSignal(parent, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, .proc/on_deconstruct)
RegisterSignal(parent, COMSIG_OBJ_BREAK, .proc/on_break)
/datum/component/storage/concrete/Destroy()
var/atom/real_location = real_location()
@@ -100,6 +103,12 @@
if(drop_all_on_deconstruct)
do_quick_empty()
/datum/component/storage/concrete/proc/on_break(datum/source, damage_flag)
if(drop_all_on_break)
do_quick_empty()
if(unlock_on_break)
set_locked(source, FALSE)
/datum/component/storage/concrete/can_see_contents()
. = ..()
for(var/i in slaves)
@@ -0,0 +1,22 @@
/datum/component/storage/concrete/emergency
drop_all_on_break = TRUE
unlock_on_break = TRUE
locked = TRUE
/datum/component/storage/concrete/emergency/Initialize()
. = ..()
RegisterSignal(parent, COMSIG_ATOM_EMAG_ACT, .proc/unlock_me)
/datum/component/storage/concrete/emergency/signal_insertion_attempt(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE)
if(!silent && istype(I, /obj/item/card/emag))
silent = TRUE // suppresses the message
return ..()
/datum/component/storage/concrete/check_locked(datum/source, mob/user, message = FALSE)
. = locked && GLOB.security_level < SEC_LEVEL_RED
if(message && . && user)
to_chat(user, "The storage unit will only unlock during a Red or Delta security alert.")
/datum/component/storage/concrete/emergency/proc/unlock_me(datum/source)
if(locked)
set_locked(source, FALSE)
+12 -18
View File
@@ -156,8 +156,7 @@
next += slave.parent
/datum/component/storage/proc/attack_self(datum/source, mob/M)
if(locked)
to_chat(M, "<span class='warning'>[parent] seems to be locked!</span>")
if(check_locked(source, M, TRUE))
return FALSE
if((M.get_active_held_item() == parent) && allow_quick_empty)
quick_empty(M)
@@ -166,8 +165,7 @@
if(!isitem(O) || !click_gather || SEND_SIGNAL(O, COMSIG_CONTAINS_STORAGE))
return FALSE
. = COMPONENT_NO_ATTACK
if(locked)
to_chat(M, "<span class='warning'>[parent] seems to be locked!</span>")
if(check_locked(source, M, TRUE))
return FALSE
var/atom/A = parent
var/obj/item/I = O
@@ -238,8 +236,7 @@
var/atom/A = parent
if((!ishuman(M) && (A.loc != M)) || (M.stat != CONSCIOUS) || M.restrained() || !M.canmove)
return
if(locked)
to_chat(M, "<span class='warning'>[parent] seems to be locked!</span>")
if(check_locked(null, M, TRUE))
return FALSE
A.add_fingerprint(M)
to_chat(M, "<span class='notice'>You start dumping out [parent].</span>")
@@ -281,7 +278,7 @@
/datum/component/storage/proc/set_locked(datum/source, new_state)
locked = new_state
if(locked)
if(check_locked())
close_all()
/datum/component/storage/proc/_process_numerical_display()
@@ -456,8 +453,7 @@
var/atom/A = parent
var/atom/dump_destination = dest_object.get_dumping_location()
if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination))
if(locked)
to_chat(M, "<span class='warning'>[parent] seems to be locked!</span>")
if(check_locked(null, M, TRUE))
return FALSE
if(dump_destination.storage_contents_dump_act(src, M))
playsound(A, "rustle", 50, 1, -5)
@@ -563,10 +559,9 @@
var/atom/host = parent
if(real_location == I.loc)
return FALSE //Means the item is already in the storage item
if(locked)
if(check_locked(null, M, !stop_messages))
if(M && !stop_messages)
host.add_fingerprint(M)
to_chat(M, "<span class='warning'>[host] seems to be locked!</span>")
return FALSE
if(real_location.contents.len >= max_items)
if(!stop_messages)
@@ -659,8 +654,10 @@
/datum/component/storage/proc/on_check()
return TRUE
/datum/component/storage/proc/check_locked()
return locked
/datum/component/storage/proc/check_locked(datum/source, mob/user, message = FALSE)
. = locked
if(message && . && user)
to_chat(user, "<span class='warning'>[parent] seems to be locked!</span>")
/datum/component/storage/proc/signal_take_type(datum/source, type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted)
if(!force)
@@ -720,9 +717,7 @@
if(A.loc == user)
. = COMPONENT_NO_ATTACK_HAND
if(locked)
to_chat(user, "<span class='warning'>[parent] seems to be locked!</span>")
else
if(!check_locked(source, user, TRUE))
show_to(user)
A.do_jiggle()
@@ -747,8 +742,7 @@
/datum/component/storage/proc/on_alt_click(datum/source, mob/user)
if(!isliving(user) || !user.CanReach(parent))
return
if(locked)
to_chat(user, "<span class='warning'>[parent] seems to be locked!</span>")
if(check_locked(source, user, TRUE))
return
var/atom/A = parent
+1
View File
@@ -2,6 +2,7 @@
var/gc_destroyed //Time when this object was destroyed.
var/list/active_timers //for SStimer
var/list/datum_components //for /datum/components
var/list/status_traits
var/list/comp_lookup //it used to be for looking up components which had registered a signal but now anything can register
var/list/signal_procs
var/signal_enabled = FALSE
+2 -2
View File
@@ -117,7 +117,7 @@
/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread)
if(internal)
return
if(has_trait(TRAIT_NOBREATH))
if(HAS_TRAIT(src, TRAIT_NOBREATH))
return
..()
@@ -137,7 +137,7 @@
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
if(dna)
if(has_trait(TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity)
if(HAS_TRAIT(src, TRAIT_VIRUSIMMUNE) && !D.bypasses_immunity)
return FALSE
for(var/thing in D.required_organs)
@@ -233,7 +233,7 @@
/datum/symptom/heal/coma/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
if(M.has_trait(TRAIT_DEATHCOMA))
if(HAS_TRAIT(M, TRAIT_DEATHCOMA))
return power
else if(M.IsUnconscious() || M.stat == UNCONSCIOUS)
return power * 0.9
@@ -364,15 +364,15 @@
/datum/symptom/heal/plasma/CanHeal(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
var/datum/gas_mixture/environment
var/list/gases
var/plasmamount
. = 0
if(M.loc)
environment = M.loc.return_air()
if(environment)
gases = environment.gases
if(gases["plasma"] && gases["plasma"][MOLES] > gases["plasma"][GAS_META][META_GAS_MOLES_VISIBLE]) //if there's enough plasma in the air to see
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
@@ -85,14 +85,14 @@
if(4, 5)
M.restoreEars()
if(M.has_trait(TRAIT_BLIND, EYE_DAMAGE))
if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE))
if(prob(20))
to_chat(M, "<span class='notice'>Your vision slowly returns...</span>")
M.cure_blind(EYE_DAMAGE)
M.cure_nearsighted(EYE_DAMAGE)
M.blur_eyes(35)
else if(M.has_trait(TRAIT_NEARSIGHT, EYE_DAMAGE))
else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE))
to_chat(M, "<span class='notice'>You can finally focus your eyes on distant objects.</span>")
M.cure_nearsighted(EYE_DAMAGE)
M.blur_eyes(10)
@@ -61,7 +61,7 @@ Bonus
M.become_nearsighted(EYE_DAMAGE)
if(prob(eyes.eye_damage - 10 + 1))
if(!remove_eyes)
if(!M.has_trait(TRAIT_BLIND))
if(!HAS_TRAIT(M, TRAIT_BLIND))
to_chat(M, "<span class='userdanger'>You go blind!</span>")
M.become_blind(EYE_DAMAGE)
else
+1 -1
View File
@@ -133,7 +133,7 @@
if(isliving(user))
var/mob/living/L = user
if(L.has_trait(TRAIT_EMOTEMUTE))
if(HAS_TRAIT(L, TRAIT_EMOTEMUTE))
return FALSE
/datum/emote/sound
+2 -2
View File
@@ -103,11 +103,11 @@
// Can most things breathe?
if(trace_gases)
continue
if(!(A_gases[/datum/gas/oxygen] && A_gases[/datum/gas/oxygen][MOLES] >= 16))
if(A_gases[/datum/gas/oxygen] >= 16)
continue
if(A_gases[/datum/gas/plasma])
continue
if(A_gases[/datum/gas/carbon_dioxide] && A_gases[/datum/gas/carbon_dioxide][MOLES] >= 10)
if(A_gases[/datum/gas/carbon_dioxide] >= 10)
continue
// Aim for goldilocks temperatures and pressure
+17 -2
View File
@@ -86,13 +86,13 @@
return 0
/datum/martial_art/krav_maga/proc/leg_sweep(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(D.stat || D.IsKnockdown())
if(D.lying || D.IsKnockdown())
return 0
D.visible_message("<span class='warning'>[A] leg sweeps [D]!</span>", \
"<span class='userdanger'>[A] leg sweeps you!</span>")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
D.apply_damage(5, BRUTE)
D.Knockdown(40)
D.Knockdown(40, override_hardstun = 0.01, 25)
log_combat(A, D, "leg sweeped")
return 1
@@ -191,3 +191,18 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
/obj/item/clothing/gloves/krav_maga/combatglovesplus
name = "combat gloves plus"
desc = "These tactical gloves are fireproof and shock resistant, and using nanochip technology it teaches you the powers of krav maga."
icon_state = "black"
item_state = "blackglovesplus"
siemens_coefficient = 0
permeability_coefficient = 0.05
strip_delay = 80
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
+1 -1
View File
@@ -179,7 +179,7 @@
/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user)
add_fingerprint(user)
if((user.has_trait(TRAIT_CLUMSY)) && prob(50))
if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, "<span class ='warning'>You club yourself over the head with [src].</span>")
user.Knockdown(60)
if(ishuman(user))
@@ -125,3 +125,11 @@
/datum/mood_event/surgery
description = "<span class='boldwarning'>HE'S CUTTING ME OPEN!!</span>\n"
mood_change = -8
/datum/mood_event/sad_empath
description = "<span class='warning'>Someone seems upset...</span>\n"
mood_change = -2
timeout = 600
/datum/mood_event/sad_empath/add_effects(mob/sadtarget)
description = "<span class='warning'>[sadtarget.name] seems upset...</span>\n"
@@ -75,3 +75,27 @@
description = "<span class='nicegreen'>There is something soothing about this music.</span>\n"
mood_change = 3
timeout = 600
/datum/mood_event/betterhug
description = "<span class='nicegreen'>Someone was very nice to me.</span>\n"
mood_change = 3
timeout = 3000
/datum/mood_event/betterhug/add_effects(mob/friend)
description = "<span class='nicegreen'>[friend.name] was very nice to me.</span>\n"
/datum/mood_event/besthug
description = "<span class='nicegreen'>Someone is great to be around, they make me feel so happy!</span>\n"
mood_change = 5
timeout = 3000
/datum/mood_event/besthug/add_effects(mob/friend)
description = "<span class='nicegreen'>[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!</span>\n"
/datum/mood_event/happy_empath
description = "<span class='warning'>Someone seems happy!</span>\n"
mood_change = 2
timeout = 600
/datum/mood_event/happy_empath/add_effects(var/mob/happytarget)
description = "<span class='warning'>[happytarget.name]'s happiness is infectious!</span>\n"
+4 -4
View File
@@ -86,12 +86,12 @@
/datum/mutation/human/clumsy/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.add_trait(TRAIT_CLUMSY, GENETIC_MUTATION)
ADD_TRAIT(owner, TRAIT_CLUMSY, GENETIC_MUTATION)
/datum/mutation/human/clumsy/on_losing(mob/living/carbon/human/owner)
if(..())
return
owner.remove_trait(TRAIT_CLUMSY, GENETIC_MUTATION)
REMOVE_TRAIT(owner, TRAIT_CLUMSY, GENETIC_MUTATION)
//Tourettes causes you to randomly stand in place and shout.
@@ -125,12 +125,12 @@
/datum/mutation/human/deaf/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.add_trait(TRAIT_DEAF, GENETIC_MUTATION)
ADD_TRAIT(owner, TRAIT_DEAF, GENETIC_MUTATION)
/datum/mutation/human/deaf/on_losing(mob/living/carbon/human/owner)
if(..())
return
owner.remove_trait(TRAIT_DEAF, GENETIC_MUTATION)
REMOVE_TRAIT(owner, TRAIT_DEAF, GENETIC_MUTATION)
//Monified turns you into a monkey.
+4 -4
View File
@@ -17,14 +17,14 @@
/datum/mutation/human/cold_resistance/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.add_trait(TRAIT_RESISTCOLD, "cold_resistance")
// owner.add_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE
ADD_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance")
// ADD_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE
/datum/mutation/human/cold_resistance/on_losing(mob/living/carbon/human/owner)
if(..())
return
owner.remove_trait(TRAIT_RESISTCOLD, "cold_resistance")
// owner.remove_trait(TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE
REMOVE_TRAIT(owner, TRAIT_RESISTCOLD, "cold_resistance")
// REMOVE_TRAIT(owner, TRAIT_RESISTLOWPRESSURE, "cold_resistance") CITADEL CHANGE
/datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner)
if(owner.getFireLoss())
+4 -4
View File
@@ -11,8 +11,8 @@
/datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.add_trait(TRAIT_STUNIMMUNE, TRAIT_HULK)
owner.add_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK)
ADD_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_HULK)
ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
owner.update_body_parts()
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
@@ -28,8 +28,8 @@
/datum/mutation/human/hulk/on_losing(mob/living/carbon/human/owner)
if(..())
return
owner.remove_trait(TRAIT_STUNIMMUNE, TRAIT_HULK)
owner.remove_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK)
REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, TRAIT_HULK)
REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, TRAIT_HULK)
owner.update_body_parts()
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk")
+3 -3
View File
@@ -30,12 +30,12 @@
/datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
owner.add_trait(TRAIT_MUTE, GENETIC_MUTATION)
ADD_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION)
/datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner)
if(..())
return
owner.remove_trait(TRAIT_MUTE, GENETIC_MUTATION)
REMOVE_TRAIT(owner, TRAIT_MUTE, GENETIC_MUTATION)
/datum/mutation/human/smile
@@ -229,4 +229,4 @@
/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner)
..()
owner.grant_language(/datum/language/common)
owner.remove_language(/datum/language/beachbum)
owner.remove_language(/datum/language/beachbum)
+18
View File
@@ -281,3 +281,21 @@
suffix = "cloning_facility.dmm"
name = "Ancient Cloning Lab"
description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures."
/datum/map_template/ruin/space/augmentation
id = "augmentationfacility"
suffix = "augmentationfacility.dmm"
name = "Roboticst Augmentation Facility"
description = "A mysterious lab in the depths of space containing robotics supplies and a one use autosurgeon."
/datum/map_template/ruin/space/harambe
id = "bigape"
suffix = "bigape.dmm"
name = "Big Ape"
description = "A gorilla? Out here? But why."
/datum/map_template/ruin/space/space_arcade
id = "arcade"
suffix = "arcade.dmm"
name = "Space Arcade"
description = "A lonely arcade in the depths of space."
+3 -3
View File
@@ -27,7 +27,7 @@
switch(M.lingcheck())
if (LINGHIVE_LING)
var/mob/living/L = M
if (!L.has_trait(CHANGELING_HIVEMIND_MUTE))
if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE))
to_chat(M, msg)
if(LINGHIVE_LINK)
to_chat(M, msg)
@@ -35,7 +35,7 @@
if(prob(40))
to_chat(M, "<i><font color=#800080>We can faintly sense an outsider trying to communicate through the hivemind...</font></i>")
if(LINGHIVE_LING)
if (user.has_trait(CHANGELING_HIVEMIND_MUTE))
if (HAS_TRAIT(user, CHANGELING_HIVEMIND_MUTE))
to_chat(user, "<span class='warning'>The poison in the air hinders our ability to interact with the hivemind.</span>")
return FALSE
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
@@ -52,7 +52,7 @@
to_chat(M, msg)
if(LINGHIVE_LING)
var/mob/living/L = M
if (!L.has_trait(CHANGELING_HIVEMIND_MUTE))
if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE))
to_chat(M, msg)
if(LINGHIVE_OUTSIDER)
if(prob(40))
+2 -2
View File
@@ -465,13 +465,13 @@
/datum/status_effect/hippocraticOath/on_apply()
//Makes the user passive, it's in their oath not to harm!
owner.add_trait(TRAIT_PACIFISM, "hippocraticOath")
ADD_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
H.add_hud_to(owner)
return ..()
/datum/status_effect/hippocraticOath/on_remove()
owner.remove_trait(TRAIT_PACIFISM, "hippocraticOath")
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
H.remove_hud_from(owner)
+5 -5
View File
@@ -21,7 +21,7 @@
to_chat(quirk_holder, gain_text)
quirk_holder.roundstart_quirks += src
if(mob_trait)
quirk_holder.add_trait(mob_trait, ROUNDSTART_TRAIT)
ADD_TRAIT(quirk_holder, mob_trait, ROUNDSTART_TRAIT)
START_PROCESSING(SSquirks, src)
add()
if(spawn_effects)
@@ -35,7 +35,7 @@
to_chat(quirk_holder, lose_text)
quirk_holder.roundstart_quirks -= src
if(mob_trait)
quirk_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT, TRUE)
REMOVE_TRAIT(quirk_holder, mob_trait, ROUNDSTART_TRAIT)
SSquirks.quirk_objects -= src
return ..()
@@ -43,8 +43,8 @@
quirk_holder.roundstart_quirks -= src
to_mob.roundstart_quirks += src
if(mob_trait)
quirk_holder.remove_trait(mob_trait, ROUNDSTART_TRAIT)
to_mob.add_trait(mob_trait, ROUNDSTART_TRAIT)
REMOVE_TRAIT(quirk_holder, mob_trait, ROUNDSTART_TRAIT)
ADD_TRAIT(to_mob, mob_trait, ROUNDSTART_TRAIT)
quirk_holder = to_mob
on_transfer()
@@ -111,7 +111,7 @@ Use this as a guideline
mob_trait = TRAIT_NEARSIGHT
///This define is in __DEFINES/traits.dm and is the actual "trait" that the game tracks
///You'll need to use "has_trait(X, sources)" checks around the code to check this; for instance, the Ageusia trait is checked in taste code
///You'll need to use "HAS_TRAIT_FROM(src, X, sources)" checks around the code to check this; for instance, the Ageusia trait is checked in taste code
///If you need help finding where to put it, the declaration finder on GitHub is the best way to locate it
gain_text = "<span class='danger'>Things far away from you start looking blurry.</span>"
+17
View File
@@ -35,6 +35,14 @@
lose_text = "<span class='danger'>You no longer feel like drinking would ease your pain.</span>"
medical_record_text = "Patient has unusually efficient liver metabolism and can slowly regenerate wounds by drinking alcoholic beverages."
/datum/quirk/empath
name = "Empath"
desc = "Whether it's a sixth sense or careful study of body language, it only takes you a quick glance at someone to understand how they feel."
value = 2
mob_trait = TRAIT_EMPATH
gain_text = "<span class='notice'>You feel in tune with those around you.</span>"
lose_text = "<span class='danger'>You feel isolated from others.</span>"
/datum/quirk/freerunning
name = "Freerunning"
desc = "You're great at quick moves! You can climb tables more quickly."
@@ -43,6 +51,15 @@
gain_text = "<span class='notice'>You feel lithe on your feet!</span>"
lose_text = "<span class='danger'>You feel clumsy again.</span>"
/datum/quirk/friendly
name = "Friendly"
desc = "You give the best hugs, especially when you're in the right mood."
value = 1
mob_trait = TRAIT_FRIENDLY
gain_text = "<span class='notice'>You want to hug someone.</span>"
lose_text = "<span class='danger'>You no longer feel compelled to hug others.</span>"
mood_quirk = TRUE
/datum/quirk/jolly
name = "Jolly"
desc = "You sometimes just feel happy, for no reason at all."
+41 -2
View File
@@ -60,7 +60,7 @@
if("Scientist")
heirloom_type = /obj/item/toy/plush/slimeplushie
if("Assistant")
heirloom_type = /obj/item/storage/toolbox/mechanical/old/heirloom
heirloom_type = /obj/item/clothing/gloves/cut/family
if("Chaplain")
heirloom_type = /obj/item/camera/spooky/family
if("Captain")
@@ -187,6 +187,41 @@
to_chat(quirk_holder, "<span class='boldannounce'>Your antagonistic nature has caused you to renounce your pacifism.</span>")
qdel(src)
/datum/quirk/paraplegic
name = "Paraplegic"
desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!"
value = -3
mob_trait = TRAIT_PARA
human_only = TRUE
gain_text = null // Handled by trauma.
lose_text = null
medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities."
/datum/quirk/paraplegic/add()
var/datum/brain_trauma/severe/paralysis/paraplegic/T = new()
var/mob/living/carbon/human/H = quirk_holder
H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE)
/datum/quirk/paraplegic/on_spawn()
if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs.
quirk_holder.buckled.unbuckle_mob(quirk_holder)
var/turf/T = get_turf(quirk_holder)
var/obj/structure/chair/spawn_chair = locate() in T
var/obj/vehicle/ridden/wheelchair/wheels = new(T)
if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
wheels.setDir(spawn_chair.dir)
wheels.buckle_mob(quirk_holder)
// During the spawning process, they may have dropped what they were holding, due to the paralysis
// So put the things back in their hands.
for(var/obj/item/I in T)
if(I.fingerprintslast == quirk_holder.ckey)
quirk_holder.put_in_hands(I)
/datum/quirk/poor_aim
name = "Poor Aim"
desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out."
@@ -208,8 +243,12 @@
var/slot_string = "limb"
/datum/quirk/prosthetic_limb/on_spawn()
var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/mob/living/carbon/human/H = quirk_holder
var/limb_slot
if(HAS_TRAIT(H, TRAIT_PARA))//Prevent paraplegic legs being replaced
limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
else
limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot)
var/obj/item/bodypart/prosthetic
switch(limb_slot)
+9
View File
@@ -93,3 +93,12 @@
gain_text = "<span class='notice'>You feel more prudish.</span>"
lose_text = "<span class='notice'>You don't feel as prudish as before.</span>"
medical_record_text = "Patient exhibits a special gene that makes them immune to Crocin and Hexacrocin."
/datum/quirk/assblastusa
name = "Buns of Steel"
desc = "You've never skipped ass day. With this trait, you are completely immune to all forms of ass slapping and anyone who tries to slap your rock hard ass usually gets a broken hand."
mob_trait = TRAIT_ASSBLASTUSA
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>"
@@ -33,7 +33,7 @@
if(prob(40))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.dna && !H.has_trait(TRAIT_RADIMMUNE))
if(H.dna && !HAS_TRAIT(H, TRAIT_RADIMMUNE))
if(prob(max(0,100-resist)))
H.randmuti()
if(prob(50))
+11 -6
View File
@@ -76,7 +76,9 @@ GLOBAL_LIST_EMPTY(teleportlocs)
continue
if(GLOB.teleportlocs[AR.name])
continue
var/turf/picked = safepick(get_area_turfs(AR.type))
if (!AR.contents.len)
continue
var/turf/picked = AR.contents[1]
if (picked && is_station_level(picked.z))
GLOB.teleportlocs[AR.name] = AR
@@ -120,6 +122,14 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if(!IS_DYNAMIC_LIGHTING(src))
add_overlay(/obj/effect/fullbright)
reg_in_areas_in_z()
return INITIALIZE_HINT_LATELOAD
/area/LateInitialize()
power_change() // all machines set to current power level, also updates icon
/area/proc/reg_in_areas_in_z()
if(contents.len)
var/list/areas_in_z = SSmapping.areas_in_z
var/z
@@ -137,11 +147,6 @@ GLOBAL_LIST_EMPTY(teleportlocs)
areas_in_z["[z]"] = list()
areas_in_z["[z]"] += src
return INITIALIZE_HINT_LATELOAD
/area/LateInitialize()
power_change() // all machines set to current power level, also updates icon
/area/Destroy()
if(GLOB.areas_by_type[type] == src)
GLOB.areas_by_type[type] = null
+6 -7
View File
@@ -6,7 +6,6 @@
var/flags_1 = NONE
var/interaction_flags_atom = NONE
var/container_type = NONE
var/datum/reagents/reagents = null
//This atom's HUD (med/sec, etc) images. Associative list.
@@ -203,16 +202,16 @@
return is_refillable() && is_drainable()
/atom/proc/is_injectable(allowmobs = TRUE)
return reagents && (container_type & (INJECTABLE | REFILLABLE))
return reagents && (reagents.reagents_holder_flags & (INJECTABLE | REFILLABLE))
/atom/proc/is_drawable(allowmobs = TRUE)
return reagents && (container_type & (DRAWABLE | DRAINABLE))
return reagents && (reagents.reagents_holder_flags & (DRAWABLE | DRAINABLE))
/atom/proc/is_refillable()
return reagents && (container_type & REFILLABLE)
return reagents && (reagents.reagents_holder_flags & REFILLABLE)
/atom/proc/is_drainable()
return reagents && (container_type & DRAINABLE)
return reagents && (reagents.reagents_holder_flags & DRAINABLE)
/atom/proc/AllowDrop()
@@ -261,7 +260,7 @@
to_chat(user, desc)
if(reagents)
if(container_type & TRANSPARENT)
if(reagents.reagents_holder_flags & TRANSPARENT)
to_chat(user, "It contains:")
if(reagents.reagent_list.len)
if(user.can_see_reagents()) //Show each individual reagent
@@ -274,7 +273,7 @@
to_chat(user, "[total_volume] units of various reagents")
else
to_chat(user, "Nothing.")
else if(container_type & AMOUNT_VISIBLE)
else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE)
if(reagents.total_volume)
to_chat(user, "<span class='notice'>It has [reagents.total_volume] unit\s left.</span>")
else
+1
View File
@@ -31,6 +31,7 @@
var/atom/movable/pulling
var/grab_state = 0
var/throwforce = 0
var/can_be_z_moved = TRUE
/atom/movable/vv_edit_var(var_name, var_value)
var/static/list/banned_edits = list("step_x", "step_y", "step_size")
+5 -5
View File
@@ -100,7 +100,7 @@
//helper for getting the appropriate health status
/proc/RoundHealth(mob/living/M)
if(M.stat == DEAD || (M.has_trait(TRAIT_FAKEDEATH)))
if(M.stat == DEAD || (HAS_TRAIT(M, TRAIT_FAKEDEATH)))
return "health-100" //what's our health? it doesn't matter, we're dead, or faking
var/maxi_health = M.maxHealth
if(iscarbon(M) && M.health < 0)
@@ -172,7 +172,7 @@
var/image/holder = hud_list[STATUS_HUD]
var/icon/I = icon(icon, icon_state, dir)
holder.pixel_y = I.Height() - world.icon_size
if(stat == DEAD || (has_trait(TRAIT_FAKEDEATH)))
if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
holder.icon_state = "huddead"
else
holder.icon_state = "hudhealthy"
@@ -182,9 +182,9 @@
var/icon/I = icon(icon, icon_state, dir)
var/virus_threat = check_virus()
holder.pixel_y = I.Height() - world.icon_size
if(has_trait(TRAIT_XENO_HOST))
if(HAS_TRAIT(src, TRAIT_XENO_HOST))
holder.icon_state = "hudxeno"
else if(stat == DEAD || (has_trait(TRAIT_FAKEDEATH)))
else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
if(tod)
var/tdelta = round(world.time - timeofdeath)
if(tdelta < (DEFIB_TIME_LIMIT * 10))
@@ -242,7 +242,7 @@
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
holder.icon_state = "hud_imp_chem"
if(has_trait(TRAIT_MINDSHIELD))
if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
holder = hud_list[IMPLOYAL_HUD]
var/icon/IC = icon(icon, icon_state, dir)
holder.pixel_y = IC.Height() - world.icon_size
+2 -2
View File
@@ -64,7 +64,7 @@ Credit where due:
return FALSE
if(isliving(M))
var/mob/living/L = M
if(L.has_trait(TRAIT_MINDSHIELD))
if(HAS_TRAIT(L, TRAIT_MINDSHIELD))
return FALSE
if(ishuman(M) || isbrain(M) || isguardian(M) || issilicon(M) || isclockmob(M) || istype(M, /mob/living/simple_animal/drone/cogscarab) || istype(M, /mob/camera/eminence))
return TRUE
@@ -131,7 +131,7 @@ Credit where due:
config_tag = "clockwork_cult"
antag_flag = ROLE_SERVANT_OF_RATVAR
false_report_weight = 10
required_players = 30
required_players = 35
required_enemies = 3
recommended_enemies = 5
enemy_minimum_age = 7
@@ -62,5 +62,6 @@
/datum/outfit/syndicate/clownop/leader
name = "Clown Operative Leader - Basic"
id = /obj/item/card/id/syndicate/nuke_leader
gloves = /obj/item/clothing/gloves/krav_maga/combatglovesplus
r_hand = /obj/item/nuclear_challenge/clownops
command_radio = TRUE
+1 -1
View File
@@ -26,7 +26,7 @@
return FALSE
else
return FALSE
if(M.has_trait(TRAIT_MINDSHIELD) || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M) || !M.client)
if(HAS_TRAIT(M, TRAIT_MINDSHIELD) || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M) || !M.client)
return FALSE //can't convert machines, shielded, braindead, or ratvar's dogs
return TRUE
+1
View File
@@ -137,6 +137,7 @@
/datum/outfit/syndicate/leader
name = "Syndicate Leader - Basic"
id = /obj/item/card/id/syndicate/nuke_leader
gloves = /obj/item/clothing/gloves/krav_maga/combatglovesplus
r_hand = /obj/item/nuclear_challenge
command_radio = TRUE
+3 -3
View File
@@ -542,6 +542,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return checking.researched_nodes.len >= target_amount
/datum/objective/capture
var/captured_amount = 0
/datum/objective/capture/proc/gen_amount_goal()
target_amount = rand(5,10)
@@ -549,8 +550,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
return target_amount
/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth.
var/captured_amount = 0
var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
/*var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
for(var/mob/living/carbon/human/M in A)//Humans.
if(M.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
@@ -573,7 +573,7 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(M.stat == DEAD)
captured_amount+=1
continue
captured_amount+=2
captured_amount+=2*/ //Removed in favour of adding points on capture, in energy_net_nets.dm
return captured_amount >= target_amount
+1 -1
View File
@@ -124,7 +124,7 @@
/datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T)
var/target_amount = text2num(name)
var/found_amount = 0
found_amount += T.air_contents.gases[/datum/gas/plasma] ? T.air_contents.gases[/datum/gas/plasma][MOLES] : 0
found_amount += T.air_contents.gases[/datum/gas/plasma]
return found_amount>=target_amount
+11 -11
View File
@@ -182,11 +182,11 @@
//Get the clone body ready
maim_clone(H)
H.add_trait(TRAIT_STABLEHEART, "cloning")
H.add_trait(TRAIT_EMOTEMUTE, "cloning")
H.add_trait(TRAIT_MUTE, "cloning")
H.add_trait(TRAIT_NOBREATH, "cloning")
H.add_trait(TRAIT_NOCRITDAMAGE, "cloning")
ADD_TRAIT(H, TRAIT_STABLEHEART, "cloning")
ADD_TRAIT(H, TRAIT_EMOTEMUTE, "cloning")
ADD_TRAIT(H, TRAIT_MUTE, "cloning")
ADD_TRAIT(H, TRAIT_NOBREATH, "cloning")
ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, "cloning")
H.Unconscious(80)
clonemind.transfer_to(H)
@@ -361,11 +361,11 @@
if(!mob_occupant)
return
mob_occupant.remove_trait(TRAIT_STABLEHEART, "cloning")
mob_occupant.remove_trait(TRAIT_EMOTEMUTE, "cloning")
mob_occupant.remove_trait(TRAIT_MUTE, "cloning")
mob_occupant.remove_trait(TRAIT_NOCRITDAMAGE, "cloning")
mob_occupant.remove_trait(TRAIT_NOBREATH, "cloning")
REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, "cloning")
REMOVE_TRAIT(mob_occupant, TRAIT_EMOTEMUTE, "cloning")
REMOVE_TRAIT(mob_occupant, TRAIT_MUTE, "cloning")
REMOVE_TRAIT(mob_occupant, TRAIT_NOCRITDAMAGE, "cloning")
REMOVE_TRAIT(mob_occupant, TRAIT_NOBREATH, "cloning")
if(grab_ghost_when == CLONER_MATURE_CLONE)
mob_occupant.grab_ghost()
@@ -452,7 +452,7 @@
// brain function, they also have no limbs or internal organs.
if(!H.has_trait(TRAIT_NODISMEMBER))
if(!HAS_TRAIT(H, TRAIT_NODISMEMBER))
var/static/list/zones = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)
for(var/zone in zones)
var/obj/item/bodypart/BP = H.get_bodypart(zone)
+78 -58
View File
@@ -1,3 +1,9 @@
#define ARCADE_WEIGHT_TRICK 4
#define ARCADE_WEIGHT_USELESS 2
#define ARCADE_WEIGHT_RARE 1
#define ARCADE_WEIGHT_PLUSH 3
/obj/machinery/computer/arcade
name = "random arcade"
desc = "random arcade machine"
@@ -6,55 +12,66 @@
icon_screen = "invaders"
clockwork = TRUE //it'd look weird
var/list/prizes = list(
/obj/item/storage/box/snappops = 8,
/obj/item/toy/talking/AI = 8,
/obj/item/toy/talking/codex_gigas = 8,
/obj/item/clothing/under/syndicate/tacticool = 8,
/obj/item/toy/sword = 8,
/obj/item/toy/gun = 8,
/obj/item/gun/ballistic/shotgun/toy/crossbow = 8,
/obj/item/storage/box/fakesyndiesuit = 8,
/obj/item/storage/crayons = 8,
/obj/item/toy/spinningtoy = 8,
/obj/item/toy/prize/ripley = 4,
/obj/item/toy/prize/fireripley = 4,
/obj/item/toy/prize/deathripley = 4,
/obj/item/toy/prize/gygax = 4,
/obj/item/toy/prize/durand = 4,
/obj/item/toy/prize/honk = 4,
/obj/item/toy/prize/marauder = 4,
/obj/item/toy/prize/seraph = 4,
/obj/item/toy/prize/mauler = 4,
/obj/item/toy/prize/odysseus = 4,
/obj/item/toy/prize/phazon = 4,
/obj/item/toy/prize/reticence = 4,
/obj/item/toy/cards/deck = 8,
/obj/item/toy/nuke = 8,
/obj/item/toy/minimeteor = 8,
/obj/item/toy/redbutton = 8,
/obj/item/toy/talking/owl = 8,
/obj/item/toy/talking/griffin = 8,
/obj/item/coin/antagtoken = 8,
/obj/item/stack/tile/fakespace/loaded = 8,
/obj/item/stack/tile/fakepit/loaded = 8,
/obj/item/toy/toy_xeno = 8,
/obj/item/storage/box/actionfigure = 4,
/obj/item/restraints/handcuffs/fake = 8,
/obj/item/grenade/chem_grenade/glitter/pink = 4,
/obj/item/grenade/chem_grenade/glitter/blue = 4,
/obj/item/grenade/chem_grenade/glitter/white = 4,
/obj/item/toy/eightball = 8,
/obj/item/toy/windupToolbox = 8,
/obj/item/toy/clockwork_watch = 8,
/obj/item/toy/toy_dagger = 8,
/obj/item/extendohand/acme = 4,
/obj/item/hot_potato/harmless/toy = 4,
/obj/item/card/emagfake = 4,
/obj/item/clothing/shoes/wheelys = 8,
/obj/item/clothing/shoes/kindleKicks = 8,
/obj/item/storage/belt/military/snack = 8,
/obj/item/toy/plush/random = 450
)//plushies have a 0.6 chance
/obj/item/toy/balloon = ARCADE_WEIGHT_USELESS,
/obj/item/toy/beach_ball = ARCADE_WEIGHT_USELESS,
/obj/item/toy/cattoy = ARCADE_WEIGHT_USELESS,
/obj/item/toy/clockwork_watch = ARCADE_WEIGHT_TRICK,
/obj/item/toy/dummy = ARCADE_WEIGHT_TRICK,
/obj/item/toy/eightball = ARCADE_WEIGHT_USELESS,
/obj/item/toy/eightball/haunted = ARCADE_WEIGHT_RARE,
/obj/item/storage/box/actionfigure = ARCADE_WEIGHT_USELESS,
/obj/item/toy/foamblade = ARCADE_WEIGHT_TRICK,
/obj/item/toy/gun = ARCADE_WEIGHT_TRICK,
/obj/item/toy/gun/justicar = ARCADE_WEIGHT_TRICK,
/obj/item/toy/gun/m41 = ARCADE_WEIGHT_TRICK,
/obj/item/toy/katana = ARCADE_WEIGHT_TRICK,
/obj/item/toy/minimeteor = ARCADE_WEIGHT_TRICK,
/obj/item/toy/nuke = ARCADE_WEIGHT_TRICK,
/obj/item/toy/plush/random = ARCADE_WEIGHT_PLUSH,
/obj/item/toy/redbutton = ARCADE_WEIGHT_TRICK,
/obj/item/toy/spinningtoy = ARCADE_WEIGHT_TRICK,
/obj/item/toy/sword = ARCADE_WEIGHT_TRICK,
/obj/item/toy/sword/cx = ARCADE_WEIGHT_TRICK,
/obj/item/toy/sword/darksabre = ARCADE_WEIGHT_TRICK,
/obj/item/toy/talking/AI = ARCADE_WEIGHT_USELESS,
/obj/item/toy/talking/codex_gigas = ARCADE_WEIGHT_USELESS,
/obj/item/toy/talking/griffin = ARCADE_WEIGHT_USELESS,
/obj/item/toy/talking/owl = ARCADE_WEIGHT_USELESS,
/obj/item/toy/toy_dagger = ARCADE_WEIGHT_TRICK,
/obj/item/toy/toy_xeno = ARCADE_WEIGHT_TRICK,
/obj/item/toy/windupToolbox = ARCADE_WEIGHT_TRICK,
/obj/item/twohanded/dualsaber/toy = ARCADE_WEIGHT_RARE,
/mob/living/simple_animal/bot/secbot/grievous/toy = ARCADE_WEIGHT_RARE,
/obj/item/clothing/mask/facehugger/toy = ARCADE_WEIGHT_RARE,
/obj/item/gun/ballistic/automatic/toy/pistol/unrestricted = ARCADE_WEIGHT_TRICK,
/obj/item/hot_potato/harmless/toy = ARCADE_WEIGHT_RARE,
/obj/item/twohanded/dualsaber/toy = ARCADE_WEIGHT_RARE,
/obj/item/twohanded/hypereutactic/toy = ARCADE_WEIGHT_RARE,
/obj/item/twohanded/hypereutactic/toy/rainbow = ARCADE_WEIGHT_RARE,
/obj/item/storage/box/snappops = ARCADE_WEIGHT_TRICK,
/obj/item/clothing/under/syndicate/tacticool = ARCADE_WEIGHT_TRICK,
/obj/item/gun/ballistic/shotgun/toy/crossbow = ARCADE_WEIGHT_TRICK,
/obj/item/storage/box/fakesyndiesuit = ARCADE_WEIGHT_TRICK,
/obj/item/storage/crayons = ARCADE_WEIGHT_USELESS,
/obj/item/coin/antagtoken = ARCADE_WEIGHT_USELESS,
/obj/item/stack/tile/fakespace/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/stack/tile/fakepit/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/restraints/handcuffs/fake = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/pink = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/blue = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/white = ARCADE_WEIGHT_TRICK,
/obj/item/extendohand/acme = ARCADE_WEIGHT_TRICK,
/obj/item/card/emagfake = ARCADE_WEIGHT_TRICK,
/obj/item/clothing/shoes/wheelys = ARCADE_WEIGHT_RARE,
/obj/item/clothing/shoes/kindleKicks = ARCADE_WEIGHT_RARE,
/obj/item/storage/belt/military/snack = ARCADE_WEIGHT_RARE,
/obj/item/clothing/mask/fakemoustache/italian = ARCADE_WEIGHT_RARE
)
light_color = LIGHT_COLOR_GREEN
@@ -74,7 +91,8 @@
/obj/machinery/computer/arcade/proc/prizevend(mob/user)
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade)
if(prob(0.0001)) //1 in a million
if(prob(1) && prob(1) && prob(1)) //Proper 1 in a million
new /obj/item/gun/energy/pulse/prize(src)
SSmedals.UnlockMedal(MEDAL_PULSE, usr.client)
@@ -124,6 +142,8 @@
var/blocked = FALSE //Player cannot attack/heal while set
var/turtle = 0
var/turn_speed = 5 //Measured in deciseconds.
/obj/machinery/computer/arcade/battle/Reset()
var/name_action
var/name_part1
@@ -172,7 +192,7 @@
if(turtle > 0)
turtle--
sleep(10)
sleep(turn_speed)
enemy_hp -= attackamt
arcade_action(usr)
@@ -185,7 +205,7 @@
updateUsrDialog()
turtle++
sleep(10)
sleep(turn_speed)
player_mp -= pointamt
player_hp += healamt
blocked = TRUE
@@ -202,7 +222,7 @@
turtle--
updateUsrDialog()
sleep(10)
sleep(turn_speed)
arcade_action(usr)
if (href_list["close"])
@@ -211,10 +231,10 @@
else if (href_list["newgame"]) //Reset everything
temp = "New Round"
player_hp = 30
player_mp = 10
enemy_hp = 45
enemy_mp = 20
player_hp = initial(player_hp)
player_mp = initial(player_mp)
enemy_hp = initial(enemy_hp)
enemy_mp = initial(enemy_mp)
gameover = FALSE
turtle = 0
@@ -260,7 +280,7 @@
if (player_mp <= 0)
gameover = TRUE
sleep(10)
sleep(turn_speed)
temp = "You have been drained! GAME OVER"
playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
if(obj_flags & EMAGGED)
@@ -59,8 +59,8 @@
var/total_moles = air_sample.total_moles()
if(total_moles)
for(var/gas_id in air_sample.gases)
var/gas_name = air_sample.gases[gas_id][GAS_META][META_GAS_NAME]
signal.data["gases"][gas_name] = air_sample.gases[gas_id][MOLES] / total_moles * 100
var/gas_name = GLOB.meta_gas_names[gas_id]
signal.data["gases"][gas_name] = air_sample.gases[gas_id] / total_moles * 100
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+1 -1
View File
@@ -450,7 +450,7 @@
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
if((mob_occupant.has_trait(TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
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
@@ -173,14 +173,15 @@
var/obj/machinery/shuttle_manipulator/M = locate() in GLOB.machines
if(M)
SSshuttle.shuttle_purchased = TRUE
M.unload_preview()
M.load_template(S)
M.existing_shuttle = SSshuttle.emergency
M.action_load(S)
SSshuttle.points -= S.credit_cost
minor_announce("[usr.real_name] has purchased [S.name] for [S.credit_cost] credits." , "Shuttle Purchase")
message_admins("[ADMIN_LOOKUPFLW(usr)] purchased [S.name].")
SSblackbox.record_feedback("text", "shuttle_purchase", 1, "[S.name]")
M.unload_preview()
M.load_template(S)
M.existing_shuttle = SSshuttle.emergency
M.action_load(S)
message_admins("[S.name] loaded, purchased by [usr]")
else
to_chat(usr, "Something went wrong! The shuttle exchange system seems to be down.")
else
+2 -2
View File
@@ -76,7 +76,7 @@
if(connected && connected.is_operational())
if(connected.occupant) //set occupant_status message
viable_occupant = connected.occupant
if(viable_occupant.has_dna() && !viable_occupant.has_trait(TRAIT_RADIMMUNE) && !viable_occupant.has_trait(TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification
if(viable_occupant.has_dna() && !HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) && !HAS_TRAIT(viable_occupant, TRAIT_NOCLONE) || (connected.scan_level == 3)) //occupant is viable for dna modification
occupant_status += "[viable_occupant.name] => "
switch(viable_occupant.stat)
if(CONSCIOUS)
@@ -523,7 +523,7 @@
var/mob/living/carbon/viable_occupant = null
if(connected)
viable_occupant = connected.occupant
if(!istype(viable_occupant) || !viable_occupant.dna || viable_occupant.has_trait(TRAIT_RADIMMUNE) || viable_occupant.has_trait(TRAIT_NOCLONE))
if(!istype(viable_occupant) || !viable_occupant.dna || HAS_TRAIT(viable_occupant, TRAIT_RADIMMUNE) || HAS_TRAIT(viable_occupant, TRAIT_NOCLONE))
viable_occupant = null
return viable_occupant
+1 -1
View File
@@ -99,7 +99,7 @@
var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
if(istype(mob_occupant))
if(locate_computer(/obj/machinery/computer/cloning))
if(!mob_occupant.suiciding && !(mob_occupant.has_trait(TRAIT_NOCLONE)) && !mob_occupant.hellbound)
if(!mob_occupant.suiciding && !(HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && !mob_occupant.hellbound)
mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
// DNA manipulators cannot operate on severed heads or brains
+1 -1
View File
@@ -763,7 +763,7 @@
if(ishuman(user) && prob(40) && src.density)
var/mob/living/carbon/human/H = user
if((H.has_trait(TRAIT_DUMB)) && Adjacent(user))
if((HAS_TRAIT(H, TRAIT_DUMB)) && Adjacent(user))
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
if(!istype(H.head, /obj/item/clothing/head/helmet))
H.visible_message("<span class='danger'>[user] headbutts the airlock.</span>", \
+6 -6
View File
@@ -42,11 +42,11 @@
icon_state = "pod_1"
//Get the clone body ready
maim_clone(H)
H.add_trait(TRAIT_STABLEHEART, "cloning")
H.add_trait(TRAIT_EMOTEMUTE, "cloning")
H.add_trait(TRAIT_MUTE, "cloning")
H.add_trait(TRAIT_NOBREATH, "cloning")
H.add_trait(TRAIT_NOCRITDAMAGE, "cloning")
ADD_TRAIT(H, TRAIT_STABLEHEART, "cloning")
ADD_TRAIT(H, TRAIT_EMOTEMUTE, "cloning")
ADD_TRAIT(H, TRAIT_MUTE, "cloning")
ADD_TRAIT(H, TRAIT_NOBREATH, "cloning")
ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, "cloning")
H.Unconscious(80)
var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H)
@@ -268,7 +268,7 @@
scantemp = "<font class='bad'>Unable to locate valid genetic data.</font>"
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
if((mob_occupant.has_trait(TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
if((HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && (src.scanner.scan_level < 2))
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
+1 -1
View File
@@ -73,7 +73,7 @@
say("Subject is not organic.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
if(!allow_living && !(C.stat == DEAD || C.has_trait(TRAIT_FAKEDEATH))) //I mean, the machines scanners arent advanced enough to tell you're alive
if(!allow_living && !(C.stat == DEAD || HAS_TRAIT(C, TRAIT_FAKEDEATH))) //I mean, the machines scanners arent advanced enough to tell you're alive
say("Subject is still alive.")
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, 1)
return
+1 -2
View File
@@ -10,7 +10,6 @@
icon = 'icons/obj/machines/limbgrower.dmi'
icon_state = "limbgrower_idleoff"
density = TRUE
container_type = OPENCONTAINER
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
@@ -34,7 +33,7 @@
)
/obj/machinery/limbgrower/Initialize()
create_reagents(100)
create_reagents(100, OPENCONTAINER)
stored_research = new /datum/techweb/specialized/autounlocking/limbgrower
. = ..()
@@ -485,7 +485,7 @@
threatcount += 4
if(shoot_unloyal)
if (!perp.has_trait(TRAIT_MINDSHIELD))
if (!HAS_TRAIT(perp, TRAIT_MINDSHIELD))
threatcount += 4
return threatcount
+1
View File
@@ -51,6 +51,7 @@
/obj/machinery/suit_storage_unit/security
suit_type = /obj/item/clothing/suit/space/hardsuit/security
mask_type = /obj/item/clothing/mask/gas/sechailer
storage_type = /obj/item/tank/jetpack/oxygen/security
/obj/machinery/suit_storage_unit/hos
suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
@@ -257,8 +257,7 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize()
. = ..()
create_reagents(max_volume)
reagents.set_reacting(FALSE)
create_reagents(max_volume, NO_REACT)
syringes = new
known_reagents = list("epinephrine"="Epinephrine","charcoal"="Charcoal")
processed_reagents = new
@@ -274,7 +273,7 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail()
..()
if(reagents)
reagents.set_reacting(TRUE)
DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT)
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M)
if(..())
@@ -421,14 +421,13 @@
if(!istype(T))
return
var/datum/gas_mixture/GM = new
GM.add_gas(/datum/gas/plasma)
if(prob(10))
GM.gases[/datum/gas/plasma][MOLES] += 100
GM.gases[/datum/gas/plasma] += 100
GM.temperature = 1500+T0C //should be enough to start a fire
T.visible_message("[src] suddenly disgorges a cloud of heated plasma.")
qdel(src)
else
GM.gases[/datum/gas/plasma][MOLES] += 5
GM.gases[/datum/gas/plasma] += 5
GM.temperature = istype(T) ? T.air.return_temperature() : T20C
T.visible_message("[src] suddenly disgorges a cloud of plasma.")
T.assume_air(GM)
+4 -5
View File
@@ -237,9 +237,8 @@
cabin_air = new
cabin_air.temperature = T20C
cabin_air.volume = 200
cabin_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen)
cabin_air.gases[/datum/gas/oxygen][MOLES] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.gases[/datum/gas/nitrogen][MOLES] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.gases[/datum/gas/oxygen] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
cabin_air.gases[/datum/gas/nitrogen] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature)
return cabin_air
/obj/mecha/proc/add_radio()
@@ -446,13 +445,13 @@
var/mob/living/L = user
if(!Adjacent(target))
if(selected && selected.is_ranged())
if(L.has_trait(TRAIT_PACIFISM) && selected.harmful)
if(HAS_TRAIT(L, TRAIT_PACIFISM) && selected.harmful)
to_chat(user, "<span class='warning'>You don't want to harm other living beings!</span>")
return
if(selected.action(target,params))
selected.start_cooldown()
else if(selected && selected.is_melee())
if(isliving(target) && selected.harmful && L.has_trait(TRAIT_PACIFISM))
if(isliving(target) && selected.harmful && HAS_TRAIT(L, TRAIT_PACIFISM))
to_chat(user, "<span class='warning'>You don't want to harm other living beings!</span>")
return
if(selected.action(target,params))
@@ -72,7 +72,7 @@
..()
if(ishuman(O))
var/mob/living/carbon/human/H = O
if(H.shoes && blood_state && bloodiness && !H.has_trait(TRAIT_LIGHT_STEP))
if(H.shoes && blood_state && bloodiness && !HAS_TRAIT(H, TRAIT_LIGHT_STEP))
var/obj/item/clothing/shoes/S = H.shoes
var/add_blood = 0
if(bloodiness >= BLOOD_GAIN_PER_STEP)
@@ -60,7 +60,7 @@
/obj/effect/decal/cleanable/blood/gibs/Crossed(mob/living/L)
if(istype(L) && has_gravity(loc))
playsound(loc, 'sound/effects/gib_step.ogg', L.has_trait(TRAIT_LIGHT_STEP) ? 20 : 50, 1)
playsound(loc, 'sound/effects/gib_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 20 : 50, 1)
. = ..()
/obj/effect/decal/cleanable/blood/gibs/proc/streak(list/directions)
@@ -3,6 +3,7 @@
desc = "Graffiti. Damn kids."
icon = 'icons/effects/crayondecal.dmi'
icon_state = "rune1"
plane = GAME_PLANE //makes the graffiti visible over a wall.
gender = NEUTER
mergeable_decal = FALSE
var/do_icon_rotate = TRUE

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