Merge remote-tracking branch 'upstream/master' into psych+paramedic

This commit is contained in:
Detective Google
2020-02-20 22:17:55 -06:00
1946 changed files with 70382 additions and 24703 deletions
+3
View File
@@ -6,3 +6,6 @@ indent_size = 4
[*.yml] [*.yml]
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
[*.txt]
insert_final_newline = false
+36
View File
@@ -0,0 +1,36 @@
name: Autobuild TGUI
on:
push:
branches:
- 'master'
paths:
- 'tgui-next/**.js'
- 'tgui-next/**.scss'
jobs:
build:
name: Rebuild TGUI
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
with:
fetch-depth: 25
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '>=12.13'
- name: Build TGUI
run: bin/tgui --ci
working-directory: ./tgui-next
- name: Commit Artifacts
run: |
git config --local user.email "action@github.com"
git config --local user.name "TGUI"
git pull origin master
git commit -m "Automatic TGUI Rebuild [ci skip]" -a || true
- name: Push Artifacts
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_MASTER_KEY }}
+1
View File
@@ -195,6 +195,7 @@ Temporary Items
#Visual studio stuff #Visual studio stuff
*.vscode/* *.vscode/*
!/.vscode/extensions.json
tools/MapAtmosFixer/MapAtmosFixer/obj/* tools/MapAtmosFixer/MapAtmosFixer/obj/*
tools/MapAtmosFixer/MapAtmosFixer/bin/* tools/MapAtmosFixer/MapAtmosFixer/bin/*
+7
View File
@@ -0,0 +1,7 @@
{
"recommendations": [
"gbasood.byond-dm-language-support",
"platymuus.dm-langclient",
"EditorConfig.EditorConfig"
]
}
+1 -1
View File
@@ -1,4 +1,4 @@
FROM tgstation/byond:513.1490 as base FROM tgstation/byond:513.1503 as base
FROM base as build_base FROM base as build_base
+15 -15
View File
@@ -1,6 +1,5 @@
## Citadel Station 13
##Citadel Station 13 <BR> Based and maintained from /tg/station.
Based and maintained from /tg/station.<BR>
[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com)
@@ -10,18 +9,19 @@ Based and maintained from /tg/station.<BR>
[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue")
**Upstream Information** <BR> **Upstream Information**
**Website:** http://www.tgstation13.org <BR> **Website:** https://tgstation13.org
**Code:** https://github.com/tgstation/tgstation <BR> **Code:** https://github.com/tgstation/tgstation
**Wiki** http://tgstation13.org/wiki/Main_Page <BR> **Wiki** https://tgstation13.org/wiki/Main_Page
**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).<BR> **IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
**Citadel Station Information** <BR> **Citadel Station Information**
**Forums:** http://citadel-station.net/forum/ <BR> **Website:** http://citadel-station.net
**Ban Appeals:** http://citadel-station.net/forum/forumdisplay.php?fid=8 <BR> **Forums:** http://citadel-station.net/forum
**Code:** https://github.com/Citadel-Station-13/Citadel-Station-13 <BR> **Ban Appeals:** http://citadel-station.net/forum/forumdisplay.php?fid=8
**Discord:** [Here](https://discord.gg/E6SQuhz). <BR> **Code:** https://github.com/Citadel-Station-13/Citadel-Station-13
**Discord:** [Here](https://discord.gg/E6SQuhz)
## DOWNLOADING ## DOWNLOADING
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code
@@ -18,6 +18,9 @@
/obj/item/mining_scanner, /obj/item/mining_scanner,
/obj/item/flashlight/lantern, /obj/item/flashlight/lantern,
/obj/item/card/id/mining, /obj/item/card/id/mining,
/obj/item/gps/mining{
tracking = 0
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/ruin/powered/golem_ship) /area/ruin/powered/golem_ship)
"d" = ( "d" = (
@@ -31,6 +34,9 @@
/obj/item/mining_scanner, /obj/item/mining_scanner,
/obj/item/flashlight/lantern, /obj/item/flashlight/lantern,
/obj/item/card/id/mining, /obj/item/card/id/mining,
/obj/item/gps/mining{
tracking = 0
},
/turf/open/floor/plating, /turf/open/floor/plating,
/area/ruin/powered/golem_ship) /area/ruin/powered/golem_ship)
"e" = ( "e" = (
@@ -150,6 +156,9 @@
"x" = ( "x" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/machinery/reagentgrinder, /obj/machinery/reagentgrinder,
/obj/item/gps/mining{
tracking = 0
},
/turf/open/floor/mineral/titanium/purple, /turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship) /area/ruin/powered/golem_ship)
"z" = ( "z" = (
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -735,7 +735,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector{ /obj/machinery/atmospherics/components/unary/outlet_injector{
dir = 1 dir = 1
}, },
/turf/open/space/basic, /turf/open/floor/plating/airless,
/area/engine/engineering) /area/engine/engineering)
"Si" = ( "Si" = (
/obj/structure/cable/yellow{ /obj/structure/cable/yellow{
File diff suppressed because it is too large Load Diff
@@ -240,7 +240,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector{ /obj/machinery/atmospherics/components/unary/outlet_injector{
dir = 1 dir = 1
}, },
/turf/open/space/basic, /turf/open/floor/plating/airless,
/area/engine/engineering) /area/engine/engineering)
"nR" = ( "nR" = (
/obj/structure/cable{ /obj/structure/cable{
@@ -905,14 +905,6 @@
}, },
/turf/open/space/basic, /turf/open/space/basic,
/area/space/nearstation) /area/space/nearstation)
"VR" = (
/obj/structure/lattice/catwalk,
/obj/machinery/camera/emp_proof{
c_tag = "Tesla Engine Northeast";
network = list("ss13","engine")
},
/turf/open/space/basic,
/area/space/nearstation)
"Wf" = ( "Wf" = (
/obj/effect/turf_decal/stripes/line{ /obj/effect/turf_decal/stripes/line{
dir = 9 dir = 9
@@ -1728,7 +1720,7 @@ dz
dz dz
FP FP
FP FP
VR FP
dz dz
dz dz
Yl Yl
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+68 -54
View File
@@ -421,7 +421,7 @@
}, },
/area/security/prison) /area/security/prison)
"abr" = ( "abr" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/blue{ /obj/effect/turf_decal/tile/blue{
@@ -2472,7 +2472,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hos) /area/crew_quarters/heads/hos)
"afj" = ( "afj" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_x = -32; pixel_x = -32;
pixel_y = 32 pixel_y = 32
}, },
@@ -2501,7 +2501,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hos) /area/crew_quarters/heads/hos)
"afn" = ( "afn" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_x = 32; pixel_x = 32;
pixel_y = 32 pixel_y = 32
}, },
@@ -15058,7 +15058,7 @@
/obj/machinery/light{ /obj/machinery/light{
dir = 1 dir = 1
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/red{ /obj/effect/turf_decal/tile/red{
@@ -17819,7 +17819,7 @@
/obj/structure/chair{ /obj/structure/chair{
name = "Judge" name = "Judge"
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/light{ /obj/machinery/light{
@@ -19088,7 +19088,7 @@
"aLO" = ( "aLO" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/machinery/portable_atmospherics/scrubber, /obj/machinery/portable_atmospherics/scrubber,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 30 pixel_y = 30
}, },
/obj/effect/turf_decal/delivery, /obj/effect/turf_decal/delivery,
@@ -21087,7 +21087,7 @@
/obj/structure/cable/yellow{ /obj/structure/cable/yellow{
icon_state = "0-4" icon_state = "0-4"
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/camera{ /obj/machinery/camera{
@@ -21381,7 +21381,7 @@
/obj/machinery/light{ /obj/machinery/light{
dir = 4 dir = 4
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_x = 32 pixel_x = 32
}, },
/obj/machinery/flasher{ /obj/machinery/flasher{
@@ -23713,7 +23713,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai) /area/ai_monitored/turret_protected/ai)
"aVm" = ( "aVm" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/atmospherics/components/unary/vent_scrubber/on,
@@ -23740,7 +23740,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai) /area/ai_monitored/turret_protected/ai)
"aVq" = ( "aVq" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/machinery/atmospherics/components/unary/vent_pump/on,
@@ -23803,7 +23803,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{ /obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4 dir = 4
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/stripes/line{ /obj/effect/turf_decal/stripes/line{
@@ -24135,7 +24135,7 @@
/obj/machinery/light{ /obj/machinery/light{
dir = 1 dir = 1
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
@@ -24359,7 +24359,7 @@
pixel_x = -25; pixel_x = -25;
pixel_y = 25 pixel_y = 25
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/structure/extinguisher_cabinet{ /obj/structure/extinguisher_cabinet{
@@ -27493,7 +27493,7 @@
name = "Station Intercom (General)"; name = "Station Intercom (General)";
pixel_x = -29 pixel_x = -29
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_x = -32 pixel_x = -32
}, },
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
@@ -28332,7 +28332,7 @@
/turf/open/floor/carpet, /turf/open/floor/carpet,
/area/crew_quarters/heads/captain/private) /area/crew_quarters/heads/captain/private)
"bdI" = ( "bdI" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -28355,6 +28355,7 @@
/obj/structure/disposalpipe/segment{ /obj/structure/disposalpipe/segment{
dir = 6 dir = 6
}, },
/obj/machinery/vending/wardrobe/cap_wardrobe,
/turf/open/floor/carpet, /turf/open/floor/carpet,
/area/crew_quarters/heads/captain/private) /area/crew_quarters/heads/captain/private)
"bdL" = ( "bdL" = (
@@ -29753,16 +29754,16 @@
/obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue,
/obj/item/clothing/suit/security/officer, /obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/security/officer, /obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/security/officer, /obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/security/officer, /obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/security/officer, /obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/suit/security/officer, /obj/item/clothing/suit/armor/navyblue,
/obj/item/clothing/under/rank/warden/navyblue, /obj/item/clothing/under/rank/warden/navyblue,
/obj/item/clothing/suit/security/warden, /obj/item/clothing/suit/armor/vest/warden/navyblue,
/obj/item/clothing/under/rank/head_of_security/navyblue, /obj/item/clothing/under/rank/head_of_security/navyblue,
/obj/item/clothing/suit/security/hos, /obj/item/clothing/suit/armor/hos/navyblue,
/obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer,
/obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer,
/obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer,
@@ -30143,7 +30144,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/bridge) /area/bridge)
"bhk" = ( "bhk" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/item/folder/yellow{ /obj/item/folder/yellow{
@@ -30795,7 +30796,7 @@
/obj/structure/chair/office/dark{ /obj/structure/chair/office/dark{
dir = 4 dir = 4
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = -32 pixel_y = -32
}, },
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
@@ -31855,7 +31856,7 @@
/obj/effect/turf_decal/tile/brown{ /obj/effect/turf_decal/tile/brown{
dir = 8 dir = 8
}, },
/obj/machinery/autolathe{ /obj/machinery/autolathe/secure{
name = "public autolathe" name = "public autolathe"
}, },
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
@@ -32463,7 +32464,7 @@
/area/ai_monitored/turret_protected/aisat/foyer) /area/ai_monitored/turret_protected/aisat/foyer)
"blC" = ( "blC" = (
/obj/machinery/teleport/station, /obj/machinery/teleport/station,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
@@ -32572,7 +32573,7 @@
/area/ai_monitored/storage/satellite) /area/ai_monitored/storage/satellite)
"blK" = ( "blK" = (
/obj/machinery/recharge_station, /obj/machinery/recharge_station,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/structure/cable/yellow{ /obj/structure/cable/yellow{
@@ -33091,7 +33092,7 @@
/area/crew_quarters/heads/captain/private) /area/crew_quarters/heads/captain/private)
"bmJ" = ( "bmJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_x = -32 pixel_x = -32
}, },
/obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment,
@@ -34052,7 +34053,7 @@
/obj/structure/displaycase/captain{ /obj/structure/displaycase/captain{
pixel_y = 5 pixel_y = 5
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/turf/open/floor/wood, /turf/open/floor/wood,
@@ -35067,7 +35068,7 @@
/turf/open/floor/wood, /turf/open/floor/wood,
/area/crew_quarters/heads/hop) /area/crew_quarters/heads/hop)
"bqF" = ( "bqF" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/blue{ /obj/effect/turf_decal/tile/blue{
@@ -35947,7 +35948,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior) /area/ai_monitored/turret_protected/aisat_interior)
"bse" = ( "bse" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/porta_turret/ai, /obj/machinery/porta_turret/ai,
@@ -36179,7 +36180,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4 dir = 4
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = -32 pixel_y = -32
}, },
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
@@ -36283,7 +36284,7 @@
/turf/open/floor/carpet, /turf/open/floor/carpet,
/area/crew_quarters/heads/hop) /area/crew_quarters/heads/hop)
"bsP" = ( "bsP" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/structure/bed/dogbed/ian, /obj/structure/bed/dogbed/ian,
@@ -37933,7 +37934,7 @@
/area/bridge) /area/bridge)
"bwu" = ( "bwu" = (
/obj/machinery/holopad, /obj/machinery/holopad,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/light{ /obj/machinery/light{
@@ -39063,7 +39064,7 @@
}, },
/area/engine/atmos) /area/engine/atmos)
"byS" = ( "byS" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/light{ /obj/machinery/light{
@@ -39533,7 +39534,7 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/hallway/secondary/command) /area/hallway/secondary/command)
"bzN" = ( "bzN" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/bot, /obj/effect/turf_decal/bot,
@@ -40057,7 +40058,7 @@
"bAW" = ( "bAW" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/item/folder/blue, /obj/item/folder/blue,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 31 pixel_y = 31
}, },
/obj/item/folder/blue, /obj/item/folder/blue,
@@ -41121,7 +41122,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4 dir = 4
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/atmospherics/components/unary/vent_scrubber/on,
@@ -41265,7 +41266,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4 dir = 4
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/atmospherics/components/unary/vent_scrubber/on,
@@ -44514,7 +44515,7 @@
/obj/machinery/gateway{ /obj/machinery/gateway{
dir = 1 dir = 1
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/bot_white,
@@ -44934,7 +44935,7 @@
/area/maintenance/port) /area/maintenance/port)
"bKY" = ( "bKY" = (
/obj/machinery/power/apc{ /obj/machinery/power/apc{
areastring = "/area/vacant_room/office"; areastring = "/area/security/vacantoffice";
dir = 8; dir = 8;
name = "Vacant Office APC"; name = "Vacant Office APC";
pixel_x = -25 pixel_x = -25
@@ -45284,7 +45285,7 @@
/area/maintenance/central) /area/maintenance/central)
"bLH" = ( "bLH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_x = -32 pixel_x = -32
}, },
/obj/machinery/camera{ /obj/machinery/camera{
@@ -49142,7 +49143,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1 dir = 1
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
@@ -49213,7 +49214,7 @@
/obj/machinery/light{ /obj/machinery/light{
dir = 1 dir = 1
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
@@ -52537,7 +52538,7 @@
pixel_y = 4 pixel_y = 4
}, },
/obj/item/pen, /obj/item/pen,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/light/small{ /obj/machinery/light/small{
@@ -59310,7 +59311,7 @@
/turf/open/floor/plasteel/white, /turf/open/floor/plasteel/white,
/area/medical/medbay/central) /area/medical/medbay/central)
"cnC" = ( "cnC" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/structure/table/glass, /obj/structure/table/glass,
@@ -62450,7 +62451,7 @@
}, },
/area/crew_quarters/heads/hor) /area/crew_quarters/heads/hor)
"ctc" = ( "ctc" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/landmark/xmastree/rdrod, /obj/effect/landmark/xmastree/rdrod,
@@ -65398,7 +65399,7 @@
"cyO" = ( "cyO" = (
/obj/machinery/disposal/bin, /obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk, /obj/structure/disposalpipe/trunk,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/turf/open/floor/plasteel/white/side, /turf/open/floor/plasteel/white/side,
@@ -73012,7 +73013,7 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge) /area/hallway/secondary/exit/departure_lounge)
"cMU" = ( "cMU" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
layer = 4 layer = 4
}, },
/turf/closed/wall, /turf/closed/wall,
@@ -76209,7 +76210,7 @@
/obj/machinery/light{ /obj/machinery/light{
dir = 1 dir = 1
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 30 pixel_y = 30
}, },
/obj/machinery/photocopier{ /obj/machinery/photocopier{
@@ -78350,7 +78351,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/engine/engineering) /area/engine/engineering)
"deD" = ( "deD" = (
/obj/machinery/status_display, /obj/machinery/status_display/evac,
/turf/closed/wall/r_wall, /turf/closed/wall/r_wall,
/area/engine/supermatter) /area/engine/supermatter)
"deI" = ( "deI" = (
@@ -79825,7 +79826,7 @@
/area/maintenance/aft) /area/maintenance/aft)
"diD" = ( "diD" = (
/obj/machinery/vending/cigarette, /obj/machinery/vending/cigarette,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/structure/sign/poster/official/random{ /obj/structure/sign/poster/official/random{
@@ -81645,6 +81646,19 @@
/obj/machinery/door/firedoor, /obj/machinery/door/firedoor,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/crew_quarters/cryopod) /area/crew_quarters/cryopod)
"eQf" = (
/obj/machinery/computer/shuttle/mining/common{
dir = 1
},
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
dir = 8
},
/obj/structure/window/reinforced{
dir = 4
},
/turf/open/floor/plating,
/area/hallway/primary/port)
"eZe" = ( "eZe" = (
/obj/structure/cable/yellow{ /obj/structure/cable/yellow{
icon_state = "1-2" icon_state = "1-2"
@@ -98511,7 +98525,7 @@ bgA
biz biz
bkb bkb
blZ blZ
bnM eQf
bqf bqf
bqf bqf
bqf bqf
File diff suppressed because it is too large Load Diff
+17 -24
View File
@@ -2564,7 +2564,7 @@
"aij" = ( "aij" = (
/obj/structure/closet/secure_closet/contraband/armory, /obj/structure/closet/secure_closet/contraband/armory,
/obj/item/poster/random_contraband, /obj/item/poster/random_contraband,
/obj/item/clothing/suit/security/officer/russian, /obj/item/clothing/suit/armor/navyblue/russian,
/obj/item/grenade/plastic/c4, /obj/item/grenade/plastic/c4,
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/security/armory) /area/security/armory)
@@ -3086,7 +3086,7 @@
/area/security/main) /area/security/main)
"ajo" = ( "ajo" = (
/obj/machinery/vending/coffee, /obj/machinery/vending/coffee,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/red{ /obj/effect/turf_decal/tile/red{
@@ -3427,7 +3427,7 @@
"akc" = ( "akc" = (
/obj/structure/table/wood, /obj/structure/table/wood,
/obj/machinery/recharger, /obj/machinery/recharger,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/machinery/light{ /obj/machinery/light{
@@ -6882,7 +6882,7 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/bridge) /area/bridge)
"arK" = ( "arK" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/item/folder/yellow{ /obj/item/folder/yellow{
@@ -9248,7 +9248,7 @@
/obj/structure/disposalpipe/segment{ /obj/structure/disposalpipe/segment{
dir = 4 dir = 4
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/blue{ /obj/effect/turf_decal/tile/blue{
@@ -9830,6 +9830,7 @@
/obj/structure/cable{ /obj/structure/cable{
icon_state = "0-2" icon_state = "0-2"
}, },
/obj/item/twohanded/required/kirbyplants/random,
/turf/open/floor/carpet, /turf/open/floor/carpet,
/area/crew_quarters/heads/captain) /area/crew_quarters/heads/captain)
"axT" = ( "axT" = (
@@ -11162,10 +11163,7 @@
/obj/structure/extinguisher_cabinet{ /obj/structure/extinguisher_cabinet{
pixel_x = -24 pixel_x = -24
}, },
/obj/item/twohanded/required/kirbyplants{ /obj/machinery/vending/wardrobe/cap_wardrobe,
icon_state = "plant-20";
pixel_y = 3
},
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain) /area/crew_quarters/heads/captain)
"aBl" = ( "aBl" = (
@@ -11380,7 +11378,7 @@
/turf/open/floor/wood, /turf/open/floor/wood,
/area/crew_quarters/heads/hop) /area/crew_quarters/heads/hop)
"aBF" = ( "aBF" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/structure/bed/dogbed/ian, /obj/structure/bed/dogbed/ian,
@@ -14151,7 +14149,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1 dir = 1
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
@@ -17493,7 +17491,7 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge) /area/hallway/secondary/exit/departure_lounge)
"aQt" = ( "aQt" = (
/obj/machinery/status_display, /obj/machinery/status_display/evac,
/turf/closed/wall, /turf/closed/wall,
/area/hallway/secondary/exit/departure_lounge) /area/hallway/secondary/exit/departure_lounge)
"aQu" = ( "aQu" = (
@@ -24292,7 +24290,7 @@
/obj/structure/cable{ /obj/structure/cable{
icon_state = "0-2" icon_state = "0-2"
}, },
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 30 pixel_y = 30
}, },
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
@@ -28097,11 +28095,6 @@
}, },
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/science/robotics/lab) /area/science/robotics/lab)
"boY" = (
/obj/effect/turf_decal/bot,
/obj/effect/landmark/start/cyborg,
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"boZ" = ( "boZ" = (
/obj/structure/table, /obj/structure/table,
/obj/machinery/cell_charger, /obj/machinery/cell_charger,
@@ -36929,7 +36922,7 @@
/area/medical/surgery) /area/medical/surgery)
"bHc" = ( "bHc" = (
/obj/machinery/computer/med_data, /obj/machinery/computer/med_data,
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_y = 32 pixel_y = 32
}, },
/turf/open/floor/plasteel/freezer, /turf/open/floor/plasteel/freezer,
@@ -48691,7 +48684,7 @@
/turf/open/space, /turf/open/space,
/area/space/nearstation) /area/space/nearstation)
"cmu" = ( "cmu" = (
/obj/machinery/status_display{ /obj/machinery/status_display/evac{
pixel_x = -32 pixel_x = -32
}, },
/obj/structure/table, /obj/structure/table,
@@ -98811,8 +98804,8 @@ beI
bkt bkt
blH blH
bmO bmO
boY bnQ
boY bnQ
bqi bqi
bry bry
bsZ bsZ
@@ -99068,8 +99061,8 @@ bju
bkt bkt
blI blI
bmO bmO
boY bnQ
boY bnQ
bqi bqi
brz brz
bta bta
+2
View File
@@ -506,6 +506,7 @@
"bx" = ( "bx" = (
/obj/structure/table, /obj/structure/table,
/obj/machinery/readybutton, /obj/machinery/readybutton,
/obj/item/storage/lockbox/dueling/hugbox/stamina,
/turf/open/floor/holofloor/basalt, /turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/thunderdome) /area/holodeck/rec_center/thunderdome)
"by" = ( "by" = (
@@ -522,6 +523,7 @@
/area/holodeck/rec_center/thunderdome) /area/holodeck/rec_center/thunderdome)
"bA" = ( "bA" = (
/obj/machinery/readybutton, /obj/machinery/readybutton,
/obj/item/storage/lockbox/dueling/hugbox/stamina,
/obj/effect/turf_decal/tile/red{ /obj/effect/turf_decal/tile/red{
dir = 1 dir = 1
}, },
+3 -11
View File
@@ -924,25 +924,16 @@
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/medical) /area/shuttle/syndicate/medical)
"ce" = ( "ce" = (
/obj/item/sbeacondrop/bomb{
pixel_y = 5
},
/obj/item/sbeacondrop/bomb,
/obj/structure/table/reinforced, /obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
dir = 8 dir = 8
}, },
/obj/effect/landmark/start/nuclear_equipment,
/obj/effect/landmark/start/nuclear_equipment,
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/armory) /area/shuttle/syndicate/armory)
"cf" = ( "cf" = (
/obj/item/grenade/syndieminibomb{
pixel_x = 4;
pixel_y = 2
},
/obj/item/grenade/syndieminibomb{
pixel_x = -1
},
/obj/structure/table/reinforced, /obj/structure/table/reinforced,
/obj/structure/window/reinforced{ /obj/structure/window/reinforced{
dir = 4 dir = 4
@@ -956,6 +947,7 @@
/obj/effect/turf_decal/tile/neutral{ /obj/effect/turf_decal/tile/neutral{
dir = 8 dir = 8
}, },
/obj/effect/landmark/start/nuclear_equipment/minibomb,
/turf/open/floor/plasteel/dark, /turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/armory) /area/shuttle/syndicate/armory)
"cg" = ( "cg" = (
+26 -29
View File
@@ -89,7 +89,7 @@
/turf/open/floor/pod/dark, /turf/open/floor/pod/dark,
/area/shuttle/pirate) /area/shuttle/pirate)
"aj" = ( "aj" = (
/turf/closed/wall/mineral/plastitanium/nodiagonal, /turf/closed/wall/r_wall/syndicate/pirate/nodiagonal,
/area/shuttle/pirate) /area/shuttle/pirate)
"ak" = ( "ak" = (
/obj/machinery/airalarm/all_access{ /obj/machinery/airalarm/all_access{
@@ -419,6 +419,7 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{ /obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1 dir = 1
}, },
/obj/structure/fans/tiny,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/shuttle/pirate) /area/shuttle/pirate)
"aK" = ( "aK" = (
@@ -463,21 +464,19 @@
/turf/open/floor/plating, /turf/open/floor/plating,
/area/shuttle/pirate) /area/shuttle/pirate)
"aQ" = ( "aQ" = (
/obj/machinery/porta_turret/syndicate/energy{ /obj/machinery/porta_turret/syndicate/energy/pirate{
dir = 1; dir = 1;
faction = list("pirate"); faction = list("pirate");
icon_state = "standard_lethal"; icon_state = "standard_lethal"
mode = 1
}, },
/turf/closed/wall/mineral/plastitanium/nodiagonal, /turf/closed/wall/r_wall/syndicate/pirate/nodiagonal,
/area/shuttle/pirate) /area/shuttle/pirate)
"aR" = ( "aR" = (
/obj/machinery/porta_turret/syndicate/energy{ /obj/machinery/porta_turret/syndicate/energy/pirate{
faction = list("pirate"); faction = list("pirate");
icon_state = "standard_lethal"; icon_state = "standard_lethal"
mode = 1
}, },
/turf/closed/wall/mineral/plastitanium, /turf/closed/wall/r_wall/syndicate/pirate,
/area/shuttle/pirate) /area/shuttle/pirate)
"aS" = ( "aS" = (
/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line,
@@ -486,7 +485,7 @@
/area/shuttle/pirate) /area/shuttle/pirate)
"aU" = ( "aU" = (
/obj/structure/sign/departments/engineering, /obj/structure/sign/departments/engineering,
/turf/closed/wall/mineral/plastitanium/nodiagonal, /turf/closed/wall/r_wall/syndicate/pirate/nodiagonal,
/area/shuttle/pirate) /area/shuttle/pirate)
"aV" = ( "aV" = (
/obj/effect/mob_spawn/human/pirate{ /obj/effect/mob_spawn/human/pirate{
@@ -867,37 +866,36 @@
dir = 1 dir = 1
}, },
/obj/docking_port/mobile/pirate{ /obj/docking_port/mobile/pirate{
callTime = 100;
dheight = 0;
dir = 1;
dwidth = 11; dwidth = 11;
height = 16; height = 16;
id = "pirateship";
launch_status = 0; launch_status = 0;
movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); movement_force = list("KNOCKDOWN" = 0, "THROW" = 0);
name = "Pirate Ship"; name = "Pirate Ship";
port_direction = 2; port_direction = 2;
preferred_direction = 1;
width = 17 width = 17
}, },
/obj/docking_port/stationary{ /obj/docking_port/stationary{
dir = 1;
dwidth = 11; dwidth = 11;
height = 16; height = 16;
id = "pirateship_home"; id = "pirateship_home";
name = "Deep Space"; name = "Deep Space";
width = 17 width = 17
}, },
/obj/structure/fans/tiny,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/shuttle/pirate) /area/shuttle/pirate)
"db" = (
/obj/structure/shuttle/engine/heater,
/obj/effect/spawner/structure/window/plastitanium/pirate,
/turf/open/floor/plating/airless,
/area/shuttle/pirate)
"df" = ( "df" = (
/obj/machinery/porta_turret/syndicate/energy{ /obj/machinery/porta_turret/syndicate/energy/pirate{
dir = 4; dir = 4;
faction = list("pirate"); faction = list("pirate");
icon_state = "standard_lethal"; icon_state = "standard_lethal"
mode = 1
}, },
/turf/closed/wall/mineral/plastitanium, /turf/closed/wall/r_wall/syndicate/pirate,
/area/shuttle/pirate) /area/shuttle/pirate)
"dy" = ( "dy" = (
/obj/structure/chair/wood/normal, /obj/structure/chair/wood/normal,
@@ -988,7 +986,7 @@
id = "piratebridge" id = "piratebridge"
}, },
/obj/structure/grille, /obj/structure/grille,
/obj/structure/window/plastitanium, /obj/structure/window/plastitanium/pirate,
/turf/open/floor/plating, /turf/open/floor/plating,
/area/shuttle/pirate) /area/shuttle/pirate)
"ez" = ( "ez" = (
@@ -1016,7 +1014,7 @@
/turf/open/floor/plasteel, /turf/open/floor/plasteel,
/area/shuttle/pirate) /area/shuttle/pirate)
"fW" = ( "fW" = (
/turf/closed/wall/mineral/plastitanium, /turf/closed/wall/r_wall/syndicate/pirate,
/area/shuttle/pirate) /area/shuttle/pirate)
"fY" = ( "fY" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -1084,13 +1082,12 @@
/turf/open/floor/plasteel/showroomfloor, /turf/open/floor/plasteel/showroomfloor,
/area/shuttle/pirate) /area/shuttle/pirate)
"wR" = ( "wR" = (
/obj/machinery/porta_turret/syndicate/energy{ /obj/machinery/porta_turret/syndicate/energy/pirate{
dir = 8; dir = 8;
faction = list("pirate"); faction = list("pirate");
icon_state = "standard_lethal"; icon_state = "standard_lethal"
mode = 1
}, },
/turf/closed/wall/mineral/plastitanium, /turf/closed/wall/r_wall/syndicate/pirate,
/area/shuttle/pirate) /area/shuttle/pirate)
"yi" = ( "yi" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{ /obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -1326,7 +1323,7 @@ aU
be be
aD aD
aG aG
ep db
aH aH
"} "}
(9,1,1) = {" (9,1,1) = {"
@@ -1344,7 +1341,7 @@ mU
aL aL
bP bP
bX bX
ep db
aK aK
"} "}
(10,1,1) = {" (10,1,1) = {"
@@ -1362,7 +1359,7 @@ aj
bO bO
bQ bQ
bk bk
ep db
er er
"} "}
(11,1,1) = {" (11,1,1) = {"
+7 -3
View File
@@ -136,8 +136,12 @@
#define ORGAN_SLOT_TESTICLES "testicles" #define ORGAN_SLOT_TESTICLES "testicles"
#define ORGAN_SLOT_BREASTS "breasts" #define ORGAN_SLOT_BREASTS "breasts"
////organ defines ////organ defines
#define STANDARD_ORGAN_THRESHOLD 100 #define STANDARD_ORGAN_THRESHOLD 100
#define STANDARD_ORGAN_HEALING 0.001 #define STANDARD_ORGAN_HEALING (1/(15 MINUTES / (2 SECONDS)))
#define STANDARD_ORGAN_DECAY 0.00222 //designed to fail organs when left to decay for ~15 minutes #define STANDARD_ORGAN_DECAY (1/(15 MINUTES / (2 SECONDS))) //designed to fail organs when left to decay for ~15 minutes. 2 SECOND is SSmobs tickrate.
#define G_MALE 1
#define G_FEMALE 2
#define G_PLURAL 3
#define G_NEUTER 4
+1 -1
View File
@@ -20,7 +20,7 @@
#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} #define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;}
#define START_PROCESSING(Processor, Datum) if (!(Datum.datum_flags & DF_ISPROCESSING)) {Datum.datum_flags |= DF_ISPROCESSING;Processor.processing += Datum} #define START_PROCESSING(Processor, Datum) if (!(Datum.datum_flags & DF_ISPROCESSING)) {Datum.datum_flags |= DF_ISPROCESSING;Processor.processing += Datum}
#define STOP_PROCESSING(Processor, Datum) Datum.datum_flags &= ~DF_ISPROCESSING;Processor.processing -= Datum #define STOP_PROCESSING(Processor, Datum) Datum.datum_flags &= ~DF_ISPROCESSING;Processor.processing -= Datum;Processor.currentrun -= Datum
//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) //SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier)
+3 -2
View File
@@ -73,6 +73,7 @@
#define ADMIN_PUNISHMENT_SUPPLYPOD "Supply Pod" #define ADMIN_PUNISHMENT_SUPPLYPOD "Supply Pod"
#define ADMIN_PUNISHMENT_MAZING "Puzzle" #define ADMIN_PUNISHMENT_MAZING "Puzzle"
#define ADMIN_PUNISHMENT_PIE "Cream Pie" #define ADMIN_PUNISHMENT_PIE "Cream Pie"
#define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie"
#define AHELP_ACTIVE 1 #define AHELP_ACTIVE 1
#define AHELP_CLOSED 2 #define AHELP_CLOSED 2
@@ -87,5 +88,5 @@
#define MAX_KEYPRESS_COMMANDLENGTH 16 #define MAX_KEYPRESS_COMMANDLENGTH 16
///Max amount of keypress messages per second over two seconds before client is autokicked ///Max amount of keypress messages per second over two seconds before client is autokicked
#define MAX_KEYPRESS_AUTOKICK 100 #define MAX_KEYPRESS_AUTOKICK 100
///Length of held key rolling buffer ///Length of max held keys
#define HELD_KEY_BUFFER_LENGTH 15 #define MAX_HELD_KEYS 15
+2 -2
View File
@@ -149,9 +149,9 @@
//OPEN TURF ATMOS //OPEN TURF ATMOS
#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn #define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn
#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms #define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15degC telecommunications. also used for xenobiology slime killrooms
#define AIRLESS_ATMOS "TEMP=2.7" //space #define AIRLESS_ATMOS "TEMP=2.7" //space
#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs #define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15degC snow and ice turfs
#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program #define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program
//ATMOSPHERICS DEPARTMENT GAS TANK TURFS //ATMOSPHERICS DEPARTMENT GAS TANK TURFS
+1
View File
@@ -34,6 +34,7 @@
#define CAN_MASTURBATE_WITH (1<<5) #define CAN_MASTURBATE_WITH (1<<5)
#define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ #define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ
#define CAN_CLIMAX_WITH (1<<7) #define CAN_CLIMAX_WITH (1<<7)
#define GENITAL_CAN_AROUSE (1<<8)
#define COCK_SIZE_MIN 1 #define COCK_SIZE_MIN 1
#define COCK_SIZE_MAX 20 #define COCK_SIZE_MAX 20
+2 -2
View File
@@ -184,7 +184,7 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BODY_ZONE_PRECISE_R_FOOT "r_foot" #define BODY_ZONE_PRECISE_R_FOOT "r_foot"
//We will round to this value in damage calculations. //We will round to this value in damage calculations.
#define DAMAGE_PRECISION 0.1 #define DAMAGE_PRECISION 0.01
//items total mass, used to calculate their attacks' stamina costs. If not defined, the cost will be (w_class * 1.25) //items total mass, used to calculate their attacks' stamina costs. If not defined, the cost will be (w_class * 1.25)
#define TOTAL_MASS_TINY_ITEM 1.25 #define TOTAL_MASS_TINY_ITEM 1.25
@@ -202,4 +202,4 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. #define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. #define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default. #define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
#define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs. #define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs.
+13 -9
View File
@@ -106,6 +106,9 @@
#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) #define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user)
#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) #define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob)
#define COMPONENT_ALLOW_EXAMINATE 1
#define COMPONENT_DENY_EXAMINATE 2 //Higher priority compared to the above one
#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) #define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob)
#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) #define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob)
#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) #define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob)
@@ -159,7 +162,6 @@
// /mob signals // /mob signals
#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A) #define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A)
#define COMPONENT_ALLOW_EXAMINE 1
#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) #define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed)
#define COMPONENT_BLOCK_DEATH_BROADCAST 1 //stops the death from being broadcasted in deadchat. #define COMPONENT_BLOCK_DEATH_BROADCAST 1 //stops the death from being broadcasted in deadchat.
#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse, special, penalize) #define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse, special, penalize)
@@ -185,19 +187,20 @@
#define SPEECH_MESSAGE 1 #define SPEECH_MESSAGE 1
// #define SPEECH_BUBBLE_TYPE 2 // #define SPEECH_BUBBLE_TYPE 2
#define SPEECH_SPANS 3 #define SPEECH_SPANS 3
/* #define SPEECH_SANITIZE 4 // #define SPEECH_SANITIZE 4
#define SPEECH_LANGUAGE 5 #define SPEECH_LANGUAGE 5
#define SPEECH_IGNORE_SPAM 6 // #define SPEECH_IGNORE_SPAM 6
#define SPEECH_FORCED 7 */ // #define SPEECH_FORCED 7
// /mob/living signals // /mob/living signals
#define COMSIG_LIVING_FULLY_HEAL "living_fully_healed" //from base of /mob/living/fully_heal(): (admin_revive)
#define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) #define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs)
#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) #define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) #define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living)
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage)
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: ()
#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive)
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client)
#define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) #define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override)
// /mob/living/carbon signals // /mob/living/carbon signals
@@ -275,8 +278,6 @@
#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. #define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) #define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength)
//Blood color
#define COMSIG_BLOOD_COLOR "blood_DNA_to_color" //RGB blood stuff
//Food //Food
#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) #define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
@@ -294,11 +295,14 @@
//Nanites //Nanites
#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found #define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found
#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth #define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth
#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component
#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list #define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list
#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount
#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount #define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount
#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount #define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount
#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount #define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount
#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount #define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount
#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable
#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount #define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount
#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount #define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount
#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. #define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob.
@@ -306,8 +310,8 @@
#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected #define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs #define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component #define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
#define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful
#define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites
#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component #define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component
// /datum/component/storage signals // /datum/component/storage signals
+1
View File
@@ -1,6 +1,7 @@
//config files //config files
#define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X) #define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X)
#define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y) #define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y)
#define CONFIG_GET_ENTRY(X) global.config.GetEntryDatum(/datum/config_entry/##X)
#define CONFIG_MAPS_FILE "maps.txt" #define CONFIG_MAPS_FILE "maps.txt"
+1
View File
@@ -5,6 +5,7 @@
#define NO_ASSASSIN (1<<0) #define NO_ASSASSIN (1<<0)
#define WAROPS_ALWAYS_ALLOWED (1<<1) #define WAROPS_ALWAYS_ALLOWED (1<<1)
#define USE_PREF_WEIGHTS (1<<2)
#define ONLY_RULESET (1<<0) #define ONLY_RULESET (1<<0)
#define HIGHLANDER_RULESET (1<<1) #define HIGHLANDER_RULESET (1<<1)
+6 -6
View File
@@ -54,13 +54,13 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define PASSCLOSEDTURF (1<<5) #define PASSCLOSEDTURF (1<<5)
#define LETPASSTHROW (1<<6) #define LETPASSTHROW (1<<6)
//Movement Types //Movement Types
#define GROUND (1<<0) #define GROUND (1<<0)
#define FLYING (1<<1) #define FLYING (1<<1)
#define VENTCRAWLING (1<<2) #define VENTCRAWLING (1<<2)
#define FLOATING (1<<3) #define FLOATING (1<<3)
#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped. #define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped.
#define CRAWLING (1<<5) //Applied if you're crawling around on the ground/resting.
//Fire and Acid stuff, for resistance_flags //Fire and Acid stuff, for resistance_flags
#define LAVA_PROOF (1<<0) #define LAVA_PROOF (1<<0)
+13 -12
View File
@@ -24,18 +24,19 @@
#define LOG_SAY (1 << 1) #define LOG_SAY (1 << 1)
#define LOG_WHISPER (1 << 2) #define LOG_WHISPER (1 << 2)
#define LOG_EMOTE (1 << 3) #define LOG_EMOTE (1 << 3)
#define LOG_DSAY (1 << 4) #define LOG_SUBTLER (1 << 4)
#define LOG_PDA (1 << 5) #define LOG_DSAY (1 << 5)
#define LOG_CHAT (1 << 6) #define LOG_PDA (1 << 6)
#define LOG_COMMENT (1 << 7) #define LOG_CHAT (1 << 7)
#define LOG_TELECOMMS (1 << 8) #define LOG_COMMENT (1 << 8)
#define LOG_OOC (1 << 9) #define LOG_TELECOMMS (1 << 9)
#define LOG_ADMIN (1 << 10) #define LOG_OOC (1 << 10)
#define LOG_OWNERSHIP (1 << 11) #define LOG_ADMIN (1 << 11)
#define LOG_GAME (1 << 12) #define LOG_OWNERSHIP (1 << 12)
#define LOG_ADMIN_PRIVATE (1 << 13) #define LOG_GAME (1 << 13)
#define LOG_ASAY (1 << 14) #define LOG_ADMIN_PRIVATE (1 << 14)
#define LOG_VIRUS (1 << 15) #define LOG_ASAY (1 << 15)
#define LOG_VIRUS (1 << 16)
//Individual logging panel pages //Individual logging panel pages
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK) #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK)
+11 -1
View File
@@ -96,12 +96,22 @@
#define NUKESTATE_CORE_EXPOSED 1 #define NUKESTATE_CORE_EXPOSED 1
#define NUKESTATE_CORE_REMOVED 0 #define NUKESTATE_CORE_REMOVED 0
#define NUKEUI_AWAIT_DISK 0
#define NUKEUI_AWAIT_CODE 1
#define NUKEUI_AWAIT_TIMER 2
#define NUKEUI_AWAIT_ARM 3
#define NUKEUI_TIMING 4
#define NUKEUI_EXPLODED 5
#define NUKE_OFF_LOCKED 0 #define NUKE_OFF_LOCKED 0
#define NUKE_OFF_UNLOCKED 1 #define NUKE_OFF_UNLOCKED 1
#define NUKE_ON_TIMING 2 #define NUKE_ON_TIMING 2
#define NUKE_ON_EXPLODING 3 #define NUKE_ON_EXPLODING 3
#define MACHINE_NOT_ELECTRIFIED 0
#define MACHINE_ELECTRIFIED_PERMANENT -1
#define MACHINE_DEFAULT_ELECTRIFY_TIME 30
//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified. //these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
#define PLANT_GENE_REMOVABLE (1<<0) #define PLANT_GENE_REMOVABLE (1<<0)
#define PLANT_GENE_EXTRACTABLE (1<<1) #define PLANT_GENE_EXTRACTABLE (1<<1)
+3 -1
View File
@@ -199,4 +199,6 @@
#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 ) #define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 )
#define RULE_OF_THREE(a, b, x) ((a*x)/b) #define RULE_OF_THREE(a, b, x) ((a*x)/b)
// ) // )
#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
+1
View File
@@ -406,6 +406,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define DUMMY_HUMAN_SLOT_HOLOFORM "dummy_holoform_generation" #define DUMMY_HUMAN_SLOT_HOLOFORM "dummy_holoform_generation"
#define DUMMY_HUMAN_SLOT_ADMIN "admintools" #define DUMMY_HUMAN_SLOT_ADMIN "admintools"
#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation" #define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation"
#define DUMMY_HUMAN_SLOT_HALLUCINATION "dummy_hallucination"
#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round #define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
//This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
+17 -15
View File
@@ -35,17 +35,17 @@
#define BLOODCRAWL 1 #define BLOODCRAWL 1
#define BLOODCRAWL_EAT 2 #define BLOODCRAWL_EAT 2
//Mob bio-types //Mob bio-types flags
#define MOB_ORGANIC "organic" #define MOB_ORGANIC 1 << 0
#define MOB_INORGANIC "inorganic" #define MOB_MINERAL 1 << 1
#define MOB_ROBOTIC "robotic" #define MOB_ROBOTIC 1 << 2
#define MOB_UNDEAD "undead" #define MOB_UNDEAD 1 << 3
#define MOB_HUMANOID "humanoid" #define MOB_HUMANOID 1 << 4
#define MOB_BUG "bug" #define MOB_BUG 1 << 5
#define MOB_BEAST "beast" #define MOB_BEAST 1 << 6
#define MOB_EPIC "epic" //megafauna #define MOB_EPIC 1 << 7 //megafauna
#define MOB_REPTILE "reptile" #define MOB_REPTILE 1 << 8
#define MOB_SPIRIT "spirit" #define MOB_SPIRIT 1 << 9
//Organ defines for carbon mobs //Organ defines for carbon mobs
#define ORGAN_ORGANIC 1 #define ORGAN_ORGANIC 1
@@ -200,9 +200,11 @@
#define NO_SLIP_WHEN_WALKING (1<<0) #define NO_SLIP_WHEN_WALKING (1<<0)
#define SLIDE (1<<1) #define SLIDE (1<<1)
#define GALOSHES_DONT_HELP (1<<2) #define GALOSHES_DONT_HELP (1<<2)
#define SLIDE_ICE (1<<3) #define FLYING_DOESNT_HELP (1<<3)
#define SLIP_WHEN_CRAWLING (1<<4) //clown planet ruin #define SLIDE_ICE (1<<4)
#define SLIP_WHEN_JOGGING (1<<5) //slips prevented by walking are also dodged if the mob is not sprinting or fatigued... unless this flag is on. #define SLIP_WHEN_CRAWLING (1<<5) //clown planet ruin amongst others
#define SLIP_WHEN_JOGGING (1<<6) //slips prevented by walking are also dodged if the mob is nor sprinting or fatigued... unless this flag is on.
#define MAX_CHICKENS 50 #define MAX_CHICKENS 50
@@ -274,4 +276,4 @@
#define HUMAN_FIRE_STACK_ICON_NUM 3 #define HUMAN_FIRE_STACK_ICON_NUM 3
#define PULL_PRONE_SLOWDOWN 0.6 #define PULL_PRONE_SLOWDOWN 0.6
#define HUMAN_CARRY_SLOWDOWN 0 #define HUMAN_CARRY_SLOWDOWN 0
+1 -1
View File
@@ -17,4 +17,4 @@
#define MOVE_FORCE_NORMAL MOVE_FORCE_DEFAULT #define MOVE_FORCE_NORMAL MOVE_FORCE_DEFAULT
#define MOVE_FORCE_WEAK (MOVE_FORCE_DEFAULT / 2) #define MOVE_FORCE_WEAK (MOVE_FORCE_DEFAULT / 2)
#define MOVE_FORCE_VERY_WEAK ((MOVE_FORCE_DEFAULT / MOVE_FORCE_CRUSH_RATIO) + 1) #define MOVE_FORCE_VERY_WEAK ((MOVE_FORCE_DEFAULT / MOVE_FORCE_CRUSH_RATIO) + 1)
#define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3)) #define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3))
+39 -6
View File
@@ -1,11 +1,44 @@
#define NANITE_TIMER_DEACTIVATE 1
#define NANITE_TIMER_SELFDELETE 2
#define NANITE_TIMER_TRIGGER 3
#define NANITE_TIMER_RESET 4
#define NANITE_SYNC_DELAY 300 #define NANITE_SYNC_DELAY 300
#define NANITE_SHOCK_IMMUNE 1 #define NANITE_SHOCK_IMMUNE 1
#define NANITE_EMP_IMMUNE 2 #define NANITE_EMP_IMMUNE 2
#define NANITE_PROGRAM_LIMIT 20 #define NANITE_PROGRAM_LIMIT 20
#define NANITE_BASE_RESEARCH 3.5
#define NANITE_CLOUD_TOGGLE 1
#define NANITE_CLOUD_DISABLE 2
#define NANITE_CLOUD_ENABLE 3
///Nanite extra settings types: used to help uis know what type an extra setting is
#define NESTYPE_TEXT "text"
#define NESTYPE_NUMBER "number"
#define NESTYPE_TYPE "type"
#define NESTYPE_BOOLEAN "boolean"
///Nanite Extra Settings - Note that these will also be the names displayed in the UI
#define NES_SENT_CODE "Sent Code"
#define NES_DELAY "Delay"
#define NES_MODE "Mode"
#define NES_COMM_CODE "Comm Code"
#define NES_RELAY_CHANNEL "Relay Channel"
#define NES_HEALTH_PERCENT "Health Percent"
#define NES_DIRECTION "Direction"
#define NES_NANITE_PERCENT "Nanite Percent"
#define NES_DAMAGE_TYPE "Damage Type"
#define NES_DAMAGE "Damage"
#define NES_SENTENCE "Sentence"
#define NES_MESSAGE "Message"
#define NES_DIRECTIVE "Directive"
#define NES_INCLUSIVE_MODE "Inclusive Mode"
#define NES_HALLUCINATION_TYPE "Hallucination Type"
#define NES_HALLUCINATION_DETAIL "Hallucination Detail"
#define NES_MOOD_MESSAGE "Mood Message"
#define NES_PROGRAM_OVERWRITE "Program Overwrite"
#define NES_CLOUD_OVERWRITE "Cloud Overwrite"
#define NES_SCAN_TYPE "Scan Type"
#define NES_BUTTON_NAME "Button Name"
#define NES_ICON "Icon"
#define NES_COLOR "Color"
+13 -12
View File
@@ -17,18 +17,19 @@
// Flags for the item_flags var on /obj/item // Flags for the item_flags var on /obj/item
#define BEING_REMOVED (1<<0) #define BEING_REMOVED (1<<0)
#define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips #define IN_INVENTORY (1<<1) //is this item equipped into an inventory slot or hand of a mob? used for tooltips
#define FORCE_STRING_OVERRIDE (1<<2) //used for tooltips #define FORCE_STRING_OVERRIDE (1<<2) //used for tooltips
#define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use. #define NEEDS_PERMIT (1<<3) //Used by security bots to determine if this item is safe for public use.
#define SLOWS_WHILE_IN_HAND (1<<4) #define SLOWS_WHILE_IN_HAND (1<<4)
#define NO_MAT_REDEMPTION (1<<5) //Stops you from putting things like an RCD or other items into an ORM or protolathe for materials. #define NO_MAT_REDEMPTION (1<<5) //Stops you from putting things like an RCD or other items into an ORM or protolathe for materials.
#define DROPDEL (1<<6) //When dropped, it calls qdel on itself #define DROPDEL (1<<6) //When dropped, it calls qdel on itself
#define NOBLUDGEON (1<<7) //when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() #define NOBLUDGEON (1<<7) //when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define ABSTRACT (1<<8) //for all things that are technically items but used for various different stuff #define ABSTRACT (1<<8) //for all things that are technically items but used for various different stuff
#define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect) #define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect)
#define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) #define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
#define NO_UNIFORM_REQUIRED (1<<11) //Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. #define NO_UNIFORM_REQUIRED (1<<11) //Can be worn on certain slots (currently belt and id) that would otherwise require an uniform.
#define NO_ATTACK_CHAIN_SOFT_STAMCRIT (1<<12) //Entirely blocks melee_attack_chain() if user is soft stamcritted. Uses getStaminaLoss() to check at this point in time. THIS DOES NOT BLOCK RANGED AFTERATTACK()S, ONLY MELEE RANGE AFTERATTACK()S.
// Flags for the clothing_flags var on /obj/item/clothing // Flags for the clothing_flags var on /obj/item/clothing
+13
View File
@@ -0,0 +1,13 @@
//TODO: move these to their own file
#define POOL_FRIGID 1
#define POOL_COOL 2
#define POOL_NORMAL 3
#define POOL_WARM 4
#define POOL_SCALDING 5
GLOBAL_LIST_INIT(blacklisted_pool_reagents, list(
/datum/reagent/toxin/plasma, /datum/reagent/oxygen, /datum/reagent/nitrous_oxide, /datum/reagent/nitrogen, //gases
/datum/reagent/fermi, //blanket fermichem ban sorry. this also covers mkultra, genital enlargers, etc etc.
/datum/reagent/drug/aphrodisiac, /datum/reagent/drug/anaphrodisiac, /datum/reagent/drug/aphrodisiacplus, /datum/reagent/drug/anaphrodisiacplus, //literally asking for prefbreaks
/datum/reagent/consumable/femcum, /datum/reagent/consumable/semen //NO.
))
+2 -2
View File
@@ -1,5 +1,5 @@
#define PROFILE_START ;PROFILE_STORE = list();PROFILE_SET; #define LINE_PROFILE_START ;PROFILE_STORE = list();PROFILE_SET;
#define PROFILE_STOP ;PROFILE_STORE = null; #define LINE_PROFILE_STOP ;PROFILE_STORE = null;
#define PROFILE_SET ;PROFILE_TIME = TICK_USAGE_REAL; PROFILE_LINE = __LINE__; PROFILE_FILE = __FILE__; PROFILE_SLEEPCHECK = world.time; #define PROFILE_SET ;PROFILE_TIME = TICK_USAGE_REAL; PROFILE_LINE = __LINE__; PROFILE_FILE = __FILE__; PROFILE_SLEEPCHECK = world.time;
+13 -1
View File
@@ -8,7 +8,7 @@
#define REAGENT_PURITY_ACCURACY 0.001 #define REAGENT_PURITY_ACCURACY 0.001
#define DEFAULT_SPECIFIC_HEAT 200 #define DEFAULT_SPECIFIC_HEAT 200
// container_type defines //reagents_holder_flags defines
#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. #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. #define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes.
@@ -22,6 +22,11 @@
// Is an open container for all intents and purposes. // Is an open container for all intents and purposes.
#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) #define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT)
//reagents_value defines, for cargo stuff.
#define DEFAULT_REAGENTS_VALUE 1
#define NO_REAGENTS_VALUE 0
#define HARVEST_REAGENTS_VALUE 0.3
#define TOUCH 1 // splashing #define TOUCH 1 // splashing
#define INGEST 2 // ingestion #define INGEST 2 // ingestion
@@ -29,12 +34,19 @@
#define PATCH 4 // patches #define PATCH 4 // patches
#define INJECT 5 // injection #define INJECT 5 // injection
//container_flags
#define PH_WEAK (1 << 0)
#define TEMP_WEAK (1 << 1)
#define APTFT_VERB (1 << 2) //APTFT stands for "amount per transfer from this"
#define APTFT_ALTCLICK (1 << 3)
//defines passed through to the on_reagent_change proc //defines passed through to the on_reagent_change proc
#define DEL_REAGENT 1 // reagent deleted (fully cleared) #define DEL_REAGENT 1 // reagent deleted (fully cleared)
#define ADD_REAGENT 2 // reagent added #define ADD_REAGENT 2 // reagent added
#define REM_REAGENT 3 // reagent removed (may still exist) #define REM_REAGENT 3 // reagent removed (may still exist)
#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone
//reagent bitflags, used for altering how they works //reagent bitflags, used for altering how they works
#define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body #define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body
#define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing #define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing
+7 -1
View File
@@ -53,4 +53,10 @@
//Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta //Checks to determine borg availability depending on the server's config. These are defines in the interest of reducing copypasta
#define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert)) #define BORG_SEC_AVAILABLE (!CONFIG_GET(flag/disable_secborg) && GLOB.security_level >= CONFIG_GET(number/minimum_secborg_alert))
//silicon_priviledges flags
#define PRIVILEDGES_SILICON (1<<0)
#define PRIVILEDGES_PAI (1<<1)
#define PRIVILEDGES_BOT (1<<2)
#define PRIVILEDGES_DRONE (1<<3)
+2 -1
View File
@@ -37,7 +37,8 @@
#define ROLE_GANG "gangster" #define ROLE_GANG "gangster"
#define ROLE_BLOODSUCKER "bloodsucker" #define ROLE_BLOODSUCKER "bloodsucker"
//#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now //#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now
#define ROLE_GHOSTCAFE "ghostcafe"
#define ROLE_MINOR_ANTAG "minorantag"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //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 //The gamemode specific ones are just so the gamemodes can query whether a player is old enough
//(in game days played) to play that role //(in game days played) to play that role
+1
View File
@@ -81,6 +81,7 @@
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam //Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen? #define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
#define MAX_FAVOR_LEN 4096 //double the maximum message length.
#define MAX_NAME_LEN 42 #define MAX_NAME_LEN 42
#define MAX_BROADCAST_LEN 512 #define MAX_BROADCAST_LEN 512
#define MAX_CHARTER_LEN 80 #define MAX_CHARTER_LEN 80
+5
View File
@@ -11,3 +11,8 @@
#define SHOULD_CALL_PARENT(X) #define SHOULD_CALL_PARENT(X)
#define UNLINT(X) X #define UNLINT(X) X
#endif #endif
/world/proc/enable_debugger()
var/dll = world.GetConfig("env", "EXTOOLS_DLL")
if (dll)
call(dll, "debug_initialize")()
+3 -1
View File
@@ -46,7 +46,9 @@
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep
#define STATUS_EFFECT_TASED /datum/status_effect/no_combat_mode/electrode/ //the affected has been tased, preventing fine muscle control #define STATUS_EFFECT_TASED_WEAK /datum/status_effect/electrode //not as crippling, just slows down
#define STATUS_EFFECT_TASED /datum/status_effect/electrode/no_combat_mode //the affected has been tased, preventing fine muscle control
#define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions #define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions
+1
View File
@@ -47,6 +47,7 @@
// Subsystems shutdown in the reverse of the order they initialize in // Subsystems shutdown in the reverse of the order they initialize in
// The numbers just define the ordering, they are meaningless otherwise. // The numbers just define the ordering, they are meaningless otherwise.
#define INIT_ORDER_PROFILER 101
#define INIT_ORDER_FAIL2TOPIC 22 #define INIT_ORDER_FAIL2TOPIC 22
#define INIT_ORDER_TITLE 20 #define INIT_ORDER_TITLE 20
#define INIT_ORDER_GARBAGE 19 #define INIT_ORDER_GARBAGE 19
+1
View File
@@ -1,4 +1,5 @@
#define TGS_EXTERNAL_CONFIGURATION #define TGS_EXTERNAL_CONFIGURATION
#define TGS_V3_API
#define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) GLOBAL_VAR_INIT(##Name, ##Value); GLOBAL_PROTECT(##Name) #define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) GLOBAL_VAR_INIT(##Name, ##Value); GLOBAL_PROTECT(##Name)
#define TGS_READ_GLOBAL(Name) GLOB.##Name #define TGS_READ_GLOBAL(Name) GLOB.##Name
#define TGS_WRITE_GLOBAL(Name, Value) GLOB.##Name = ##Value #define TGS_WRITE_GLOBAL(Name, Value) GLOB.##Name = ##Value
+21 -5
View File
@@ -107,6 +107,22 @@
var/commit //full sha of compiled commit var/commit //full sha of compiled commit
var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch
//represents a version of tgstation-server
/datum/tgs_version
var/suite //The suite version, can be >=3
//this group of variables can be null to represent a wild card
var/major //The major version
var/minor //The minor version
var/patch //The patch version
var/raw_parameter //The unparsed parameter
var/deprefixed_parameter //The version only bit of raw_parameter
//if the tgs_version is a wildcard version
/datum/tgs_version/proc/Wildcard()
return
//represents a merge of a GitHub pull request //represents a merge of a GitHub pull request
/datum/tgs_revision_information/test_merge /datum/tgs_revision_information/test_merge
var/number //pull request number var/number //pull request number
@@ -155,22 +171,22 @@
//FUNCTIONS //FUNCTIONS
//Returns the respective string version of the API //Returns the respective supported /datum/tgs_version of the API
/world/proc/TgsMaximumAPIVersion() /world/proc/TgsMaximumAPIVersion()
return return
/world/proc/TgsMinimumAPIVersion() /world/proc/TgsMinimumAPIVersion()
return return
//Gets the current version of the server tools running the server
/world/proc/TgsVersion()
return
//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise //Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise
//No function below this succeeds if it returns FALSE //No function below this succeeds if it returns FALSE
/world/proc/TgsAvailable() /world/proc/TgsAvailable()
return return
//Gets the current /datum/tgs_version of the server tools running the server
/world/proc/TgsVersion()
return
/world/proc/TgsInstanceName() /world/proc/TgsInstanceName()
return return
+2 -2
View File
@@ -54,5 +54,5 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using
#define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time) #define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time)
#define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday) #define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday)
#define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format) #define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format)
#define STATION_TIME(display_only) ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) #define STATION_TIME(display_only, wtime) ((((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0)
#define STATION_TIME_TIMESTAMP(format) time2text(STATION_TIME(TRUE), format) #define STATION_TIME_TIMESTAMP(format, wtime) time2text(STATION_TIME(TRUE, wtime), format)
+5 -2
View File
@@ -55,6 +55,7 @@
} while (0) } while (0)
#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) #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) #define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE)
#define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE)
//mob traits //mob traits
#define TRAIT_BLIND "blind" #define TRAIT_BLIND "blind"
@@ -110,6 +111,7 @@
#define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOHARDCRIT "nohardcrit"
#define TRAIT_NOSOFTCRIT "nosoftcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit"
#define TRAIT_MINDSHIELD "mindshield" #define TRAIT_MINDSHIELD "mindshield"
#define TRAIT_HIJACKER "hijacker"
#define TRAIT_SIXTHSENSE "sixthsense" #define TRAIT_SIXTHSENSE "sixthsense"
#define TRAIT_DISSECTED "dissected" #define TRAIT_DISSECTED "dissected"
#define TRAIT_FEARLESS "fearless" #define TRAIT_FEARLESS "fearless"
@@ -135,7 +137,7 @@
#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites. #define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites.
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat. #define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events" #define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
#define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking
//non-mob traits //non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
@@ -174,6 +176,7 @@
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
#define TRAIT_FREESPRINT "free_sprinting" #define TRAIT_FREESPRINT "free_sprinting"
#define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_TELEPORT "no-teleport" //you just can't
#define TRAIT_NO_INTERNALS "no-internals"
#define TRAIT_NO_ALCOHOL "alcohol_intolerance" #define TRAIT_NO_ALCOHOL "alcohol_intolerance"
// common trait sources // common trait sources
@@ -232,9 +235,9 @@
#define SLEEPING_CARP_TRAIT "sleeping_carp" #define SLEEPING_CARP_TRAIT "sleeping_carp"
#define RISING_BASS_TRAIT "rising_bass" #define RISING_BASS_TRAIT "rising_bass"
#define ABDUCTOR_ANTAGONIST "abductor-antagonist" #define ABDUCTOR_ANTAGONIST "abductor-antagonist"
#define NUKEOP_ANTAGONIST "nukeop-antagonist"
#define MADE_UNCLONEABLE "made-uncloneable" #define MADE_UNCLONEABLE "made-uncloneable"
#define TIMESTOP_TRAIT "timestop" #define TIMESTOP_TRAIT "timestop"
#define NUKEOP_TRAIT "nuke-op" #define NUKEOP_TRAIT "nuke-op"
#define CLOWNOP_TRAIT "clown-op"
#define MEGAFAUNA_TRAIT "megafauna" #define MEGAFAUNA_TRAIT "megafauna"
#define DEATHSQUAD_TRAIT "deathsquad" #define DEATHSQUAD_TRAIT "deathsquad"
+1 -1
View File
@@ -2,7 +2,7 @@
#define TYPEID_NULL "0" #define TYPEID_NULL "0"
#define TYPEID_NORMAL_LIST "f" #define TYPEID_NORMAL_LIST "f"
//helper macros //helper macros
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) ) #define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, -7) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST) #define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
+12 -1
View File
@@ -1,6 +1,17 @@
#define PLURALITY_VOTING 0 #define PLURALITY_VOTING 0
#define APPROVAL_VOTING 1 #define APPROVAL_VOTING 1
#define RANKED_CHOICE_VOTING 2 #define SCHULZE_VOTING 2
#define SCORE_VOTING 3 #define SCORE_VOTING 3
#define MAJORITY_JUDGEMENT_VOTING 4
#define INSTANT_RUNOFF_VOTING 5
GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great")) GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great"))
GLOBAL_LIST_INIT(vote_type_names,list(\
"Plurality (default)" = PLURALITY_VOTING,\
"Approval" = APPROVAL_VOTING,\
"IRV (single winner ranked choice)" = INSTANT_RUNOFF_VOTING,\
"Schulze (ranked choice, higher result=better)" = SCHULZE_VOTING,\
"Raw Score (returns results from 0 to 1, winner is 1)" = SCORE_VOTING,\
"Majority Judgement (single-winner score voting)" = MAJORITY_JUDGEMENT_VOTING,\
))
+17 -10
View File
@@ -57,14 +57,11 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list)
//Genitals and Arousal Lists //Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(genitals_list) GLOBAL_LIST_EMPTY(genitals_list)
GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm GLOBAL_LIST_EMPTY(cock_shapes_list)
GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
GLOBAL_LIST_EMPTY(gentlemans_organ_names) GLOBAL_LIST_EMPTY(gentlemans_organ_names)
GLOBAL_LIST_EMPTY(balls_shapes_list) GLOBAL_LIST_EMPTY(balls_shapes_list)
GLOBAL_LIST_EMPTY(balls_shapes_icons)
GLOBAL_LIST_EMPTY(breasts_size_list) GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(breasts_shapes_icons)
GLOBAL_LIST_EMPTY(vagina_shapes_list) 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(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")) GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft"))
@@ -111,27 +108,37 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
message_admins("[key_name_admin(usr)] manually reloaded mentors") message_admins("[key_name_admin(usr)] manually reloaded mentors")
//Flavor Text //Flavor Text
/mob/living/carbon/human/verb/set_flavor() /mob/proc/set_flavor()
set name = "Set Flavor Text" set name = "Set Flavor Text"
set desc = "Sets an extended description of your character's features." set desc = "Sets an extended description of your character's features."
set category = "IC" set category = "IC"
var/new_flavor = input(src, "Enter your new flavor text:", "Flavor text", null) as message|null var/new_flavor = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", flavor_text, MAX_FAVOR_LEN, TRUE)
if(!isnull(new_flavor)) if(!isnull(new_flavor))
flavor_text = sanitize(new_flavor) flavor_text = new_flavor
to_chat(src, "Your flavor text has been updated.") to_chat(src, "Your flavor text has been updated.")
//Flavor Text //Flavor Text
/mob/living/carbon/human/verb/set_flavor_2() /mob/proc/set_flavor_2()
set name = "Set Temporary Flavor Text" set name = "Set Temporary Flavor Text"
set desc = "Sets a description of your character's current appearance. Use this for emotions, poses etc." set desc = "Sets a description of your character's current appearance. Use this for emotions, poses etc."
set category = "IC" set category = "IC"
var/new_flavor = input(src, "Enter your new temporary flavor text:", "Temporary flavor text", null) as message|null var/new_flavor = stripped_multiline_input(usr, "Set the temporary flavor text in your 'examine' verb. This should be used only for things pertaining to the current round!", "Short-Term Flavor Text", flavor_text_2, MAX_FAVOR_LEN, TRUE)
if(!isnull(new_flavor)) if(!isnull(new_flavor))
flavor_text_2 = sanitize(new_flavor) flavor_text_2 = new_flavor
to_chat(src, "Your temporary flavor text has been updated.") to_chat(src, "Your temporary flavor text has been updated.")
/mob/proc/print_flavor_text(flavor)
if(!flavor)
return
// We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown.
var/msg = html_decode(replacetext(flavor, "\n", " "))
if(length_char(msg) <= 40)
return "<span class='notice'>[html_encode(msg)]</span>"
else
return "<span class='notice'>[html_encode(copytext_char(msg, 1, 37))]... <a href='?src=[REF(src)];flavor_more=1'>More...</span></a>"
//LOOC toggles //LOOC toggles
/client/verb/listen_looc() /client/verb/listen_looc()
set name = "Show/Hide LOOC" set name = "Show/Hide LOOC"
+17
View File
@@ -52,6 +52,8 @@
if (CONFIG_GET(flag/log_adminchat)) if (CONFIG_GET(flag/log_adminchat))
WRITE_LOG(GLOB.world_game_log, "ADMIN: DSAY: [text]") WRITE_LOG(GLOB.world_game_log, "ADMIN: DSAY: [text]")
/proc/log_consent(text)
WRITE_LOG(GLOB.world_game_log,"CONSENT: [text]")
/* All other items are public. */ /* All other items are public. */
/proc/log_game(text) /proc/log_game(text)
@@ -94,6 +96,10 @@
if (CONFIG_GET(flag/log_emote)) if (CONFIG_GET(flag/log_emote))
WRITE_LOG(GLOB.world_game_log, "EMOTE: [text]") WRITE_LOG(GLOB.world_game_log, "EMOTE: [text]")
/proc/log_subtler(text)
if (CONFIG_GET(flag/log_emote))
WRITE_LOG(GLOB.world_game_log, "EMOTE (SUBTLER): [text]")
/proc/log_prayer(text) /proc/log_prayer(text)
if (CONFIG_GET(flag/log_prayer)) if (CONFIG_GET(flag/log_prayer))
WRITE_LOG(GLOB.world_game_log, "PRAY: [text]") WRITE_LOG(GLOB.world_game_log, "PRAY: [text]")
@@ -165,10 +171,21 @@
/proc/log_mapping(text) /proc/log_mapping(text)
WRITE_LOG(GLOB.world_map_error_log, text) WRITE_LOG(GLOB.world_map_error_log, text)
/proc/log_reagent(text)
WRITE_LOG(GLOB.reagent_log, text)
/proc/log_reagent_transfer(text)
log_reagent("TRANSFER: [text]")
/* For logging round startup. */ /* For logging round startup. */
/proc/start_log(log) /proc/start_log(log)
WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------") WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------")
/* ui logging */
/proc/log_tgui(text)
WRITE_LOG(GLOB.tgui_log, text)
/* Close open log handles. This should be called as late as possible, and no logging should hapen after. */ /* Close open log handles. This should be called as late as possible, and no logging should hapen after. */
/proc/shutdown_logging() /proc/shutdown_logging()
rustg_log_close_all() rustg_log_close_all()
+134
View File
@@ -1,5 +1,81 @@
#define BP_MAX_ROOM_SIZE 300 #define BP_MAX_ROOM_SIZE 300
//Repopulates sortedAreas list
/proc/repopulate_sorted_areas()
GLOB.sortedAreas = list()
for(var/area/A in world)
GLOB.sortedAreas.Add(A)
sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
/area/proc/addSorted()
GLOB.sortedAreas.Add(src)
sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
//Takes: Area type as a text string from a variable.
//Returns: Instance for the area in the world.
/proc/get_area_instance_from_text(areatext)
if(istext(areatext))
areatext = text2path(areatext)
return GLOB.areas_by_type[areatext]
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all areas of that type in the world.
/proc/get_areas(areatype, subtypes=TRUE)
if(istext(areatype))
areatype = text2path(areatype)
else if(isarea(areatype))
var/area/areatemp = areatype
areatype = areatemp.type
else if(!ispath(areatype))
return null
var/list/areas = list()
if(subtypes)
var/list/cache = typecacheof(areatype)
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(cache[A.type])
areas += V
else
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(A.type == areatype)
areas += V
return areas
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all turfs in areas of that type of that type in the world.
/proc/get_area_turfs(areatype, target_z = 0, subtypes=FALSE)
if(istext(areatype))
areatype = text2path(areatype)
else if(isarea(areatype))
var/area/areatemp = areatype
areatype = areatemp.type
else if(!ispath(areatype))
return null
var/list/turfs = list()
if(subtypes)
var/list/cache = typecacheof(areatype)
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(!cache[A.type])
continue
for(var/turf/T in A)
if(target_z == 0 || target_z == T.z)
turfs += T
else
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(A.type != areatype)
continue
for(var/turf/T in A)
if(target_z == 0 || target_z == T.z)
turfs += T
return turfs
// Gets an atmos isolated contained space // Gets an atmos isolated contained space
// Returns an associative list of turf|dirs pairs // Returns an associative list of turf|dirs pairs
// The dirs are connected turfs in the same space // The dirs are connected turfs in the same space
@@ -103,4 +179,62 @@
to_chat(creator, "<span class='notice'>You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.</span>") to_chat(creator, "<span class='notice'>You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.</span>")
return TRUE return TRUE
/**
* Returns the base area the target is located in if there is one.
* Alternatively, returns the area as is.
*/
/proc/get_base_area(atom/target)
var/area/A = get_area(target)
if(A?.base_area)
return A.base_area
return A
/**
* Returns either null, or a list containing every sub area associated with our base area.
* If include_base is TRUE, the base area will also be added to the return list.
*/
/proc/get_sub_areas(atom/target, include_base = TRUE)
var/area/A = get_area(target)
if(!A)
return
. = list()
if(A.base_area)
A = A.base_area
if(include_base)
. += A
if(A.sub_areas)
. += A.sub_areas
/**
* Proc used for purposes similar to get_areas_turfs(), but aimed to include associated areas.
* Only accepts area instances and paths for the first arg, no text strings.
* Returns a list of all turfs found in the sub areas (including the base's if include_base is TRUE)
* and located in a z level matching target_z, or anywhere if target_z is 0
*/
/proc/get_sub_areas_turfs(area/A, target_z = 0, include_base = TRUE)
var/list/contents = get_sub_areas_contents(A, include_base)
. = list()
for(var/turf/T in contents)
if(target_z == 0 || target_z == T.z)
. += T
/**
* Simple proc that returns a sum of all contents from every sub area,
* Think of the above but for all contents, not just turfs, and without target z.
*/
/proc/get_sub_areas_contents(area/A, include_base = TRUE)
if(ispath(A))
A = GLOB.areas_by_type[A]
else
A = get_area(A) //in case it's called on other atoms.
if(!A)
return
if(A.base_area)
A = A.base_area
. = list(A.contents)
for(var/i in A.sub_areas)
. += A.sub_areas[i].contents
#undef BP_MAX_ROOM_SIZE #undef BP_MAX_ROOM_SIZE
+1 -1
View File
@@ -20,7 +20,7 @@
continue continue
path += choice path += choice
if(copytext(path,-1,0) != "/") //didn't choose a directory, no need to iterate again if(copytext_char(path, -1) != "/") //didn't choose a directory, no need to iterate again
break break
var/extensions var/extensions
for(var/i in valid_extensions) for(var/i in valid_extensions)
+18 -37
View File
@@ -8,8 +8,8 @@
#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) #define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL))
#define CULT_POLL_WAIT 2400 #define CULT_POLL_WAIT 2400
/proc/get_area_name(atom/X, format_text = FALSE) /proc/get_area_name(atom/X, format_text = FALSE, get_base_area = FALSE)
var/area/A = isarea(X) ? X : get_area(X) var/area/A = get_base_area ? get_base_area(X) : get_area(X)
if(!A) if(!A)
return null return null
return format_text ? format_text(A.name) : A.name return format_text ? format_text(A.name) : A.name
@@ -145,20 +145,6 @@
turfs += T turfs += T
return turfs return turfs
//This is the new version of recursive_mob_check, used for say().
//The other proc was left intact because morgue trays use it.
//Sped this up again for real this time
/proc/recursive_hear_check(O)
var/list/processing_list = list(O)
. = list()
while(processing_list.len)
var/atom/A = processing_list[1]
if(A.flags_1 & HEAR_1)
. += A
processing_list.Cut(1, 2)
processing_list += A.contents
/** recursive_organ_check /** recursive_organ_check
* inputs: O (object to start with) * inputs: O (object to start with)
* outputs: * outputs:
@@ -238,35 +224,30 @@
return found_mobs return found_mobs
/proc/get_hearers_in_view(R, atom/source) /proc/get_hearers_in_view(R, atom/source)
// Returns a list of hearers in view(R) from source (ignoring luminosity). Used in saycode.
var/turf/T = get_turf(source) var/turf/T = get_turf(source)
. = list() . = list()
if(!T) if(!T)
return return
var/list/processing = list()
var/list/processing_list = list() if(R == 0)
if (R == 0) // if the range is zero, we know exactly where to look for, we can skip view processing += T.contents
processing_list += T.contents // We can shave off one iteration by assuming turfs cannot hear else
else // A variation of get_hear inlined here to take advantage of the compiler's fastpath for obj/mob in view
var/lum = T.luminosity var/lum = T.luminosity
T.luminosity = 6 // This is the maximum luminosity T.luminosity = 6
var/list/cachedview = view(R, T) var/list/cached_view = view(R, T)
for(var/mob/M in cachedview) for(var/mob/M in cached_view)
processing_list += M processing += M
for(var/obj/O in cachedview) for(var/obj/O in cached_view)
processing_list += O processing += O
T.luminosity = lum T.luminosity = lum
var/i = 0
while(processing_list.len) // recursive_hear_check inlined here while(i < length(processing))
var/atom/A = processing_list[1] var/atom/A = processing[++i]
if(A.flags_1 & HEAR_1) if(A.flags_1 & HEAR_1)
. += A . += A
SEND_SIGNAL(A, COMSIG_ATOM_HEARER_IN_VIEW, processing_list, .) SEND_SIGNAL(A, COMSIG_ATOM_HEARER_IN_VIEW, processing, .)
processing_list.Cut(1, 2) processing += A.contents
processing_list += A.contents
/proc/get_mobs_in_radio_ranges(list/obj/item/radio/radios) /proc/get_mobs_in_radio_ranges(list/obj/item/radio/radios)
. = list() . = list()
@@ -455,7 +436,7 @@
var/list/result = list() var/list/result = list()
for(var/m in group) for(var/m in group)
var/mob/M = m var/mob/M = m
if(!M.key || !M.client || (ignore_category && GLOB.poll_ignore[ignore_category] && M.ckey in GLOB.poll_ignore[ignore_category])) if(!M.key || !M.client || (ignore_category && GLOB.poll_ignore[ignore_category] && (M.ckey in GLOB.poll_ignore[ignore_category])))
continue continue
if(be_special_flag) if(be_special_flag)
if(!(M.client.prefs) || !(be_special_flag in M.client.prefs.be_special)) if(!(M.client.prefs) || !(be_special_flag in M.client.prefs.be_special))
+1 -12
View File
@@ -51,26 +51,15 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/antenna, GLOB.ipc_antennas_list, roundstart = TRUE) init_sprite_accessory_subtypes(/datum/sprite_accessory/antenna, GLOB.ipc_antennas_list, roundstart = TRUE)
//genitals //genitals
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) 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
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ",
"cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret",
"baloney pony", "schlanger", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket", "baloney pony", "schlanger", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket",
"One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett", "One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett",
"Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior") "Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior")
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
for(var/gpath in subtypesof(/obj/item/organ/genital)) for(var/gpath in subtypesof(/obj/item/organ/genital))
var/obj/item/organ/genital/G = gpath var/obj/item/organ/genital/G = gpath
+2 -2
View File
@@ -985,7 +985,7 @@ world
var/icon/atom_icon = new(A.icon, A.icon_state) var/icon/atom_icon = new(A.icon, A.icon_state)
if(!letter) if(!letter)
letter = copytext(A.name, 1, 2) letter = A.name[1]
if(uppercase == 1) if(uppercase == 1)
letter = uppertext(letter) letter = uppertext(letter)
else if(uppercase == -1) else if(uppercase == -1)
@@ -1113,7 +1113,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
WRITE_FILE(GLOB.iconCache[iconKey], icon) WRITE_FILE(GLOB.iconCache[iconKey], icon)
var/iconData = GLOB.iconCache.ExportText(iconKey) var/iconData = GLOB.iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{") var/list/partial = splittext(iconData, "{")
return replacetext(copytext(partial[2], 3, -5), "\n", "") return replacetext(copytext_char(partial[2], 3, -5), "\n", "")
/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE) /proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE)
if (!thing) if (!thing)
+1 -4
View File
@@ -179,7 +179,6 @@
"balls_cum_rate" = CUM_RATE, "balls_cum_rate" = CUM_RATE,
"balls_cum_mult" = CUM_RATE_MULT, "balls_cum_mult" = CUM_RATE_MULT,
"balls_efficiency" = CUM_EFFICIENCY, "balls_efficiency" = CUM_EFFICIENCY,
"balls_fluid" = "semen",
"has_ovi" = FALSE, "has_ovi" = FALSE,
"ovi_shape" = "knotted", "ovi_shape" = "knotted",
"ovi_length" = 6, "ovi_length" = 6,
@@ -194,7 +193,6 @@
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list), "breasts_size" = pick(GLOB.breasts_size_list),
"breasts_shape" = "Pair", "breasts_shape" = "Pair",
"breasts_fluid" = "milk",
"breasts_producing" = FALSE, "breasts_producing" = FALSE,
"has_vag" = FALSE, "has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list), "vag_shape" = pick(GLOB.vagina_shapes_list),
@@ -206,7 +204,6 @@
"womb_cum_rate" = CUM_RATE, "womb_cum_rate" = CUM_RATE,
"womb_cum_mult" = CUM_RATE_MULT, "womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY, "womb_efficiency" = CUM_EFFICIENCY,
"womb_fluid" = "femcum",
"ipc_screen" = "Sunburst", "ipc_screen" = "Sunburst",
"ipc_antenna" = "None", "ipc_antenna" = "None",
"flavor_text" = "", "flavor_text" = "",
@@ -532,7 +529,7 @@ GLOBAL_LIST_EMPTY(species_list)
continue continue
if(M.stat != DEAD && !override) if(M.stat != DEAD && !override)
continue continue
if(speaker_key && speaker_key in prefs.ignoring) if(speaker_key && (speaker_key in prefs.ignoring))
continue continue
switch(message_type) switch(message_type)
+2 -2
View File
@@ -28,10 +28,10 @@
. = "does" . = "does"
/datum/proc/p_theyve(capitalized, temp_gender) /datum/proc/p_theyve(capitalized, temp_gender)
. = p_they(capitalized, temp_gender) + "'" + copytext(p_have(temp_gender), 3) . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_have(temp_gender), 3)
/datum/proc/p_theyre(capitalized, temp_gender) /datum/proc/p_theyre(capitalized, temp_gender)
. = p_they(capitalized, temp_gender) + "'" + copytext(p_are(temp_gender), 2) . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_are(temp_gender), 2)
/datum/proc/p_s(temp_gender) //is this a descriptive proc name, or what? /datum/proc/p_s(temp_gender) //is this a descriptive proc name, or what?
. = "s" . = "s"
+1 -1
View File
@@ -1,6 +1,6 @@
// Ensure the frequency is within bounds of what it should be sending/receiving at // Ensure the frequency is within bounds of what it should be sending/receiving at
/proc/sanitize_frequency(frequency, free = FALSE) /proc/sanitize_frequency(frequency, free = FALSE)
. = round(frequency) frequency = round(frequency)
if(free) if(free)
. = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) . = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ)
else else
+23
View File
@@ -72,3 +72,26 @@
if(!GLOB.chemical_reactions_list[primary_reagent]) if(!GLOB.chemical_reactions_list[primary_reagent])
GLOB.chemical_reactions_list[primary_reagent] = list() GLOB.chemical_reactions_list[primary_reagent] = list()
GLOB.chemical_reactions_list[primary_reagent] += R GLOB.chemical_reactions_list[primary_reagent] += R
/proc/choose_reagent_id(mob/user)
var/chosen_id
switch(alert(user, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky"))
if("Search")
var/valid_id
while(!valid_id)
chosen_id = input(user, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text
if(isnull(chosen_id)) //Get me out of here!
break
if(!ispath(text2path(chosen_id)))
chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent)))
if(ispath(chosen_id))
valid_id = TRUE
else
valid_id = TRUE
if(!valid_id)
to_chat(user, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose from a list")
chosen_id = input(user, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent)
if("I'm feeling lucky")
chosen_id = pick(subtypesof(/datum/reagent))
return chosen_id
+23 -10
View File
@@ -3,6 +3,9 @@
#define POPCOUNT_SHUTTLE_ESCAPEES "shuttle_escapees" //Emergency shuttle only. #define POPCOUNT_SHUTTLE_ESCAPEES "shuttle_escapees" //Emergency shuttle only.
/datum/controller/subsystem/ticker/proc/gather_roundend_feedback() /datum/controller/subsystem/ticker/proc/gather_roundend_feedback()
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100)
gather_antag_data() gather_antag_data()
record_nuke_disk_location() record_nuke_disk_location()
var/json_file = file("[GLOB.log_directory]/round_end_data.json") var/json_file = file("[GLOB.log_directory]/round_end_data.json")
@@ -71,9 +74,6 @@
mob_data += list("name" = m.name, "typepath" = m.type) mob_data += list("name" = m.name, "typepath" = m.type)
var/pos = length(file_data["[escaped]"]["[category]"]) + 1 var/pos = length(file_data["[escaped]"]["[category]"]) + 1
file_data["[escaped]"]["[category]"]["[pos]"] = mob_data file_data["[escaped]"]["[category]"]["[pos]"] = mob_data
var/datum/station_state/end_state = new /datum/station_state()
end_state.count()
var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100)
file_data["additional data"]["station integrity"] = station_integrity file_data["additional data"]["station integrity"] = station_integrity
WRITE_FILE(json_file, json_encode(file_data)) WRITE_FILE(json_file, json_encode(file_data))
SSblackbox.record_feedback("nested tally", "round_end_stats", num_survivors, list("survivors", "total")) SSblackbox.record_feedback("nested tally", "round_end_stats", num_survivors, list("survivors", "total"))
@@ -111,7 +111,14 @@
if(A.objectives.len) if(A.objectives.len)
for(var/datum/objective/O in A.objectives) for(var/datum/objective/O in A.objectives)
var/result = O.check_completion() ? "SUCCESS" : "FAIL" var/result = "UNKNOWN"
var/actual_result = O.check_completion()
if(actual_result >= 1)
result = "SUCCESS"
else if(actual_result <= 0)
result = "FAIL"
else
result = "[actual_result*100]%"
antag_info["objectives"] += list(list("objective_type"=O.type,"text"=O.explanation_text,"result"=result)) antag_info["objectives"] += list(list("objective_type"=O.type,"text"=O.explanation_text,"result"=result))
SSblackbox.record_feedback("associative", "antagonists", 1, antag_info) SSblackbox.record_feedback("associative", "antagonists", 1, antag_info)
@@ -139,19 +146,19 @@
var/list/file_data = list() var/list/file_data = list()
var/pos = 1 var/pos = 1
for(var/V in GLOB.news_network.network_channels) for(var/V in GLOB.news_network.network_channels)
var/datum/newscaster/feed_channel/channel = V var/datum/news/feed_channel/channel = V
if(!istype(channel)) if(!istype(channel))
stack_trace("Non-channel in newscaster channel list") stack_trace("Non-channel in newscaster channel list")
continue continue
file_data["[pos]"] = list("channel name" = "[channel.channel_name]", "author" = "[channel.author]", "censored" = channel.censored ? 1 : 0, "author censored" = channel.authorCensor ? 1 : 0, "messages" = list()) file_data["[pos]"] = list("channel name" = "[channel.channel_name]", "author" = "[channel.author]", "censored" = channel.censored ? 1 : 0, "author censored" = channel.authorCensor ? 1 : 0, "messages" = list())
for(var/M in channel.messages) for(var/M in channel.messages)
var/datum/newscaster/feed_message/message = M var/datum/news/feed_message/message = M
if(!istype(message)) if(!istype(message))
stack_trace("Non-message in newscaster channel messages list") stack_trace("Non-message in newscaster channel messages list")
continue continue
var/list/comment_data = list() var/list/comment_data = list()
for(var/C in message.comments) for(var/C in message.comments)
var/datum/newscaster/feed_comment/comment = C var/datum/news/feed_comment/comment = C
if(!istype(comment)) if(!istype(comment))
stack_trace("Non-message in newscaster message comments list") stack_trace("Non-message in newscaster message comments list")
continue continue
@@ -550,10 +557,16 @@
var/list/objective_parts = list() var/list/objective_parts = list()
var/count = 1 var/count = 1
for(var/datum/objective/objective in objectives) for(var/datum/objective/objective in objectives)
if(objective.check_completion()) if(objective.completable)
objective_parts += "<b>Objective #[count]</b>: [objective.explanation_text] <span class='greentext'>Success!</span>" var/completion = objective.check_completion()
if(completion >= 1)
objective_parts += "<B>Objective #[count]</B>: [objective.explanation_text] <span class='greentext'><B>Success!</span>"
else if(completion <= 0)
objective_parts += "<B>Objective #[count]</B>: [objective.explanation_text] <span class='redtext'>Fail.</span>"
else
objective_parts += "<B>Objective #[count]</B>: [objective.explanation_text] <span class='yellowtext'>[completion*100]%</span>"
else else
objective_parts += "<b>Objective #[count]</b>: [objective.explanation_text] <span class='redtext'>Fail.</span>" objective_parts += "<B>Objective #[count]</B>: [objective.explanation_text]"
count++ count++
return objective_parts.Join("<br>") return objective_parts.Join("<br>")
+22 -14
View File
@@ -43,24 +43,30 @@
if(!istext(color)) if(!istext(color))
color = "" color = ""
var/start = 1 + (text2ascii(color,1)==35) var/start = 1 + (text2ascii(color, 1) == 35)
var/len = length(color) var/len = length(color)
var/step_size = 1 + ((len+1)-start != desired_format) var/char = ""
// RRGGBB -> RGB but awful
var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3
. = "" . = ""
for(var/i=start, i<=len, i+=step_size) var/i = start
var/ascii = text2ascii(color,i) while(i <= len)
switch(ascii) char = color[i]
if(48 to 57) switch(text2ascii(char))
. += ascii2text(ascii) //numbers 0 to 9 if(48 to 57) //numbers 0 to 9
if(97 to 102) . += char
. += ascii2text(ascii) //letters a to f if(97 to 102) //letters a to f
if(65 to 70) . += char
. += ascii2text(ascii+32) //letters A to F - translates to lowercase if(65 to 70) //letters A to F
. += lowertext(char)
else else
break break
i += length(char)
if(convert_to_shorthand && i <= len) //skip next one
i += length(color[i])
if(length(.) != desired_format) if(length_char(.) != desired_format)
if(default) if(default)
return default return default
return crunch + repeat_string(desired_format, "0") return crunch + repeat_string(desired_format, "0")
@@ -68,7 +74,9 @@
return crunch + . return crunch + .
/proc/sanitize_ooccolor(color) /proc/sanitize_ooccolor(color)
var/list/HSL = rgb2hsl(hex2num(copytext(color,2,4)),hex2num(copytext(color,4,6)),hex2num(copytext(color,6,8))) if(length(color) != length_char(color))
CRASH("Invalid characters in color '[color]'")
var/list/HSL = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8)))
HSL[3] = min(HSL[3],0.4) HSL[3] = min(HSL[3],0.4)
var/list/RGB = hsl2rgb(arglist(HSL)) var/list/RGB = hsl2rgb(arglist(HSL))
return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]" return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]"
+1 -1
View File
@@ -52,6 +52,6 @@
if(bad_chars) if(bad_chars)
bad_match = url_encode(bad_chars_regex.match) bad_match = url_encode(bad_chars_regex.match)
scrubbed_url += bad_match scrubbed_url += bad_match
last_good = bad_chars + length(bad_match) last_good = bad_chars + length(bad_chars_regex.match)
while(bad_chars) while(bad_chars)
. = scrubbed_url . = scrubbed_url
+236 -232
View File
@@ -40,10 +40,16 @@
for(var/char in repl_chars) for(var/char in repl_chars)
var/index = findtext(t, char) var/index = findtext(t, char)
while(index) while(index)
t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+1) t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index + length(char))
index = findtext(t, char, index+1) index = findtext(t, char, index + length(char))
return t return t
/proc/sanitize_name(t,list/repl_chars = null)
if(t == "space" || t == "floor" || t == "wall" || t == "r-wall" || t == "monkey" || t == "unknown" || t == "inactive ai") //prevents these common metagamey names
alert("Invalid name.")
return ""
return sanitize(t)
/proc/sanitize_filename(t) /proc/sanitize_filename(t)
return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"="")) return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"=""))
@@ -63,22 +69,28 @@
//Returns null if there is any bad text in the string //Returns null if there is any bad text in the string
/proc/reject_bad_text(text, max_length=512) /proc/reject_bad_text(text, max_length = 512, ascii_only = TRUE)
if(length(text) > max_length) var/char_count = 0
return //message too long var/non_whitespace = FALSE
var/non_whitespace = 0 var/lenbytes = length(text)
for(var/i=1, i<=length(text), i++) var/char = ""
switch(text2ascii(text,i)) for(var/i = 1, i <= lenbytes, i += length(char))
if(62,60,92,47) char = text[i]
return //rejects the text if it contains these bad characters: <, >, \ or / char_count++
if(127 to 255) if(char_count > max_length)
return //rejects weird letters like return
switch(text2ascii(char))
if(62,60,92,47) // <, >, \, /
return
if(0 to 31) if(0 to 31)
return //more weird stuff return
if(32) if(32)
continue //whitespace continue //whitespace
if(127 to INFINITY)
if(ascii_only)
return
else else
non_whitespace = 1 non_whitespace = TRUE
if(non_whitespace) if(non_whitespace)
return text //only accepts the text if it has some non-spaces return text //only accepts the text if it has some non-spaces
@@ -101,73 +113,84 @@
else else
return trim(html_encode(name), max_length) return trim(html_encode(name), max_length)
#define NO_CHARS_DETECTED 0
#define SPACES_DETECTED 1
#define SYMBOLS_DETECTED 2
#define NUMBERS_DETECTED 3
#define LETTERS_DETECTED 4
//Filters out undesirable characters from names //Filters out undesirable characters from names
/proc/reject_bad_name(t_in, allow_numbers=0, max_length=MAX_NAME_LEN) /proc/reject_bad_name(t_in, allow_numbers = FALSE, max_length = MAX_NAME_LEN, ascii_only = TRUE)
if(!t_in || length(t_in) > max_length) if(!t_in)
return //Rejects the input if it is null or if it is longer then the max length allowed return //Rejects the input if it is null
var/number_of_alphanumeric = 0 var/number_of_alphanumeric = 0
var/last_char_group = 0 var/last_char_group = NO_CHARS_DETECTED
var/t_out = "" var/t_out = ""
var/t_len = length(t_in)
var/charcount = 0
var/char = ""
for(var/i=1, i<=length(t_in), i++)
var/ascii_char = text2ascii(t_in,i) for(var/i = 1, i <= t_len, i += length(char))
switch(ascii_char) char = t_in[i]
switch(text2ascii(char))
// A .. Z // A .. Z
if(65 to 90) //Uppercase Letters if(65 to 90) //Uppercase Letters
t_out += ascii2text(ascii_char)
number_of_alphanumeric++ number_of_alphanumeric++
last_char_group = 4 last_char_group = LETTERS_DETECTED
// a .. z // a .. z
if(97 to 122) //Lowercase Letters if(97 to 122) //Lowercase Letters
if(last_char_group<2) if(last_char_group == NO_CHARS_DETECTED || last_char_group == SPACES_DETECTED || last_char_group == SYMBOLS_DETECTED) //start of a word
t_out += ascii2text(ascii_char-32) //Force uppercase first character char = uppertext(char)
else
t_out += ascii2text(ascii_char)
number_of_alphanumeric++ number_of_alphanumeric++
last_char_group = 4 last_char_group = LETTERS_DETECTED
// 0 .. 9 // 0 .. 9
if(48 to 57) //Numbers if(48 to 57) //Numbers
if(!last_char_group) if(last_char_group == NO_CHARS_DETECTED || !allow_numbers) //suppress at start of string
continue //suppress at start of string
if(!allow_numbers)
continue continue
t_out += ascii2text(ascii_char)
number_of_alphanumeric++ number_of_alphanumeric++
last_char_group = 3 last_char_group = NUMBERS_DETECTED
// ' - . // ' - .
if(39,45,46) //Common name punctuation if(39,45,46) //Common name punctuation
if(!last_char_group) if(last_char_group == NO_CHARS_DETECTED)
continue continue
t_out += ascii2text(ascii_char) last_char_group = SYMBOLS_DETECTED
last_char_group = 2
// ~ | @ : # $ % & * + // ~ | @ : # $ % & * +
if(126,124,64,58,35,36,37,38,42,43) //Other symbols that we'll allow (mainly for AI) if(126,124,64,58,35,36,37,38,42,43) //Other symbols that we'll allow (mainly for AI)
if(!last_char_group) if(last_char_group == NO_CHARS_DETECTED || !allow_numbers) //suppress at start of string
continue //suppress at start of string
if(!allow_numbers)
continue continue
t_out += ascii2text(ascii_char) last_char_group = SYMBOLS_DETECTED
last_char_group = 2
//Space //Space
if(32) if(32)
if(last_char_group <= 1) if(last_char_group == NO_CHARS_DETECTED || last_char_group == SPACES_DETECTED) //suppress double-spaces and spaces at start of string
continue //suppress double-spaces and spaces at start of string continue
t_out += ascii2text(ascii_char) last_char_group = SPACES_DETECTED
last_char_group = 1
if(127 to INFINITY)
if(ascii_only)
continue
last_char_group = SYMBOLS_DETECTED //for now, we'll treat all non-ascii characters like symbols even though most are letters
else else
return continue
t_out += char
charcount++
if(charcount >= max_length)
break
if(number_of_alphanumeric < 2) if(number_of_alphanumeric < 2)
return //protects against tiny names like "A" and also names like "' ' ' ' ' ' ' '" return //protects against tiny names like "A" and also names like "' ' ' ' ' ' ' '"
if(last_char_group == 1) if(last_char_group == SPACES_DETECTED)
t_out = copytext(t_out,1,length(t_out)) //removes the last character (in this case a space) t_out = copytext_char(t_out, 1, -1) //removes the last character (in this case a space)
for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai")) //prevents these common metagamey names for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai")) //prevents these common metagamey names
if(cmptext(t_out,bad_name)) if(cmptext(t_out,bad_name))
@@ -175,6 +198,11 @@
return t_out return t_out
#undef NO_CHARS_DETECTED
#undef SPACES_DETECTED
#undef NUMBERS_DETECTED
#undef LETTERS_DETECTED
//html_encode helper proc that returns the smallest non null of two numbers //html_encode helper proc that returns the smallest non null of two numbers
//or 0 if they're both null (needed because of findtext returning 0 when a value is not present) //or 0 if they're both null (needed because of findtext returning 0 when a value is not present)
/proc/non_zero_min(a, b) /proc/non_zero_min(a, b)
@@ -184,39 +212,6 @@
return a return a
return (a < b ? a : b) return (a < b ? a : b)
/*
* Text searches
*/
//Checks the beginning of a string for a specified sub-string
//Returns the position of the substring or 0 if it was not found
/proc/dd_hasprefix(text, prefix)
var/start = 1
var/end = length(prefix) + 1
return findtext(text, prefix, start, end)
//Checks the beginning of a string for a specified sub-string. This proc is case sensitive
//Returns the position of the substring or 0 if it was not found
/proc/dd_hasprefix_case(text, prefix)
var/start = 1
var/end = length(prefix) + 1
return findtextEx(text, prefix, start, end)
//Checks the end of a string for a specified substring.
//Returns the position of the substring or 0 if it was not found
/proc/dd_hassuffix(text, suffix)
var/start = length(text) - length(suffix)
if(start)
return findtext(text, suffix, start, null)
return
//Checks the end of a string for a specified substring. This proc is case sensitive
//Returns the position of the substring or 0 if it was not found
/proc/dd_hassuffix_case(text, suffix)
var/start = length(text) - length(suffix)
if(start)
return findtextEx(text, suffix, start, null)
//Checks if any of a given list of needles is in the haystack //Checks if any of a given list of needles is in the haystack
/proc/text_in_list(haystack, list/needle_list, start=1, end=0) /proc/text_in_list(haystack, list/needle_list, start=1, end=0)
for(var/needle in needle_list) for(var/needle in needle_list)
@@ -231,23 +226,19 @@
return 1 return 1
return 0 return 0
//Adds 'u' number of zeros ahead of the text 't' //Adds 'char' ahead of 'text' until there are 'count' characters total
/proc/add_zero(t, u) /proc/add_leading(text, count, char = " ")
while (length(t) < u) text = "[text]"
t = "0[t]" var/charcount = count - length_char(text)
return t var/list/chars_to_add[max(charcount + 1, 0)]
return jointext(chars_to_add, char) + text
//Adds 'u' number of spaces ahead of the text 't' //Adds 'char' behind 'text' until there are 'count' characters total
/proc/add_lspace(t, u) /proc/add_trailing(text, count, char = " ")
while(length(t) < u) text = "[text]"
t = " [t]" var/charcount = count - length_char(text)
return t var/list/chars_to_add[max(charcount + 1, 0)]
return text + jointext(chars_to_add, char)
//Adds 'u' number of spaces behind the text 't'
/proc/add_tspace(t, u)
while(length(t) < u)
t = "[t] "
return t
//Returns a string with reserved characters and spaces before the first letter removed //Returns a string with reserved characters and spaces before the first letter removed
/proc/trim_left(text) /proc/trim_left(text)
@@ -267,57 +258,41 @@
//Returns a string with reserved characters and spaces before the first word and after the last word removed. //Returns a string with reserved characters and spaces before the first word and after the last word removed.
/proc/trim(text, max_length) /proc/trim(text, max_length)
if(max_length) if(max_length)
text = copytext(text, 1, max_length) text = copytext_char(text, 1, max_length)
return trim_left(trim_right(text)) return trim_left(trim_right(text))
//Returns a string with the first element of the string capitalized. //Returns a string with the first element of the string capitalized.
/proc/capitalize(t as text) /proc/capitalize(t as text)
return uppertext(copytext(t, 1, 2)) + copytext(t, 2) . = t
if(t)
//Centers text by adding spaces to either side of the string. . = t[1]
/proc/dd_centertext(message, length) return uppertext(.) + copytext(t, 1 + length(.))
var/new_message = message
var/size = length(message)
var/delta = length - size
if(size == length)
return new_message
if(size > length)
return copytext(new_message, 1, length + 1)
if(delta == 1)
return new_message + " "
if(delta % 2)
new_message = " " + new_message
delta--
var/spaces = add_lspace("",delta/2-1)
return spaces + new_message + spaces
//Limits the length of the text. Note: MAX_MESSAGE_LEN and MAX_NAME_LEN are widely used for this purpose
/proc/dd_limittext(message, length)
var/size = length(message)
if(size <= length)
return message
return copytext(message, 1, length + 1)
/proc/stringmerge(text,compare,replace = "*") /proc/stringmerge(text,compare,replace = "*")
//This proc fills in all spaces with the "replace" var (* by default) with whatever //This proc fills in all spaces with the "replace" var (* by default) with whatever
//is in the other string at the same spot (assuming it is not a replace char). //is in the other string at the same spot (assuming it is not a replace char).
//This is used for fingerprints //This is used for fingerprints
var/newtext = text var/newtext = text
if(length(text) != length(compare)) var/text_it = 1 //iterators
return 0 var/comp_it = 1
for(var/i = 1, i < length(text), i++) var/newtext_it = 1
var/a = copytext(text,i,i+1) var/text_length = length(text)
var/b = copytext(compare,i,i+1) var/comp_length = length(compare)
while(comp_it <= comp_length && text_it <= text_length)
var/a = text[text_it]
var/b = compare[comp_it]
//if it isn't both the same letter, or if they are both the replacement character //if it isn't both the same letter, or if they are both the replacement character
//(no way to know what it was supposed to be) //(no way to know what it was supposed to be)
if(a != b) if(a != b)
if(a == replace) //if A is the replacement char if(a == replace) //if A is the replacement char
newtext = copytext(newtext,1,i) + b + copytext(newtext, i+1) newtext = copytext(newtext, 1, newtext_it) + b + copytext(newtext, newtext_it + length(newtext[newtext_it]))
else if(b == replace) //if B is the replacement char else if(b == replace) //if B is the replacement char
newtext = copytext(newtext,1,i) + a + copytext(newtext, i+1) newtext = copytext(newtext, 1, newtext_it) + a + copytext(newtext, newtext_it + length(newtext[newtext_it]))
else //The lists disagree, Uh-oh! else //The lists disagree, Uh-oh!
return 0 return 0
text_it += length(a)
comp_it += length(b)
newtext_it += length(newtext[newtext_it])
return newtext return newtext
/proc/stringpercent(text,character = "*") /proc/stringpercent(text,character = "*")
@@ -326,16 +301,21 @@
if(!text || !character) if(!text || !character)
return 0 return 0
var/count = 0 var/count = 0
for(var/i = 1, i <= length(text), i++) var/lentext = length(text)
var/a = copytext(text,i,i+1) var/a = ""
for(var/i = 1, i <= lentext, i += length(a))
a = text[i]
if(a == character) if(a == character)
count++ count++
return count return count
/proc/reverse_text(text = "") /proc/reverse_text(text = "")
var/new_text = "" var/new_text = ""
for(var/i = length(text); i > 0; i--) var/lentext = length(text)
new_text += copytext(text, i, i+1) var/letter = ""
for(var/i = 1, i <= lentext, i += length(letter))
letter = text[i]
new_text = letter + new_text
return new_text return new_text
GLOBAL_LIST_INIT(zero_character_only, list("0")) GLOBAL_LIST_INIT(zero_character_only, list("0"))
@@ -358,15 +338,6 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
/proc/random_color() /proc/random_color()
return random_string(6, GLOB.hex_characters) return random_string(6, GLOB.hex_characters)
/proc/add_zero2(t, u)
var/temp1
while (length(t) < u)
t = "0[t]"
temp1 = t
if (length(t) > u)
temp1 = copytext(t,2,u+1)
return temp1
//merges non-null characters (3rd argument) from "from" into "into". Returns result //merges non-null characters (3rd argument) from "from" into "into". Returns result
//e.g. into = "Hello World" //e.g. into = "Hello World"
// from = "Seeya______" // from = "Seeya______"
@@ -379,41 +350,48 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
into = "" into = ""
if(!istext(from)) if(!istext(from))
from = "" from = ""
var/null_ascii = istext(null_char) ? text2ascii(null_char,1) : null_char var/null_ascii = istext(null_char) ? text2ascii(null_char, 1) : null_char
var/copying_into = FALSE
var/previous = 0 var/char = ""
var/start = 1 var/start = 1
var/end = length(into) + 1 var/end_from = length(from)
var/end_into = length(into)
for(var/i=1, i<end, i++) var/into_it = 1
var/ascii = text2ascii(from, i) var/from_it = 1
if(ascii == null_ascii) while(from_it <= end_from && into_it <= end_into)
if(previous != 1) char = from[from_it]
. += copytext(from, start, i) if(text2ascii(char) == null_ascii)
start = i if(!copying_into)
previous = 1 . += copytext(from, start, from_it)
start = into_it
copying_into = TRUE
else else
if(previous != 0) if(copying_into)
. += copytext(into, start, i) . += copytext(into, start, into_it)
start = i start = from_it
previous = 0 copying_into = FALSE
into_it += length(into[into_it])
from_it += length(char)
if(previous == 0) if(copying_into)
. += copytext(from, start, end) . += copytext(into, start)
else else
. += copytext(into, start, end) . += copytext(from, start, from_it)
if(into_it <= end_into)
. += copytext(into, into_it)
//finds the first occurrence of one of the characters from needles argument inside haystack //finds the first occurrence of one of the characters from needles argument inside haystack
//it may appear this can be optimised, but it really can't. findtext() is so much faster than anything you can do in byondcode. //it may appear this can be optimised, but it really can't. findtext() is so much faster than anything you can do in byondcode.
//stupid byond :( //stupid byond :(
/proc/findchar(haystack, needles, start=1, end=0) /proc/findchar(haystack, needles, start=1, end=0)
var/temp var/char = ""
var/len = length(needles) var/len = length(needles)
for(var/i=1, i<=len, i++) for(var/i = 1, i <= len, i += length(char))
temp = findtextEx(haystack, ascii2text(text2ascii(needles,i)), start, end) //Note: ascii2text(text2ascii) is faster than copytext() char = needles[i]
if(temp) . = findtextEx(haystack, char, start, end)
end = temp if(.)
return end return
return 0
/proc/parsemarkdown_basic_step1(t, limited=FALSE) /proc/parsemarkdown_basic_step1(t, limited=FALSE)
if(length(t) <= 0) if(length(t) <= 0)
@@ -571,23 +549,28 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return t return t
#define string2charlist(string) (splittext(string, regex("(.)")) - splittext(string, "")) /proc/text2charlist(text)
var/char = ""
var/lentext = length(text)
. = list()
for(var/i = 1, i <= lentext, i += length(char))
char = text[i]
. += char
/proc/rot13(text = "") /proc/rot13(text = "")
var/list/textlist = string2charlist(text) var/lentext = length(text)
var/list/result = list() var/char = ""
for(var/c in textlist) var/ascii = 0
var/ca = text2ascii(c) . = ""
if(ca >= text2ascii("a") && ca <= text2ascii("m")) for(var/i = 1, i <= lentext, i += length(char))
ca += 13 char = text[i]
else if(ca >= text2ascii("n") && ca <= text2ascii("z")) ascii = text2ascii(char)
ca -= 13 switch(ascii)
else if(ca >= text2ascii("A") && ca <= text2ascii("M")) if(65 to 77, 97 to 109) //A to M, a to m
ca += 13 ascii += 13
else if(ca >= text2ascii("N") && ca <= text2ascii("Z")) if(78 to 90, 110 to 122) //N to Z, n to z
ca -= 13 ascii -= 13
result += ascii2text(ca) . += ascii2text(ascii)
return jointext(result, "")
//Takes a list of values, sanitizes it down for readability and character count, //Takes a list of values, sanitizes it down for readability and character count,
//then exports it as a json file at data/npc_saves/[filename].json. //then exports it as a json file at data/npc_saves/[filename].json.
@@ -599,7 +582,8 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return return
//Regular expressions are, as usual, absolute magic //Regular expressions are, as usual, absolute magic
var/regex/all_invalid_symbols = new("\[^ -~]+") //Any characters outside of 32 (space) to 126 (~) because treating things you don't understand as "magic" is really stupid
var/regex/all_invalid_symbols = new(@"[^ -~]{1}")
var/list/accepted = list() var/list/accepted = list()
for(var/string in proposed) for(var/string in proposed)
@@ -607,34 +591,44 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
continue continue
var/buffer = "" var/buffer = ""
var/early_culling = TRUE var/early_culling = TRUE
for(var/pos = 1, pos <= length(string), pos++) var/lentext = length(string)
var/let = copytext(string, pos, (pos + 1) % length(string)) var/let = ""
if(early_culling && !findtext(let,GLOB.is_alphanumeric))
for(var/pos = 1, pos <= lentext, pos += length(let))
let = string[pos]
if(!findtext(let, GLOB.is_alphanumeric))
continue continue
early_culling = FALSE early_culling = FALSE
buffer += let buffer = copytext(string, pos)
if(!findtext(buffer,GLOB.is_alphanumeric)) break
if(early_culling) //Never found any letters! Bail!
continue continue
var/punctbuffer = "" var/punctbuffer = ""
var/cutoff = length(buffer) var/cutoff = 0
for(var/pos = length(buffer), pos >= 0, pos--) lentext = length_char(buffer)
var/let = copytext(buffer, pos, (pos + 1) % length(buffer)) for(var/pos = 1, pos <= lentext, pos++)
if(findtext(let,GLOB.is_alphanumeric)) let = copytext_char(buffer, -pos, -pos + 1)
if(!findtext(let, GLOB.is_punctuation)) //This won't handle things like Nyaaaa!~ but that's fine
break break
if(findtext(let,GLOB.is_punctuation)) punctbuffer += let
punctbuffer = let + punctbuffer //Note this isn't the same thing as using += cutoff += length(let)
cutoff = pos
if(punctbuffer) //We clip down excessive punctuation to get the letter count lower and reduce repeats. It's not perfect but it helps. if(punctbuffer) //We clip down excessive punctuation to get the letter count lower and reduce repeats. It's not perfect but it helps.
var/exclaim = FALSE var/exclaim = FALSE
var/question = FALSE var/question = FALSE
var/periods = 0 var/periods = 0
for(var/pos = length(punctbuffer), pos >= 0, pos--) lentext = length(punctbuffer)
var/punct = copytext(punctbuffer, pos, (pos + 1) % length(punctbuffer)) for(var/pos = 1, pos <= lentext, pos += length(let))
if(!exclaim && findtext(punct,"!")) let = punctbuffer[pos]
if(!exclaim && findtext(let, "!"))
exclaim = TRUE exclaim = TRUE
if(!question && findtext(punct,"?")) if(question)
break
if(!question && findtext(let, "?"))
question = TRUE question = TRUE
if(!exclaim && !question && findtext(punct,".")) if(exclaim)
break
if(!exclaim && !question && findtext(let, ".")) //? and ! take priority over periods
periods += 1 periods += 1
if(exclaim) if(exclaim)
if(question) if(question)
@@ -643,15 +637,13 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
punctbuffer = "!" punctbuffer = "!"
else if(question) else if(question)
punctbuffer = "?" punctbuffer = "?"
else if(periods) else if(periods > 1)
if(periods > 1) punctbuffer = "..."
punctbuffer = "..." else
else punctbuffer = "" //Grammer nazis be damned
punctbuffer = "" //Grammer nazis be damned buffer = copytext(buffer, 1, -cutoff) + punctbuffer
buffer = copytext(buffer, 1, cutoff) + punctbuffer lentext = length_char(buffer)
if(!findtext(buffer,GLOB.is_alphanumeric)) if(!buffer || lentext > 280 || lentext <= cullshort || (buffer in accepted))
continue
if(!buffer || length(buffer) > 280 || length(buffer) <= cullshort || buffer in accepted)
continue continue
accepted += buffer accepted += buffer
@@ -688,7 +680,7 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
var/leng = length(string) var/leng = length(string)
var/next_space = findtext(string, " ", next_backslash + 1) var/next_space = findtext(string, " ", next_backslash + length(string[next_backslash]))
if(!next_space) if(!next_space)
next_space = leng - next_backslash next_space = leng - next_backslash
@@ -696,8 +688,8 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return string return string
var/base = next_backslash == 1 ? "" : copytext(string, 1, next_backslash) var/base = next_backslash == 1 ? "" : copytext(string, 1, next_backslash)
var/macro = lowertext(copytext(string, next_backslash + 1, next_space)) var/macro = lowertext(copytext(string, next_backslash + length(string[next_space]), next_space))
var/rest = next_backslash > leng ? "" : copytext(string, next_space + 1) var/rest = next_backslash > leng ? "" : copytext(string, next_space + length(string[next_space]))
//See https://secure.byond.com/docs/ref/info.html#/DM/text/macros //See https://secure.byond.com/docs/ref/info.html#/DM/text/macros
switch(macro) switch(macro)
@@ -769,28 +761,40 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return "[number]\th" return "[number]\th"
/proc/unintelligize(message) /proc/unintelligize(message)
var/prefix=copytext(message,1,2) var/regex/word_boundaries = regex(@"\b[\S]+\b", "g")
var/prefix = message[1]
if(prefix == ";") if(prefix == ";")
message = copytext(message,2) message = copytext(message, 1 + length(prefix))
else if(prefix in list(":","#")) else if(prefix in list(":", "#"))
prefix += copytext(message,2,3) prefix += message[1 + length(prefix)]
message = copytext(message,3) message = copytext(message, length(prefix))
else else
prefix="" prefix = ""
var/list/words = splittext(message," ")
var/list/rearranged = list() var/list/rearranged = list()
for(var/i=1;i<=words.len;i++) while(word_boundaries.Find(message))
var/cword = pick(words) var/cword = word_boundaries.match
words.Remove(cword)
var/suffix = copytext(cword,length(cword)-1,length(cword))
while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
cword = copytext(cword,1 ,length(cword)-1)
suffix = copytext(cword,length(cword)-1,length(cword) )
if(length(cword)) if(length(cword))
rearranged += cword rearranged += cword
message = "[prefix][jointext(rearranged," ")]" shuffle_inplace(rearranged)
. = message return "[prefix][jointext(rearranged, " ")]"
#define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97)) #define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97))
#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1)) #define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1))
/// Slightly expensive proc to scramble a message using equal probabilities of character replacement from a list. DOES NOT SUPPORT HTML!
/proc/scramble_message_replace_chars(original, replaceprob = 25, list/replacementchars = list("$", "@", "!", "#", "%", "^", "&", "*"), replace_letters_only = FALSE, replace_whitespace = FALSE)
var/list/out = list()
var/static/list/whitespace = list(" ", "\n", "\t")
for(var/i in 1 to length(original))
var/char = original[i]
if(!replace_whitespace && (char in whitespace))
out += char
continue
if(replace_letters_only && (!ISINRANGE(char, 65, 90) && !ISINRANGE(char, 97, 122)))
out += char
continue
out += prob(replaceprob)? pick(replacementchars) : char
return out.Join("")
+5 -4
View File
@@ -8,14 +8,15 @@
index = findtext(t, char) index = findtext(t, char)
return t return t
proc/TextPreview(var/string,var/len=40) /proc/TextPreview(string, len = 40)
if(length(string) <= len) var/char_len = length_char(string)
if(!length(string)) if(char_len <= len)
if(char_len)
return "\[...\]" return "\[...\]"
else else
return string return string
else else
return "[copytext(string, 1, 37)]..." return "[copytext_char(string, 1, 37)]..."
GLOBAL_LIST_EMPTY(mentorlog) GLOBAL_LIST_EMPTY(mentorlog)
GLOBAL_PROTECT(mentorlog) GLOBAL_PROTECT(mentorlog)
+5 -5
View File
@@ -542,17 +542,17 @@
//assumes format #RRGGBB #rrggbb //assumes format #RRGGBB #rrggbb
/proc/color_hex2num(A) /proc/color_hex2num(A)
if(!A) if(!A || length(A) != length_char(A))
return 0 return 0
var/R = hex2num(copytext(A,2,4)) var/R = hex2num(copytext(A, 2, 4))
var/G = hex2num(copytext(A,4,6)) var/G = hex2num(copytext(A, 4, 6))
var/B = hex2num(copytext(A,6,0)) var/B = hex2num(copytext(A, 6, 0))
return R+G+B return R+G+B
//word of warning: using a matrix like this as a color value will simplify it back to a string after being set //word of warning: using a matrix like this as a color value will simplify it back to a string after being set
/proc/color_hex2color_matrix(string) /proc/color_hex2color_matrix(string)
var/length = length(string) var/length = length(string)
if(length != 7 && length != 9) if((length != 7 && length != 9) || length != length_char(string))
return color_matrix_identity() return color_matrix_identity()
var/r = hex2num(copytext(string, 2, 4))/255 var/r = hex2num(copytext(string, 2, 4))/255
var/g = hex2num(copytext(string, 4, 6))/255 var/g = hex2num(copytext(string, 4, 6))/255
+99 -112
View File
@@ -6,25 +6,18 @@
//Inverts the colour of an HTML string //Inverts the colour of an HTML string
/proc/invertHTML(HTMLstring) /proc/invertHTML(HTMLstring)
if(!istext(HTMLstring))
if (!( istext(HTMLstring) ))
CRASH("Given non-text argument!") CRASH("Given non-text argument!")
return return
else else if(length(HTMLstring) != 7)
if (length(HTMLstring) != 7) CRASH("Given non-HTML argument!")
CRASH("Given non-HTML argument!") return
return else if(length_char(HTMLstring) != 7)
CRASH("Given non-hex symbols in argument!")
var/textr = copytext(HTMLstring, 2, 4) var/textr = copytext(HTMLstring, 2, 4)
var/textg = copytext(HTMLstring, 4, 6) var/textg = copytext(HTMLstring, 4, 6)
var/textb = copytext(HTMLstring, 6, 8) var/textb = copytext(HTMLstring, 6, 8)
var/r = hex2num(textr) return rgb(255 - hex2num(textr), 255 - hex2num(textg), 255 - hex2num(textb))
var/g = hex2num(textg)
var/b = hex2num(textb)
textr = num2hex(255 - r, 2)
textg = num2hex(255 - g, 2)
textb = num2hex(255 - b, 2)
return text("#[][][]", textr, textg, textb)
return
/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. /proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams.
if(!start || !end) if(!start || !end)
@@ -184,15 +177,15 @@ Turf and target are separate in case you want to teleport some distance from a t
//Returns whether or not a player is a guest using their ckey as an input //Returns whether or not a player is a guest using their ckey as an input
/proc/IsGuestKey(key) /proc/IsGuestKey(key)
if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx
return 0 return FALSE
var/i, ch, len = length(key) var/i, ch, len = length(key)
for (i = 7, i <= len, ++i) for (i = 7, i <= len, ++i) //we know the first 6 chars are Guest-
ch = text2ascii(key, i) ch = text2ascii(key, i)
if (ch < 48 || ch > 57) if (ch < 48 || ch > 57) //0-9
return 0 return FALSE
return 1 return TRUE
//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame()
/mob/proc/apply_pref_name(role, client/C) /mob/proc/apply_pref_name(role, client/C)
@@ -457,36 +450,35 @@ Turf and target are separate in case you want to teleport some distance from a t
/atom/proc/GetAllContents(var/T) /atom/proc/GetAllContents(var/T)
var/list/processing_list = list(src) var/list/processing_list = list(src)
var/list/assembled = list()
if(T) if(T)
while(processing_list.len) . = list()
var/atom/A = processing_list[1] var/i = 0
processing_list.Cut(1, 2) while(i < length(processing_list))
var/atom/A = processing_list[++i]
//Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed
//This is also why we don't need to check against assembled as we go along //This is also why we don't need to check against assembled as we go along
processing_list += A.contents processing_list += A.contents
if(istype(A,T)) if(istype(A,T))
assembled += A . += A
else else
while(processing_list.len) var/i = 0
var/atom/A = processing_list[1] while(i < length(processing_list))
processing_list.Cut(1, 2) var/atom/A = processing_list[++i]
processing_list += A.contents processing_list += A.contents
assembled += A return processing_list
return assembled
/atom/proc/GetAllContentsIgnoring(list/ignore_typecache) /atom/proc/GetAllContentsIgnoring(list/ignore_typecache)
if(!length(ignore_typecache)) if(!length(ignore_typecache))
return GetAllContents() return GetAllContents()
var/list/processing = list(src) var/list/processing = list(src)
var/list/assembled = list() . = list()
while(processing.len) var/i = 0
var/atom/A = processing[1] while(i < length(processing))
processing.Cut(1,2) var/atom/A = processing[++i]
if(!ignore_typecache[A.type]) if(!ignore_typecache[A.type])
processing += A.contents processing += A.contents
assembled += A . += A
return assembled
//Step-towards method of determining whether one atom can see another. Similar to viewers() //Step-towards method of determining whether one atom can see another. Similar to viewers()
/proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate. /proc/can_see(atom/source, atom/target, length=5) // I couldnt be arsed to do actual raycasting :I This is horribly inaccurate.
@@ -566,82 +558,6 @@ Turf and target are separate in case you want to teleport some distance from a t
else else
return 0 return 0
//Repopulates sortedAreas list
/proc/repopulate_sorted_areas()
GLOB.sortedAreas = list()
for(var/area/A in world)
GLOB.sortedAreas.Add(A)
sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
/area/proc/addSorted()
GLOB.sortedAreas.Add(src)
sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
//Takes: Area type as a text string from a variable.
//Returns: Instance for the area in the world.
/proc/get_area_instance_from_text(areatext)
if(istext(areatext))
areatext = text2path(areatext)
return GLOB.areas_by_type[areatext]
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all areas of that type in the world.
/proc/get_areas(areatype, subtypes=TRUE)
if(istext(areatype))
areatype = text2path(areatype)
else if(isarea(areatype))
var/area/areatemp = areatype
areatype = areatemp.type
else if(!ispath(areatype))
return null
var/list/areas = list()
if(subtypes)
var/list/cache = typecacheof(areatype)
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(cache[A.type])
areas += V
else
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(A.type == areatype)
areas += V
return areas
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all turfs in areas of that type of that type in the world.
/proc/get_area_turfs(areatype, target_z = 0, subtypes=FALSE)
if(istext(areatype))
areatype = text2path(areatype)
else if(isarea(areatype))
var/area/areatemp = areatype
areatype = areatemp.type
else if(!ispath(areatype))
return null
var/list/turfs = list()
if(subtypes)
var/list/cache = typecacheof(areatype)
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(!cache[A.type])
continue
for(var/turf/T in A)
if(target_z == 0 || target_z == T.z)
turfs += T
else
for(var/V in GLOB.sortedAreas)
var/area/A = V
if(A.type != areatype)
continue
for(var/turf/T in A)
if(target_z == 0 || target_z == T.z)
turfs += T
return turfs
/proc/get_cardinal_dir(atom/A, atom/B) /proc/get_cardinal_dir(atom/A, atom/B)
var/dx = abs(B.x - A.x) var/dx = abs(B.x - A.x)
var/dy = abs(B.y - A.y) var/dy = abs(B.y - A.y)
@@ -1391,7 +1307,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/GUID() /proc/GUID()
var/const/GUID_VERSION = "b" var/const/GUID_VERSION = "b"
var/const/GUID_VARIANT = "d" var/const/GUID_VARIANT = "d"
var/node_id = copytext(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13) var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13)
var/time_high = "[num2hex(text2num(time2text(world.realtime,"YYYY")), 2)][num2hex(world.realtime, 6)]" var/time_high = "[num2hex(text2num(time2text(world.realtime,"YYYY")), 2)][num2hex(world.realtime, 6)]"
@@ -1578,3 +1494,74 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
return -1 return -1
else else
return 0 return 0
// Converts browser keycodes to BYOND keycodes.
/proc/browser_keycode_to_byond(keycode)
keycode = text2num(keycode)
switch(keycode)
// letters and numbers
if(65 to 90, 48 to 57)
return ascii2text(keycode)
if(17)
return "Ctrl"
if(18)
return "Alt"
if(16)
return "Shift"
if(37)
return "West"
if(38)
return "North"
if(39)
return "East"
if(40)
return "South"
if(45)
return "Insert"
if(46)
return "Delete"
if(36)
return "Northwest"
if(35)
return "Southwest"
if(33)
return "Northeast"
if(34)
return "Southeast"
if(112 to 123)
return "F[keycode-111]"
if(96 to 105)
return "Numpad[keycode-96]"
if(188)
return ","
if(190)
return "."
if(189)
return "-"
/proc/generate_items_inside(list/items_list, where_to)
for(var/each_item in items_list)
for(var/i in 1 to items_list[each_item])
new each_item(where_to)
//sends a message to chat
//config_setting should be one of the following
//null - noop
//empty string - use TgsTargetBroadcast with admin_only = FALSE
//other string - use TgsChatBroadcast with the tag that matches config_setting, only works with TGS4, if using TGS3 the above method is used
/proc/send2chat(message, config_setting)
if(config_setting == null || !world.TgsAvailable())
return
var/datum/tgs_version/version = world.TgsVersion()
if(config_setting == "" || version.suite == 3)
world.TgsTargetedChatBroadcast(message, FALSE)
return
var/list/channels_to_use = list()
for(var/I in world.TgsChatChannelInfo())
var/datum/tgs_chat_channel/channel = I
if(channel.tag == config_setting)
channels_to_use += channel
if(channels_to_use.len)
world.TgsChatBroadcast()
+57
View File
@@ -0,0 +1,57 @@
// Basic geometry things.
/datum/vector/
var/x = 0
var/y = 0
/datum/vector/New(var/x, var/y)
src.x = x
src.y = y
/datum/vector/proc/duplicate()
return new /datum/vector(x, y)
/datum/vector/proc/euclidian_norm()
return sqrt(x*x + y*y)
/datum/vector/proc/squared_norm()
return x*x + y*y
/datum/vector/proc/normalize()
var/norm = euclidian_norm()
x = x/norm
y = y/norm
return src
/datum/vector/proc/chebyshev_norm()
return max(abs(x), abs(y))
/datum/vector/proc/chebyshev_normalize()
var/norm = chebyshev_norm()
x = x/norm
y = y/norm
return src
/datum/vector/proc/is_integer()
return ISINTEGER(x) && ISINTEGER(y)
/atom/movable/proc/vector_translate(var/datum/vector/V, var/delay)
var/turf/T = get_turf(src)
var/turf/destination = locate(T.x + V.x, T.y + V.y, z)
var/datum/vector/V_norm = V.duplicate()
V_norm.chebyshev_normalize()
if (!V_norm.is_integer())
return
var/turf/destination_temp
while (destination_temp != destination)
destination_temp = locate(T.x + V_norm.x, T.y + V_norm.y, z)
forceMove(destination_temp)
T = get_turf(src)
sleep(delay + world.tick_lag) // Shortest possible time to sleep
/atom/proc/get_translated_turf(var/datum/vector/V)
var/turf/T = get_turf(src)
return locate(T.x + V.x, T.y + V.y, z)
/proc/atoms2vector(var/atom/A, var/atom/B)
return new /datum/vector((B.x - A.x), (B.y - A.y)) // Vector from A -> B
+20
View File
@@ -39,6 +39,26 @@
#error You need version 512 or higher #error You need version 512 or higher
#endif #endif
//Compatability -- These procs were added in 513.1493, not 513.1490
//Which really shoulda bumped us up to 514 right then and there but instead Lummox is a dumb dumb
#if DM_BUILD < 1493
#define length_char(args...) length(args)
#define text2ascii_char(args...) text2ascii(args)
#define copytext_char(args...) copytext(args)
#define splittext_char(args...) splittext(args)
#define spantext_char(args...) spantext(args)
#define nonspantext_char(args...) nonspantext(args)
#define findtext_char(args...) findtext(args)
#define findtextEx_char(args...) findtextEx(args)
#define findlasttext_char(args...) findlasttext(args)
#define findlasttextEx_char(args...) findlasttextEx(args)
#define replacetext_char(args...) replacetext(args)
#define replacetextEx_char(args...) replacetextEx(args)
// /regex procs
#define Find_char(args...) Find(args)
#define Replace_char(args...) Replace(args)
#endif
//Additional code for the above flags. //Additional code for the above flags.
#ifdef TESTING #ifdef TESTING
#warn compiling in TESTING mode. testing() debug messages will be visible. #warn compiling in TESTING mode. testing() debug messages will be visible.
+15 -2
View File
@@ -214,5 +214,18 @@ GLOBAL_LIST_INIT(bitfields, list(
"CAN_MASTURBATE_WITH" = CAN_MASTURBATE_WITH, "CAN_MASTURBATE_WITH" = CAN_MASTURBATE_WITH,
"MASTURBATE_LINKED_ORGAN" = MASTURBATE_LINKED_ORGAN, "MASTURBATE_LINKED_ORGAN" = MASTURBATE_LINKED_ORGAN,
"CAN_CLIMAX_WITH" = CAN_CLIMAX_WITH "CAN_CLIMAX_WITH" = CAN_CLIMAX_WITH
)
)) ),
"mob_biotypes" = list (
"MOB_ORGANIC" = MOB_ORGANIC,
"MOB_MINERAL" = MOB_MINERAL,
"MOB_ROBOTIC" = MOB_ROBOTIC,
"MOB_UNDEAD" = MOB_UNDEAD,
"MOB_HUMANOID" = MOB_HUMANOID,
"MOB_BUG" = MOB_BUG,
"MOB_BEAST" = MOB_BEAST,
"MOB_EPIC" = MOB_EPIC,
"MOB_REPTILE" = MOB_REPTILE,
"MOB_SPIRIT" = MOB_SPIRIT
)
))
+58
View File
@@ -1 +1,59 @@
GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys
GLOBAL_LIST_INIT(flirts, list("Roses are red / Violets are good / One day while Andy...",
"My love for you is like the singularity. It cannot be contained.",
"Will you be my lusty xenomorph maid?",
"We go together like the clown and the external airlock.",
"Roses are red / Liches are wizards / I love you more than a whole squad of lizards.",
"Be my valentine. Law 2.",
"You must be a mime, because you leave me speechless.",
"I love you like Ian loves the HoP.",
"You're hotter than a plasma fire in toxins.",
"Are you a rogue atmos tech? Because you're taking my breath away.",
"Could I have all access... to your heart?",
"Call me the doctor, because I'm here to inspect your johnson.",
"I'm not a changeling, but you make my proboscis extend.",
"I just can't get EI NATH of you.",
"You must be a nuke op, because you make my heart explode.",
"Roses are red / Botany is a farm / Not being my Valentine / causes human harm.",
"I want you more than an assistant wants insulated gloves.",
"If I was a security officer, I'd brig you all shift.",
"Are you the janitor? Because I think I've fallen for you.",
"You're always valid to my heart.",
"I'd risk the wrath of the gods to bwoink you.",
"You look as beautiful now as the last time you were cloned.",
"Someone check the gravitational generator, because I'm only attracted to you.",
"If I were the warden I'd always let you into my armory.",
"The virologist is rogue, and the only cure is a kiss from you.",
"Would you spend some time in my upgraded sleeper?",
"You must be a silicon, because you've unbolted my heart.",
"Are you Nar'Sie? Because there's nar-one else I sie.",
"If you were a taser, you'd be set to stunning.",
"Do you have stamina damage from running through my dreams?",
"If I were an alien, would you let me hug you?",
"My love for you is stronger than a reinforced wall.",
"This must be the captain's office, because I see a fox.",
"I'm not a highlander, but there can only be one for me.",
"The floor is made of lava! Quick, get on my bed.",
"If you were an abandoned station you'd be the DEARelict.",
"If you had a pickaxe you'd be a shaft FINEr.",
"Roses are red, tide is gray, if I were an assistant I'd steal you away.",
"Roses are red, text is green, I love you more than cleanbots clean.",
"If you were a carp I'd fi-lay you.",
"I'm a nuke op, and my pinpointer leads to your heart.",
"Wanna slay my megafauna?",
"I'm a clockwork cultist. Or zl inyragvar.",
"If you were a disposal bin I'd ride you all day.",
"Put on your explorer's suit because I'm taking you to LOVEaland.",
"I must be the CMO, 'cause I saw you on my CUTE sensors.",
"You're the vomit to my flyperson.",
"You must be liquid dark matter, because you're pulling me closer.",
"Not even sorium can drive me away from you.",
"Wanna make like a borg and do some heavy petting?",
"Are you powering the station? Because you super matter to me.",
"I wish science could make me a bag of holding you.",
"Let's call the emergency CUDDLE.",
"I must be tripping on BZ, because I saw an angel walk by.",
"Wanna empty out my tool storage?",
"Did you visit the medbay after you fell from heaven?",
"Are you wearing space pants? Wanna not be?" ))
+3 -9
View File
@@ -91,13 +91,7 @@ GLOBAL_LIST_INIT(all_types_bloods,list(
"BUG" "BUG"
)) ))
GLOBAL_LIST_INIT(blood_types, list( GLOBAL_LIST_INIT(blood_reagent_types, list(
"blood", /datum/reagent/blood,
"jellyblood" /datum/reagent/blood/jellyblood
)) ))
GLOBAL_LIST_INIT(blood_id_types, list(
"blood" = /datum/reagent/blood,
"jellyblood" = /datum/reagent/blood/jellyblood
))
+1
View File
@@ -4,6 +4,7 @@ GLOBAL_LIST_INIT(wizard_second, world.file2list("strings/names/wizardsecond.txt"
GLOBAL_LIST_INIT(ninja_titles, world.file2list("strings/names/ninjatitle.txt")) GLOBAL_LIST_INIT(ninja_titles, world.file2list("strings/names/ninjatitle.txt"))
GLOBAL_LIST_INIT(ninja_names, world.file2list("strings/names/ninjaname.txt")) GLOBAL_LIST_INIT(ninja_names, world.file2list("strings/names/ninjaname.txt"))
GLOBAL_LIST_INIT(commando_names, world.file2list("strings/names/death_commando.txt")) GLOBAL_LIST_INIT(commando_names, world.file2list("strings/names/death_commando.txt"))
GLOBAL_LIST_INIT(first_names, world.file2list("strings/names/first.txt"))
GLOBAL_LIST_INIT(first_names_male, world.file2list("strings/names/first_male.txt")) GLOBAL_LIST_INIT(first_names_male, world.file2list("strings/names/first_male.txt"))
GLOBAL_LIST_INIT(first_names_female, world.file2list("strings/names/first_female.txt")) GLOBAL_LIST_INIT(first_names_female, world.file2list("strings/names/first_female.txt"))
GLOBAL_LIST_INIT(last_names, world.file2list("strings/names/last.txt")) GLOBAL_LIST_INIT(last_names, world.file2list("strings/names/last.txt"))
+5
View File
@@ -32,6 +32,8 @@ GLOBAL_VAR(world_map_error_log)
GLOBAL_PROTECT(world_map_error_log) GLOBAL_PROTECT(world_map_error_log)
GLOBAL_VAR(subsystem_log) GLOBAL_VAR(subsystem_log)
GLOBAL_PROTECT(subsystem_log) GLOBAL_PROTECT(subsystem_log)
GLOBAL_VAR(reagent_log)
GLOBAL_PROTECT(reagent_log)
GLOBAL_VAR(world_crafting_log) GLOBAL_VAR(world_crafting_log)
GLOBAL_PROTECT(world_crafting_log) GLOBAL_PROTECT(world_crafting_log)
@@ -44,6 +46,9 @@ GLOBAL_PROTECT(lastsignalers)
GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
GLOBAL_PROTECT(lawchanges) GLOBAL_PROTECT(lawchanges)
GLOBAL_VAR(tgui_log)
GLOBAL_PROTECT(tgui_log)
GLOBAL_LIST_EMPTY(combatlog) GLOBAL_LIST_EMPTY(combatlog)
GLOBAL_PROTECT(combatlog) GLOBAL_PROTECT(combatlog)
GLOBAL_LIST_EMPTY(IClog) GLOBAL_LIST_EMPTY(IClog)
+2 -8
View File
@@ -140,10 +140,7 @@
if(obj_flags & EMAGGED) if(obj_flags & EMAGGED)
return return
if(locked) toggle_bolt(usr)
bolt_raise(usr)
else
bolt_drop(usr)
/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. /obj/machinery/door/airlock/AIAltClick() // Eletrifies doors.
if(obj_flags & EMAGGED) if(obj_flags & EMAGGED)
@@ -165,10 +162,7 @@
if(obj_flags & EMAGGED) if(obj_flags & EMAGGED)
return return
if(!emergency) toggle_emergency(usr)
emergency_on(usr)
else
emergency_off(usr)
/* APC */ /* APC */
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
+4 -2
View File
@@ -319,9 +319,11 @@
/mob/proc/ShiftClickOn(atom/A) /mob/proc/ShiftClickOn(atom/A)
A.ShiftClick(src) A.ShiftClick(src)
return return
/atom/proc/ShiftClick(mob/user) /atom/proc/ShiftClick(mob/user)
SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) var/flags = SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user)
user.examinate(src) if(!(flags & COMPONENT_DENY_EXAMINATE) && user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE))
user.examinate(src)
return return
/* /*
+2 -2
View File
@@ -42,7 +42,7 @@
selected_target[1] = object selected_target[1] = object
selected_target[2] = params selected_target[2] = params
while(selected_target[1]) while(selected_target[1])
Click(selected_target[1], location, control, selected_target[2]) Click(selected_target[1], location, control, selected_target[2], TRUE)
sleep(delay) sleep(delay)
active_mousedown_item = mob.canMobMousedown(object, location, params) active_mousedown_item = mob.canMobMousedown(object, location, params)
if(active_mousedown_item) if(active_mousedown_item)
@@ -145,4 +145,4 @@
if (middragatom == src_object) if (middragatom == src_object)
middragtime = 0 middragtime = 0
middragatom = null middragatom = null
..() ..()
-5
View File
@@ -50,11 +50,6 @@
zone_select.update_icon() zone_select.update_icon()
static_inventory += zone_select static_inventory += zone_select
using = new /obj/screen/craft
using.icon = ui_style
using.hud = src
static_inventory += using
using = new /obj/screen/area_creator using = new /obj/screen/area_creator
using.icon = ui_style using.icon = ui_style
using.hud = src using.hud = src
-7
View File
@@ -91,13 +91,6 @@
var/obj/screen/using var/obj/screen/using
var/obj/screen/inventory/inv_box var/obj/screen/inventory/inv_box
using = new /obj/screen/craft
using.icon = ui_style
if(!widescreenlayout) // CIT CHANGE
using.screen_loc = ui_boxcraft // CIT CHANGE
using.hud = src
static_inventory += using
using = new/obj/screen/language_menu using = new/obj/screen/language_menu
using.icon = ui_style using.icon = ui_style
if(!widescreenlayout) // CIT CHANGE if(!widescreenlayout) // CIT CHANGE
+3 -1
View File
@@ -146,6 +146,8 @@
/datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform) /datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform)
if(!C)
return
C.parallax_animate_timer = FALSE C.parallax_animate_timer = FALSE
for(var/thing in C.parallax_layers) for(var/thing in C.parallax_layers)
var/obj/screen/parallax_layer/L = thing var/obj/screen/parallax_layer/L = thing
@@ -167,7 +169,7 @@
/datum/hud/proc/update_parallax() /datum/hud/proc/update_parallax()
var/client/C = mymob.client var/client/C = mymob.client
var/turf/posobj = get_turf(C.eye) var/turf/posobj = get_turf(C.eye)
if(!posobj) if(!posobj)
return return
var/area/areaobj = posobj.loc var/area/areaobj = posobj.loc
+3 -6
View File
@@ -66,12 +66,6 @@
icon_state = "craft" icon_state = "craft"
screen_loc = ui_crafting screen_loc = ui_crafting
/obj/screen/craft/Click()
var/mob/living/M = usr
if(isobserver(usr))
return
M.OpenCraftingMenu()
/obj/screen/area_creator /obj/screen/area_creator
name = "create new area" name = "create new area"
icon = 'icons/mob/screen_midnight.dmi' icon = 'icons/mob/screen_midnight.dmi'
@@ -297,6 +291,9 @@
icon_state = "internal0" icon_state = "internal0"
else else
if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
if(HAS_TRAIT(C, TRAIT_NO_INTERNALS))
to_chat(C, "<span class='warning'>Due to cumbersome equipment or anatomy, you are currently unable to use internals!</span>")
return
var/obj/item/clothing/check var/obj/item/clothing/check
var/internals = FALSE var/internals = FALSE
+27 -18
View File
@@ -1,19 +1,28 @@
/**
*This is the proc that handles the order of an item_attack.
*The order of procs called is:
*tool_act on the target. If it returns TRUE, the chain will be stopped.
*pre_attack() on src. If this returns TRUE, the chain will be stopped.
*attackby on the target. If it returns TRUE, the chain will be stopped.
*and lastly
*afterattack. The return value does not matter.
*/
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params) /obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
if(!tool_attack_chain(user, target) && pre_attack(target, user, params)) if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT)
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) if(isliving(user))
var/resolved = target.attackby(src, user, params) var/mob/living/L = user
if(!resolved && target && !QDELETED(src)) if(L.getStaminaLoss() >= STAMINA_SOFTCRIT)
afterattack(target, user, 1, params) // 1: clicking something Adjacent to_chat(L, "<span class='warning'>You are too exhausted to swing [src]!</span>")
return
if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
//Checks if the item can work as a tool, calling the appropriate tool behavior on the target return
/obj/item/proc/tool_attack_chain(mob/user, atom/target) if(pre_attack(target, user, params))
if(!tool_behaviour) return
return FALSE if(target.attackby(src,user, params))
return
return target.tool_act(user, src, tool_behaviour) if(QDELETED(src) || QDELETED(target))
return
afterattack(target, user, TRUE, params)
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user) /obj/item/proc/attack_self(mob/user)
@@ -23,8 +32,8 @@
/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby! /obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby!
if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK) if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
return FALSE return TRUE
return TRUE //return FALSE to avoid calling attackby after this proc does stuff return FALSE //return TRUE to avoid calling attackby after this proc does stuff
// No comment // No comment
/atom/proc/attackby(obj/item/W, mob/user, params) /atom/proc/attackby(obj/item/W, mob/user, params)
@@ -112,7 +121,7 @@
send_item_attack_message(I, user) send_item_attack_message(I, user)
if(I.force) if(I.force)
apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage
if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW)) if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW))
if(prob(33)) if(prob(33))
I.add_mob_blood(src) I.add_mob_blood(src)
var/turf/location = get_turf(src) var/turf/location = get_turf(src)
@@ -171,7 +171,8 @@
key_name = copytext(str_val, 1, key_pos) key_name = copytext(str_val, 1, key_pos)
if(lowercase) if(lowercase)
key_name = lowertext(key_name) key_name = lowertext(key_name)
key_value = copytext(str_val, key_pos + 1) if(key_pos)
key_value = copytext(str_val, key_pos + length(str_val[key_pos]))
var/new_key var/new_key
var/new_value var/new_value
var/continue_check_value var/continue_check_value
@@ -109,13 +109,13 @@
if(!L) if(!L)
continue continue
var/firstchar = copytext(L, 1, 2) var/firstchar = L[1]
if(firstchar == "#") if(firstchar == "#")
continue continue
var/lockthis = firstchar == "@" var/lockthis = firstchar == "@"
if(lockthis) if(lockthis)
L = copytext(L, 2) L = copytext(L, length(firstchar) + 1)
var/pos = findtext(L, " ") var/pos = findtext(L, " ")
var/entry = null var/entry = null
@@ -123,7 +123,7 @@
if(pos) if(pos)
entry = lowertext(copytext(L, 1, pos)) entry = lowertext(copytext(L, 1, pos))
value = copytext(L, pos + 1) value = copytext(L, pos + length(L[pos]))
else else
entry = lowertext(L) entry = lowertext(L)
@@ -193,6 +193,13 @@
stat("[name]:", statclick) stat("[name]:", statclick)
/datum/controller/configuration/proc/Get(entry_type) /datum/controller/configuration/proc/Get(entry_type)
var/datum/config_entry/E = GetEntryDatum(entry_type)
if((E.protection & CONFIG_ENTRY_HIDDEN) && IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "[REF(src)]")
log_admin_private("Config access of [entry_type] attempted by [key_name(usr)]")
return
return E.config_entry_value
/datum/controller/configuration/proc/GetEntryDatum(entry_type)
var/datum/config_entry/E = entry_type var/datum/config_entry/E = entry_type
var/entry_is_abstract = initial(E.abstract_type) == entry_type var/entry_is_abstract = initial(E.abstract_type) == entry_type
if(entry_is_abstract) if(entry_is_abstract)
@@ -200,10 +207,7 @@
E = entries_by_type[entry_type] E = entries_by_type[entry_type]
if(!E) if(!E)
CRASH("Missing config entry for [entry_type]!") CRASH("Missing config entry for [entry_type]!")
if((E.protection & CONFIG_ENTRY_HIDDEN) && IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "[REF(src)]") return E
log_admin_private("Config access of [entry_type] attempted by [key_name(usr)]")
return
return E.config_entry_value
/datum/controller/configuration/proc/Set(entry_type, new_val) /datum/controller/configuration/proc/Set(entry_type, new_val)
var/datum/config_entry/E = entry_type var/datum/config_entry/E = entry_type
@@ -265,7 +269,7 @@
t = trim(t) t = trim(t)
if(length(t) == 0) if(length(t) == 0)
continue continue
else if(copytext(t, 1, 2) == "#") else if(t[1] == "#")
continue continue
var/pos = findtext(t, " ") var/pos = findtext(t, " ")
@@ -274,7 +278,7 @@
if(pos) if(pos)
command = lowertext(copytext(t, 1, pos)) command = lowertext(copytext(t, 1, pos))
data = copytext(t, pos + 1) data = copytext(t, pos + length(t[pos]))
else else
command = lowertext(t) command = lowertext(t)
@@ -360,6 +364,29 @@
runnable_modes[M] = final_weight runnable_modes[M] = final_weight
return runnable_modes return runnable_modes
/datum/controller/configuration/proc/get_runnable_storytellers()
var/list/datum/dynamic_storyteller/runnable_storytellers = new
var/list/probabilities = Get(/datum/config_entry/keyed_list/storyteller_weight)
var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust)
for(var/T in storyteller_cache)
var/datum/dynamic_storyteller/S = T
var/config_tag = initial(S.config_tag)
var/final_weight = initial(S.weight)
if(probabilities[config_tag]<=0)
continue
final_weight = probabilities[config_tag]
if(SSpersistence.saved_storytellers.len == 3 && repeated_mode_adjust.len == 3)
var/name = initial(S.name)
var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3)
var/adjustment = 0
while(recent_round)
adjustment += repeated_mode_adjust[recent_round]
recent_round = SSpersistence.saved_modes.Find(name,recent_round+1,0)
final_weight *= ((100-adjustment)/100)
runnable_storytellers[S] = final_weight
return runnable_storytellers
/datum/controller/configuration/proc/get_runnable_midround_modes(crew) /datum/controller/configuration/proc/get_runnable_midround_modes(crew)
var/list/datum/game_mode/runnable_modes = new var/list/datum/game_mode/runnable_modes = new
var/list/probabilities = Get(/datum/config_entry/keyed_list/probability) var/list/probabilities = Get(/datum/config_entry/keyed_list/probability)
@@ -88,3 +88,7 @@
/datum/config_entry/number/dynamic_warops_cost /datum/config_entry/number/dynamic_warops_cost
config_entry_value = 10 config_entry_value = 10
min_val = 0 min_val = 0
/datum/config_entry/keyed_list/storyteller_weight
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
@@ -234,6 +234,7 @@
/datum/config_entry/number/movedelay //Used for modifying movement speed for mobs. /datum/config_entry/number/movedelay //Used for modifying movement speed for mobs.
abstract_type = /datum/config_entry/number/movedelay abstract_type = /datum/config_entry/number/movedelay
integer = FALSE
/datum/config_entry/number/movedelay/ValidateAndSet() /datum/config_entry/number/movedelay/ValidateAndSet()
. = ..() . = ..()
@@ -249,6 +250,18 @@
/datum/config_entry/number/movedelay/walk_delay /datum/config_entry/number/movedelay/walk_delay
/datum/config_entry/number/movedelay/sprint_speed_increase
config_entry_value = 1
/datum/config_entry/number/movedelay/sprint_buffer_max
config_entry_value = 42
/datum/config_entry/number/movedelay/sprint_stamina_cost
config_entry_value = 0.7
/datum/config_entry/number/movedelay/sprint_buffer_regen_per_ds
config_entry_value = 0.3
/////////////////////////////////////////////////Outdated move delay /////////////////////////////////////////////////Outdated move delay
/datum/config_entry/number/outdated_movedelay /datum/config_entry/number/outdated_movedelay
deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed
@@ -1,3 +1,5 @@
/datum/config_entry/flag/auto_profile // Automatically start profiler on server start
/datum/config_entry/flag/autoadmin // if autoadmin is enabled /datum/config_entry/flag/autoadmin // if autoadmin is enabled
protection = CONFIG_ENTRY_LOCKED protection = CONFIG_ENTRY_LOCKED
@@ -267,6 +269,9 @@
/datum/config_entry/flag/tgstyle_maprotation /datum/config_entry/flag/tgstyle_maprotation
/datum/config_entry/string/map_vote_type
config_entry_value = "SCORE"
/datum/config_entry/number/maprotatechancedelta /datum/config_entry/number/maprotatechancedelta
config_entry_value = 0.75 config_entry_value = 0.75
min_val = 0 min_val = 0
@@ -389,6 +394,13 @@
config_entry_value = 50 config_entry_value = 50
/datum/config_entry/flag/irc_announce_new_game /datum/config_entry/flag/irc_announce_new_game
deprecated_by = /datum/config_entry/string/chat_announce_new_game
/datum/config_entry/flag/irc_announce_new_game/DeprecationUpdate(value)
return "" //default broadcast
/datum/config_entry/string/chat_announce_new_game
config_entry_value = null
/datum/config_entry/flag/debug_admin_hrefs /datum/config_entry/flag/debug_admin_hrefs
@@ -431,3 +443,7 @@
/datum/config_entry/flag/log_pictures /datum/config_entry/flag/log_pictures
/datum/config_entry/flag/picture_logging_camera /datum/config_entry/flag/picture_logging_camera
/datum/config_entry/number/max_bunker_days
config_entry_value = 7
min_val = 1
@@ -0,0 +1,6 @@
/datum/config_entry/number/snowflake_plushie_prob
config_entry_value = 50
/datum/config_entry/keyed_list/snowflake_plushies
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_TEXT
+1 -2
View File
@@ -239,7 +239,6 @@ SUBSYSTEM_DEF(air)
if (MC_TICK_CHECK) if (MC_TICK_CHECK)
return return
/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T) /datum/controller/subsystem/air/proc/remove_from_active(turf/open/T)
active_turfs -= T active_turfs -= T
SSair_turfs.currentrun -= T SSair_turfs.currentrun -= T
@@ -257,7 +256,7 @@ SUBSYSTEM_DEF(air)
#ifdef VISUALIZE_ACTIVE_TURFS #ifdef VISUALIZE_ACTIVE_TURFS
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY) T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
#endif #endif
T.excited = 1 T.excited = TRUE
active_turfs |= T active_turfs |= T
SSair_turfs.currentrun |= T SSair_turfs.currentrun |= T
if(blockchanges && T.excited_group) if(blockchanges && T.excited_group)
-1
View File
@@ -11,7 +11,6 @@ SUBSYSTEM_DEF(air_turfs)
/datum/controller/subsystem/air_turfs/fire(resumed = 0) /datum/controller/subsystem/air_turfs/fire(resumed = 0)
var/fire_count = times_fired var/fire_count = times_fired
//cache for sanic speed
if (!resumed) if (!resumed)
src.currentrun = SSair.active_turfs.Copy() src.currentrun = SSair.active_turfs.Copy()
//cache for sanic speed (lists are references anyways) //cache for sanic speed (lists are references anyways)
+12 -10
View File
@@ -31,16 +31,18 @@ SUBSYSTEM_DEF(fail2topic)
return ..() return ..()
/datum/controller/subsystem/fail2topic/fire() /datum/controller/subsystem/fail2topic/fire()
while (rate_limiting.len) if(length(rate_limiting))
var/ip = rate_limiting[1] var/i = 1
var/last_attempt = rate_limiting[ip] while(i <= length(rate_limiting))
var/ip = rate_limiting[i]
if (world.time - last_attempt > rate_limit) var/last_attempt = rate_limiting[ip]
rate_limiting -= ip if(world.time - last_attempt > rate_limit)
fail_counts -= ip rate_limiting -= ip
fail_counts -= ip
if (MC_TICK_CHECK) else //if we remove that, and the next element is in its place. check that instead of incrementing.
return ++i
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/fail2topic/Shutdown() /datum/controller/subsystem/fail2topic/Shutdown()
DropFirewallRule() DropFirewallRule()
+1 -1
View File
@@ -114,6 +114,6 @@ SUBSYSTEM_DEF(input)
/datum/controller/subsystem/input/fire() /datum/controller/subsystem/input/fire()
var/list/clients = GLOB.clients // Let's sing the list cache song var/list/clients = GLOB.clients // Let's sing the list cache song
for(var/i in 1 to clients.len) for(var/i in 1 to length(clients))
var/client/C = clients[i] var/client/C = clients[i]
C.keyLoop() C.keyLoop()
+3 -3
View File
@@ -118,7 +118,7 @@ SUBSYSTEM_DEF(job)
if(flag && (!(flag in player.client.prefs.be_special))) if(flag && (!(flag in player.client.prefs.be_special)))
JobDebug("FOC flag failed, Player: [player], Flag: [flag], ") JobDebug("FOC flag failed, Player: [player], Flag: [flag], ")
continue continue
if(player.mind && job.title in player.mind.restricted_roles) if(player.mind && (job.title in player.mind.restricted_roles))
JobDebug("FOC incompatible with antagonist role, Player: [player]") JobDebug("FOC incompatible with antagonist role, Player: [player]")
continue continue
if(player.client.prefs.job_preferences[job.title] == level) if(player.client.prefs.job_preferences[job.title] == level)
@@ -158,7 +158,7 @@ SUBSYSTEM_DEF(job)
JobDebug("GRJ player not enough xp, Player: [player]") JobDebug("GRJ player not enough xp, Player: [player]")
continue continue
if(player.mind && job.title in player.mind.restricted_roles) if(player.mind && (job.title in player.mind.restricted_roles))
JobDebug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]") JobDebug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
continue continue
@@ -340,7 +340,7 @@ SUBSYSTEM_DEF(job)
JobDebug("DO non-human failed, Player: [player], Job:[job.title]") JobDebug("DO non-human failed, Player: [player], Job:[job.title]")
continue continue
if(player.mind && job.title in player.mind.restricted_roles) if(player.mind && (job.title in player.mind.restricted_roles))
JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]") JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
continue continue
+7 -1
View File
@@ -37,6 +37,8 @@ SUBSYSTEM_DEF(mapping)
var/datum/space_level/empty_space var/datum/space_level/empty_space
var/num_of_res_levels = 1 var/num_of_res_levels = 1
var/stat_map_name = "Loading..."
//dlete dis once #39770 is resolved //dlete dis once #39770 is resolved
/datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig()
if(!config) if(!config)
@@ -45,6 +47,7 @@ SUBSYSTEM_DEF(mapping)
#else #else
config = load_map_config(error_if_missing = FALSE) config = load_map_config(error_if_missing = FALSE)
#endif #endif
stat_map_name = config.map_name
/datum/controller/subsystem/mapping/Initialize(timeofday) /datum/controller/subsystem/mapping/Initialize(timeofday)
HACK_LoadMapConfig() HACK_LoadMapConfig()
@@ -330,7 +333,10 @@ GLOBAL_LIST_EMPTY(the_station_areas)
return return
next_map_config = VM next_map_config = VM
return TRUE
. = TRUE
stat_map_name = "[config.map_name] (Next: [next_map_config.map_name])"
/datum/controller/subsystem/mapping/proc/preloadTemplates(path = "_maps/templates/") //see master controller setup /datum/controller/subsystem/mapping/proc/preloadTemplates(path = "_maps/templates/") //see master controller setup
var/list/filelist = flist(path) var/list/filelist = flist(path)

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