diff --git a/.github/AUTODOC_GUIDE.md b/.github/AUTODOC_GUIDE.md
new file mode 100644
index 00000000000..6a7d521a04d
--- /dev/null
+++ b/.github/AUTODOC_GUIDE.md
@@ -0,0 +1,108 @@
+# dmdoc
+[DOCUMENTATION]: https://codedocs.paradisestation.org/
+
+[BYOND]: https://secure.byond.com/
+
+[DMDOC]: https://github.com/AffectedArc07/ParaSpacemanDMM/tree/master/src/dmdoc
+
+[DMDOC] is a documentation generator for DreamMaker, the scripting language
+of the [BYOND] game engine. It produces simple static HTML files based on
+documented files, macros, types, procs, and vars.
+
+We use **dmdoc** to generate [DOCUMENTATION] for our code, and that documentation
+is automatically generated and built on every new commit to the master branch
+
+This gives new developers a clickable reference [DOCUMENTATION] they can browse to better help
+gain understanding of the Paradise codebase structure and api reference.
+
+## Documenting code on Paradise
+We use block comments to document procs and classes, and we use `///` line comments
+when documenting individual variables.
+
+Documentation is not required at Paradise, but it is highly recommended that all new code be covered with DMdoc code, according to the [Specifications](#Specification)
+
+We also recommend that when you touch older code, you document the functions that you
+have touched in the process of updating that code
+
+### Specification
+A class *should* always be autodocumented, and all public functions *should* be documented
+
+All class level defined variables *should* be documented
+
+Internal functions *can* be documented, but may not be
+
+A public function is any function that a developer might reasonably call while using
+or interacting with your object. Internal functions are helper functions that your
+public functions rely on to implement logic
+
+
+### Documenting a proc
+When documenting a proc, we give a short one line description (as this is shown
+next to the proc definition in the list of all procs for a type or global
+namespace), then a longer paragraph which will be shown when the user clicks on
+the proc to jump to it's definition
+```
+/**
+ * Short description of the proc
+ *
+ * Longer detailed paragraph about the proc
+ * including any relevant detail
+ * Arguments:
+ * * arg1 - Relevance of this argument
+ * * arg2 - Relevance of this argument
+ */
+```
+
+### Documenting a class
+We first give the name of the class as a header, this can be omitted if the name is
+just going to be the typepath of the class, as dmdoc uses that by default
+
+Then we give a short oneline description of the class
+
+Finally we give a longer multi paragraph description of the class and it's details
+```
+/**
+ * # Classname (Can be omitted if it's just going to be the typepath)
+ *
+ * The short overview
+ *
+ * A longer
+ * paragraph of functionality about the class
+ * including any assumptions/special cases
+ *
+ */
+```
+
+### Documenting a variable/define
+Give a short explanation of what the variable, in the context of the class, or define is.
+```
+/// Type path of item to go in suit slot
+var/suit = null
+```
+
+## Module level description of code
+Modules are the best way to describe the structure/intent of a package of code
+where you don't want to be tied to the formal layout of the class structure.
+
+On Paradise we do this by adding markdown files inside the `code` directory
+that will also be rendered and added to the modules tree. The structure for
+these is deliberately not defined, so you can be as freeform and as wheeling as
+you would like.
+
+[Here is a representative example of what you might write](https://codedocs.paradisestation.org/code/modules/keybindings/readme.html)
+
+## Special variables
+You can use certain special template variables in DM DOC comments and they will be expanded
+```
+ [DEFINE_NAME] - Expands to a link to the define definition if documented
+ [/mob] - Expands to a link to the docs for the /mob class
+ [/mob/proc/Dizzy] - Expands to a link that will take you to the /mob class and anchor you to the dizzy proc docs
+ [/mob/var/stat] - Expands to a link that will take you to the /mob class and anchor you to the stat var docs
+```
+
+You can customise the link name by using `[link name][link shorthand].`
+
+eg. `[see more about dizzy here] [/mob/proc/Dizzy]`
+
+This is very useful to quickly link to other parts of the autodoc code to expand
+upon a comment made, or reasoning about code
diff --git a/.github/workflows/generate_autodoc.yml b/.github/workflows/generate_autodoc.yml
new file mode 100644
index 00000000000..44eb69eb570
--- /dev/null
+++ b/.github/workflows/generate_autodoc.yml
@@ -0,0 +1,32 @@
+name: Generate Documentation
+
+on:
+ schedule:
+ - cron: "0 0 * * *" # Every day at the very start of the day
+
+jobs:
+ generate_docs:
+ name: 'Generate Documentation'
+ runs-on: ubuntu-18.04
+ steps:
+ - name: 'Update Branch'
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 1
+ ref: master
+
+ - name: 'Generate Documentation'
+ run: |
+ ./tools/github-actions/doc-generator
+ touch dmdoc/.nojekyll
+ # Nojekyll is important to disable jeykll syntax, which can mess with files that start with underscores
+
+ - name: 'Deploy Documentation'
+ uses: crazy-max/ghaction-github-pages@v2
+ with:
+ keep_history: false
+ build_dir: dmdoc
+ jekyll: false
+ fqdn: codedocs.paradisestation.org
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 4c916fe365c..66f2f61abee 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -4296,55 +4296,20 @@
dir = 2
},
/area/centcom/control)
-"mE" = (
-/obj/structure/flora/ausbushes/lavendergrass,
-/turf/unsimulated/floor{
- icon_state = "grass1";
- name = "grass"
- },
-/area/centcom/specops)
-"mF" = (
-/obj/structure/flora/ausbushes/stalkybush,
-/turf/unsimulated/floor{
- icon_state = "grass1";
- name = "grass"
- },
-/area/centcom/specops)
-"mG" = (
-/obj/structure/flora/ausbushes/pointybush,
-/turf/unsimulated/floor{
- icon_state = "grass1";
- name = "grass"
- },
-/area/centcom/specops)
-"mH" = (
-/obj/structure/flora/ausbushes/ywflowers,
-/turf/unsimulated/floor{
- icon_state = "grass1";
- name = "grass"
- },
-/area/centcom/specops)
"mI" = (
/obj/structure/flora/ausbushes/brflowers,
/turf/unsimulated/floor{
icon_state = "grass1";
name = "grass"
},
-/area/centcom/specops)
-"mJ" = (
-/obj/structure/flora/ausbushes/sparsegrass,
-/turf/unsimulated/floor{
- icon_state = "grass1";
- name = "grass"
- },
-/area/centcom/specops)
+/area/centcom/control)
"mK" = (
/obj/structure/flora/ausbushes/reedbush,
/turf/unsimulated/floor{
icon_state = "grass1";
name = "grass"
},
-/area/centcom/specops)
+/area/centcom/control)
"mL" = (
/turf/unsimulated/floor{
dir = 1;
@@ -36255,7 +36220,7 @@ lH
lH
mu
su
-mF
+mZ
mY
su
nD
@@ -36512,7 +36477,7 @@ mc
lH
lH
su
-mE
+nd
mX
su
nD
@@ -36769,7 +36734,7 @@ mc
lH
lH
su
-mH
+mY
na
su
nD
@@ -37026,7 +36991,7 @@ lH
lH
lH
su
-mG
+WW
mZ
su
nD
@@ -37283,7 +37248,7 @@ lH
mk
mw
su
-mJ
+na
ne
su
nD
diff --git a/code/datums/action.dm b/code/datums/action.dm
index 11ab496d386..1a146467b5a 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -450,6 +450,7 @@
/datum/action/spell_action
check_flags = 0
background_icon_state = "bg_spell"
+ var/recharge_text_color = "#FFFFFF"
/datum/action/spell_action/New(Target)
..()
@@ -487,6 +488,18 @@
return spell.can_cast(owner)
return 0
+/datum/action/spell_action/UpdateButtonIcon()
+ if(button && !(. = ..()))
+ var/obj/effect/proc_holder/spell/S = target
+ if(!istype(S))
+ return
+ var/progress = S.get_availability_percentage()
+ var/col_val_high = 72 * progress + 128
+ var/col_val_low = 200 * progress
+ button.maptext = "
-
- | Radio Subspace Transceiver |
- {{:helper.link("Enabled", null, {'radio' : 0}, data.radio ? 'selected' : null)}} |
- {{:helper.link("Disabled", null, {'radio' : 1}, data.radio ? null : 'redButton' )}} |
-
- | Wireless Interface |
- {{:helper.link("Enabled", null, {'wireless' : 0}, data.wireless ? 'selected' : null)}} |
- {{:helper.link("Disabled", null, {'wireless' : 1}, data.wireless ? null : 'redButton' )}} |
-
- {{if data.flushing}}
- | AI wipe in progress... |
- {{else}}
-
- | Wipe AI |
- {{:helper.link("Wipe", 'exclamation-circle', {'wipe' : 1}, null, 'redButton')}} |
-
- {{/if}}
-
- {{/if}}
-{{else}}
- Stored AI: