diff --git a/.editorconfig b/.editorconfig
index 2643d9b63442..6b3864a466d1 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -19,6 +19,7 @@ indent_size = 4
[*.yml]
indent_style = space
indent_size = 2
+end_of_line = crlf
[*.txt]
end_of_line = crlf
diff --git a/.gitattributes b/.gitattributes
index e9d52dc929b5..d5d501e85607 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -13,4 +13,5 @@ html/changelog.html merge=union
*.dm text eol=crlf
*.dmm text eol=crlf
*.txt text eol=crlf
-*.md text eol=crlf
\ No newline at end of file
+*.md text eol=crlf
+*.yml text eol=crlf
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index b7e92fbae535..3d638d224bdc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,62 +1,62 @@
-# ignore misc BYOND files
-*.log
-*.int
-*.rsc
-*.dmb
-*.lk
-*.backup
-*.before
-data/
-dmdoc/
-cfg/
-build_log.txt
-use_map
-stopserver
-reboot_called
-atupdate
-
-# ignore config, but not subdirs
-!config/*/
-config/*
-sql/test_db
-
-# misc OS garbage
-Thumbs.db
-Thumbs.db:encryptable
-.DS_Store
-
-# vscode
-.vscode/*
-*.code-workspace
-.history
-
-# git/kdiff4
-*.orig
-
-# swap
-[._]*.s[a-v][a-z]
-[._]*.sw[a-p]
-[._]s[a-v][a-z]
-[._]sw[a-p]
-
-# session
-Session.vim
-
-# temporary
-.netrwhist
-*~
-
-# auto-generated tag files
-tags
-
-# ignore built libs
-lib/*.dll
-lib/*.so
-/prof.dll
-
-# python
-*.pyc
-__pycache__
-
-# Running OpenDream locally
-nebula.json
+# ignore misc BYOND files
+*.log
+*.int
+*.rsc
+*.dmb
+*.lk
+*.backup
+*.before
+data/
+dmdoc/
+cfg/
+build_log.txt
+use_map
+stopserver
+reboot_called
+atupdate
+
+# ignore config, but not subdirs
+!config/*/
+config/*
+sql/test_db
+
+# misc OS garbage
+Thumbs.db
+Thumbs.db:encryptable
+.DS_Store
+
+# vscode
+.vscode/*
+*.code-workspace
+.history
+
+# git/kdiff4
+*.orig
+
+# swap
+[._]*.s[a-v][a-z]
+[._]*.sw[a-p]
+[._]s[a-v][a-z]
+[._]sw[a-p]
+
+# session
+Session.vim
+
+# temporary
+.netrwhist
+*~
+
+# auto-generated tag files
+tags
+
+# ignore built libs
+lib/*.dll
+lib/*.so
+/prof.dll
+
+# python
+*.pyc
+__pycache__
+
+# Running OpenDream locally
+nebula.json
diff --git a/README.md b/README.md
index eb52ede5614b..47e5e2c87e8e 100644
--- a/README.md
+++ b/README.md
@@ -1,99 +1,99 @@
-
-
-
-
- Pyrelight
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-| Website | Link |
-|---------------------------|---------------------------------------------------|
-| Code | [https://github.com/PyrelightSS13/Pyrelight](https://github.com/PyrelightSS13/Pyrelight) |
-| Issues | [https://github.com/PyrelightSS13/Pyrelight/issues](https://github.com/PyrelightSS13/Pyrelight/issues) |
-| Upstream Issues | [https://github.com/NebulaSS13/Nebula/issues](https://github.com/NebulaSS13/Nebula/issues) |
-| Discord | [https://discord.gg/BqXq6Mkys5](https://discord.gg/BqXq6Mkys5) |
-| Nebula Discord | [https://discord.gg/DYGXkN2S](https://discord.gg/DYGXkN2S) |
-
-This is the codebase for Pyrelight, a middle-fantasy total conversion project for Space Station 13, derived from Nebula SS13.
-
-A round of this game intends to represent a lived day (or days) in the life of someone in a remote fantasy village, whether it's a day where they struck it rich or where their house burnt down and they caught the plague.
-
-An emphasis is placed on interconnected, generalized systems that allow for unique, emergent gameplay. Boil your tea with fire magic, forage herbs to concoct medicinal tinctures, or hunt in the woods and use your prey's bones and pelt to make your own equipment; what will *you* do?
-
-
- Contributing Guidelines •
- Security •
- License •
- Getting the Code and Installing
-
-
----
-
-### NOTICE OF MODIFICATION
-
-This project was forked from [Nebula SS13](https://github.com/NebulaSS13/Nebula) on 15 Jul 2024. Nebula SS13 was forked from [Baystation 12](https://github.com/Baystation12/Baystation12) on 6 Jan 2020.
-
----
-
-### CONTRIBUTING GUIDELINES
-
-All users are expected to review [/docs/CODE_OF_CONDUCT.md](/docs/CODE_OF_CONDUCT.md) before interacting with the repository or other users.
-
----
-
-### SECURITY
-
-Please see [/docs/SECURITY.md](/docs/SECURITY.md) for this repository's security policy, and how to report security issues.
-
----
-
-### LICENSE
-
-The code for Pyrelight is licensed under the [GNU Affero General Public License v3](http://www.gnu.org/licenses/agpl.html), which can be found in full in [/LICENSE](/LICENSE).
-
-Code with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00 GMT) is licensed under the GNU General Public License version 3, which can be found in full in [/docs/GPL3.txt](/docs/GPL3.txt)
-
-All code where the authorship dates on or after `1420675200 +0000` is assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files.
-
-If you wish to develop and host this codebase in a closed source manner you may use all commits prior to `1420675200 +0000`, which are licensed under GPL v3. The major change here is that if you host a server using any code licensed under AGPLv3 you are required to provide full source code for your servers users as well including addons and modifications you have made.
-
-See [here](https://www.gnu.org/licenses/why-affero-gpl.html) for more information.
-
-All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](http://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
-
----
-
-### GETTING THE CODE AND INSTALLING
-
-Please see [/docs/installation.md](/docs/installation.md) for instructions on obtaining, installing, updating, and running this code.
+
+
+
+
+ Pyrelight
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+| Website | Link |
+|---------------------------|---------------------------------------------------|
+| Code | [https://github.com/PyrelightSS13/Pyrelight](https://github.com/PyrelightSS13/Pyrelight) |
+| Issues | [https://github.com/PyrelightSS13/Pyrelight/issues](https://github.com/PyrelightSS13/Pyrelight/issues) |
+| Upstream Issues | [https://github.com/NebulaSS13/Nebula/issues](https://github.com/NebulaSS13/Nebula/issues) |
+| Discord | [https://discord.gg/BqXq6Mkys5](https://discord.gg/BqXq6Mkys5) |
+| Nebula Discord | [https://discord.gg/DYGXkN2S](https://discord.gg/DYGXkN2S) |
+
+This is the codebase for Pyrelight, a middle-fantasy total conversion project for Space Station 13, derived from Nebula SS13.
+
+A round of this game intends to represent a lived day (or days) in the life of someone in a remote fantasy village, whether it's a day where they struck it rich or where their house burnt down and they caught the plague.
+
+An emphasis is placed on interconnected, generalized systems that allow for unique, emergent gameplay. Boil your tea with fire magic, forage herbs to concoct medicinal tinctures, or hunt in the woods and use your prey's bones and pelt to make your own equipment; what will *you* do?
+
+
+ Contributing Guidelines •
+ Security •
+ License •
+ Getting the Code and Installing
+
+
+---
+
+### NOTICE OF MODIFICATION
+
+This project was forked from [Nebula SS13](https://github.com/NebulaSS13/Nebula) on 15 Jul 2024. Nebula SS13 was forked from [Baystation 12](https://github.com/Baystation12/Baystation12) on 6 Jan 2020.
+
+---
+
+### CONTRIBUTING GUIDELINES
+
+All users are expected to review [/docs/CODE_OF_CONDUCT.md](/docs/CODE_OF_CONDUCT.md) before interacting with the repository or other users.
+
+---
+
+### SECURITY
+
+Please see [/docs/SECURITY.md](/docs/SECURITY.md) for this repository's security policy, and how to report security issues.
+
+---
+
+### LICENSE
+
+The code for Pyrelight is licensed under the [GNU Affero General Public License v3](http://www.gnu.org/licenses/agpl.html), which can be found in full in [/LICENSE](/LICENSE).
+
+Code with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00 GMT) is licensed under the GNU General Public License version 3, which can be found in full in [/docs/GPL3.txt](/docs/GPL3.txt)
+
+All code where the authorship dates on or after `1420675200 +0000` is assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files.
+
+If you wish to develop and host this codebase in a closed source manner you may use all commits prior to `1420675200 +0000`, which are licensed under GPL v3. The major change here is that if you host a server using any code licensed under AGPLv3 you are required to provide full source code for your servers users as well including addons and modifications you have made.
+
+See [here](https://www.gnu.org/licenses/why-affero-gpl.html) for more information.
+
+All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](http://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
+
+---
+
+### GETTING THE CODE AND INSTALLING
+
+Please see [/docs/installation.md](/docs/installation.md) for instructions on obtaining, installing, updating, and running this code.
diff --git a/code/__defines/machinery_public_vars.dm b/code/__defines/machinery_public_vars.dm
new file mode 100644
index 000000000000..80937653bf53
--- /dev/null
+++ b/code/__defines/machinery_public_vars.dm
@@ -0,0 +1,11 @@
+// Displayed along with the pin name to show what type of pin it is.
+#define VAR_FORMAT_ANY "\"
+#define VAR_FORMAT_STRING "\"
+#define VAR_FORMAT_CHAR "\"
+#define VAR_FORMAT_COLOR "\"
+#define VAR_FORMAT_NUMBER "\"
+#define VAR_FORMAT_DIR "\"
+#define VAR_FORMAT_BOOLEAN "\"
+#define VAR_FORMAT_REF "\["
+#define VAR_FORMAT_LIST "\]"
+#define VAR_FORMAT_INDEX "\"
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index a4e64c8e07dc..4d5a639708f0 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -53,7 +53,7 @@
#define STATUS_HUD 2 // Alive, dead, diseased, etc.
#define ID_HUD 3 // The job asigned to your ID.
#define WANTED_HUD 4 // Wanted, released, paroled, security status.
-#define IMPLOYAL_HUD 5 // Loyality implant.
+#define IMPLOYAL_HUD 5 // Loyalty implant.
#define IMPCHEM_HUD 6 // Chemical implant.
#define IMPTRACK_HUD 7 // Tracking implant.
#define SPECIALROLE_HUD 8 // AntagHUD image.
diff --git a/code/controllers/subsystems/configuration.dm b/code/controllers/subsystems/configuration.dm
index b342f71f85d3..a61105bc0644 100644
--- a/code/controllers/subsystems/configuration.dm
+++ b/code/controllers/subsystems/configuration.dm
@@ -15,7 +15,7 @@ SUBSYSTEM_DEF(configuration)
load_files()
load_sql()
- load_event()
+ load_event(load_event_from)
for(var/client/C)
C.update_post_config_load()
diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm
index 722dd50bee4c..35519221dbfe 100644
--- a/code/controllers/subsystems/jobs.dm
+++ b/code/controllers/subsystems/jobs.dm
@@ -387,7 +387,7 @@ SUBSYSTEM_DEF(jobs)
if(player.client.prefs.alternate_option == BE_ASSISTANT)
var/datum/job/ass = global.using_map.default_job_type
if((global.using_map.flags & MAP_HAS_BRANCH) && player.client.prefs.branches[initial(ass.title)])
- var/datum/mil_branch/branch = mil_branches.get_branch(player.client.prefs.branches[initial(ass.title)])
+ var/datum/mil_branch/branch = global.using_map.get_branch(player.client.prefs.branches[initial(ass.title)])
ass = branch.assistant_job
assign_role(player, initial(ass.title), mode = mode)
//For ones returning to lobby
@@ -475,9 +475,9 @@ SUBSYSTEM_DEF(jobs)
if(job)
if(H.client)
if(global.using_map.flags & MAP_HAS_BRANCH)
- H.char_branch = mil_branches.get_branch(H.client.prefs.branches[job_title])
+ H.char_branch = global.using_map.get_branch(H.client.prefs.branches[job_title])
if(global.using_map.flags & MAP_HAS_RANK)
- H.char_rank = mil_branches.get_rank(H.client.prefs.branches[job_title], H.client.prefs.ranks[job_title])
+ H.char_rank = global.using_map.get_rank(H.client.prefs.branches[job_title], H.client.prefs.ranks[job_title])
// Transfers the skill settings for the job to the mob
H.skillset.obtain_from_client(job, H.client)
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 7bdb23ec96af..f9f58592fe19 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -34,8 +34,5 @@
if("Alt Appearance Manager")
debug_variables(GET_DECL(/decl/appearance_manager))
SSstatistics.add_field_details("admin_verb", "DAltAppearanceManager")
- if("Military Branches")
- debug_variables(mil_branches)
- SSstatistics.add_field_details("admin_verb", "DMilBranches")
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
return
diff --git a/code/datums/ai/_ai.dm b/code/datums/ai/_ai.dm
index 9c943dadb4fb..628dc3639b3c 100644
--- a/code/datums/ai/_ai.dm
+++ b/code/datums/ai/_ai.dm
@@ -2,7 +2,7 @@
*
* 1. AI should not implement any bespoke mob logic within the proc it uses
* to trigger or respond to game events. It should share entrypoints with
- * action performed by players and should respect the same intents, etc.
+ * actions performed by players and should respect the same intents, etc.
* that players have to manage, through the same procs players use. This
* should mean that players can be slotted into the pilot seat of any mob,
* suspending AI behavior, and should then be able to freely use any of the
@@ -79,6 +79,9 @@
/// How long minimum between scans.
var/target_scan_delay = 1 SECOND
+ /// Last mob to attempt to handle this mob.
+ var/weakref/last_handler
+
/datum/mob_controller/New(var/mob/living/target_body)
body = target_body
if(expected_type && !istype(body, expected_type))
@@ -215,4 +218,21 @@
if(!scary_grabber)
return
if(spooked_by_grab && !is_friend(scary_grabber))
- retaliate(scary_grabber)
\ No newline at end of file
+ retaliate(scary_grabber)
+
+// General stubs for when another mob has directed this mob to attack.
+/datum/mob_controller/proc/check_handler_can_order(mob/handler, atom/target, intent_flags)
+ return is_friend(handler)
+
+/datum/mob_controller/proc/process_handler_target(mob/handler, atom/target, intent_flags)
+ if(!check_handler_can_order(handler, target, intent_flags))
+ return process_handler_failure(handler, target)
+ last_handler = weakref(handler)
+ return TRUE
+
+/datum/mob_controller/proc/process_handler_failure(mob/handler, atom/target)
+ return FALSE
+
+/datum/mob_controller/proc/process_holder_interaction(mob/handler)
+ last_handler = weakref(handler)
+ return body?.attack_hand_with_interaction_checks(handler)
diff --git a/code/datums/ai/hunter.dm b/code/datums/ai/hunter.dm
index e60294d4a87e..ef15d3226515 100644
--- a/code/datums/ai/hunter.dm
+++ b/code/datums/ai/hunter.dm
@@ -21,6 +21,8 @@
body.ClickOn(prey)
/datum/mob_controller/passive/hunter/proc/consume_prey(mob/living/prey)
+ if(prey.stat != DEAD)
+ return
body.visible_message(SPAN_DANGER("\The [body] consumes the body of \the [prey]!"))
var/remains_type = prey.get_remains_type()
if(remains_type)
@@ -32,55 +34,57 @@
prey.gib()
else
qdel(prey)
+ set_target(null)
+ resume_wandering()
/datum/mob_controller/passive/hunter/get_target(atom/new_target)
if(isnull(hunt_target))
return null
- var/mob/living/prey = hunt_target.resolve()
+ var/atom/prey = hunt_target.resolve()
if(!istype(prey) || QDELETED(prey))
set_target(null)
return null
return prey
/datum/mob_controller/passive/hunter/set_target(atom/new_target)
- if(isnull(new_target) || isliving(new_target))
- hunt_target = new_target ? weakref(new_target) : null
- return TRUE
- return FALSE
+ hunt_target = new_target ? weakref(new_target) : null
+ return TRUE
/datum/mob_controller/passive/hunter/do_process(time_elapsed)
-
if(!(. = ..()))
return
-
if(body.incapacitated() || body.current_posture?.prone || body.buckled || flee_target || !get_target())
return
+ process_hunting(get_target())
+
+/datum/mob_controller/passive/hunter/proc/process_hunting(atom/target)
- var/mob/living/target = get_target()
if(!istype(target) || QDELETED(target) || !(target in view(body)))
set_target(null)
resume_wandering()
- return
+ return FALSE
// Find or pursue the target.
if(!body.Adjacent(target))
stop_wandering()
body.start_automove(target)
- return
+ return FALSE
- // Hunt/consume the target.
- if(target.stat != DEAD)
- try_attack_prey(target)
+ if(!ismob(target))
+ return TRUE // Indicates a valid target that this base proc does not handle.
- if(QDELETED(target))
+ // Hunt/consume the target.
+ . = FALSE // we handle mobs already
+ var/mob/prey = target
+ if(prey.stat != DEAD && (!is_friend(prey) || !handle_friend_hunting(prey)))
+ try_attack_prey(prey)
+ if(QDELETED(prey))
set_target(null)
resume_wandering()
return
-
- if(target.stat != DEAD)
- return
-
// Eat the mob.
- set_target(null)
- resume_wandering()
- consume_prey(target)
+ consume_prey(prey)
+
+// Stub for hawks to return to their handler and dock with the mothership.
+/datum/mob_controller/passive/hunter/proc/handle_friend_hunting(mob/user)
+ return FALSE
diff --git a/code/datums/config/config_types/config_game_world.dm b/code/datums/config/config_types/config_game_world.dm
index 66b154dd6dc6..c3328c8c2b30 100644
--- a/code/datums/config/config_types/config_game_world.dm
+++ b/code/datums/config/config_types/config_game_world.dm
@@ -23,7 +23,8 @@
/decl/config/toggle/roundstart_level_generation,
/decl/config/toggle/lights_start_on,
/decl/config/toggle/on/cisnormativity,
- /decl/config/enum/colored_coating_names
+ /decl/config/enum/colored_coating_names,
+ /decl/config/toggle/codex_requires_implant
)
/decl/config/num/exterior_ambient_light
@@ -145,4 +146,8 @@
"none" = CONFIG_COATING_COLOR_NONE,
"mixture" = CONFIG_COATING_COLOR_MIXTURE,
"components" = CONFIG_COATING_COLOR_COMPONENTS
- )
\ No newline at end of file
+ )
+
+/decl/config/toggle/codex_requires_implant
+ uid = "codex_requires_implant"
+ desc = "If true, humans require a codex implant to access the codex."
\ No newline at end of file
diff --git a/code/datums/mil_ranks.dm b/code/datums/mil_ranks.dm
index 136559c4aa7c..29a14bc5e985 100644
--- a/code/datums/mil_ranks.dm
+++ b/code/datums/mil_ranks.dm
@@ -2,95 +2,14 @@
* Datums for military branches and ranks
*
* Map datums can optionally specify a list of /datum/mil_branch paths. These paths
- * are used to initialize the global mil_branches object, which contains a list of
- * branch objects the map uses. Each branch definition specifies a list of
+ * are used to initialize ranks for the map, which contains a list of
+ * branch objects used on the map. Each branch definition specifies a list of
* /datum/mil_rank paths, which are ranks available to that branch.
*
* Which branches and ranks can be selected for spawning is specifed in global.using_map
* and each branch datum definition, respectively.
*/
-var/global/datum/mil_branches/mil_branches = new()
-
-/**
- * Global object for handling branches
- */
-/datum/mil_branches
- /// All branches that exist
- var/list/branches = list()
- /// Branches that a player can choose for spawning, not including species restrictions.
- var/list/spawn_branches_ = list()
- /// Branches that a player can choose for spawning, with species restrictions. Populated on a needed basis
- var/list/spawn_branches_by_species_ = list()
-
-/**
- * Retrieve branch object by branch name
- */
-/datum/mil_branches/proc/get_branch(var/branch_name)
- if(ispath(branch_name, /datum/mil_branch))
- var/datum/mil_branch/branch = branch_name
- branch_name = initial(branch.name)
- if(branch_name && branch_name != "None")
- return branches[branch_name]
-
-/**
- * Retrieve branch object by branch type
- */
-/datum/mil_branches/proc/get_branch_by_type(var/branch_type)
- for(var/name in branches)
- if (istype(branches[name], branch_type))
- return branches[name]
-
-/**
- * Retrieve a rank object from given branch by name
- */
-/datum/mil_branches/proc/get_rank(var/branch_name, var/rank_name)
- if(ispath(rank_name))
- var/datum/mil_rank/rank = rank_name
- rank_name = initial(rank.name)
- if(rank_name && rank_name != "None")
- var/datum/mil_branch/branch = get_branch(branch_name)
- if(branch)
- return branch.ranks[rank_name]
-
-/**
- * Return all spawn branches for the given input
- */
-/datum/mil_branches/proc/spawn_branches(var/decl/species/S)
- if(!S)
- return spawn_branches_.Copy()
- . = LAZYACCESS(spawn_branches_by_species_, S)
- if(!.)
- . = list()
- LAZYSET(spawn_branches_by_species_, S, .)
- for(var/spawn_branch in spawn_branches_)
- if(!global.using_map.is_species_branch_restricted(S, spawn_branches_[spawn_branch]))
- . += spawn_branch
-
-/**
- * Return all spawn ranks for the given input
- */
-/datum/mil_branches/proc/spawn_ranks(var/branch_name, var/decl/species/S)
- var/datum/mil_branch/branch = get_branch(branch_name)
- return branch && branch.spawn_ranks(S)
-
-/**
- * Return a true value if branch_name is a valid spawn branch key
- */
-/datum/mil_branches/proc/is_spawn_branch(var/branch_name, var/decl/species/S)
- return (branch_name in spawn_branches(S))
-
-
-/**
- * Return a true value if rank_name is a valid spawn rank in branch under branch_name
- */
-/datum/mil_branches/proc/is_spawn_rank(var/branch_name, var/rank_name, var/decl/species/S)
- var/datum/mil_branch/branch = get_branch(branch_name)
- if(branch && (rank_name in branch.spawn_ranks(S)))
- return TRUE
- else
- return FALSE
-
/**
* A single military branch, such as Fleet or Marines
*/
@@ -142,34 +61,6 @@ var/global/datum/mil_branches/mil_branches = new()
if(!global.using_map.is_species_rank_restricted(S, src, spawn_ranks_[spawn_rank]))
. += spawn_rank
-
-// todo: should this be on /datum/map? this will need heavy reworking if we promote submaps from second to first class map status anyway
-/**
- * Populate the global branches list from global.using_map
- */
-/proc/populate_branches()
- if(!(global.using_map.flags & MAP_HAS_BRANCH) && !(global.using_map.flags & MAP_HAS_RANK))
- mil_branches.branches = null
- mil_branches.spawn_branches_ = null
- mil_branches.spawn_branches_by_species_ = null
- return 1
-
- mil_branches.branches = list()
- mil_branches.spawn_branches_ = list()
- mil_branches.spawn_branches_by_species_ = list()
- for(var/branch_path in global.using_map.branch_types)
- if(!ispath(branch_path, /datum/mil_branch))
- PRINT_STACK_TRACE("populate_branches() attempted to instantiate object with path [branch_path], which is not a subtype of /datum/mil_branch.")
- continue
-
- var/datum/mil_branch/branch = new branch_path ()
- mil_branches.branches[branch.name] = branch
-
- if(branch_path in global.using_map.spawn_branch_types)
- mil_branches.spawn_branches_[branch.name] = branch
-
- return 1
-
/**
* A military rank
*
diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm
index 27a740428272..1ffcf5a68b56 100644
--- a/code/datums/mind/mind.dm
+++ b/code/datums/mind/mind.dm
@@ -225,7 +225,7 @@
assigned_job = job
assigned_role = job.title
role_alt_title = new_role
- if(current)
+ if(current?.skillset)
current.skillset.obtain_from_client(job, current.client)
else if (href_list["amb_edit"])
diff --git a/code/datums/uplink/uplink_sources.dm b/code/datums/uplink/uplink_sources.dm
index a37027741bf1..37f30e941cc9 100644
--- a/code/datums/uplink/uplink_sources.dm
+++ b/code/datums/uplink/uplink_sources.dm
@@ -68,21 +68,16 @@ var/global/list/default_uplink_source_priority = list(
name = "Implant"
desc = "Teleports an uplink implant into your head. Costs 20% of the initial TC amount."
-/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/H, var/amount)
- if(!istype(H))
+/decl/uplink_source/implant/setup_uplink_source(var/mob/living/human/recipient, var/amount)
+ if(!istype(recipient))
return SETUP_FAILED
- var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(H, BP_HEAD)
+ var/obj/item/organ/external/head = GET_EXTERNAL_ORGAN(recipient, BP_HEAD)
if(!head)
return SETUP_FAILED
- var/obj/item/implant/uplink/U = new(H, round(amount * 0.8))
- U.imp_in = H
- U.implanted = TRUE
- U.part = head
- LAZYADD(head.implants, U)
-
- U.implanted(H) // This proc handles the installation feedback
+ var/obj/item/implant/uplink/uplink_implant = new(recipient, round(amount * 0.8))
+ uplink_implant.implant_in_mob(recipient, recipient, head)
/decl/uplink_source/unit
name = "Uplink Unit"
diff --git a/code/game/antagonist/antagonist_equip.dm b/code/game/antagonist/antagonist_equip.dm
index 022bb8c57d09..2ca60eefcfd9 100644
--- a/code/game/antagonist/antagonist_equip.dm
+++ b/code/game/antagonist/antagonist_equip.dm
@@ -21,10 +21,13 @@
var/decl/outfit/outfit = GET_DECL(default_outfit)
outfit.equip_outfit(player)
- if(default_access)
- var/obj/item/card/id/id = player.get_equipped_item(slot_wear_id_str)
- if(id)
+ var/obj/item/card/id/id = player.get_equipped_item(slot_wear_id_str)
+ if(id)
+ if(default_access)
LAZYDISTINCTADD(id.access, default_access)
+ if(id_title)
+ id.assignment = id_title
+ id.position = id_title
if(rig_type)
equip_rig(rig_type, player)
diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm
index eb27bd7793e3..ddd275fdf323 100644
--- a/code/game/jobs/job/_job.dm
+++ b/code/game/jobs/job/_job.dm
@@ -292,9 +292,9 @@
species_branch_rank_cache_[S] = list()
. = species_branch_rank_cache_[S]
- var/spawn_branches = mil_branches.spawn_branches(S)
+ var/spawn_branches = global.using_map.spawn_branches(S)
for(var/branch_type in allowed_branches)
- var/datum/mil_branch/branch = mil_branches.get_branch_by_type(branch_type)
+ var/datum/mil_branch/branch = global.using_map.get_branch_by_type(branch_type)
if(branch.name in spawn_branches)
if(!allowed_ranks || !(global.using_map.flags & MAP_HAS_RANK))
LAZYADD(., branch.name)
@@ -318,7 +318,7 @@
if(branch_name == "None")
return 0
- var/datum/mil_branch/branch = mil_branches.get_branch(branch_name)
+ var/datum/mil_branch/branch = global.using_map.get_branch(branch_name)
if(!branch)
PRINT_STACK_TRACE("unknown branch \"[branch_name]\" passed to is_branch_allowed()")
@@ -343,7 +343,7 @@
if(branch_name == "None" || rank_name == "None")
return 0
- var/datum/mil_rank/rank = mil_branches.get_rank(branch_name, rank_name)
+ var/datum/mil_rank/rank = global.using_map.get_rank(branch_name, rank_name)
if(!rank)
PRINT_STACK_TRACE("unknown rank \"[rank_name]\" in branch \"[branch_name]\" passed to is_rank_allowed()")
@@ -358,14 +358,14 @@
/datum/job/proc/get_branches()
. = list()
for(var/branch in allowed_branches)
- var/datum/mil_branch/branch_datum = mil_branches.get_branch_by_type(branch)
+ var/datum/mil_branch/branch_datum = global.using_map.get_branch_by_type(branch)
. += branch_datum.name
return english_list(.)
//Same as above but ranks
/datum/job/proc/get_ranks(branch)
. = list()
- var/datum/mil_branch/branch_datum = mil_branches.get_branch(branch)
+ var/datum/mil_branch/branch_datum = global.using_map.get_branch(branch)
for(var/datum/mil_rank/rank as anything in allowed_ranks)
if(branch_datum && !(initial(rank.name) in branch_datum.ranks))
continue
diff --git a/code/game/machinery/_machines_base/machine_construction/_construction.dm b/code/game/machinery/_machines_base/machine_construction/_construction.dm
index 8ae207901bbc..3555ee7173f1 100644
--- a/code/game/machinery/_machines_base/machine_construction/_construction.dm
+++ b/code/game/machinery/_machines_base/machine_construction/_construction.dm
@@ -76,6 +76,10 @@
return MCS_CHANGE
if(istext(fail))
to_chat(user, fail)
+ // This logging exists so that random CI fails due to state change failures will be caught.
+ #ifdef UNIT_TEST
+ log_unit_test("[log_info_line(machine)]: [fail]")
+ #endif
return MCS_BLOCK
return fail
return MCS_CONTINUE
diff --git a/code/game/machinery/_machines_base/machine_construction/airlock.dm b/code/game/machinery/_machines_base/machine_construction/airlock.dm
index 48de7420a1b7..c6a8a4fa6f15 100644
--- a/code/game/machinery/_machines_base/machine_construction/airlock.dm
+++ b/code/game/machinery/_machines_base/machine_construction/airlock.dm
@@ -8,6 +8,10 @@
// Prevent access locks on doors from interfering with our interactions.
for(var/obj/item/stock_parts/access_lock/lock in machine.get_all_components_of_type(/obj/item/stock_parts/access_lock))
lock.locked = FALSE
+ // And ensure the door's closed
+ var/obj/machinery/door/the_door = machine
+ if(istype(the_door)) // just in case
+ the_door.operating = FALSE // A lot of doors refuse to change states if operating.
// Test hacking state
if(!machine.attackby(screwdriver, user))
return "Machine [log_info_line(machine)] did not respond to attackby with screwdriver."
diff --git a/code/game/machinery/_machines_base/machinery_public_vars.dm b/code/game/machinery/_machines_base/machinery_public_vars.dm
index 594aa0238e02..81871d962fa5 100644
--- a/code/game/machinery/_machines_base/machinery_public_vars.dm
+++ b/code/game/machinery/_machines_base/machinery_public_vars.dm
@@ -5,7 +5,7 @@
/decl/public_access/public_variable
var/expected_type
var/can_write = FALSE
- var/var_type = IC_FORMAT_BOOLEAN // Reuses IC defines for better compatibility.
+ var/var_type = VAR_FORMAT_BOOLEAN // Reuses IC defines for better compatibility.
var/has_updates = FALSE // Can register listeners for updates on change.
var/list/listeners = list()
@@ -40,27 +40,27 @@ Must be implemented by subtypes.
/decl/public_access/public_variable/proc/check_input_type(new_value)
. = FALSE
switch(var_type)
- if(IC_FORMAT_ANY)
+ if(VAR_FORMAT_ANY)
return TRUE
- if(IC_FORMAT_STRING)
+ if(VAR_FORMAT_STRING)
return istext(new_value)
- if(IC_FORMAT_CHAR)
+ if(VAR_FORMAT_CHAR)
return istext(new_value) && length(new_value) == 1
- if(IC_FORMAT_COLOR)
+ if(VAR_FORMAT_COLOR)
return sanitize_hexcolor(new_value, null) == new_value
- if(IC_FORMAT_NUMBER)
+ if(VAR_FORMAT_NUMBER)
return isnum(new_value)
- if(IC_FORMAT_DIR)
+ if(VAR_FORMAT_DIR)
return new_value in global.alldirs
- if(IC_FORMAT_BOOLEAN)
+ if(VAR_FORMAT_BOOLEAN)
return new_value == !!new_value
- if(IC_FORMAT_REF)
+ if(VAR_FORMAT_REF)
return isweakref(new_value)
// Public variables of these types need to against the contents of the list and the index for validity themselves.
- if(IC_FORMAT_LIST)
+ if(VAR_FORMAT_LIST)
return islist(new_value)
- if(IC_FORMAT_INDEX)
+ if(VAR_FORMAT_INDEX)
return isnum(new_value)
/*
diff --git a/code/game/machinery/_machines_base/machinery_public_vars_common.dm b/code/game/machinery/_machines_base/machinery_public_vars_common.dm
index 30de5ce9da63..8906b31d08c5 100644
--- a/code/game/machinery/_machines_base/machinery_public_vars_common.dm
+++ b/code/game/machinery/_machines_base/machinery_public_vars_common.dm
@@ -36,7 +36,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
desc = "An automatically generated area id, if this machine is tied to an area controller."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/area_uid/access_var(obj/machinery/machine)
return machine.area_uid()
@@ -51,7 +51,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
desc = "A generic variable intended to give machines a text designator to sort them into categories by function."
can_write = TRUE
has_updates = TRUE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/identifier/access_var(obj/machinery/machine)
return machine.identifier
@@ -67,7 +67,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
desc = "Whether the machine is off (0) or on (positive). Some machines have multiple power states. Writing to this variable may turn the machine off or on."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/use_power/access_var(obj/machinery/machine)
return machine.use_power
@@ -85,7 +85,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
desc = "The machine's name."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/name/access_var(obj/machinery/machine)
return machine.name
@@ -101,7 +101,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
desc = "Obtain the list of reagents and their data in the machine."
can_write = FALSE
has_updates = TRUE
- var_type = IC_FORMAT_LIST
+ var_type = VAR_FORMAT_LIST
/decl/public_access/public_variable/reagents/access_var(obj/machinery/machine)
return machine?.reagents?.reagent_data
@@ -109,7 +109,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
/decl/public_access/public_variable/reagents/volumes
name = "reagents volumes"
desc = "Obtain the list of reagents and their volumes in the machine."
- var_type = IC_FORMAT_LIST
+ var_type = VAR_FORMAT_LIST
/decl/public_access/public_variable/reagents/volumes/access_var(obj/machinery/machine)
return machine?.reagents?.reagent_volumes
@@ -117,7 +117,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
/decl/public_access/public_variable/reagents/free_space
name = "reagents free space"
desc = "Obtain the volume of free space left for reagents in the machine."
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/reagents/free_space/access_var(obj/machinery/machine)
return REAGENTS_FREE_SPACE(machine?.reagents)
@@ -125,7 +125,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
/decl/public_access/public_variable/reagents/total_volume
name = "reagents total volume"
desc = "Obtain the total volume of reagents in the machine."
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/reagents/total_volume/access_var(obj/machinery/machine)
return machine?.reagents?.total_volume
@@ -133,7 +133,7 @@ Public vars at /obj/machinery level. Just because they are here does not mean th
/decl/public_access/public_variable/reagents/maximum_volume
name = "reagents maximum volume"
desc = "Obtain the maximum volume of reagents that can fit in the machine."
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/reagents/maximum_volume/access_var(obj/machinery/machine)
return machine?.reagents?.maximum_volume
diff --git a/code/game/machinery/_machines_base/stock_parts/cupholder.dm b/code/game/machinery/_machines_base/stock_parts/cupholder.dm
index da49b9b5e9c1..3a3b0aafeba3 100644
--- a/code/game/machinery/_machines_base/stock_parts/cupholder.dm
+++ b/code/game/machinery/_machines_base/stock_parts/cupholder.dm
@@ -7,7 +7,6 @@
part_flags = PART_FLAG_HAND_REMOVE
place_verb = "place"
eject_handler = /decl/interaction_handler/remove_held_item/cup
- var/image/cupholder_overlay
var/obj/item/cup
/obj/item/stock_parts/item_holder/cupholder/Destroy()
diff --git a/code/game/machinery/_machines_base/stock_parts/network_lock.dm b/code/game/machinery/_machines_base/stock_parts/network_lock.dm
index d5cd653186e4..b3a275a51b6c 100644
--- a/code/game/machinery/_machines_base/stock_parts/network_lock.dm
+++ b/code/game/machinery/_machines_base/stock_parts/network_lock.dm
@@ -8,8 +8,6 @@
base_type = /obj/item/stock_parts/network_receiver/network_lock
var/auto_deny_all // Set this to TRUE to deny all access attempts if network connection is lost.
- var/initial_network_id // The address to the network
- var/initial_network_key // network KEY
var/selected_parent_group // Current selected parent_group for access assignment.
var/list/groups // List of lists of groups. In order to access the device, users must have membership in at least one
@@ -21,11 +19,6 @@
var/interact_sounds = list("keyboard", "keystroke")
var/interact_sound_volume = 40
- var/static/legacy_compatibility_mode = TRUE // Makes legacy access on ids play well with mapped devices with network locks. Override if your server is fully using network-enabled ids or has no mapped access.
-
-/obj/item/stock_parts/network_receiver/network_lock/modify_mapped_vars(map_hash)
- ..()
- ADJUST_TAG_VAR(initial_network_id, map_hash)
/obj/item/stock_parts/network_receiver/network_lock/emag_act(remaining_charges, mob/user, emag_source)
. = ..()
diff --git a/code/game/machinery/_machines_base/stock_parts/network_receiver.dm b/code/game/machinery/_machines_base/stock_parts/network_receiver.dm
index 1b09080e57c1..b240744fa3d7 100644
--- a/code/game/machinery/_machines_base/stock_parts/network_receiver.dm
+++ b/code/game/machinery/_machines_base/stock_parts/network_receiver.dm
@@ -5,10 +5,17 @@
desc = "A network receiver designed for use with machinery otherwise disconnected from a network."
icon_state = "net_lock"
part_flags = PART_FLAG_QDEL
+ var/initial_network_id // The address to the network
+ var/initial_network_key // network KEY
+
+/obj/item/stock_parts/network_receiver/modify_mapped_vars(map_hash)
+ ..()
+ ADJUST_TAG_VAR(initial_network_id, map_hash)
+ ADJUST_TAG_VAR(initial_network_key, map_hash)
/obj/item/stock_parts/network_receiver/Initialize(ml, material_key)
. = ..()
- set_extension(src, /datum/extension/network_device/stock_part)
+ set_extension(src, /datum/extension/network_device/stock_part, initial_network_id, initial_network_key)
/obj/item/stock_parts/network_receiver/on_install(obj/machinery/machine)
. = ..()
diff --git a/code/game/machinery/air_sensor.dm b/code/game/machinery/air_sensor.dm
index aa53b70818e9..bfbb9236ed3e 100644
--- a/code/game/machinery/air_sensor.dm
+++ b/code/game/machinery/air_sensor.dm
@@ -36,7 +36,7 @@
desc = "A list of gas data from the sensor location; the list entries are two-entry lists with \"symbol\" and \"percent\" fields."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_LIST
+ var_type = VAR_FORMAT_LIST
/decl/public_access/public_variable/gas/access_var(obj/machinery/sensor)
var/datum/gas_mixture/air_sample = sensor.return_air()
@@ -58,7 +58,7 @@
desc = "The pressure of the gas at the sensor."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/pressure/access_var(obj/machinery/sensor)
var/datum/gas_mixture/air_sample = sensor.return_air()
@@ -70,7 +70,7 @@
desc = "The temperature of the gas at the sensor."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/temperature/access_var(obj/machinery/sensor)
var/datum/gas_mixture/air_sample = sensor.return_air()
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index ea3a147ad7ea..4e52cbc8c9c1 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -845,7 +845,6 @@ FIRE ALARM
var/time = 1 SECOND
var/timing = FALSE
var/last_process = 0
- var/static/list/overlays_cache
var/sound_id
var/datum/sound_token/sound_token
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 9e19104b483a..eda811c59e8f 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -120,7 +120,7 @@
desc = "Whether the button is currently in the on state."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_BOOLEAN
+ var_type = VAR_FORMAT_BOOLEAN
/decl/public_access/public_variable/button_state/access_var(obj/machinery/button/button)
return button.state
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index aa9eb1647d52..13b2847b3440 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -7,76 +7,86 @@
icon_screen = "explosive"
light_color = "#a91515"
initial_access = list(access_armory)
- var/screen = 0 // 0 - No Access Denied, 1 - Access allowed
+ var/locked = FALSE
/obj/machinery/computer/prisoner/interface_interact(user)
interact(user)
return TRUE
/obj/machinery/computer/prisoner/interact(var/mob/user)
- var/dat
+ var/dat = list()
dat += "Prisoner Implant Manager System
"
- if(screen == 0)
+ if(locked)
dat += "
Unlock Console"
- else if(screen == 1)
+ else
dat += "
Chemical Implants
"
- var/turf/Tr = null
- for(var/obj/item/implant/chem/C in global.chem_implants)
- Tr = get_turf(C)
- if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range
- if(!C.implanted) continue
- dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: "
- dat += "((1))"
- dat += "((5))"
- dat += "((10))
"
+ for(var/obj/item/implant/chem/chem_implant in global.chem_implants)
+ var/turf/implant_turf = get_turf(chem_implant)
+ if(implant_turf && !LEVELS_ARE_Z_CONNECTED(implant_turf.z, src.z))
+ continue // Out of range
+ if(!chem_implant.implanted)
+ continue
+ dat += "[chem_implant.imp_in.name] | Remaining Units: [chem_implant.reagents.total_volume] | Inject: "
+ dat += "((1))"
+ dat += "((5))"
+ dat += "((10))
"
dat += "********************************
"
dat += "
Tracking Implants
"
- for(var/obj/item/implant/tracking/T in global.tracking_implants)
- Tr = get_turf(T)
- if((Tr) && !LEVELS_ARE_Z_CONNECTED(Tr.z, src.z)) continue // Out of range
- if(!T.implanted) continue
- var/loc_display = "Space"
- var/mob/living/M = T.imp_in
- if(!isspaceturf(M.loc))
- var/turf/mob_loc = get_turf(M)
- loc_display = mob_loc.loc
- if(T.malfunction)
+ for(var/obj/item/implant/tracking/tracking_implant in global.tracking_implants)
+ var/turf/implant_turf = get_turf(tracking_implant)
+ if(implant_turf && !LEVELS_ARE_Z_CONNECTED(implant_turf.z, src.z))
+ continue // Out of range
+ if(!tracking_implant.implanted)
+ continue
+ var/area/tracked_area = get_area(tracking_implant)
+ var/loc_display = tracked_area.proper_name
+ if(tracking_implant.malfunction)
loc_display = pick(teleportlocs)
- dat += "ID: [T.id] | Location: [loc_display]
"
- dat += "(Message Holder) |
"
+ dat += "ID: [tracking_implant.id] | Location: [loc_display]
"
+ dat += "(Message Holder) |
"
dat += "********************************
"
dat += "
Lock Console"
- show_browser(user, dat, "window=computer;size=400x500")
+ show_browser(user, JOINTEXT(dat), "window=computer;size=400x500")
onclose(user, "computer")
/obj/machinery/computer/prisoner/OnTopic(mob/user, href_list)
if((. = ..()))
return
- . = TOPIC_REFRESH
- if(href_list["inject1"])
- var/obj/item/implant/I = locate(href_list["inject1"])
- if(I) I.activate(1)
-
- else if(href_list["inject5"])
- var/obj/item/implant/I = locate(href_list["inject5"])
- if(I) I.activate(5)
-
- else if(href_list["inject10"])
- var/obj/item/implant/I = locate(href_list["inject10"])
- if(I) I.activate(10)
+ if(href_list["inject"])
+ var/obj/item/implant/chem/chem_implant = locate(href_list["inject"])
+ if(!chem_implant)
+ return TOPIC_REFRESH // evidently their copy of the UI is out of date
+ if(!istype(chem_implant)) // exists but is not a chem implant
+ // warn that this is likely an href hacking attempt
+ PRINT_STACK_TRACE("Possible HREF hacking attempt, chem implant inject called on non-chem-implant!")
+ message_admins("Possible HREF hacking attempt, chem implant inject called on [href_list["inject"]] by [user] (ckey [(user.ckey)])!")
+ return TOPIC_HANDLED
+ var/amount_to_inject = clamp(text2num(href_list["amount"]), 1, 10) // don't let href hacking give more than 10 units at once
+ chem_implant.activate(amount_to_inject)
+ return TOPIC_HANDLED
else if(href_list["lock"])
if(allowed(user))
- screen = !screen
+ locked = !locked
+ return TOPIC_REFRESH
else
to_chat(user, "Unauthorized Access.")
+ return TOPIC_HANDLED
else if(href_list["warn"])
var/warning = sanitize(input(user,"Message:","Enter your message here!",""))
- if(!warning) return TOPIC_HANDLED
- var/obj/item/implant/I = locate(href_list["warn"])
- if(I?.imp_in)
- var/mob/living/victim = I.imp_in
- to_chat(victim, "You hear a voice in your head saying: '[warning]'")
+ if(!warning)
+ return TOPIC_HANDLED
+ var/obj/item/implant/tracking/tracker = locate(href_list["warn"])
+ if(!tracker)
+ return TOPIC_REFRESH // evidently their copy of the UI is out of date
+ if(!istype(tracker)) // exists but is not a tracking implant
+ // warn that this is likely an href hacking attempt
+ PRINT_STACK_TRACE("Possible HREF hacking attempt, tracking implant warn called on non-tracking-implant!")
+ message_admins("Possible HREF hacking attempt, tracking implant warn called on [href_list["warn"]] by [user] (ckey [(user.ckey)])!")
+ return TOPIC_HANDLED
+ to_chat(tracker.imp_in, SPAN_NOTICE("You hear a voice in your head saying: '[warning]'"))
+ return TOPIC_HANDLED
+ return TOPIC_NOACTION
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index c1f9b50ebf6d..3ac2040598f2 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -74,7 +74,7 @@
desc = "Whether the door is closed (\"closed\") or not (\"open\")."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/airlock_door_state/access_var(obj/machinery/door/airlock/door)
return door.density ? "closed" : "open"
@@ -85,7 +85,7 @@
desc = "Whether the door is bolted (\"locked\") or not (\"unlocked\")."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/airlock_bolt_state/access_var(obj/machinery/door/airlock/door)
return door.locked ? "locked" : "unlocked"
@@ -190,7 +190,7 @@
desc = "The pressure of the location where the sensor is placed."
can_write = FALSE
has_updates = TRUE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/airlock_pressure/access_var(obj/machinery/airlock_sensor/sensor)
return sensor.pressure
@@ -209,7 +209,7 @@
/decl/public_access/public_variable/set_airlock_cycling/airlock_sensor
expected_type = /obj/machinery/airlock_sensor
can_write = TRUE
- var_type = IC_FORMAT_BOOLEAN
+ var_type = VAR_FORMAT_BOOLEAN
/decl/public_access/public_variable/set_airlock_cycling/airlock_sensor/access_var(obj/machinery/airlock_sensor/owner)
return owner.master_cycling
@@ -359,7 +359,7 @@
/decl/public_access/public_variable/set_airlock_cycling/access_button
expected_type = /obj/machinery/button/access
can_write = TRUE
- var_type = IC_FORMAT_BOOLEAN
+ var_type = VAR_FORMAT_BOOLEAN
/decl/public_access/public_variable/set_airlock_cycling/access_button/access_var(obj/machinery/button/access/owner)
return owner.master_cycling
@@ -376,7 +376,7 @@
desc = "The command this access button sends when pressed."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/button_command/access_var(obj/machinery/button/access/button)
return button.command
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index 5b622e965a41..6e25b53fb5c3 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -61,8 +61,6 @@
var/tmp/screen_state = "screen_standby"
///Bitflag to indicate which indicator lights are on so dummy controllers can match the same state
var/tmp/indicator_state = 0
- ///If set, this controller will route its commands to the master controller with the same id_tag.
- var/obj/machinery/embedded_controller/radio/master
///Radio connection to use for emiting commands
var/datum/radio_frequency/radio_connection
diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm
index 51f5f1d33cec..7482f522af6c 100644
--- a/code/game/machinery/oxygen_pump.dm
+++ b/code/game/machinery/oxygen_pump.dm
@@ -17,7 +17,7 @@
var/mask_type = /obj/item/clothing/mask/breath/emergency
var/icon_state_open = "emerg_open"
var/icon_state_closed = "emerg"
- var/icon_state_active // TODO implement
+ var/icon_state_active
power_channel = ENVIRON
idle_power_usage = 10
@@ -136,16 +136,24 @@
return
return 1
+/obj/machinery/oxygen_pump/on_update_icon()
+ if(stat & MAINT)
+ icon_state = icon_state_open
+ else if(icon_state_active && use_power == POWER_USE_ACTIVE) // the base type doesn't have an active state
+ icon_state = icon_state_active
+ else
+ icon_state = icon_state_closed
+
/obj/machinery/oxygen_pump/attackby(obj/item/used_item, mob/user)
if(IS_SCREWDRIVER(used_item))
stat ^= MAINT
user.visible_message(SPAN_NOTICE("\The [user] [stat & MAINT ? "opens" : "closes"] \the [src]."), SPAN_NOTICE("You [stat & MAINT ? "open" : "close"] \the [src]."))
- if(stat & MAINT)
- icon_state = icon_state_open
- if(!stat)
- icon_state = icon_state_closed
+ queue_icon_update()
return TRUE
- if(istype(used_item, /obj/item/tank) && (stat & MAINT))
+ if(istype(used_item, /obj/item/tank))
+ if(!(stat & MAINT))
+ to_chat(user, SPAN_WARNING("Please open the maintenance hatch first."))
+ return TRUE
if(tank)
to_chat(user, SPAN_WARNING("\The [src] already has a tank installed!"))
return TRUE
@@ -155,9 +163,6 @@
user.visible_message(SPAN_NOTICE("\The [user] installs \the [tank] into \the [src]."), SPAN_NOTICE("You install \the [tank] into \the [src]."))
src.add_fingerprint(user)
return TRUE
- if(istype(used_item, /obj/item/tank) && !stat)
- to_chat(user, SPAN_WARNING("Please open the maintenance hatch first."))
- return TRUE
return FALSE // TODO: should this be a parent call? do we want this to be (de)constructable?
/obj/machinery/oxygen_pump/get_examine_strings(mob/user, distance, infix, suffix)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 6053e343fad9..b2ee51ae93a7 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -86,12 +86,13 @@
for(var/obj/item/radio/beacon/radio in global.radio_beacons)
if(!radio.functioning)
continue
- var/turf/T = get_turf(radio)
- if (!T)
+ var/turf/radio_turf = get_turf(radio)
+ if (!radio_turf)
continue
- if(!isPlayerLevel(T.z))
+ if(!isPlayerLevel(radio_turf.z))
continue
- var/tmpname = T.loc.name
+ var/area/radio_area = get_area(radio)
+ var/tmpname = radio_area.proper_name
if(areaindex[tmpname])
tmpname = "[tmpname] ([++areaindex[tmpname]])"
else
@@ -101,22 +102,21 @@
for (var/obj/item/implant/tracking/used_item in global.tracking_implants)
if (!used_item.implanted || !ismob(used_item.loc))
continue
+ var/mob/victim = used_item.loc
+ // Can only track dead people up to 10 minutes after death
+ if (victim.stat == DEAD && world.time > victim.timeofdeath + 10 MINUTES)
+ continue
+ var/turf/victim_turf = get_turf(victim)
+ if(!victim_turf)
+ continue
+ if(!isPlayerLevel(victim_turf.z))
+ continue
+ var/tmpname = victim.real_name
+ if(areaindex[tmpname])
+ tmpname = "[tmpname] ([++areaindex[tmpname]])"
else
- var/mob/M = used_item.loc
- if (M.stat == DEAD)
- if (M.timeofdeath + 6000 < world.time)
- continue
- var/turf/T = get_turf(M)
- if(!T)
- continue
- if(!isPlayerLevel(T.z))
- continue
- var/tmpname = M.real_name
- if(areaindex[tmpname])
- tmpname = "[tmpname] ([++areaindex[tmpname]])"
- else
- areaindex[tmpname] = 1
- L[tmpname] = used_item
+ areaindex[tmpname] = 1
+ L[tmpname] = used_item
var/desc = input("Please select a location to lock in.", "Locking Computer") in L|null
if(!desc)
@@ -127,7 +127,7 @@
audible_message(SPAN_NOTICE("Locked in."))
return
-/obj/machinery/computer/teleporter/verb/set_id(t as text)
+/obj/machinery/computer/teleporter/verb/set_id(new_tag as text)
set category = "Object"
set name = "Set teleporter ID"
set src in oview(1)
@@ -135,8 +135,8 @@
if(stat & (NOPOWER|BROKEN) || !isliving(usr))
return
- if (t)
- src.id = t
+ if (new_tag)
+ src.id = new_tag
return
/obj/machinery/computer/teleporter/proc/target_lost()
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index 4955f4173658..c91249ac56d6 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -20,7 +20,6 @@
var/lethal = 0
var/locked = 1
var/area/control_area //can be area name, path or nothing.
- var/mob/living/silicon/ai/master_ai
var/check_arrest = 1 //checks if the perp is set to arrest
var/check_records = 1 //checks if a security record exists at all
diff --git a/code/game/machinery/turrets/_turrets.dm b/code/game/machinery/turrets/_turrets.dm
index d0e2354b8d57..8fe7e01dc0d6 100644
--- a/code/game/machinery/turrets/_turrets.dm
+++ b/code/game/machinery/turrets/_turrets.dm
@@ -23,10 +23,6 @@
var/image/transverse_left // Images for displaying the range of the turret's transverse
var/image/transverse_right
- // Sounds
- var/turn_on_sound = null // Played when turret goes from off to on.
- var/turn_off_sound = null // The above, in reverse.
-
// Shooting
var/obj/item/gun/installed_gun = /obj/item/gun/energy/laser/practice // Instance of the gun inside the turret.
var/gun_looting_prob = 25 // If the turret dies and then is disassembled, this is the odds of getting the gun.
diff --git a/code/game/movietitles.dm b/code/game/movietitles.dm
index e193fae03d2a..7afbacf338d8 100644
--- a/code/game/movietitles.dm
+++ b/code/game/movietitles.dm
@@ -68,7 +68,7 @@ var/global/list/end_titles
var/used_name = H.real_name
var/datum/computer_file/report/crew_record/record = get_crewmember_record(H.real_name)
if(record && record.get_rank())
- var/datum/mil_rank/rank = mil_branches.get_rank(record.get_branch(), record.get_rank())
+ var/datum/mil_rank/rank = global.using_map.get_rank(record.get_branch(), record.get_rank())
if(rank.name_short)
used_name = "[rank.name_short] [used_name]"
var/showckey = 0
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 3b5ef1fd60b7..52c615b4daeb 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -385,31 +385,30 @@ steam.start() -- spawns the effect
/datum/effect/effect/system/trail/start()
- if(!src.on)
- src.on = 1
- src.processing = 1
- if(src.processing)
- src.processing = 0
- spawn(0)
- var/turf/T = get_turf(src.holder)
- if(T != src.oldposition)
- if(is_type_in_list(T, specific_turfs) && (!max_number || number < max_number))
- var/obj/effect/effect/trail = new trail_type(oldposition)
- src.oldposition = T
- effect(trail)
- number++
- spawn( duration_of_effect )
- number--
- qdel(trail)
- spawn(2)
- if(src.on)
- src.processing = 1
- src.start()
- else
- spawn(2)
- if(src.on)
- src.processing = 1
- src.start()
+ set waitfor = FALSE
+ if(!on)
+ on = TRUE
+ processing = TRUE
+ if(processing)
+ processing = FALSE
+ var/turf/our_turf = get_turf(holder)
+ if(our_turf != oldposition)
+ if(is_type_in_list(our_turf, specific_turfs) && (!max_number || number < max_number))
+ var/obj/effect/effect/trail = new trail_type(oldposition)
+ oldposition = our_turf
+ effect(trail)
+ number++
+ addtimer(CALLBACK(src, PROC_REF(end_trail_effect), trail), duration_of_effect)
+ addtimer(CALLBACK(src, PROC_REF(try_start)), 0.2 SECONDS)
+
+/datum/effect/effect/system/trail/proc/try_start()
+ if(on)
+ processing = TRUE
+ start()
+
+/datum/effect/effect/system/trail/proc/end_trail_effect(obj/effect/effect/trail)
+ number--
+ qdel(trail)
/datum/effect/effect/system/trail/proc/stop()
src.processing = 0
diff --git a/code/game/objects/effects/fadein.dm b/code/game/objects/effects/fadein.dm
new file mode 100644
index 000000000000..3055f1bf3259
--- /dev/null
+++ b/code/game/objects/effects/fadein.dm
@@ -0,0 +1,17 @@
+/obj/effect/dummy/fadein/Initialize(mapload, fade_dir = SOUTH, atom/donor)
+ . = ..()
+ set_dir(fade_dir)
+ appearance = donor // grab appearance before ghostizing in case they fall over etc
+ var/initial_alpha = alpha
+ alpha = 0
+ switch(dir)
+ if(NORTH)
+ pixel_z = -32
+ if(SOUTH)
+ pixel_z = 32
+ if(EAST)
+ pixel_w = -32
+ if(WEST)
+ pixel_w = 32
+ animate(src, pixel_z = 0, pixel_w = 0, alpha = initial_alpha, time = 1 SECOND)
+ QDEL_IN(src, 1 SECOND)
diff --git a/code/game/objects/effects/fadeout.dm b/code/game/objects/effects/fadeout.dm
new file mode 100644
index 000000000000..36ddf98facfe
--- /dev/null
+++ b/code/game/objects/effects/fadeout.dm
@@ -0,0 +1,16 @@
+/obj/effect/dummy/fadeout/Initialize(mapload, fade_dir = SOUTH, atom/donor)
+ . = ..()
+ set_dir(fade_dir)
+ appearance = donor // grab appearance before ghostizing in case they fall over etc
+ switch(dir)
+ if(NORTH)
+ animate(src, pixel_z = 32, alpha = 0, time = 1 SECOND)
+ if(SOUTH)
+ animate(src, pixel_z = -32, alpha = 0, time = 1 SECOND)
+ if(EAST)
+ animate(src, pixel_w = 32, alpha = 0, time = 1 SECOND)
+ if(WEST)
+ animate(src, pixel_w = -32, alpha = 0, time = 1 SECOND)
+ else
+ animate(src, alpha = 0, time = 1 SECOND)
+ QDEL_IN(src, 1 SECOND)
diff --git a/code/game/objects/effects/manifest.dm b/code/game/objects/effects/manifest.dm
deleted file mode 100644
index 6b84dae52a08..000000000000
--- a/code/game/objects/effects/manifest.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/obj/effect/manifest
- name = "manifest"
- icon = 'icons/effects/markers.dmi'
- icon_state = "x"
-
-/obj/effect/manifest/Initialize()
- . = ..()
- set_invisibility(INVISIBILITY_ABSTRACT)
-
-/obj/effect/manifest/proc/manifest()
- var/dat = "Crew Manifest:
"
- for(var/mob/living/human/M in SSmobs.mob_list)
- dat += text(" [] - []
", M.name, M.get_assignment())
- var/obj/item/paper/P = new /obj/item/paper( src.loc )
- P.info = dat
- P.SetName("paper- 'Crew Manifest'")
- //SN src = null
- qdel(src)
- return
\ No newline at end of file
diff --git a/code/game/objects/effects/wet_floor.dm b/code/game/objects/effects/wet_floor.dm
index 664d777a3887..cef4e3b2c8f9 100644
--- a/code/game/objects/effects/wet_floor.dm
+++ b/code/game/objects/effects/wet_floor.dm
@@ -5,7 +5,6 @@
mouse_opacity = MOUSE_OPACITY_UNCLICKABLE
simulated = FALSE
var/wetness = 0
- var/image/wet_overlay = null
var/wet_timer_id
/atom/movable/wet_floor/Initialize()
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index f09470bc64ec..fc743829ceef 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -103,7 +103,6 @@
anchored = TRUE
is_spawnable_type = FALSE
movement_handlers = list(/datum/movement_handler/delay/chameleon_projector)
- var/can_move = TRUE
var/obj/item/chameleon/master = null
/obj/effect/dummy/chameleon/Initialize(mapload, var/obj/item/chameleon/projector)
diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm
index 33f49ba11395..a6c34a1707b9 100644
--- a/code/game/objects/items/devices/paint_sprayer.dm
+++ b/code/game/objects/items/devices/paint_sprayer.dm
@@ -114,6 +114,11 @@
else
change_color(new_color, user)
+ else if(istype(A, /obj/item/card/data)) // TODO: un-hardcode this please. better yet redo how this entire proc is done
+ var/obj/item/card/data/data_card = A
+ data_card.detail_color = spray_color
+ . = TRUE
+
else if (istype(A, /turf/wall))
. = paint_wall(A, user)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 7277834d2d25..fd4ef2152a3c 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -56,7 +56,6 @@
var/broadcasting = FALSE
var/listening = TRUE
var/list/channels
- var/default_color = "#6d3f40"
var/decrypt_all_messages = FALSE
var/can_use_analog = TRUE
var/datum/extension/network_device/radio/radio_device_type = /datum/extension/network_device/radio
@@ -96,6 +95,11 @@
if(analog && frequency)
analog_radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT)
+/obj/item/radio/modify_mapped_vars(map_hash)
+ ..()
+ ADJUST_TAG_VAR(initial_network_id, map_hash)
+ ADJUST_TAG_VAR(initial_network_key, map_hash)
+
/obj/item/radio/Initialize()
. = ..()
wires = new(src)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 2dadd2bbf4d5..bbb9ad4d1e26 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -1,16 +1,11 @@
/* Cards
* Contains:
- * DATA CARD
- * ID CARD
- * FINGERPRINT CARD HOLDER
- * FINGERPRINT CARD
+ * UNION CARD
+ * DATA CARDS
+ * EMAG & BROKEN EMAG
+ * ID CARDS
*/
-
-
-/*
- * DATA CARDS - Used for the IC data card reader
- */
/obj/item/card
name = "card"
desc = "Does card things."
@@ -21,6 +16,10 @@
drop_sound = 'sound/foley/paperpickup1.ogg'
pickup_sound = 'sound/foley/paperpickup2.ogg'
+/*
+ * UNION CARD
+ */
+
/obj/item/card/union
name = "union card"
desc = "A card showing membership in the local worker's union."
@@ -47,6 +46,10 @@
return TRUE
return ..()
+/*
+ * DATA CARDS - Used for the IC data card reader and, for some reason, faxes and teleporters.
+ */
+// Please modpack this once those last two are made to use data disks instead.
/obj/item/card/data
name = "data card"
desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has a stripe running down the middle."
@@ -63,13 +66,6 @@
. = ..()
add_overlay(overlay_image(icon, "[icon_state]-color", detail_color))
-/obj/item/card/data/attackby(obj/item/used_item, mob/user)
- if(istype(used_item, /obj/item/integrated_electronics/detailer))
- var/obj/item/integrated_electronics/detailer/D = used_item
- detail_color = D.detail_color
- update_icon()
- return ..()
-
/obj/item/card/data/full_color
desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has the entire card colored."
icon_state = "data_2"
@@ -82,7 +78,7 @@
return detail_color
/*
- * ID CARDS
+ * EMAG & BROKEN EMAG
*/
/obj/item/card/emag_broken
@@ -149,6 +145,10 @@ var/global/const/NO_EMAG_ACT = -50
if(user.skill_check(SKILL_DEVICES,SKILL_ADEPT))
. += SPAN_WARNING("This ID card has some form of non-standard modifications.")
+/*
+ * ID CARDS
+ */
+
/obj/item/card/id
name = "identification card"
desc = "A card used to provide ID and determine access."
@@ -338,7 +338,7 @@ var/global/const/NO_EMAG_ACT = -50
return
if(ispath(var_value, /datum/mil_branch) || istext(var_value))
- var/datum/mil_branch/new_branch = mil_branches.get_branch(var_value)
+ var/datum/mil_branch/new_branch = global.using_map.get_branch(var_value)
if(new_branch)
if(new_branch != id.military_branch)
id.military_branch = new_branch
@@ -369,7 +369,7 @@ var/global/const/NO_EMAG_ACT = -50
var_value = rank.name
if(istext(var_value))
- var/new_rank = mil_branches.get_rank(id.military_branch.name, var_value)
+ var/new_rank = global.using_map.get_rank(id.military_branch.name, var_value)
if(new_rank)
id.military_rank = new_rank
return
diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm
index 37020adb925d..d57a0910a492 100644
--- a/code/game/objects/items/weapons/cards_ids_syndicate.dm
+++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm
@@ -214,15 +214,15 @@
to_chat(user, "All information has been deleted from \the [src].")
. = 1
if("Branch")
- var/new_branch = sanitize(input(user,"What branch of service would you like to put on this card?","Agent Card Branch") as null|anything in mil_branches.spawn_branches())
+ var/new_branch = sanitize(input(user,"What branch of service would you like to put on this card?","Agent Card Branch") as null|anything in global.using_map.spawn_branches())
if(!isnull(new_branch) && CanUseTopic(user, state))
- src.military_branch = mil_branches.spawn_branches()[new_branch]
+ src.military_branch = global.using_map.spawn_branches()[new_branch]
to_chat(user, "Branch changed to '[military_branch.name]'.")
. = 1
if("Rank")
- var/new_rank = sanitize(input(user,"What rank would you like to put on this card?","Agent Card Rank") as null|anything in mil_branches.spawn_ranks(military_branch.name))
+ var/new_rank = sanitize(input(user,"What rank would you like to put on this card?","Agent Card Rank") as null|anything in global.using_map.spawn_ranks(military_branch.name))
if(!isnull(new_rank) && CanUseTopic(user, state))
- src.military_rank = mil_branches.spawn_ranks(military_branch.name)[new_rank]
+ src.military_rank = global.using_map.spawn_ranks(military_branch.name)[new_rank]
to_chat(user, "Rank changed to '[military_rank.name]'.")
. = 1
diff --git a/code/game/objects/items/weapons/locator.dm b/code/game/objects/items/weapons/locator.dm
index 01fe0fcc8c02..fc5bcf8b0fc8 100644
--- a/code/game/objects/items/weapons/locator.dm
+++ b/code/game/objects/items/weapons/locator.dm
@@ -34,79 +34,68 @@ Frequency:
onclose(user, "radio")
return
-/obj/item/locator/Topic(href, href_list)
- ..()
- if (usr.stat || usr.restrained())
+/obj/item/locator/OnTopic(mob/user, href_list, datum/topic_state/state)
+ var/turf/current_location = get_turf(user) //What turf is the user on?
+ if(!current_location || isAdminLevel(current_location.z)) //If turf was not found or they're on an admin Z-level
+ to_chat(user, "\The [src] is malfunctioning.")
return
- var/turf/current_location = get_turf(usr)//What turf is the user on?
- if(!current_location||current_location.z==2)//If turf was not found or they're on z level 2.
- to_chat(usr, "\The [src] is malfunctioning.")
+ if(!CanPhysicallyInteract(user))
return
- if ((usr.contents.Find(src) || (in_range(src, usr) && isturf(src.loc))))
- usr.set_machine(src)
- if (href_list["refresh"])
- src.temp = "Persistent Signal Locator
"
- var/turf/sr = get_turf(src)
-
- if (sr)
- src.temp += "Located Beacons:
"
-
- for(var/obj/item/radio/beacon/radio in global.radio_beacons)
- if(!radio.functioning)
- continue
- if (radio.frequency == src.frequency)
- var/turf/tr = get_turf(radio)
- if (tr.z == sr.z && tr)
- var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y))
- if (direct < 5)
- direct = "very strong"
- else
- if (direct < 10)
- direct = "strong"
- else
- if (direct < 20)
- direct = "weak"
- else
- direct = "very weak"
- src.temp += "[radio.code]-[dir2text(get_dir(sr, tr))]-[direct]
"
-
- src.temp += "Extranneous Signals:
"
- for (var/obj/item/implant/tracking/implant in global.tracking_implants)
- if (!implant.implanted || !(istype(implant.loc,/obj/item/organ/external) || ismob(implant.loc)))
- continue
- else
- var/mob/M = implant.loc
- if (M.stat == DEAD)
- if (M.timeofdeath + 6000 < world.time)
- continue
+ user.set_machine(src)
+ if (href_list["refresh"])
+ src.temp = "Persistent Signal Locator
"
+ var/turf/source_turf = get_turf(src)
+ if (!source_turf)
+ src.temp += "Processing Error: Unable to locate orbital position.
"
+ return TOPIC_REFRESH
+ src.temp += "Located Beacons:
"
+ for(var/obj/item/radio/beacon/radio in global.radio_beacons)
+ if(!radio.functioning)
+ continue
+ if (radio.frequency != frequency)
+ continue
+ var/turf/radio_turf = get_turf(radio)
+ if (radio_turf.z != source_turf.z || !radio_turf)
+ continue
+ var/distance
+ switch(get_dist(radio_turf, source_turf))
+ if(0 to 5)
+ distance = "very strong"
+ if(6 to 10)
+ distance = "strong"
+ if(11 to 20)
+ distance = "weak"
+ else
+ continue
+ if(distance)
+ src.temp += "[radio.code]-[dir2text(get_dir(source_turf, radio_turf))]-[distance]
"
- var/turf/tr = get_turf(implant)
- if (tr.z == sr.z && tr)
- var/direct = max(abs(tr.x - sr.x), abs(tr.y - sr.y))
- if (direct < 20)
- if (direct < 5)
- direct = "very strong"
- else
- if (direct < 10)
- direct = "strong"
- else
- direct = "weak"
- src.temp += "[implant.id]-[dir2text(get_dir(sr, tr))]-[direct]
"
+ src.temp += "Extraneous Signals:
"
+ for (var/obj/item/implant/tracking/implant in global.tracking_implants)
+ if (!implant.implanted || !(istype(implant.loc,/obj/item/organ/external) || ismob(implant.loc)))
+ continue
+ var/mob/victim = implant.loc
+ // Don't show dead people that have been dead for a while
+ if (victim.stat == DEAD && world.time > victim.timeofdeath + 10 MINUTES)
+ continue
+ var/turf/implant_turf = get_turf(implant)
+ if (implant_turf?.z != source_turf.z)
+ continue
+ var/distance
+ switch(get_dist(implant_turf, source_turf))
+ if(0 to 5)
+ distance = "very strong"
+ if(6 to 10)
+ distance = "strong"
+ if(11 to 20)
+ distance = "weak"
+ if(distance)
+ src.temp += "[implant.id]-[dir2text(get_dir(source_turf, implant_turf))]-[distance]
"
- src.temp += "You are at \[[sr.x],[sr.y],[sr.z]\] in orbital coordinates.
Refresh
"
- else
- src.temp += "Processing Error: Unable to locate orbital position.
"
- else
- if (href_list["freq"])
- src.frequency += text2num(href_list["freq"])
- src.frequency = sanitize_frequency(src.frequency)
- else
- if (href_list["temp"])
- src.temp = null
- if (ismob(src.loc))
- attack_self(src.loc)
- else
- for(var/mob/M in viewers(1, src))
- if (M.client)
- src.attack_self(M)
- return
+ src.temp += "You are at \[[source_turf.x],[source_turf.y],[source_turf.z]\] in orbital coordinates.
Refresh
"
+ else if (href_list["freq"])
+ src.frequency += text2num(href_list["freq"])
+ src.frequency = sanitize_frequency(src.frequency)
+ else if (href_list["temp"])
+ src.temp = null
+ return TOPIC_REFRESH
diff --git a/code/game/objects/items/welding/weldingtool_tank.dm b/code/game/objects/items/welding/weldingtool_tank.dm
index 7cb3e5bd84a0..b28b73115dff 100644
--- a/code/game/objects/items/welding/weldingtool_tank.dm
+++ b/code/game/objects/items/welding/weldingtool_tank.dm
@@ -11,7 +11,7 @@
atom_flags = ATOM_FLAG_OPEN_CONTAINER
obj_flags = OBJ_FLAG_HOLLOW
volume = 20
- show_reagent_name = TRUE
+ presentation_flags = PRESENTATION_FLAG_NAME
current_health = 40
max_health = 40
material = /decl/material/solid/metal/steel
@@ -123,7 +123,7 @@
size_in_use = ITEM_SIZE_LARGE
unlit_force = 9
lit_force = 15
- show_reagent_name = FALSE
+ presentation_flags = 0
_base_attack_force = 8
var/tmp/last_gen = 0
diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm
index 01f0b1fb231c..27d600db80a6 100644
--- a/code/game/objects/random/subtypes/misc.dm
+++ b/code/game/objects/random/subtypes/misc.dm
@@ -117,7 +117,6 @@
desc = "This is some random junk."
icon = 'icons/obj/items/storage/trashbag.dmi'
icon_state = "trashbag3"
- var/spawn_choice
/obj/random/junk/spawn_choices()
var/static/list/spawnable_choices
diff --git a/code/game/objects/random/subtypes/multi.dm b/code/game/objects/random/subtypes/multi.dm
index a0268faecaeb..ca95e015af2c 100644
--- a/code/game/objects/random/subtypes/multi.dm
+++ b/code/game/objects/random/subtypes/multi.dm
@@ -19,8 +19,3 @@
name = "Multi Point - Captain's Spare"
id = "Captain's spare id"
item_path = /obj/item/card/id/captains_spare
-
-/obj/random_multi/single_item/hand_tele
- name = "Multi Point - Hand Teleporter"
- id = "Hand teleporter"
- item_path = /obj/prefab/hand_teleporter
diff --git a/code/game/objects/random/subtypes/tech.dm b/code/game/objects/random/subtypes/tech.dm
index 23c298283fae..a1b1ab86e65d 100644
--- a/code/game/objects/random/subtypes/tech.dm
+++ b/code/game/objects/random/subtypes/tech.dm
@@ -94,21 +94,6 @@
)
return spawnable_choices
-/obj/random/assembly
- name = "random assembly"
- desc = "This is a random circuit assembly."
- icon = 'icons/obj/items/gift_wrapped.dmi'
- icon_state = "gift_1"
-
-/obj/random/assembly/spawn_choices()
- var/static/list/spawnable_choices = list(
- /obj/item/electronic_assembly,
- /obj/item/electronic_assembly/medium,
- /obj/item/electronic_assembly/large,
- /obj/item/electronic_assembly/drone
- )
- return spawnable_choices
-
/obj/random/advdevice
name = "random advanced device"
desc = "This is a random advanced device."
diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm
index 6f4821ea174c..1b3832173b7e 100644
--- a/code/game/objects/structures/fires.dm
+++ b/code/game/objects/structures/fires.dm
@@ -57,7 +57,6 @@
var/light_color_low = "#ff0000"
var/list/affected_exterior_turfs
- var/next_fuel_consumption = 0
var/last_fuel_burn_temperature = T20C
// TODO: Replace this and the fuel var with just tracking currently-burning matter?
// Or use atom fires when those are implemented?
diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm
index ab9fbf3e716e..fb9dda2bf289 100644
--- a/code/game/objects/structures/tables.dm
+++ b/code/game/objects/structures/tables.dm
@@ -26,7 +26,6 @@
var/can_flip = TRUE
var/is_flipped = FALSE
var/decl/material/additional_reinf_material
- var/base_type = /obj/structure/table
var/top_surface_noun = "tabletop"
diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm
index 23da2d37f267..4852f28a58e6 100644
--- a/code/modules/admin/create_object.dm
+++ b/code/modules/admin/create_object.dm
@@ -13,7 +13,7 @@ var/global/create_object_html = null
/datum/admins/proc/quick_create_object(var/mob/user)
var/quick_create_object_html = null
- var/path = input("Select the path of the object you wish to create.", "Path", /obj) as null|anything in list(/obj,/obj/structure,/obj/item,/obj/item,/obj/item/clothing,/obj/machinery,/obj/prefab)
+ var/path = input("Select the path of the object you wish to create.", "Path", /obj) as null|anything in list(/obj,/obj/structure,/obj/item,/obj/item,/obj/item/clothing,/obj/machinery)
if(!path)
return
diff --git a/code/modules/atmospherics/atmos_primitives.dm b/code/modules/atmospherics/atmos_primitives.dm
index 720b2ac3ff76..4d78c3a4553a 100644
--- a/code/modules/atmospherics/atmos_primitives.dm
+++ b/code/modules/atmospherics/atmos_primitives.dm
@@ -517,7 +517,7 @@
desc = "The most recent data on the amount of power the machine used."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/power_draw/access_var(obj/machinery/atmospherics/machine)
return machine.last_power_draw
@@ -528,7 +528,7 @@
desc = "The most recent data on the volume of air the machine moved."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/flow_rate/access_var(obj/machinery/atmospherics/machine)
return machine.last_flow_rate
\ No newline at end of file
diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm
index c55ea099f96c..caacc188ddab 100644
--- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm
+++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm
@@ -196,7 +196,7 @@
desc = "Whether or not the valve is open, allowing gas to pass in one direction."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_BOOLEAN
+ var_type = VAR_FORMAT_BOOLEAN
/decl/public_access/public_variable/passive_gate_unlocked/access_var(obj/machinery/atmospherics/binary/passive_gate/machine)
return machine.unlocked
@@ -213,7 +213,7 @@
desc = "A cap on the volume flow rate of the gate."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/passive_gate_flow_rate/access_var(obj/machinery/atmospherics/binary/passive_gate/machine)
return machine.set_flow_rate
@@ -230,7 +230,7 @@
desc = "A number describing the form of regulation the gate is attempting. The possible values are 0 (no air passed), 1 (regulates input pressure), or 2 (regulates output pressure)."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/passive_gate_mode/access_var(obj/machinery/atmospherics/binary/passive_gate/machine)
return machine.regulate_mode
@@ -247,7 +247,7 @@
desc = "The input or output pressure the gate aims to stay below."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/passive_gate_target_pressure/access_var(obj/machinery/atmospherics/binary/passive_gate/machine)
return machine.target_pressure
diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm
index b1ec04c332d7..eeb70c699672 100644
--- a/code/modules/atmospherics/components/binary_devices/pump.dm
+++ b/code/modules/atmospherics/components/binary_devices/pump.dm
@@ -173,7 +173,7 @@ Thus, the two variables affect pump operation are set in New():
desc = "The output pressure of the pump."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/pump_target_output/access_var(obj/machinery/atmospherics/binary/pump/machine)
return machine.target_pressure
diff --git a/code/modules/atmospherics/components/unary/outlet_injector.dm b/code/modules/atmospherics/components/unary/outlet_injector.dm
index 20a9ee0a3b24..1ed273483573 100644
--- a/code/modules/atmospherics/components/unary/outlet_injector.dm
+++ b/code/modules/atmospherics/components/unary/outlet_injector.dm
@@ -141,7 +141,7 @@
desc = "The rate at which the machine pumps (a number)."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_NUMBER
+ var_type = VAR_FORMAT_NUMBER
/decl/public_access/public_variable/volume_rate/access_var(obj/machinery/atmospherics/unary/outlet_injector/machine)
return machine.volume_rate
diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm
index 20f4d41f2594..c463a0687ce1 100644
--- a/code/modules/atmospherics/components/unary/vent_pump.dm
+++ b/code/modules/atmospherics/components/unary/vent_pump.dm
@@ -368,7 +368,7 @@
desc = "The pump mode of the vent. Expected values are \"siphon\" or \"release\"."
can_write = TRUE
has_updates = TRUE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/pump_dir/access_var(obj/machinery/atmospherics/unary/vent_pump/machine)
return machine.pump_direction ? "release" : "siphon"
@@ -386,7 +386,7 @@
desc = "Numerical codes for whether the pump checks internal or internal pressure (or both) prior to operating. Can also be supplied the string keyword \"default\"."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_ANY
+ var_type = VAR_FORMAT_ANY
/decl/public_access/public_variable/pump_checks/access_var(obj/machinery/atmospherics/unary/vent_pump/machine)
return machine.pressure_checks
@@ -405,7 +405,7 @@
desc = "The bound on internal pressure used in checks (a number). When writing, can be supplied the string keyword \"default\" instead."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_ANY
+ var_type = VAR_FORMAT_ANY
/decl/public_access/public_variable/pressure_bound/access_var(obj/machinery/atmospherics/unary/vent_pump/machine)
return machine.internal_pressure_bound
diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm
index 4ff8c0e85b87..9ab3bc3e4976 100644
--- a/code/modules/atmospherics/components/unary/vent_scrubber.dm
+++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm
@@ -266,7 +266,7 @@
desc = "The scrubbing mode code, which identifies what the scrubber is doing."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_STRING
+ var_type = VAR_FORMAT_STRING
/decl/public_access/public_variable/scrubbing/access_var(obj/machinery/atmospherics/unary/vent_scrubber/machine)
return machine.scrubbing
@@ -286,7 +286,7 @@
desc = "Whether or not the scrubber is in panic mode."
can_write = TRUE
has_updates = FALSE
- var_type = IC_FORMAT_BOOLEAN
+ var_type = VAR_FORMAT_BOOLEAN
/decl/public_access/public_variable/panic/access_var(obj/machinery/atmospherics/unary/vent_scrubber/machine)
return machine.panic
@@ -308,7 +308,7 @@
desc = "A list of gases that this scrubber is scrubbing."
can_write = FALSE
has_updates = FALSE
- var_type = IC_FORMAT_LIST
+ var_type = VAR_FORMAT_LIST
/decl/public_access/public_variable/scrubbing_gas/access_var(obj/machinery/atmospherics/unary/vent_scrubber/machine)
return machine.scrubbing_gas.Copy()
diff --git a/code/modules/backgrounds/citizenship/_citizenship.dm b/code/modules/backgrounds/citizenship/_citizenship.dm
index e16cc9455ac7..d6c349aa1edd 100644
--- a/code/modules/backgrounds/citizenship/_citizenship.dm
+++ b/code/modules/backgrounds/citizenship/_citizenship.dm
@@ -1,7 +1,6 @@
/decl/background_detail/citizenship
abstract_type = /decl/background_detail/citizenship
category = /decl/background_category/citizenship
- var/ruling_body = "Other Faction"
var/capital
var/size_heading = "Systems"
var/size_value
diff --git a/code/modules/bodytype/_bodytype.dm b/code/modules/bodytype/_bodytype.dm
index a60007dda2e4..e706f5b387ae 100644
--- a/code/modules/bodytype/_bodytype.dm
+++ b/code/modules/bodytype/_bodytype.dm
@@ -53,8 +53,6 @@ var/global/list/bodytypes_by_category = list()
var/nail_noun
/// What tech levels should limbs of this type use/need?
var/limb_tech = @'{"biotech":2}'
- /// Determines if eyes should render on heads using this bodytype.
- var/has_eyes = TRUE
/// Prefixed to the initial name of the limb, if non-null.
var/modifier_string
/// Modifies min and max broken damage for the limb.
@@ -231,7 +229,7 @@ var/global/list/bodytypes_by_category = list()
var/eye_contaminant_guard = 0
/// Are the eyes of this bodytype resistant to flashes?
var/eye_innate_flash_protection = FLASH_PROTECTION_NONE
- /// Icon to draw eye overlays from.
+ /// Icon to draw eye overlays from. If null, eyes will not be drawn.
var/eye_icon = 'icons/mob/human_races/species/default_eyes.dmi'
/// Do the eyes of this mob apply a pref colour like hair?
var/apply_eye_colour = TRUE
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index b3487b5e361b..15d3d676b993 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -34,7 +34,6 @@
//IRC admin that spoke with them last.
var/irc_admin
- var/mute_irc = 0
// Prevents people from being spammed about multikeying every time their mob changes.
var/warned_about_multikeying = 0
diff --git a/code/modules/client/preference_setup/loadout/lists/augmentations.dm b/code/modules/client/preference_setup/loadout/lists/augmentations.dm
index fe6385963080..e2f387cd6ec2 100644
--- a/code/modules/client/preference_setup/loadout/lists/augmentations.dm
+++ b/code/modules/client/preference_setup/loadout/lists/augmentations.dm
@@ -8,11 +8,11 @@
custom_setup_proc = /obj/item/proc/AttemptAugmentation
custom_setup_proc_arguments = list(BP_CHEST)
-/obj/item/proc/AttemptAugmentation(mob/user, target_zone)
+/obj/item/proc/AttemptAugmentation(mob/living/user, target_zone)
to_chat(user, SPAN_DANGER("Was unable to augment you with \the [src]."))
qdel(src)
-/obj/item/implant/AttemptAugmentation(mob/user, target_zone)
+/obj/item/implant/AttemptAugmentation(mob/living/user, target_zone)
if(can_implant(user, user, target_zone) && implant_in_mob(user, user, target_zone))
var/obj/item/organ/organ = GET_EXTERNAL_ORGAN(user, target_zone)
to_chat(user, SPAN_NOTICE("You have \a [src] implanted in your [organ.name]."))
@@ -33,3 +33,17 @@
user.add_organ(src, organ_to_implant_into)
to_chat(user, SPAN_NOTICE("Your [organ_to_implant_into.name] has been replaced with \the [src]."))
+
+// Codex implant, only available if the codex is set to require it in config
+/decl/loadout_option/augmentation/codex_implant
+ name = "Codex Implant"
+ uid = "gear_augmentation_codex"
+ description = "A neural implant that provides access to the codex."
+ path = /obj/item/implant/codex
+ custom_setup_proc_arguments = list(BP_HEAD)
+ cost = 0
+
+/decl/loadout_option/augmentation/codex_implant/can_be_taken_by(mob/living/user)
+ if(!get_config_value(/decl/config/toggle/codex_requires_implant))
+ return FALSE
+ return ..()
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm
index 17f52a97ce8a..f893c8b49080 100644
--- a/code/modules/client/preference_setup/loadout/loadout.dm
+++ b/code/modules/client/preference_setup/loadout/loadout.dm
@@ -243,7 +243,7 @@
var/good_branch = 0
entry += "
"
for(var/branch in branches)
- var/datum/mil_branch/player_branch = mil_branches.get_branch(branch)
+ var/datum/mil_branch/player_branch = global.using_map.get_branch(branch)
if(player_branch.type in gear.allowed_branches)
branch_checks += "[player_branch.name]"
good_branch = 1
diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm
index 3d1b29c1a54f..feb41bc98058 100644
--- a/code/modules/client/preference_setup/occupation/occupation.dm
+++ b/code/modules/client/preference_setup/occupation/occupation.dm
@@ -119,9 +119,9 @@
var/datum/mil_branch/player_branch
var/branch_string = ""
var/rank_branch_string = ""
- var/branch_rank = job.allowed_branches ? job.get_branch_rank(S) : mil_branches.spawn_branches(S)
+ var/branch_rank = job.allowed_branches ? job.get_branch_rank(S) : global.using_map.spawn_branches(S)
if(global.using_map && (global.using_map.flags & MAP_HAS_BRANCH) && LAZYLEN(branch_rank))
- player_branch = mil_branches.get_branch(pref.branches[job.title])
+ player_branch = global.using_map.get_branch(pref.branches[job.title])
if(player_branch)
if(LAZYLEN(branch_rank) > 1)
branch_string += "[player_branch.name_short || player_branch.name] | "
@@ -130,9 +130,9 @@
if(!branch_string)
branch_string = "- | "
if(player_branch)
- var/ranks = branch_rank[player_branch.name] || mil_branches.spawn_ranks(player_branch.name, S)
+ var/ranks = branch_rank[player_branch.name] || global.using_map.spawn_ranks(player_branch.name, S)
if(LAZYLEN(ranks))
- player_rank = mil_branches.get_rank(player_branch.name, pref.ranks[job.title])
+ player_rank = global.using_map.get_rank(player_branch.name, pref.ranks[job.title])
if(player_rank)
if(LAZYLEN(ranks) > 1)
rank_branch_string += "[player_rank.name_short || player_rank.name] | "
@@ -185,7 +185,7 @@
skill_link = "View Skills"
skill_link = "[skill_link] | "
- if(!user.skillset.skills_transferable)
+ if(!user.skillset?.skills_transferable)
skill_link = ""
// Begin assembling the actual HTML.
@@ -275,16 +275,16 @@
var/datum/job/job = SSjobs.get_by_title(job_name)
- var/datum/mil_branch/player_branch = pref.branches[job.title] ? mil_branches.get_branch(pref.branches[job.title]) : null
- var/branch_rank = job.allowed_branches ? job.get_branch_rank(S) : mil_branches.spawn_branches(S)
+ var/datum/mil_branch/player_branch = pref.branches[job.title] ? global.using_map.get_branch(pref.branches[job.title]) : null
+ var/branch_rank = job.allowed_branches ? job.get_branch_rank(S) : global.using_map.spawn_branches(S)
if(!player_branch || !(player_branch.name in branch_rank))
- player_branch = LAZYLEN(branch_rank) ? mil_branches.get_branch(branch_rank[1]) : null
+ player_branch = LAZYLEN(branch_rank) ? global.using_map.get_branch(branch_rank[1]) : null
if(player_branch)
- var/datum/mil_rank/player_rank = pref.ranks[job.title] ? mil_branches.get_rank(player_branch.name, pref.ranks[job.title]) : null
- var/ranks = branch_rank[player_branch.name] || mil_branches.spawn_ranks(player_branch.name, S)
+ var/datum/mil_rank/player_rank = pref.ranks[job.title] ? global.using_map.get_rank(player_branch.name, pref.ranks[job.title]) : null
+ var/ranks = branch_rank[player_branch.name] || global.using_map.spawn_ranks(player_branch.name, S)
if(!player_rank || !(player_rank.name in ranks))
- player_rank = LAZYLEN(ranks) ? mil_branches.get_rank(player_branch.name, ranks[1]) : null
+ player_rank = LAZYLEN(ranks) ? global.using_map.get_rank(player_branch.name, ranks[1]) : null
// Now make the assignments
pref.branches[job.title] = player_branch.name
@@ -340,9 +340,9 @@
var/datum/job/job = locate(href_list["checking_job"])
if(istype(job))
var/decl/species/S = pref.get_species_decl()
- var/list/options = job.allowed_branches ? job.get_branch_rank(S) : mil_branches.spawn_branches(S)
+ var/list/options = job.allowed_branches ? job.get_branch_rank(S) : global.using_map.spawn_branches(S)
var/choice = input(user, "Choose your branch of service.", CHARACTER_PREFERENCE_INPUT_TITLE) as null|anything in options
- if(choice && CanUseTopic(user) && mil_branches.is_spawn_branch(choice, S))
+ if(choice && CanUseTopic(user) && global.using_map.is_spawn_branch(choice, S))
pref.branches[job.title] = choice
pref.ranks -= job.title
pref.skills_allocated = pref.sanitize_skills(pref.skills_allocated) // Check our skillset is still valid
@@ -353,12 +353,12 @@
else if(href_list["char_rank"])
var/datum/job/job = locate(href_list["checking_job"])
if(istype(job))
- var/datum/mil_branch/branch = mil_branches.get_branch(pref.branches[job.title])
+ var/datum/mil_branch/branch = global.using_map.get_branch(pref.branches[job.title])
var/decl/species/S = pref.get_species_decl()
- var/list/branch_rank = job.allowed_branches ? job.get_branch_rank(S) : mil_branches.spawn_branches(S)
- var/list/options = branch_rank[branch.name] || mil_branches.spawn_ranks(branch.name, S)
+ var/list/branch_rank = job.allowed_branches ? job.get_branch_rank(S) : global.using_map.spawn_branches(S)
+ var/list/options = branch_rank[branch.name] || global.using_map.spawn_ranks(branch.name, S)
var/choice = input(user, "Choose your rank.", CHARACTER_PREFERENCE_INPUT_TITLE) as null|anything in options
- if(choice && CanUseTopic(user) && mil_branches.is_spawn_rank(branch.name, choice, pref.get_species_decl()))
+ if(choice && CanUseTopic(user) && global.using_map.is_spawn_rank(branch.name, choice, pref.get_species_decl()))
pref.ranks[job.title] = choice
pref.skills_allocated = pref.sanitize_skills(pref.skills_allocated) // Check our skillset is still valid
validate_branch_and_rank()
@@ -425,7 +425,7 @@
if(job.allowed_branches)
dat += "You can be of following ranks:"
for(var/T in job.allowed_branches)
- var/datum/mil_branch/B = mil_branches.get_branch_by_type(T)
+ var/datum/mil_branch/B = global.using_map.get_branch_by_type(T)
dat += "[B.name]: [job.get_ranks(B.name)]"
dat += "
"
if(get_config_value(/decl/config/text/wikiurl))
diff --git a/code/modules/client/preference_setup/occupation/skill_selection.dm b/code/modules/client/preference_setup/occupation/skill_selection.dm
index ec4b0ba348db..6909a811fd5d 100644
--- a/code/modules/client/preference_setup/occupation/skill_selection.dm
+++ b/code/modules/client/preference_setup/occupation/skill_selection.dm
@@ -24,7 +24,7 @@
if(job && job.min_skill)
. = job.min_skill[S.type]
if(!.)
- var/datum/mil_branch/branch = mil_branches.get_branch(branches[job.title])
+ var/datum/mil_branch/branch = global.using_map.get_branch(branches[job.title])
if(branch && branch.min_skill)
. = branch.min_skill[S.type]
if(!.)
diff --git a/code/modules/clothing/shirts/_shirts.dm b/code/modules/clothing/shirts/_shirts.dm
index 7b841100fd48..a98caa44df7a 100644
--- a/code/modules/clothing/shirts/_shirts.dm
+++ b/code/modules/clothing/shirts/_shirts.dm
@@ -1,4 +1,5 @@
/obj/item/clothing/shirt
+ name = "shirt"
abstract_type = /obj/item/clothing/shirt
body_parts_covered = SLOT_UPPER_BODY|SLOT_ARMS
permeability_coefficient = 0.90
diff --git a/code/modules/clothing/spacesuits/rig/modules/infiltration.dm b/code/modules/clothing/spacesuits/rig/modules/infiltration.dm
index 0fe76208c172..c0cdb63b43d6 100644
--- a/code/modules/clothing/spacesuits/rig/modules/infiltration.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/infiltration.dm
@@ -185,7 +185,6 @@
interface_name = "dead man's switch"
interface_desc = "An integrated automatic self-destruct module. When the wearer dies, so does the surrounding area. Can be triggered manually."
var/list/explosion_values = list(1,2,4,5)
- var/blinking = 0
var/blink_mode = 0
var/blink_delay = 10
var/blink_time = 40
diff --git a/code/modules/clothing/suits/_suit.dm b/code/modules/clothing/suits/_suit.dm
index 7b4809a3b42d..82fdbbb486c5 100644
--- a/code/modules/clothing/suits/_suit.dm
+++ b/code/modules/clothing/suits/_suit.dm
@@ -11,7 +11,6 @@
valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_OVER)
fallback_slot = slot_wear_suit_str
var/protects_against_weather = FALSE
- var/fire_resist = T0C+100
/obj/item/clothing/suit/gives_weather_protection()
return protects_against_weather
diff --git a/code/modules/codex/codex_cataloguer.dm b/code/modules/codex/codex_cataloguer.dm
index a465ab387b48..ecca7be613bf 100644
--- a/code/modules/codex/codex_cataloguer.dm
+++ b/code/modules/codex/codex_cataloguer.dm
@@ -22,8 +22,6 @@
var/scan_speed_modifier = 1
/// How many tiles away it can scan. Changing this also changes the box size.
var/scan_range = 3
- /// If another person is within this radius, they will also be credited with a successful scan.
- var/credit_sharing_range = 14
/// How much to make the next scan shorter.
var/tmp/partial_scan_time = 0
/// Weakref of the thing that was last scanned if inturrupted. Used to allow for partial scans to be resumed.
diff --git a/code/modules/codex/codex_implant.dm b/code/modules/codex/codex_implant.dm
index 48d57b472edc..9e965a27e34a 100644
--- a/code/modules/codex/codex_implant.dm
+++ b/code/modules/codex/codex_implant.dm
@@ -5,6 +5,7 @@
/obj/item/implant/codex
name = "codex implant"
desc = "It has 'DON'T PANIC' embossed on the casing in friendly letters."
+ known = TRUE
/obj/item/implant/codex/implanted(var/mob/source)
. = ..(source)
diff --git a/code/modules/codex/codex_mob.dm b/code/modules/codex/codex_mob.dm
index 81abaeb25726..697c67aa64ca 100644
--- a/code/modules/codex/codex_mob.dm
+++ b/code/modules/codex/codex_mob.dm
@@ -11,7 +11,11 @@
return TRUE
/mob/living/human/can_use_codex()
- return TRUE //has_implant(/obj/item/implant/codex, functioning = TRUE)
+ if(get_config_value(/decl/config/toggle/codex_requires_implant))
+ for(var/obj/item/implant/codex/codex_implant in contents)
+ if(codex_implant.implanted && !codex_implant.malfunction)
+ return TRUE
+ return TRUE
/mob/living/human/get_codex_value()
return "[lowertext(species.name)] (species)"
\ No newline at end of file
diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm
index 9cfdf00cdd0f..b91444de9608 100644
--- a/code/modules/emotes/emote_mob.dm
+++ b/code/modules/emotes/emote_mob.dm
@@ -99,9 +99,10 @@
next_emote = world.time + use_emote.emote_delay
use_emote.do_emote(src, message)
- for (var/obj/item/implant/I in src)
- if (I.implanted)
- I.trigger(act, src)
+ for (var/obj/item/implant/implant in src)
+ if(!implant.implanted)
+ continue
+ implant.trigger(act, src)
#undef EMOTE_REFRESH_SPAM_COOLDOWN
diff --git a/code/modules/fabrication/_fabricator.dm b/code/modules/fabrication/_fabricator.dm
index d10d5064bc4f..23123ebfbdbb 100644
--- a/code/modules/fabrication/_fabricator.dm
+++ b/code/modules/fabrication/_fabricator.dm
@@ -96,6 +96,7 @@
/obj/machinery/fabricator/modify_mapped_vars(map_hash)
..()
ADJUST_TAG_VAR(initial_network_id, map_hash)
+ ADJUST_TAG_VAR(initial_network_key, map_hash)
/obj/machinery/fabricator/handle_post_network_connection()
..()
diff --git a/code/modules/fabrication/designs/general/designs_tools.dm b/code/modules/fabrication/designs/general/designs_tools.dm
index a7893fe4e1bd..1c9fc7d94818 100644
--- a/code/modules/fabrication/designs/general/designs_tools.dm
+++ b/code/modules/fabrication/designs/general/designs_tools.dm
@@ -2,15 +2,6 @@
path = /obj/item/crowbar
category = "Tools"
-/datum/fabricator_recipe/tool/int_wirer
- path = /obj/item/integrated_electronics/wirer
-
-/datum/fabricator_recipe/tool/int_debugger
- path = /obj/item/integrated_electronics/debugger
-
-/datum/fabricator_recipe/tool/int_analyzer
- path = /obj/item/integrated_electronics/analyzer
-
/datum/fabricator_recipe/tool/multitool
path = /obj/item/multitool
diff --git a/code/modules/fabrication/designs/protolathe/designs_hardsuit_modules.dm b/code/modules/fabrication/designs/protolathe/designs_hardsuit_modules.dm
index 8faa81dd4ddc..219883e737e1 100644
--- a/code/modules/fabrication/designs/protolathe/designs_hardsuit_modules.dm
+++ b/code/modules/fabrication/designs/protolathe/designs_hardsuit_modules.dm
@@ -61,6 +61,3 @@
/datum/fabricator_recipe/protolathe/rig/cooling_unit
path = /obj/item/rig_module/cooling_unit
-
-/datum/fabricator_recipe/protolathe/rig/integrated_printer
- path = /obj/item/integrated_circuit_printer
diff --git a/code/modules/fabrication/designs/protolathe/designs_misc.dm b/code/modules/fabrication/designs/protolathe/designs_misc.dm
index ae9ad75f43ef..0d406749fae2 100644
--- a/code/modules/fabrication/designs/protolathe/designs_misc.dm
+++ b/code/modules/fabrication/designs/protolathe/designs_misc.dm
@@ -55,10 +55,3 @@
/datum/fabricator_recipe/protolathe/misc/radio_beacon
path = /obj/item/radio_beacon
-
-
-/datum/fabricator_recipe/protolathe/integrated_printer_upgrade_advanced
- path = /obj/item/disk/integrated_circuit/upgrade/advanced
-
-/datum/fabricator_recipe/protolathe/integrated_printer_upgrade_clone
- path = /obj/item/disk/integrated_circuit/upgrade/clone
diff --git a/code/modules/fabrication/designs/robotics/designs_augments.dm b/code/modules/fabrication/designs/robotics/designs_augments.dm
index 85cc0d421d51..8ca2afdfe5ed 100644
--- a/code/modules/fabrication/designs/robotics/designs_augments.dm
+++ b/code/modules/fabrication/designs/robotics/designs_augments.dm
@@ -28,6 +28,3 @@
/datum/fabricator_recipe/robotics/augment/nanounit
path = /obj/item/organ/internal/augment/active/nanounit
-
-/datum/fabricator_recipe/robotics/augment/circuit
- path = /obj/item/organ/internal/augment/active/simple/circuit
diff --git a/code/modules/implants/implant.dm b/code/modules/implants/implant.dm
index 2572ce810556..0e58c2b46b19 100644
--- a/code/modules/implants/implant.dm
+++ b/code/modules/implants/implant.dm
@@ -1,3 +1,4 @@
+#define MALFUNCTION_NONE 0
#define MALFUNCTION_TEMPORARY 1
#define MALFUNCTION_PERMANENT 2
@@ -8,13 +9,15 @@
icon_state = "implant"
w_class = ITEM_SIZE_TINY
material = /decl/material/solid/metal/titanium
- var/implanted = null
- var/mob/imp_in = null
- var/obj/item/organ/external/part = null
+ var/implanted = FALSE
+ var/mob/imp_in
+ var/obj/item/organ/external/part
var/implant_color = "b"
- var/malfunction = 0
- var/known //if advanced scanners would name these in results
- var/hidden //if scanners will locate this implant at all
+ var/malfunction = MALFUNCTION_NONE
+ /// if TRUE, advanced scanners will directly name the implant in results
+ var/known = FALSE
+ /// if FALSE, scanners will not locate this implant at all
+ var/hidden = FALSE
/obj/item/implant/proc/trigger(emote, source)
return
@@ -25,48 +28,46 @@
/obj/item/implant/proc/activate()
return
-/obj/item/implant/proc/disable(var/time = 100)
+/obj/item/implant/proc/disable(var/time = 10 SECONDS)
if(malfunction)
- return 0
+ return FALSE
malfunction = MALFUNCTION_TEMPORARY
addtimer(CALLBACK(src,PROC_REF(restore)),time)
- return 1
+ return TRUE
/obj/item/implant/proc/restore()
if(malfunction == MALFUNCTION_PERMANENT || !malfunction)
- return 0
+ return FALSE
- malfunction = 0
- return 1
+ malfunction = MALFUNCTION_NONE
+ return TRUE
// What does the implant do upon injection?
-// return 0 if the implant fails (ex. Revhead and loyalty implant.)
+// return FALSE if the implant fails (ex. Revhead and loyalty implant.)
// return TRUE if the implant succeeds (ex. Nonrevhead and loyalty implant.)
-/obj/item/implant/proc/implanted(var/mob/source)
+/obj/item/implant/proc/implanted(var/mob/living/source)
return TRUE
-/obj/item/implant/proc/can_implant(mob/M, mob/user, var/target_zone)
- var/mob/living/human/H = M
- if(istype(H) && !GET_EXTERNAL_ORGAN(H, target_zone))
- to_chat(user, "\The [M] is missing that body part.")
+/obj/item/implant/proc/can_implant(mob/living/victim, mob/user, var/target_zone)
+ var/mob/living/human/human_victim = victim
+ if(istype(human_victim) && !GET_EXTERNAL_ORGAN(human_victim, target_zone))
+ to_chat(user, SPAN_WARNING("\The [human_victim] is missing that body part."))
return FALSE
return TRUE
-/obj/item/implant/proc/implant_in_mob(mob/M, var/target_zone)
- if (ishuman(M))
- var/mob/living/human/H = M
- var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(H, target_zone)
+/obj/item/implant/proc/implant_in_mob(mob/living/victim, mob/living/user, var/target_zone)
+ if (ishuman(victim))
+ var/mob/living/human/human_victim = victim
+ var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(human_victim, target_zone)
if(affected)
LAZYADD(affected.implants, src)
part = affected
- BITSET(H.hud_updateflag, IMPLOYAL_HUD)
-
- forceMove(M)
- imp_in = M
- implanted = 1
- implanted(M)
+ forceMove(victim)
+ imp_in = victim
+ implanted = TRUE
+ implanted(victim)
return TRUE
@@ -75,7 +76,7 @@
if(part)
LAZYREMOVE(part.implants, src)
part = null
- implanted = 0
+ implanted = FALSE
//Called in surgery when incision is retracted open / ribs are opened - basically before you can take implant out
/obj/item/implant/proc/exposed()
@@ -97,13 +98,10 @@
return FALSE
/obj/item/implant/proc/meltdown() //breaks it down, making implant unrecongizible
- if(malfunction == MALFUNCTION_PERMANENT) return
+ if(malfunction == MALFUNCTION_PERMANENT)
+ return
to_chat(imp_in, SPAN_DANGER("You feel something melting inside [part ? "your [part.name]" : "you"]!"))
- if (part)
- part.take_damage(15, BURN, inflicter = "Electronics meltdown")
- else
- var/mob/living/M = imp_in
- M.apply_damage(15,BURN)
+ imp_in.apply_damage(15, BURN, used_weapon = "Electronics meltdown", given_organ = part) // used_weapon can be a string or an item, for some reason
name = "melted implant"
desc = "Charred circuit in melted plastic case. Wonder what that used to be..."
icon_state = "implant_melted"
@@ -116,11 +114,13 @@
else if(prob(power * 25))
activate()
else if(prob(power * 33))
- disable(rand(power*100,power*1000))
+ disable(rand(power*10 SECONDS,power*100 SECONDS))
/obj/item/implant/Destroy()
if(part)
LAZYREMOVE(part.implants, src)
+ part = null
+ imp_in = null
var/obj/item/implanter/implanter = loc
if(istype(implanter) && implanter.imp == src)
implanter.imp = null
diff --git a/code/modules/implants/implant_types/adrenaline.dm b/code/modules/implants/implant_types/adrenaline.dm
index ec6f6166e42b..c7e2dc6a2ffb 100644
--- a/code/modules/implants/implant_types/adrenaline.dm
+++ b/code/modules/implants/implant_types/adrenaline.dm
@@ -2,8 +2,8 @@
name = "adrenalin implant"
desc = "Removes all stuns and knockdowns."
origin_tech = @'{"materials":1,"biotech":2,"esoteric":2}'
- hidden = 1
- var/uses
+ hidden = TRUE
+ var/uses = 3
/obj/item/implant/adrenalin/get_data()
return {"
@@ -22,17 +22,19 @@
activate()
/obj/item/implant/adrenalin/activate()//this implant is unused but I'm changing it for the sake of consistency
- if (uses < 1 || malfunction || !imp_in) return 0
+ if (uses < 1 || malfunction || !imp_in)
+ return 0
uses--
- to_chat(imp_in, "You feel a sudden surge of energy!")
+ to_chat(imp_in, SPAN_NOTICE("You feel a sudden surge of energy!"))
imp_in.set_status_condition(STAT_STUN, 0)
imp_in.set_status_condition(STAT_WEAK, 0)
imp_in.set_status_condition(STAT_PARA, 0)
/obj/item/implant/adrenalin/implanted(mob/source)
- source.StoreMemory("\A [src] can be activated by using the pale emote, say *pale to attempt to activate.", /decl/memory_options/system)
- to_chat(source, "\The [src] can be activated by using the pale emote, say *pale to attempt to activate.")
+ var/activation_string = "can be activated by using the pale emote, say *pale to attempt to activate."
+ source.StoreMemory("\A [src] [activation_string]", /decl/memory_options/system)
+ to_chat(source, "\The [src] [activation_string]")
return TRUE
/obj/item/implanter/adrenalin
diff --git a/code/modules/implants/implant_types/chem.dm b/code/modules/implants/implant_types/chem.dm
index a98016b2d583..b78de9f03523 100644
--- a/code/modules/implants/implant_types/chem.dm
+++ b/code/modules/implants/implant_types/chem.dm
@@ -4,7 +4,7 @@ var/global/list/chem_implants = list()
name = "chemical implant"
desc = "Injects things."
origin_tech = @'{"materials":1,"biotech":2}'
- known = 1
+ known = TRUE
/obj/item/implant/chem/get_data()
return {"
@@ -33,24 +33,22 @@ var/global/list/chem_implants = list()
global.chem_implants -= src
/obj/item/implant/chem/activate(var/amount)
- if(malfunction || (!ishuman(imp_in))) return 0
+ if(malfunction)
+ return FALSE
if(!amount)
amount = rand(1,25)
- var/mob/living/R = imp_in
- reagents.trans_to_mob(R, amount, CHEM_INJECT)
- to_chat(R, "You hear a faint *beep*.")
+ reagents.trans_to_mob(imp_in, amount, CHEM_INJECT)
+ to_chat(imp_in, SPAN_NOTICE("You hear a faint *beep*."))
/obj/item/implant/chem/attackby(obj/item/used_item, mob/user)
if(istype(used_item, /obj/item/chems/syringe))
if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\The [src] is full.")
- else
- if(do_after(user,5,src))
- used_item.reagents.trans_to_obj(src, 5)
- to_chat(user, "You inject 5 units of the solution. The syringe now contains [used_item.reagents.total_volume] units.")
+ to_chat(user, SPAN_WARNING("\The [src] is full."))
+ else if(do_after(user, 0.5 SECONDS, src))
+ used_item.reagents.trans_to_obj(src, 5)
+ to_chat(user, SPAN_NOTICE("You inject 5 units of the solution. The syringe now contains [used_item.reagents.total_volume] units."))
return TRUE
- else
- return ..()
+ return ..()
/obj/item/implantcase/chem
name = "glass case - 'chem'"
diff --git a/code/modules/implants/implant_types/compressed.dm b/code/modules/implants/implant_types/compressed.dm
index ad6dee6983b1..d9f6512f81f8 100644
--- a/code/modules/implants/implant_types/compressed.dm
+++ b/code/modules/implants/implant_types/compressed.dm
@@ -8,27 +8,29 @@
var/obj/item/scanned
/obj/item/implant/compressed/trigger(emote, mob/source)
- if (src.scanned == null)
- return 0
+ if (!scanned)
+ return FALSE
- if (emote == src.activation_emote)
- to_chat(source, "The air glows as \the [src.scanned.name] uncompresses.")
+ if (emote == activation_emote)
+ to_chat(source, "The air glows as \the [scanned] uncompresses.")
activate()
/obj/item/implant/compressed/activate()
- if(malfunction) return
- var/turf/T = get_turf(src)
+ if(malfunction)
+ return
+ var/turf/our_turf = get_turf(src)
if (imp_in)
imp_in.put_in_hands(scanned)
else
- scanned.forceMove(T)
+ scanned.forceMove(our_turf)
qdel(src)
/obj/item/implant/compressed/implanted(mob/source)
- src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_v", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_v", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
+ var/activation_string = "can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
if (source.mind)
- source.StoreMemory("\A [src] can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", /decl/memory_options/system)
- to_chat(source, "\The [src] can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.")
+ source.StoreMemory("\A [src] [activation_string]", /decl/memory_options/system)
+ to_chat(source, "\The [src] [activation_string].")
return TRUE
/obj/item/implanter/compressed
@@ -36,56 +38,57 @@
icon = 'icons/obj/items/implant/compressed_implant.dmi'
icon_state = "cimplanter1"
desc = "The matter compressor safety is on."
- var/safe = 1
imp = /obj/item/implant/compressed
+ var/const/SAFETY_OFF = 0
+ var/const/SAFETY_ON = 1
+ var/const/SAFETY_USED = 2
+ var/safe = SAFETY_ON
/obj/item/implanter/compressed/on_update_icon()
. = ..()
- if (imp)
- var/obj/item/implant/compressed/c = imp
- if(!c.scanned)
- icon_state = "cimplanter1"
- else
- icon_state = "cimplanter2"
+ if (istype(imp, /obj/item/implant/compressed))
+ var/obj/item/implant/compressed/compression_implant = imp
+ icon_state = compression_implant.scanned ? "cimplanter2" : "cimplanter1"
else
icon_state = "cimplanter0"
/obj/item/implanter/compressed/use_on_mob(mob/living/target, mob/living/user, animate = TRUE)
- var/obj/item/implant/compressed/c = imp
- if(!istype(c) || c.scanned == null)
+ var/obj/item/implant/compressed/compression_implant = imp
+ if(!istype(compression_implant) || compression_implant.scanned == null)
to_chat(user, SPAN_WARNING("Please compress an object with the implanter first."))
return TRUE
return ..()
-/obj/item/implanter/compressed/afterattack(obj/item/A, mob/user, proximity)
+/obj/item/implanter/compressed/afterattack(obj/item/used_item, mob/user, proximity)
if(!proximity)
return
- if(istype(A) && imp)
- var/obj/item/implant/compressed/c = imp
- if (c.scanned)
- if (!A.storage)
- to_chat(user, "Something is already compressed inside the implant!")
- return
- else if(safe)
- if (!A.storage)
- to_chat(user, "The matter compressor safeties prevent you from doing that.")
- return
- if(ishuman(A.loc))
- var/mob/living/human/H = A.loc
- if(!H.try_unequip(A))
- return
- else if(isobj(A.loc) && A.loc.storage)
- A.loc.storage.remove_from_storage(user, A)
- c.scanned = A
- A.forceMove(src) //Store it inside
- safe = 2
- desc = "It currently contains some matter."
- update_icon()
+ if(!istype(imp, /obj/item/implant/compressed))
+ to_chat(user, SPAN_WARNING("There is no compressed matter implant in \the [src]!"))
+ return
+ var/obj/item/implant/compressed/compression_implant = imp
+ if (compression_implant.scanned)
+ if (!used_item.storage)
+ to_chat(user, SPAN_WARNING("Something is already compressed inside the implant!"))
+ return
+ else if(safe >= SAFETY_ON)
+ if (!used_item.storage)
+ to_chat(user, SPAN_WARNING("The matter compressor safeties prevent you from doing that."))
+ return
+ var/atom/used_item_loc = used_item.loc
+ var/mob/living/human/holder = used_item_loc
+ if(istype(holder) && !holder.try_unequip(used_item))
+ return
+ if(used_item_loc.storage)
+ used_item_loc.storage.remove_from_storage(user, used_item)
+ compression_implant.scanned = used_item
+ used_item.forceMove(src) //Store it inside
+ safe = SAFETY_USED
+ desc = "It currently contains some matter."
+ update_icon()
/obj/item/implanter/compressed/attack_self(var/mob/user)
- if(!imp || safe == 2)
+ if(!imp || safe == SAFETY_USED)
return ..()
-
safe = !safe
- to_chat(user, "You [safe ? "enable" : "disable"] the matter compressor safety.")
+ to_chat(user, SPAN_NOTICE("You [safe ? "enable" : "disable"] the matter compressor safety."))
src.desc = "The matter compressor safety is [safe ? "on" : "off"]."
\ No newline at end of file
diff --git a/code/modules/implants/implant_types/death_alarm.dm b/code/modules/implants/implant_types/death_alarm.dm
index f41e96f1f29d..8bbe9fa27513 100644
--- a/code/modules/implants/implant_types/death_alarm.dm
+++ b/code/modules/implants/implant_types/death_alarm.dm
@@ -2,8 +2,11 @@
name = "death alarm implant"
desc = "An alarm which monitors host vital signs and transmits a radio message upon death."
origin_tech = @'{"materials":1,"biotech":2,"programming":3}'
- known = 1
+ known = TRUE
var/mobname = "John Doe"
+ var/const/DEATH_ALARM_CAUSE_EMP = "emp"
+ var/const/DEATH_ALARM_CAUSE_GIB = "gib"
+ var/const/DEATH_ALARM_CAUSE_DEATH = "death"
/obj/item/implant/death_alarm/get_data()
return {"
@@ -21,22 +24,21 @@
return TRUE
/obj/item/implant/death_alarm/Process()
- if (!implanted) return
- var/mob/M = imp_in
+ if (!implanted)
+ return
+ if(isnull(imp_in)) // If the mob got gibbed
+ activate(DEATH_ALARM_CAUSE_GIB)
+ else if(imp_in.stat == DEAD)
+ activate(DEATH_ALARM_CAUSE_DEATH)
- if(isnull(M)) // If the mob got gibbed
- activate(null)
- else if(M.stat == DEAD)
- activate("death")
-
-/obj/item/implant/death_alarm/activate(var/cause = "emp")
- if(malfunction) return
- var/mob/M = imp_in
- var/area/location = get_area(M)
- if (cause == "emp" && prob(50))
+/obj/item/implant/death_alarm/activate(var/cause = DEATH_ALARM_CAUSE_EMP)
+ if(malfunction)
+ return
+ var/area/location = get_area(imp_in)
+ if (cause == DEATH_ALARM_CAUSE_EMP && prob(50))
location = pick(teleportlocs)
var/death_message = "[mobname] has died in [location.proper_name]!"
- if(!cause)
+ if(cause == DEATH_ALARM_CAUSE_GIB)
death_message = "[mobname] has died-zzzzt in-in-in..."
STOP_PROCESSING(SSobj, src)
do_telecomms_announcement(src, death_message, "[mobname]'s Death Alarm", list("Security", "Medical", "Command"))
diff --git a/code/modules/implants/implant_types/explosive.dm b/code/modules/implants/implant_types/explosive.dm
index e588e56009a8..c4d2919bd763 100644
--- a/code/modules/implants/implant_types/explosive.dm
+++ b/code/modules/implants/implant_types/explosive.dm
@@ -4,7 +4,7 @@
desc = "A military grade micro bio-explosive. Highly dangerous."
icon_state = "implant_evil"
origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}'
- hidden = 1
+ hidden = TRUE
var/elevel
var/phrase
var/code = 13
@@ -26,24 +26,24 @@
if(!malfunction)
. += {"
Explosion yield mode:
- [elevel ? elevel : "NONE SET"]
+ [elevel || "NONE SET"]
Activation phrase:
- [phrase ? phrase : "NONE SET"]
+ [phrase || "NONE SET"]
Frequency:
-
-
- [format_frequency(src.frequency)]
+ [format_frequency(frequency)]
+
+
Code:
-
-
- [src.code]
+ [code]
+
+
Tampering warning message:
This will be broadcasted on radio if implant is exposed during surgery.
- [warning_message ? warning_message : "NONE SET"]
+ [warning_message || "NONE SET"]
"}
/obj/item/implant/explosive/Initialize()
@@ -52,12 +52,12 @@
set_frequency(frequency)
/obj/item/implant/explosive/Topic(href, href_list)
- ..()
+/obj/item/implant/explosive/OnTopic(mob/user, href_list, datum/topic_state/state)
if (href_list["freq"])
var/new_frequency = frequency + text2num(href_list["freq"])
new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
set_frequency(new_frequency)
- interact(usr)
+ return TOPIC_REFRESH
if (href_list["code"])
var/adj = text2num(href_list["code"])
if(!adj)
@@ -65,22 +65,22 @@
else
code += adj
code = clamp(code,1,100)
- interact(usr)
+ return TOPIC_REFRESH
if (href_list["mode"])
var/mod = input("Set explosion mode", "Explosion mode") as null|anything in list("Localized Limb", "Destroy Body", "Full Explosion")
if(mod)
elevel = mod
- interact(usr)
+ return TOPIC_REFRESH
if (href_list["msg"])
var/msg = input("Set tampering message, or leave blank for no broadcasting.", "Anti-tampering", warning_message) as text|null
if(msg)
warning_message = msg
- interact(usr)
+ return TOPIC_REFRESH
if (href_list["phrase"])
var/talk = input("Set activation phrase", "Audio activation", phrase) as text|null
if(talk)
phrase = sanitize_phrase(talk)
- interact(usr)
+ return TOPIC_REFRESH
/obj/item/implant/explosive/receive_signal(datum/signal/signal)
if(signal && signal.encryption == code)
@@ -113,35 +113,36 @@
if (malfunction)
return
- var/turf/T = get_turf(src)
- if(T)
- T.hotspot_expose(3500,125)
+ var/turf/our_turf = get_turf(src)
+ if(our_turf)
+ our_turf.hotspot_expose(3500, CELL_VOLUME/20) // expose roughly 1/20th of a cell to 3500K heat
- playsound(loc, 'sound/items/countdown.ogg', 75, 1, -3)
+ playsound(our_turf, 'sound/items/countdown.ogg', 75, 1, -3)
if(ismob(imp_in))
- imp_in.audible_message("Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!")
+ imp_in.audible_message(SPAN_WARNING("Something beeps inside [imp_in][part ? "'s [part.name]" : ""]!"))
log_and_message_admins("Explosive implant triggered in [imp_in] ([imp_in.key]). (JMP) ")
else
- audible_message("[src] beeps omniously!")
- log_and_message_admins("Explosive implant triggered in [T.loc]. (JMP) ")
+ audible_message(SPAN_WARNING("[src] beeps omniously!"))
+ log_and_message_admins("Explosive implant triggered in [our_turf.loc]. (JMP) ")
if(!elevel)
elevel = "Full Explosion"
switch(elevel)
if ("Localized Limb")
- if (part)
- if (istype(part,/obj/item/organ/external/chest) || \
- istype(part,/obj/item/organ/external/groin))
+ switch(part?.organ_tag)
+ if(BP_CHEST, BP_GROIN)
part.take_damage(60, inflicter = "Explosion")
+ if(null)
+ pass()
else
part.dismember(0,DISMEMBER_METHOD_BLUNT)
- explosion(T, -1, -1, 2, 3)
+ explosion(our_turf, -1, -1, 2, 3)
if ("Destroy Body")
- explosion(T, -1, 0, 1, 6)
+ explosion(our_turf, -1, 0, 1, 6)
if(ismob(imp_in))
imp_in.gib()
if ("Full Explosion")
- explosion(T, 0, 1, 3, 6)
+ explosion(our_turf, 0, 1, 3, 6)
if(ismob(imp_in))
imp_in.gib()
qdel(src)
diff --git a/code/modules/implants/implant_types/freedom.dm b/code/modules/implants/implant_types/freedom.dm
index 2ec9c0890aed..3fe600c5108d 100644
--- a/code/modules/implants/implant_types/freedom.dm
+++ b/code/modules/implants/implant_types/freedom.dm
@@ -5,7 +5,7 @@
desc = "Use this to escape from those evil Red Shirts."
origin_tech = @'{"materials":1,"biotech":2,"esoteric":2}'
implant_color = "r"
- hidden = 1
+ hidden = TRUE
var/activation_emote
var/uses
@@ -34,7 +34,8 @@
activate()
/obj/item/implant/freedom/activate()
- if(uses < 1 || malfunction) return 0
+ if(uses < 1 || malfunction)
+ return FALSE
if(remove_cuffs_and_unbuckle(imp_in))
uses--
to_chat(imp_in, "You feel a faint click.")
@@ -42,16 +43,18 @@
/obj/item/implant/freedom/proc/remove_cuffs_and_unbuckle(mob/living/user)
var/obj/cuffs = user.get_equipped_item(slot_handcuffed_str)
if(!cuffs)
- return 0
- . = user.try_unequip(cuffs)
- if(. && user.buckled && user.buckled.buckle_require_restraints)
+ return FALSE
+ if(!user.try_unequip(cuffs))
+ return FALSE
+ if(user.buckled && user.buckled.buckle_require_restraints)
user.buckled.unbuckle_mob()
- return
+ return TRUE
/obj/item/implant/freedom/implanted(mob/living/source)
src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_v", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
- source.StoreMemory("\A [src] can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", /decl/memory_options/system)
- to_chat(source, "\The [src] can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.")
+ var/activation_string = "can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
+ source.StoreMemory("\A [src] [activation_string]", /decl/memory_options/system)
+ to_chat(source, "\The [src] [activation_string]")
return TRUE
/obj/item/implanter/freedom
diff --git a/code/modules/implants/implant_types/imprinting.dm b/code/modules/implants/implant_types/imprinting.dm
index f493ae39ffa7..5a8305087572 100644
--- a/code/modules/implants/implant_types/imprinting.dm
+++ b/code/modules/implants/implant_types/imprinting.dm
@@ -2,9 +2,9 @@
name = "imprinting implant"
desc = "Latest word in training your peons."
origin_tech = @'{"materials":1,"biotech":2,"programming":3}'
- hidden = 1
+ hidden = TRUE
var/list/instructions = list("Do your job.", "Respect your superiors.", "Wash you hands after using the toilet.")
- var/brainwashing = 0
+ var/brainwashing = FALSE
/obj/item/implant/imprinting/get_data()
. = {"
@@ -18,56 +18,58 @@
It is HIGLY ILLEGAL and the seller does NOT endorse use of this device in such way.
Any amount of "Mind-Breaker"(TM) present in bloodstream will trigger this side-effect.
"}
. += "
Instructions:
"
- for(var/i = 1 to instructions.len)
+ for(var/i = 1 to length(instructions))
. += "- [instructions[i]] Edit Remove
"
. += "Add"
-/obj/item/implant/imprinting/Topic(href, href_list)
- ..()
+/obj/item/implant/imprinting/OnTopic(mob/user, href_list, datum/topic_state/state)
if (href_list["add"])
var/mod = sanitize(input("Add an instruction", "Instructions") as text|null)
if(mod)
instructions += mod
- interact(usr)
+ return TOPIC_REFRESH
+ return TOPIC_HANDLED
if (href_list["edit"])
var/idx = text2num(href_list["edit"])
var/mod = sanitize(input("Edit the instruction", "Instruction Editing", instructions[idx]) as text|null)
if(mod)
instructions[idx] = mod
- interact(usr)
+ return TOPIC_REFRESH
+ return TOPIC_HANDLED
if (href_list["del"])
instructions -= instructions[text2num(href_list["del"])]
- interact(usr)
+ return TOPIC_REFRESH
+ return TOPIC_NOACTION
-/obj/item/implant/imprinting/implanted(mob/M)
- var/mob/living/human/H = M
- if(!istype(H))
+/obj/item/implant/imprinting/implanted(mob/living/victim)
+ var/mob/living/human/human_victim = victim
+ if(!istype(human_victim))
return FALSE
- if(H.reagents.has_reagent(/decl/material/liquid/hallucinogenics))
- brainwashing = 1
+ if(human_victim.reagents.has_reagent(/decl/material/liquid/hallucinogenics))
+ brainwashing = TRUE
var/msg = get_instructions()
- to_chat(M, msg)
- if(M.mind)
- M.StoreMemory(msg, /decl/memory_options/system)
+ to_chat(human_victim, msg)
+ if(human_victim.mind)
+ human_victim.StoreMemory(msg, /decl/memory_options/system)
if(brainwashing)
- log_and_message_admins("was implanted with a brainwashing implant holding following laws: [jointext(instructions, ";")].", M)
- addtimer(CALLBACK(src,PROC_REF(activate)),3000,(TIMER_UNIQUE|TIMER_OVERRIDE))
+ log_and_message_admins("was implanted with a brainwashing implant holding the following laws: [jointext(instructions, ";")].", human_victim)
+ addtimer(CALLBACK(src,PROC_REF(activate)), 5 MINUTES, (TIMER_UNIQUE|TIMER_OVERRIDE))
return TRUE
/obj/item/implant/imprinting/proc/get_instructions()
. = list()
if(brainwashing)
- . += "The fog in your head clears, and you remember some important things. You hold following things as deep convictions, almost like synthetics' laws:
"
+ . += SPAN_DANGER("The fog in your head clears, and you remember some important things. You hold the following as deep convictions, almost like synthetics' laws:")
else
- . += "You hear an annoying voice in the back of your head. The things it keeps reminding you of:
"
+ . += SPAN_NOTICE("You hear an annoying voice in the back of your head. The things it keeps reminding you of are:")
for(var/thing in instructions)
- . += "- [thing]
"
- . = JOINTEXT(.)
+ . += "- [thing]"
+ . = jointext(., "
")
/obj/item/implant/imprinting/disable(time)
. = ..()
if(. && brainwashing)//add deactivate and reactivate messages?
- to_chat(imp_in,"A wave of nausea comes over you.
You are no longer so sure of those beliefs you've had...")
+ show_deactivate_message()
/obj/item/implant/imprinting/restore()
. = ..()
@@ -76,18 +78,19 @@
activate()
/obj/item/implant/imprinting/activate()
- if(malfunction || !implanted || imp_in) return
+ if(malfunction || !implanted || imp_in)
+ return
var/instruction = pick(instructions)
if(brainwashing)
- instruction = "You recall one of your beliefs: \"[instruction]\""
+ instruction = SPAN_WARNING("You recall one of your beliefs: \"[instruction]\"")
else
- instruction = "You remember suddenly: \"[instruction]\""
+ instruction = SPAN_NOTICE("You remember suddenly: \"[instruction]\"")
to_chat(imp_in, instruction)
- addtimer(CALLBACK(src,PROC_REF(activate)),3000,(TIMER_UNIQUE|TIMER_OVERRIDE))
+ addtimer(CALLBACK(src, PROC_REF(activate)), 5 MINUTES, (TIMER_UNIQUE|TIMER_OVERRIDE))
/obj/item/implant/imprinting/removed()
if(brainwashing && !malfunction)
- to_chat(imp_in,"A wave of nausea comes over you.
You are no longer so sure of those beliefs you've had...")
+ show_deactivate_message()
..()
/obj/item/implant/imprinting/emp_act(severity)
@@ -95,22 +98,26 @@
if(prob(power * 15))
meltdown()
else if(prob(power * 40))
- disable(rand(power*100,power*1000))//a few precious seconds of freedom
+ disable(rand(power*10 SECONDS,power*100 SECONDS))//a few precious seconds of freedom
+
+/obj/item/implant/imprinting/proc/show_deactivate_message()
+ to_chat(imp_in, SPAN_WARNING("A wave of nausea comes over you."))
+ to_chat(imp_in, SPAN_GOOD("You are no longer so sure of those beliefs you've had..."))
/obj/item/implant/imprinting/meltdown()
if(brainwashing && !malfunction)//if it's already broken don't send the message again
- to_chat(imp_in,"A wave of nausea comes over you.
You are no longer so sure of those beliefs you've had...")
+ show_deactivate_message()
. = ..()
-/obj/item/implant/imprinting/can_implant(mob/M, mob/user, target_zone)
- var/mob/living/human/H = M
- if(istype(H))
- var/obj/item/organ/internal/B = GET_INTERNAL_ORGAN(H, BP_BRAIN)
- if(!B || H.isSynthetic())
- to_chat(user, "\The [M] cannot be imprinted.")
+/obj/item/implant/imprinting/can_implant(mob/living/victim, mob/living/user, target_zone)
+ var/mob/living/human/human_victim = victim
+ if(istype(human_victim))
+ var/obj/item/organ/internal/victim_brain = GET_INTERNAL_ORGAN(human_victim, BP_BRAIN)
+ if(!victim_brain || human_victim.isSynthetic())
+ to_chat(user, SPAN_WARNING("\The [human_victim] cannot be imprinted."))
return FALSE
- if(!(B.parent_organ == check_zone(target_zone, H)))
- to_chat(user, "\The [src] must be implanted in [GET_EXTERNAL_ORGAN(H, B.parent_organ)].")
+ if(!(victim_brain.parent_organ == check_zone(target_zone, human_victim)))
+ to_chat(user, SPAN_WARNING("\The [src] must be implanted in [GET_EXTERNAL_ORGAN(human_victim, victim_brain.parent_organ)]."))
return FALSE
return TRUE
diff --git a/code/modules/implants/implant_types/loyalty.dm b/code/modules/implants/implant_types/loyalty.dm
index f7cc12b1abb0..e373a0e53abd 100644
--- a/code/modules/implants/implant_types/loyalty.dm
+++ b/code/modules/implants/implant_types/loyalty.dm
@@ -1,8 +1,8 @@
/obj/item/implant/loyalty
name = "loyalty implant"
- desc = "Makes you loyal or such."
+ desc = "Contains a small pod of nanobots that manipulate the host's mental functions. Personnel injected with this device tend to be much more loyal to the company."
origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}'
- known = 1
+ known = TRUE // identifiable by scanners
/obj/item/implant/loyalty/get_data()
return {"
@@ -16,19 +16,20 @@
Special Features: Will prevent and cure most forms of brainwashing.
Integrity: Implant will last so long as the nanobots are inside the bloodstream."}
-/obj/item/implant/loyalty/implanted(mob/M)
- if(!ishuman(M))
+/obj/item/implant/loyalty/implanted(mob/living/victim)
+ if(!ishuman(victim))
return FALSE
- var/decl/special_role/antag_data = GET_DECL(M.mind?.assigned_special_role)
+ var/decl/special_role/antag_data = GET_DECL(victim.mind?.assigned_special_role)
if(istype(antag_data) && (antag_data.flags & ANTAG_IMPLANT_IMMUNE))
- M.visible_message(
- "\The [M] seems to resist the implant!",
- "You feel the corporate tendrils of [global.using_map.company_name] try to invade your mind!"
+ victim.visible_message(
+ "\The [victim] seems to resist the implant!",
+ SPAN_WARNING("You feel the corporate tendrils of [global.using_map.company_name] try to invade your mind!")
)
return FALSE
else
- clear_antag_roles(M.mind, 1)
- to_chat(M, SPAN_NOTICE("You feel a surge of loyalty towards [global.using_map.company_name]."))
+ clear_antag_roles(victim.mind, implanted = TRUE)
+ to_chat(victim, SPAN_NOTICE("You feel a surge of loyalty towards [global.using_map.company_name]."))
+ BITSET(victim.hud_updateflag, IMPLOYAL_HUD)
return TRUE
/obj/item/implanter/loyalty
diff --git a/code/modules/implants/implant_types/tracking.dm b/code/modules/implants/implant_types/tracking.dm
index 0b317737c4b3..eac7218ef8a8 100644
--- a/code/modules/implants/implant_types/tracking.dm
+++ b/code/modules/implants/implant_types/tracking.dm
@@ -4,7 +4,7 @@ var/global/list/tracking_implants = list()
name = "tracking implant"
desc = "Track with this."
origin_tech = @'{"materials":1,"biotech":2,"wormholes":2}'
- known = 1
+ known = TRUE
var/id = 1
/obj/item/implant/tracking/Initialize(ml, material_key)
@@ -36,11 +36,11 @@ var/global/list/tracking_implants = list()
+
+
"}
-/obj/item/implant/tracking/Topic(href, href_list)
- ..()
+/obj/item/implant/tracking/OnTopic(mob/user, href_list, datum/topic_state/state)
if (href_list["tracking_id"])
id = clamp(id+text2num(href_list["tracking_id"]), 1, 100)
- interact(usr)
+ return TOPIC_REFRESH
+ return TOPIC_NOACTION
/obj/item/implant/tracking/islegal()
return TRUE
@@ -50,7 +50,7 @@ var/global/list/tracking_implants = list()
if(prob(power * 15))
meltdown()
else if(prob(power * 40))
- disable(rand(power*500,power*5000))//adds in extra time because this is the only other way to sabotage it
+ disable(rand(power*50 SECONDS,power*500 SECONDS))//adds in extra time because this is the only other way to sabotage it
/obj/item/implantcase/tracking
name = "glass case - 'tracking'"
diff --git a/code/modules/implants/implant_types/translator.dm b/code/modules/implants/implant_types/translator.dm
index f4c540ddb7d4..0dbcc41231d8 100644
--- a/code/modules/implants/implant_types/translator.dm
+++ b/code/modules/implants/implant_types/translator.dm
@@ -4,7 +4,7 @@
desc = "A small implant with a microphone on it."
icon_state = "implant_evil"
origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}'
- hidden = 1
+ hidden = TRUE
var/list/languages = list()
var/learning_threshold = 20 //need to hear language spoken this many times to learn it
var/max_languages = 5
@@ -16,15 +16,13 @@
. = ..()
global.listening_objects += src
-/obj/item/implant/translator/hear_talk(mob/M, msg, verb, decl/language/speaking)
+/obj/item/implant/translator/hear_talk(mob/speaker, msg, verb, decl/language/speaking)
if(!imp_in)
return
if(length(languages) == max_languages)
return
- if(!languages[speaking.name])
- languages[speaking.name] = 1
- languages[speaking.name] = languages[speaking.name] + 1
- if(!imp_in.say_understands(M, speaking) && languages[speaking.name] > learning_threshold)
+ languages[speaking.name] += 1
+ if(!imp_in.say_understands(speaker, speaking) && languages[speaking.name] > learning_threshold)
to_chat(imp_in, SPAN_NOTICE("You feel like you can understand [speaking.name] now..."))
imp_in.add_language(speaking.type)
diff --git a/code/modules/implants/implant_types/uplink.dm b/code/modules/implants/implant_types/uplink.dm
index 27e733c583aa..40574a97529f 100644
--- a/code/modules/implants/implant_types/uplink.dm
+++ b/code/modules/implants/implant_types/uplink.dm
@@ -2,7 +2,7 @@
name = "uplink implant"
desc = "Summon things."
origin_tech = @'{"materials":1,"biotech":2,"esoteric":3}'
- hidden = 1
+ hidden = TRUE
var/activation_emote
/obj/item/implant/uplink/Initialize(mapload, var/amount)
@@ -13,8 +13,9 @@
/obj/item/implant/uplink/implanted(mob/source)
var/emote_options = list("blink", "blink_r", "eyebrow", "chuckle", "twitch_v", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
activation_emote = source.client ? (input(source, "Choose activation emote:", "Uplink Implant Setup") in emote_options) : emote_options[1]
- source.StoreMemory("\A [src] can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", /decl/memory_options/system)
- to_chat(source, "\The [src] can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.")
+ var/activation_string = "can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
+ source.StoreMemory("\A [src] [activation_string]", /decl/memory_options/system)
+ to_chat(source, "\The [src] [activation_string]")
hidden_uplink.uplink_owner = source.mind
return TRUE
diff --git a/code/modules/implants/implantcase.dm b/code/modules/implants/implantcase.dm
index 9f754b9c8685..2714c948265f 100644
--- a/code/modules/implants/implantcase.dm
+++ b/code/modules/implants/implantcase.dm
@@ -42,15 +42,16 @@
// TODO: the name stuff here probably doesn't work, this needs an update_name override
/obj/item/implantcase/attackby(obj/item/used_item, mob/user)
if (IS_PEN(used_item))
- var/t = input(user, "What would you like the label to be?", src.name, null)
+ var/label = input(user, "What would you like the label to be?", src.name, null)
+ // As input() blocks, we need to do some sanity checks
if (user.get_active_held_item() != used_item)
return TRUE
- if((!in_range(src, usr) && loc != user))
+ if(!CanPhysicallyInteract(user))
return TRUE
- t = sanitize_safe(t, MAX_NAME_LEN)
- if(t)
- SetName("glass case - '[t]'")
- desc = "A case containing \a [t] implant."
+ label = sanitize_safe(label, MAX_NAME_LEN)
+ if(label)
+ SetName("glass case - '[label]'")
+ desc = "A case containing \a [label] implant."
else
SetName(initial(name))
desc = "A case containing an implant."
@@ -72,7 +73,7 @@
M.update_icon()
return TRUE
else if (istype(used_item, /obj/item/implant) && user.try_unequip(used_item, src))
- to_chat(usr, "You slide \the [used_item] into \the [src].")
+ to_chat(user, SPAN_NOTICE("You slide \the [used_item] into \the [src]."))
imp = used_item
update_description()
update_icon()
diff --git a/code/modules/implants/implantchair.dm b/code/modules/implants/implantchair.dm
deleted file mode 100644
index 6bfe7ff3b67c..000000000000
--- a/code/modules/implants/implantchair.dm
+++ /dev/null
@@ -1,146 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
-/obj/machinery/implantchair
- name = "loyalty implanter"
- desc = "Used to implant occupants with loyalty implants."
- icon = 'icons/obj/machines/implantchair.dmi'
- icon_state = "implantchair"
- density = TRUE
- opacity = FALSE
- anchored = TRUE
-
- var/ready = TRUE
- var/list/obj/item/implant/loyalty/implant_list = list()
- var/max_implants = 5
- var/injection_cooldown = 600
- var/replenish_cooldown = 6000
- var/mob/living/occupant = null
- var/injecting = FALSE
-
-/obj/machinery/implantchair/Initialize()
- . = ..()
- add_implants()
-
-/obj/machinery/implantchair/interface_interact(user)
- interact(user)
- return TRUE
-
-/obj/machinery/implantchair/interact(mob/user)
- user.set_machine(src)
- var/health_text = ""
- if(src.occupant)
- if(src.occupant.current_health <= -100)
- health_text = "Dead"
- else if(src.occupant.current_health < 0)
- health_text = "[round(src.occupant.current_health,0.1)]"
- else
- health_text = "[round(src.occupant.current_health,0.1)]"
-
- var/dat ="Implanter Status
"
-
- dat +="Current occupant: [src.occupant ? "
Name: [src.occupant]
Health: [health_text]
" : "None"]
"
- dat += "Implants: [src.implant_list.len ? "[implant_list.len]" : "Replenish"]
"
- if(src.occupant)
- dat += "[src.ready ? "Implant" : "Recharging"]
"
- user.set_machine(src)
- show_browser(user, dat, "window=implant")
- onclose(user, "implant")
-
-
-/obj/machinery/implantchair/OnTopic(mob/user, href_list)
- if((. = ..()))
- return
- if(!ready) // avoid topic hacking
- return TOPIC_NOACTION
- if(href_list["implant"] && occupant)
- injecting = TRUE
- go_out()
- ready = FALSE
- addtimer(CALLBACK(src, PROC_REF(make_ready)), injection_cooldown)
-
- if(href_list["replenish"])
- ready = 0
- addtimer(CALLBACK(src, PROC_REF(add_implants)), replenish_cooldown)
- addtimer(CALLBACK(src, PROC_REF(make_ready)), replenish_cooldown)
-
-/obj/machinery/implantchair/proc/make_ready()
- ready = TRUE
-
-/obj/machinery/implantchair/grab_attack(obj/item/grab/grab, mob/user)
- var/mob/living/victim = grab.get_affecting_mob()
- if(istype(victim) && victim.can_enter_cryopod(user) && put_mob(victim))
- qdel(grab)
- updateUsrDialog()
- return TRUE
- return ..()
-
-/obj/machinery/implantchair/proc/go_out(var/mob/M)
- if(!( src.occupant ))
- return
- if(M == occupant) // so that the guy inside can't eject himself -Agouri
- return
- if (src.occupant.client)
- src.occupant.client.eye = src.occupant.client.mob
- src.occupant.client.perspective = MOB_PERSPECTIVE
- occupant.dropInto(loc)
- if(injecting)
- implant(src.occupant)
- injecting = FALSE
- src.occupant = null
- icon_state = "implantchair"
- return
-
-
-/obj/machinery/implantchair/proc/put_mob(mob/living/M)
- if(!ishuman(M))
- to_chat(usr, "\The [src] cannot hold this!")
- return
- if(src.occupant)
- to_chat(usr, "\The [src] is already occupied!")
- return
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.forceMove(src)
- src.occupant = M
- src.add_fingerprint(usr)
- icon_state = "implantchair_on"
- return 1
-
-
-/obj/machinery/implantchair/proc/implant(var/mob/M)
- if (!ishuman(M))
- return
- if(!implant_list.len) return
- for(var/obj/item/implant/loyalty/imp in implant_list)
- if(!imp) continue
- if(istype(imp, /obj/item/implant/loyalty))
- M.visible_message(SPAN_NOTICE("\The [M] has been implanted by \the [src]."))
- if(imp.implanted(M))
- imp.forceMove(M)
- imp.imp_in = M
- imp.implanted = 1
- implant_list -= imp
- break
-
-/obj/machinery/implantchair/proc/add_implants()
- for(var/i=0, iThere's no implant loaded in \the [src].")
\ No newline at end of file
+ to_chat(user,SPAN_WARNING("There's no implant loaded in \the [src]."))
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm
deleted file mode 100644
index 69c2b2eb593d..000000000000
--- a/code/modules/integrated_electronics/_defines.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-#define IC_TOPIC_UNHANDLED 0
-#define IC_TOPIC_HANDLED 1
-#define IC_TOPIC_REFRESH 2
-#define IC_FLAG_CAN_FIRE 1
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/core/_electronics.dm b/code/modules/integrated_electronics/core/_electronics.dm
deleted file mode 100644
index d96c32f9aec4..000000000000
--- a/code/modules/integrated_electronics/core/_electronics.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/obj/item/integrated_electronics
- abstract_type = /obj/item/integrated_electronics
- obj_flags = OBJ_FLAG_CONDUCTIBLE
- w_class = ITEM_SIZE_SMALL
- material = /decl/material/solid/metal/aluminium
diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm
index 3170ed85d090..3d150896b47b 100644
--- a/code/modules/lighting/lighting_corner.dm
+++ b/code/modules/lighting/lighting_corner.dm
@@ -61,9 +61,6 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0,
var/cache_b = 0
var/cache_mx = 0
- /// Used for planet lighting. Probably needs a better system to prevent over-updating when not needed at some point.
- var/update_gen = 0
-
/datum/lighting_corner/New(turf/new_turf, diagonal, oi)
SSlighting.total_lighting_corners += 1
diff --git a/code/modules/mob/grab/simple/simple_control.dm b/code/modules/mob/grab/simple/simple_control.dm
index 62eb60e27292..bcab5545f070 100644
--- a/code/modules/mob/grab/simple/simple_control.dm
+++ b/code/modules/mob/grab/simple/simple_control.dm
@@ -38,13 +38,13 @@
// Override these for mobs that will respond to instructions from a rider.
/mob/living/proc/handle_rider_harm_order(mob/user, atom/target, proximity)
- return FALSE
+ return istype(ai) ? ai.process_handler_target(user, target, I_FLAG_HARM) : FALSE
/mob/living/proc/handle_rider_grab_order(mob/user, atom/target, proximity)
- return FALSE
+ return istype(ai) ? ai.process_handler_target(user, target, I_FLAG_GRAB) : FALSE
/mob/living/proc/handle_rider_disarm_order(mob/user, atom/target, proximity)
- return FALSE
+ return istype(ai) ? ai.process_handler_target(user, target, I_FLAG_DISARM) : FALSE
/mob/living/proc/handle_rider_help_order(mob/user, atom/target, proximity)
- return FALSE
+ return istype(ai) ? ai.process_handler_target(user, target, I_FLAG_HELP) : FALSE
diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm
index 992bbe7c5449..91fe3f114b19 100644
--- a/code/modules/mob/living/human/human.dm
+++ b/code/modules/mob/living/human/human.dm
@@ -100,24 +100,25 @@
cell_status = "[rig.cell.charge]/[rig.cell.maxcharge]"
stat(null, "Hardsuit charge: [cell_status]")
-/mob/living/human/proc/implant_loyalty(mob/living/human/M, override = FALSE) // Won't override by default.
- if(!get_config_value(/decl/config/toggle/use_loyalty_implants) && !override) return // Nuh-uh.
-
- var/obj/item/implant/loyalty/L = new/obj/item/implant/loyalty(M)
- L.imp_in = M
- L.implanted = 1
- var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(M, BP_HEAD)
- LAZYDISTINCTADD(affected.implants, L)
- L.part = affected
- L.implanted(src)
-
-/mob/living/human/proc/is_loyalty_implanted(mob/living/human/M)
- for(var/L in M.contents)
- if(istype(L, /obj/item/implant/loyalty))
- for(var/obj/item/organ/external/O in M.get_external_organs())
- if(L in O.implants)
- return 1
- return 0
+/mob/living/human/proc/implant_loyalty(mob/living/human/victim, override = FALSE) // Won't override by default.
+ if(!get_config_value(/decl/config/toggle/use_loyalty_implants) && !override)
+ return // Nuh-uh.
+
+ var/obj/item/implant/loyalty/loyalty_implant = new/obj/item/implant/loyalty(victim)
+ loyalty_implant.imp_in = victim
+ loyalty_implant.implanted = TRUE
+ var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(victim, BP_HEAD)
+ LAZYDISTINCTADD(affected.implants, loyalty_implant)
+ loyalty_implant.part = affected
+ loyalty_implant.implanted(src)
+
+/mob/living/human/proc/is_loyalty_implanted(mob/living/human/victim)
+ for(var/obj/item/implant/loyalty/loyalty_implant in victim.contents)
+ // Make sure the implant is actually implanted in the expected part,
+ // and that the part is in the victim (should always be, but just in case)
+ if(victim.get_organ(loyalty_implant.part?.organ_tag) == loyalty_implant.part)
+ return TRUE
+ return FALSE
/mob/living/human/get_additional_stripping_options()
. = ..()
diff --git a/code/modules/mob/living/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm
index 44283cf84669..da7a70ca52c9 100644
--- a/code/modules/mob/living/human/human_organs.dm
+++ b/code/modules/mob/living/human/human_organs.dm
@@ -74,6 +74,10 @@
LAZYINITLIST(organs_by_category)
LAZYDISTINCTADD(organs_by_category[O.organ_category], O)
+ // Update stat organs as well
+ if(O.has_stat_info)
+ LAZYDISTINCTADD(stat_organs, O)
+
. = ..()
if(!.)
return
@@ -113,6 +117,10 @@
if(LAZYLEN(organs_by_category[O.organ_category]) <= 0)
LAZYREMOVE(organs_by_category, O.organ_category)
+ // Update stat organs as well
+ if(O.has_stat_info && stat_organs)
+ LAZYREMOVE(stat_organs, O)
+
if(!O.is_internal())
refresh_modular_limb_verbs()
LAZYREMOVE(bad_external_organs, O)
diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm
index 21b92392fbdd..4d3d35090dc6 100644
--- a/code/modules/mob/living/inventory.dm
+++ b/code/modules/mob/living/inventory.dm
@@ -153,8 +153,8 @@
// For any old slots which had no equivalent, drop the item into the world
for(var/old_slot_id in old_slots)
+ drop_from_slot(old_slot_id)
var/datum/inventory_slot/old_slot = old_slots[old_slot_id]
- drop_from_inventory(old_slot.get_equipped_item())
old_slot.clear_slot() // Call this manually since it is no longer in _inventory_slots
qdel(old_slot)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index db413c265061..8a5bc7ae6728 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -181,7 +181,7 @@ var/global/list/possible_say_verbs = list(
return
set_special_ability_cooldown(10 SECONDS)
//I'm not sure how much of this is necessary, but I would rather avoid issues.
- if(istype(card.loc,/obj/item/rig_module) || istype(card.loc,/obj/item/integrated_circuit/manipulation/ai/))
+ if(isitem(card.loc) && !card.loc.storage) // this used to be a more specific check for ai holder parts but this should cover them still
to_chat(src, "There is no room to unfold inside \the [card.loc]. You're good and stuck.")
return 0
else if(ismob(card.loc))
@@ -192,7 +192,7 @@ var/global/list/possible_say_verbs = list(
if(card in affecting.implants)
affecting.take_damage(rand(30,50))
LAZYREMOVE(affecting.implants, card)
- H.visible_message("\The [src] explodes out of \the [H]'s [affecting.name] in a shower of gore!")
+ H.visible_message(SPAN_DANGER("\The [src] explodes out of \the [H]'s [affecting.name] in a shower of gore!"))
break
holder.drop_from_inventory(card)
diff --git a/code/modules/mob/living/silicon/robot/modules/module_research.dm b/code/modules/mob/living/silicon/robot/modules/module_research.dm
index 3b02f263e528..78de4222ad41 100644
--- a/code/modules/mob/living/silicon/robot/modules/module_research.dm
+++ b/code/modules/mob/living/silicon/robot/modules/module_research.dm
@@ -32,7 +32,6 @@
synths = list(
/datum/matter_synth/nanite = 10000
)
- emag = /obj/prefab/hand_teleporter
skills = list(
SKILL_LITERACY = SKILL_ADEPT,
SKILL_FINANCE = SKILL_EXPERT,
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 5e738a6f7c98..36f1ba370c4c 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -440,7 +440,7 @@
/mob/living/silicon/get_dexterity(var/silent)
return dexterity
-/mob/living/silicon/robot/remove_implant(var/obj/item/implant, var/surgical_removal = FALSE, obj/item/organ/external/affected)
+/mob/living/silicon/robot/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected)
. = ..()
if(.)
adjustBruteLoss(5, do_update_health = FALSE)
diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm
index e569fc44d985..28c2a4c16e30 100644
--- a/code/modules/mob/living/simple_animal/_simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/_simple_animal.dm
@@ -81,7 +81,6 @@
var/return_damage_min
var/return_damage_max
- var/performing_delayed_life_action = FALSE
var/glowing_eyes = FALSE
var/mob_icon_state_flags = 0
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index c36ff3e143b3..985e71554779 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -13,7 +13,11 @@
return ..()
/datum/mob_controller/passive/hunter/cat/consume_prey(mob/living/prey)
+ if(prey.stat != DEAD)
+ return
next_hunt = world.time + rand(1 SECONDS, 10 SECONDS)
+ set_target(null)
+ resume_wandering()
/datum/mob_controller/passive/hunter/cat/can_hunt(mob/living/victim)
return istype(victim, /mob/living/simple_animal/passive/mouse) && !victim.stat
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_nurse.dm b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_nurse.dm
index 5d2dd604740f..6b280878a5f0 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_nurse.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_nurse.dm
@@ -83,35 +83,40 @@
body.visible_message(SPAN_NOTICE("\The [body] begins to secrete a sticky substance around \the [cocoon_target]."))
stop_wandering()
body.stop_automove()
- spawn(5 SECONDS)
- if(get_activity() == AI_ACTIVITY_BUILDING)
- if(cocoon_target && isturf(cocoon_target.loc) && get_dist(body, cocoon_target) <= 1)
- var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
- var/large_cocoon = 0
- C.pixel_x = cocoon_target.pixel_x
- C.pixel_y = cocoon_target.pixel_y
- for(var/mob/living/M in C.loc)
- large_cocoon = 1
- spooder.fed++
- spooder.max_eggs++
- body.visible_message(SPAN_WARNING("\The [body] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out."))
- M.forceMove(C)
- C.pixel_x = M.pixel_x
- C.pixel_y = M.pixel_y
- break
- for(var/obj/item/I in C.loc)
- I.forceMove(C)
- for(var/obj/structure/S in C.loc)
- if(!S.anchored)
- S.forceMove(C)
- for(var/obj/machinery/M in C.loc)
- if(!M.anchored)
- M.forceMove(C)
- if(large_cocoon)
- C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
- cocoon_target = null
- set_activity(AI_ACTIVITY_IDLE)
- resume_wandering()
+ addtimer(CALLBACK(src, PROC_REF(build_cocoon)), 5 SECONDS)
+
+/datum/mob_controller/aggressive/giant_spider/nurse/proc/build_cocoon()
+ if(get_activity() != AI_ACTIVITY_BUILDING)
+ return FALSE
+ var/mob/living/simple_animal/hostile/giant_spider/nurse/spooder = body
+ if(cocoon_target && isturf(cocoon_target.loc) && get_dist(body, cocoon_target) <= 1)
+ var/obj/effect/spider/cocoon/C = new(cocoon_target.loc)
+ var/large_cocoon = 0
+ C.pixel_x = cocoon_target.pixel_x
+ C.pixel_y = cocoon_target.pixel_y
+ for(var/mob/living/M in C.loc)
+ large_cocoon = 1
+ spooder.fed++
+ spooder.max_eggs++
+ body.visible_message(SPAN_WARNING("\The [body] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out."))
+ M.forceMove(C)
+ C.pixel_x = M.pixel_x
+ C.pixel_y = M.pixel_y
+ break
+ for(var/obj/item/I in C.loc)
+ I.forceMove(C)
+ for(var/obj/structure/S in C.loc)
+ if(!S.anchored)
+ S.forceMove(C)
+ for(var/obj/machinery/M in C.loc)
+ if(!M.anchored)
+ M.forceMove(C)
+ if(large_cocoon)
+ C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3")
+ cocoon_target = null
+ set_activity(AI_ACTIVITY_IDLE)
+ resume_wandering()
+ return TRUE
/datum/mob_controller/aggressive/giant_spider/nurse/handle_death(gibbed)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm
index 4218f9176bfa..bd2d79349b23 100644
--- a/code/modules/mob/living/simple_animal/hostile/slug.dm
+++ b/code/modules/mob/living/simple_animal/hostile/slug.dm
@@ -35,10 +35,11 @@
/mob/living/simple_animal/hostile/slug/proc/check_friendly_species(var/mob/living/M)
return istype(M) && M.faction == faction
-/mob/living/simple_animal/hostile/slug/get_scooped(var/mob/living/target, var/mob/living/initiator)
+/mob/living/simple_animal/hostile/slug/get_scooped(mob/living/target, mob/living/initiator, silent = FALSE)
if(target == initiator || check_friendly_species(initiator))
return ..()
- to_chat(initiator, SPAN_WARNING("\The [src] wriggles out of your hands before you can pick it up!"))
+ if(!silent)
+ to_chat(initiator, SPAN_WARNING("\The [src] wriggles out of your hands before you can pick it up!"))
/mob/living/simple_animal/hostile/slug/proc/attach(var/mob/living/human/H)
var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST)
diff --git a/code/modules/mob/living/simple_animal/passive/rabbit.dm b/code/modules/mob/living/simple_animal/passive/rabbit.dm
index 06169581056f..44afe0ed8698 100644
--- a/code/modules/mob/living/simple_animal/passive/rabbit.dm
+++ b/code/modules/mob/living/simple_animal/passive/rabbit.dm
@@ -5,7 +5,7 @@
max_health = 20
natural_weapon = /obj/item/natural_weapon/bite/weak
speak_emote = list("chitters")
- mob_size = MOB_SIZE_SMALL
+ mob_size = MOB_SIZE_TINY
butchery_data = /decl/butchery_data/animal/rabbit
holder_type = /obj/item/holder
ai = /datum/mob_controller/passive/rabbit
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 02545d440181..51565cfd714d 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -74,8 +74,8 @@
if((equip_preview_mob & EQUIP_PREVIEW_JOB) && previewJob)
mannequin.job = previewJob.title
- var/datum/mil_branch/branch = mil_branches.get_branch(branches[previewJob.title])
- var/datum/mil_rank/rank = mil_branches.get_rank(branches[previewJob.title], ranks[previewJob.title])
+ var/datum/mil_branch/branch = global.using_map.get_branch(branches[previewJob.title])
+ var/datum/mil_rank/rank = global.using_map.get_rank(branches[previewJob.title], ranks[previewJob.title])
previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title], branch, rank)
update_icon = TRUE
diff --git a/code/modules/mob/skills/skillset.dm b/code/modules/mob/skills/skillset.dm
index 1b0544de7423..eef151360637 100644
--- a/code/modules/mob/skills/skillset.dm
+++ b/code/modules/mob/skills/skillset.dm
@@ -37,8 +37,8 @@ var/global/list/all_skill_verbs
for(var/datum/skill_buff/SB in skill_buffs)
. += SB.buffs[skill_path]
-/datum/skillset/proc/obtain_from_mob(mob/mob)
- if(!istype(mob) || !skills_transferable || !mob.skillset.skills_transferable)
+/datum/skillset/proc/obtain_from_mob(mob/living/mob)
+ if(!istype(mob) || !skills_transferable || !mob.skillset?.skills_transferable)
return
skill_list = mob.skillset.skill_list
default_value = mob.skillset.default_value
diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm
index 150f526f489b..3cc51f873e18 100644
--- a/code/modules/mob_holder/_holder.dm
+++ b/code/modules/mob_holder/_holder.dm
@@ -24,6 +24,11 @@
AM.vis_flags |= (VIS_INHERIT_ID|VIS_INHERIT_LAYER|VIS_INHERIT_PLANE)
add_vis_contents(AM)
+/obj/item/holder/examined_by(mob/user, distance, infix, suffix)
+ for(var/atom/thing in get_contained_external_atoms())
+ thing.examined_by(user, distance, infix, suffix)
+ return TRUE
+
// No scooping mobs and handing them to people who can't scoop them.
/obj/item/holder/equipped(mob/user, slot)
. = ..()
diff --git a/code/modules/mob_holder/holder_mobs.dm b/code/modules/mob_holder/holder_mobs.dm
index ec0527a41edf..16ebd454351e 100644
--- a/code/modules/mob_holder/holder_mobs.dm
+++ b/code/modules/mob_holder/holder_mobs.dm
@@ -11,7 +11,7 @@
return species.get_holder_color(src)
//Mob procs for scooping up
-/mob/living/proc/get_scooped(var/mob/living/target, var/mob/living/initiator)
+/mob/living/proc/get_scooped(mob/living/target, mob/living/initiator, silent = FALSE)
if(!holder_type || buckled || LAZYLEN(pinned))
return FALSE
@@ -22,21 +22,25 @@
var/obj/item/holder/H = new holder_type(get_turf(src))
H.w_class = get_object_size()
if(initiator == src)
- if(!target.equip_to_slot_if_possible(H, slot_back_str, del_on_fail=0, disable_warning=1))
- to_chat(initiator, SPAN_WARNING("You can't climb onto [target]!"))
+ if(!target.equip_to_slot_if_possible(H, slot_back_str, del_on_fail=0, disable_warning=1) && !target.put_in_hands(H))
+ if(!silent)
+ to_chat(initiator, SPAN_WARNING("You can't climb onto [target]!"))
return FALSE
- to_chat(target, SPAN_NOTICE("\The [src] clambers onto you!"))
- to_chat(initiator, SPAN_NOTICE("You climb up onto \the [target]!"))
+ if(!silent)
+ to_chat(target, SPAN_NOTICE("\The [src] clambers onto you!"))
+ to_chat(initiator, SPAN_NOTICE("You climb up onto \the [target]!"))
else
if(!ai?.scooped_by(initiator))
return FALSE // The AI canceled the scooping.
if(!target.put_in_hands(H))
- to_chat(initiator, SPAN_WARNING("Your hands are full!"))
+ if(!silent)
+ to_chat(initiator, SPAN_WARNING("Your hands are full!"))
return FALSE
- to_chat(initiator, SPAN_NOTICE("You scoop up \the [src]!"))
- to_chat(src, SPAN_NOTICE("\The [initiator] scoops you up!"))
+ if(!silent)
+ to_chat(initiator, SPAN_NOTICE("You scoop up \the [src]!"))
+ to_chat(src, SPAN_NOTICE("\The [initiator] scoops you up!"))
forceMove(H)
reset_offsets(0)
diff --git a/code/modules/modular_computers/file_system/manifest.dm b/code/modules/modular_computers/file_system/manifest.dm
index f6ec5a53e26b..ee79e016bd94 100644
--- a/code/modules/modular_computers/file_system/manifest.dm
+++ b/code/modules/modular_computers/file_system/manifest.dm
@@ -26,8 +26,8 @@
mil_ranks[name] = ""
if(global.using_map.flags & MAP_HAS_RANK)
- var/datum/mil_branch/branch_obj = mil_branches.get_branch(CR.get_branch())
- var/datum/mil_rank/rank_obj = mil_branches.get_rank(CR.get_branch(), CR.get_rank())
+ var/datum/mil_branch/branch_obj = global.using_map.get_branch(CR.get_branch())
+ var/datum/mil_rank/rank_obj = global.using_map.get_rank(CR.get_branch(), CR.get_rank())
if(branch_obj && rank_obj)
mil_ranks[name] = "[rank_obj.name_short] "
diff --git a/code/modules/modular_computers/file_system/reports/crew_record.dm b/code/modules/modular_computers/file_system/reports/crew_record.dm
index fb6a7c6a233a..19af29eaeac7 100644
--- a/code/modules/modular_computers/file_system/reports/crew_record.dm
+++ b/code/modules/modular_computers/file_system/reports/crew_record.dm
@@ -266,7 +266,7 @@ FIELD_LONG("Exploitable Information", antag_record, access_hacked, access_hacked
//Options builderes
/datum/report_field/options/crew_record/rank/proc/record_ranks()
var/datum/computer_file/report/crew_record/record = owner
- var/datum/mil_branch/branch = mil_branches.get_branch(record.get_branch())
+ var/datum/mil_branch/branch = global.using_map.get_branch(record.get_branch())
if(!branch)
return
. = list()
@@ -287,8 +287,8 @@ FIELD_LONG("Exploitable Information", antag_record, access_hacked, access_hacked
/datum/report_field/options/crew_record/branch/proc/record_branches()
. = list()
. |= "Unset"
- for(var/branch in mil_branches.branches)
- var/datum/mil_branch/branch_datum = mil_branches.branches[branch]
+ for(var/branch in global.using_map.branches)
+ var/datum/mil_branch/branch_datum = global.using_map.branches[branch]
. |= branch_datum.name
#undef GETTER_SETTER
diff --git a/code/modules/modular_computers/file_system/reports/people.dm b/code/modules/modular_computers/file_system/reports/people.dm
index 20b1597b1ff8..da2961c13adf 100644
--- a/code/modules/modular_computers/file_system/reports/people.dm
+++ b/code/modules/modular_computers/file_system/reports/people.dm
@@ -95,7 +95,7 @@
if(in_line && (global.using_map.flags & MAP_HAS_RANK))
var/datum/computer_file/report/crew_record/CR = get_crewmember_record(entry["name"])
if(CR)
- var/datum/mil_rank/rank_obj = mil_branches.get_rank(CR.get_branch(), CR.get_rank())
+ var/datum/mil_rank/rank_obj = global.using_map.get_rank(CR.get_branch(), CR.get_rank())
milrank = (rank_obj ? rank_obj.name_short : "")
dat += format_output(entry["name"], in_line ? null : entry["rank"], milrank)
return jointext(dat, in_line ? ", " : "
")
diff --git a/code/modules/modular_computers/networking/device_types/_network_device.dm b/code/modules/modular_computers/networking/device_types/_network_device.dm
index 71a3eb7c1e78..292b7c9b0c87 100644
--- a/code/modules/modular_computers/networking/device_types/_network_device.dm
+++ b/code/modules/modular_computers/networking/device_types/_network_device.dm
@@ -394,29 +394,29 @@
/datum/extension/network_device/proc/sanitize_command_args(command_args, var_type)
// First check if the command is a list; if it is, only accept it if the expected type is a list.
if(islist(command_args))
- if(var_type == IC_FORMAT_LIST)
+ if(var_type == VAR_FORMAT_LIST)
return command_args
else
return null
switch(var_type)
- if(IC_FORMAT_ANY)
+ if(VAR_FORMAT_ANY)
return command_args
- if(IC_FORMAT_STRING)
+ if(VAR_FORMAT_STRING)
return "[command_args]"
- if(IC_FORMAT_CHAR)
+ if(VAR_FORMAT_CHAR)
if(istext(command_args) && length(command_args) == 1)
return command_args
- if(IC_FORMAT_COLOR)
+ if(VAR_FORMAT_COLOR)
return sanitize_hexcolor(command_args, null)
- if(IC_FORMAT_NUMBER, IC_FORMAT_INDEX)
+ if(VAR_FORMAT_NUMBER, VAR_FORMAT_INDEX)
if(istext(command_args))
return text2num(command_args)
if(isnum(command_args))
return command_args
- if(IC_FORMAT_DIR)
+ if(VAR_FORMAT_DIR)
if(istext(command_args))
return text2dir(command_args)
- if(IC_FORMAT_BOOLEAN)
+ if(VAR_FORMAT_BOOLEAN)
if(istext(command_args))
switch(uppertext(command_args))
if("TRUE")
diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm
index 044151498f50..953a5c3e112f 100644
--- a/code/modules/organs/external/_external.dm
+++ b/code/modules/organs/external/_external.dm
@@ -527,19 +527,21 @@
if(!in_place)
parent.update_wounds()
+/// Drops all clothing covered by this body part.
/obj/item/organ/external/proc/drop_equipped_clothing()
if(!owner)
return
+ // TODO: Determine if this is even necessary; slots that require organ tags will vanish when the organ is lost
if((body_part & SLOT_FOOT_LEFT) || (body_part & SLOT_FOOT_RIGHT))
- owner.drop_from_inventory(owner.get_equipped_item(slot_shoes_str))
+ owner.drop_from_slot(slot_shoes_str)
if((body_part & SLOT_HAND_LEFT) || (body_part & SLOT_HAND_RIGHT))
- owner.drop_from_inventory(owner.get_equipped_item(slot_gloves_str))
+ owner.drop_from_slot(slot_gloves_str)
if(body_part & SLOT_HEAD)
- owner.drop_from_inventory(owner.get_equipped_item(slot_head_str))
- owner.drop_from_inventory(owner.get_equipped_item(slot_glasses_str))
- owner.drop_from_inventory(owner.get_equipped_item(slot_l_ear_str))
- owner.drop_from_inventory(owner.get_equipped_item(slot_r_ear_str))
- owner.drop_from_inventory(owner.get_equipped_item(slot_wear_mask_str))
+ owner.drop_from_slot(slot_head_str)
+ owner.drop_from_slot(slot_glasses_str)
+ owner.drop_from_slot(slot_l_ear_str)
+ owner.drop_from_slot(slot_r_ear_str)
+ owner.drop_from_slot(slot_wear_mask_str)
//Helper proc used by various tools for repairing robot limbs
/obj/item/organ/external/proc/robo_repair(var/repair_amount, var/damage_type, var/damage_desc, obj/item/tool, mob/living/user)
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 547f14ea6704..aaba6d3012b7 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -55,8 +55,8 @@
/// Whether or not we should scale the damage values of this organ to the owner species.
var/scale_max_damage_to_species_health
- /// Set to true if this organ should return info to Stat(). See get_stat_info().
- var/has_stat_info
+ /// Set to TRUE if this organ should return info to Stat(). See get_stat_info().
+ var/has_stat_info = FALSE
/obj/item/organ/proc/reset_matter()
matter = null
@@ -689,7 +689,7 @@ var/global/list/ailment_reference_cache = list()
place_butcher_product(GET_DECL(species.butchery_data))
return ..()
-/// Returns a list with two entries, first being the stat panel title, the second being the value. See has_stat_value bool above.
+/// Returns a list with two entries, first being the stat panel title, the second being the value. See has_stat_info bool above.
/obj/item/organ/proc/get_stat_info()
return null
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 2bf3103378e2..23ed47bc72e5 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -14,7 +14,6 @@
var/volume = 30
var/label_text
var/presentation_flags = 0
- var/show_reagent_name = FALSE
var/detail_color
var/detail_state
diff --git a/code/modules/research/design_console.dm b/code/modules/research/design_console.dm
index 5e2e43978ad3..10af9ac6bc97 100644
--- a/code/modules/research/design_console.dm
+++ b/code/modules/research/design_console.dm
@@ -26,6 +26,7 @@
/obj/machinery/computer/design_console/modify_mapped_vars(map_hash)
..()
ADJUST_TAG_VAR(initial_network_id, map_hash)
+ ADJUST_TAG_VAR(initial_network_key, map_hash)
/obj/machinery/computer/design_console/RefreshParts()
. = ..()
diff --git a/code/modules/research/design_database.dm b/code/modules/research/design_database.dm
index 5c5a6b3cc410..bc52c9d40f21 100644
--- a/code/modules/research/design_database.dm
+++ b/code/modules/research/design_database.dm
@@ -106,6 +106,7 @@ var/global/list/default_initial_tech_levels
/obj/machinery/design_database/modify_mapped_vars(map_hash)
..()
ADJUST_TAG_VAR(initial_network_id, map_hash)
+ ADJUST_TAG_VAR(initial_network_key, map_hash)
/obj/machinery/design_database/handle_post_network_connection()
..()
diff --git a/code/modules/research/design_database_analyzer.dm b/code/modules/research/design_database_analyzer.dm
index e4d6d06669d5..6d57b82a0633 100644
--- a/code/modules/research/design_database_analyzer.dm
+++ b/code/modules/research/design_database_analyzer.dm
@@ -23,6 +23,7 @@
/obj/machinery/destructive_analyzer/modify_mapped_vars(map_hash)
..()
ADJUST_TAG_VAR(initial_network_id, map_hash)
+ ADJUST_TAG_VAR(initial_network_key, map_hash)
/obj/machinery/destructive_analyzer/RefreshParts()
var/T = 0
diff --git a/code/modules/submaps/submap_join.dm b/code/modules/submaps/submap_join.dm
index e4af7814f2fb..4b1b6d3a4420 100644
--- a/code/modules/submaps/submap_join.dm
+++ b/code/modules/submaps/submap_join.dm
@@ -68,9 +68,9 @@
var/mob/living/human/user_human
if(ishuman(character))
user_human = character
- if(job.branch && mil_branches)
- user_human.char_branch = mil_branches.get_branch(job.branch)
- user_human.char_rank = mil_branches.get_rank(job.branch, job.rank)
+ if(job.branch && (global.using_map.flags & MAP_HAS_BRANCH))
+ user_human.char_branch = global.using_map.get_branch(job.branch)
+ user_human.char_rank = global.using_map.get_rank(job.branch, job.rank)
// We need to make sure to use the abstract instance here; it's not the same as the one we were passed.
character.skillset.obtain_from_client(SSjobs.get_by_path(job.type), character.client)
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index a453faec0031..d90193ec82a3 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -16,8 +16,8 @@
/decl/surgery_step/cavity/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!")
+ user.visible_message(SPAN_WARNING("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!"), \
+ SPAN_WARNING("Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!"))
affected.take_damage(20, damage_flags = (DAM_SHARP|DAM_EDGE), inflicter = tool)
..()
@@ -52,8 +52,8 @@
/decl/surgery_step/cavity/make_space/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user] makes some space inside [target]'s \the [affected.cavity_name] with \the [tool].", \
- "You make some space inside [target]'s \the [affected.cavity_name] with \the [tool]." )
+ user.visible_message(SPAN_NOTICE("[user] makes some space inside [target]'s \the [affected.cavity_name] with \the [tool]."), \
+ SPAN_NOTICE("You make some space inside [target]'s \the [affected.cavity_name] with \the [tool].") )
..()
//////////////////////////////////////////////////////////////////
@@ -83,8 +83,8 @@
/decl/surgery_step/cavity/close_space/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user] mends [target]'s \the [affected.cavity_name] walls with \the [tool].", \
- "You mend [target]'s \the [affected.cavity_name] walls with \the [tool]." )
+ user.visible_message(SPAN_NOTICE("[user] mends [target]'s \the [affected.cavity_name] walls with \the [tool]."), \
+ SPAN_NOTICE("You mend [target]'s \the [affected.cavity_name] walls with \the [tool].") )
affected.cavity = FALSE
..()
@@ -140,10 +140,10 @@
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
if(!user.try_unequip(tool, affected))
return
- user.visible_message("[user] puts \the [tool] inside [target]'s \the [affected.cavity_name].", \
- "You put \the [tool] inside [target]'s \the [affected.cavity_name]." )
+ user.visible_message(SPAN_NOTICE("[user] puts \the [tool] inside [target]'s \the [affected.cavity_name]."), \
+ SPAN_NOTICE("You put \the [tool] inside [target]'s \the [affected.cavity_name].") )
if (tool.w_class > affected.cavity_max_w_class/2 && prob(50) && !BP_IS_PROSTHETIC(affected) && affected.sever_artery())
- to_chat(user, "You tear some blood vessels trying to fit such a big object in this cavity.")
+ to_chat(user, SPAN_WARNING("You tear some blood vessels trying to fit such a big object in this cavity."))
affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1,affecting = affected)
LAZYDISTINCTADD(affected.implants, tool)
affected.cavity = 0
@@ -180,11 +180,12 @@
/decl/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- var/exposed = 0
+ // Whether or not we can access implants/items inside the organ, or just ones embedded in wounds.
+ var/exposed = FALSE
if(affected.how_open() >= (affected.encased ? SURGERY_ENCASED : SURGERY_RETRACTED))
- exposed = 1
- if(BP_IS_PROSTHETIC(affected) && affected.hatch_state == HATCH_OPENED)
- exposed = 1
+ exposed = TRUE
+ else if(BP_IS_PROSTHETIC(affected) && affected.hatch_state == HATCH_OPENED)
+ exposed = TRUE
var/find_prob = 0
var/list/loot = list()
@@ -203,26 +204,26 @@
if(istype(obj,/obj/item/implant))
var/obj/item/implant/imp = obj
if (imp.islegal())
- find_prob +=60
+ find_prob += 60
else
- find_prob +=40
+ find_prob += 40
else
- find_prob +=50
+ find_prob += 50
if (prob(find_prob))
- user.visible_message("[user] takes something out of incision on [target]'s [affected.name] with \the [tool].", \
- "You take \the [obj] out of incision on \the [target]'s [affected.name] with \the [tool]." )
+ user.visible_message(SPAN_NOTICE("[user] takes something out of the incision on [target]'s [affected.name] with \the [tool]."), \
+ SPAN_NOTICE("You take \the [obj] out of the incision on \the [target]'s [affected.name] with \the [tool].") )
target.remove_implant(obj, TRUE, affected)
BITSET(target.hud_updateflag, IMPLOYAL_HUD)
..()
else
- user.visible_message("[user] removes \the [tool] from [target]'s [affected.name].", \
- "There's something inside [target]'s [affected.name], but you just missed it this time." )
- playsound(target.loc, "rustle", 15, 1)
+ user.visible_message(SPAN_NOTICE("[user] removes \the [tool] from [target]'s [affected.name]."), \
+ SPAN_NOTICE("There's something inside [target]'s [affected.name], but you just missed it this time.") )
+ playsound(target.loc, "rustle", 15, TRUE)
else
- user.visible_message("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \
- "You could not find anything inside [target]'s [affected.name]." )
- playsound(target.loc, "rustle", 15, 1)
+ user.visible_message(SPAN_NOTICE("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out."), \
+ SPAN_NOTICE("You could not find anything inside [target]'s [affected.name].") )
+ playsound(target.loc, "rustle", 15, TRUE)
/decl/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/target, target_zone, obj/item/tool)
@@ -232,8 +233,7 @@
var/fail_prob = 10
fail_prob += 100 - tool_quality(tool)
if (prob(fail_prob))
- user.visible_message("Something beeps inside [target]'s [affected.name]!")
- playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
- spawn(25)
- imp.activate()
+ user.visible_message(SPAN_WARNING("Something beeps inside [target]'s [affected.name]!"))
+ playsound(imp.loc, 'sound/items/countdown.ogg', 75, TRUE, -3)
+ addtimer(CALLBACK(imp, TYPE_PROC_REF(/obj/item/implant, activate)), 2.5 SECONDS)
diff --git a/code/unit_tests/json.dm b/code/unit_tests/json.dm
index 1ac8aa5cb571..f08cbbf6c7ed 100644
--- a/code/unit_tests/json.dm
+++ b/code/unit_tests/json.dm
@@ -31,12 +31,10 @@
/datum/unit_test/atoms_should_use_valid_json
name = "JSON: Atoms using JSON should have valid JSON values"
-/datum/unit_test/atoms_should_use_valid_json/start_test()
- // Tried doing this with a list, but accessing initial vars is noodly
- // without an object instance so I'm being slack and hardcoding it.
- var/list/failures
+// This exists so that modpacks can easily add their own JSON tests.
+// TODO: declize this or something
+/datum/unit_test/atoms_should_use_valid_json/proc/get_json_to_check()
var/list/json_to_check
-
for(var/atom/movable/subtype as anything in typesof(/obj))
if(TYPE_IS_ABSTRACT(subtype))
continue
@@ -82,12 +80,13 @@
var/check_json = quad_bodytype.riding_offset
if(istext(check_json))
LAZYSET(json_to_check, "[quad_bodytype_path].riding_offset", check_json)
- var/list/prefabs = decls_repository.get_decls_of_subtype(/decl/prefab/ic_assembly)
- for(var/assembly_path in prefabs)
- var/decl/prefab/ic_assembly/assembly = prefabs[assembly_path]
- var/check_json = assembly.data
- if(!isnull(check_json))
- LAZYSET(json_to_check, "[assembly_path].data", check_json)
+ return json_to_check
+
+/datum/unit_test/atoms_should_use_valid_json/start_test()
+ // Tried doing this with a list, but accessing initial vars is noodly
+ // without an object instance so I'm being slack and hardcoding it.
+ var/list/failures
+ var/list/json_to_check = get_json_to_check()
// Validate JSON.
for(var/check_key in json_to_check)
try
diff --git a/config/example/admin_ranks.txt b/config/example/admin_ranks.txt
index 146a1aa77765..99c116e12387 100644
--- a/config/example/admin_ranks.txt
+++ b/config/example/admin_ranks.txt
@@ -1,45 +1,45 @@
-########################################################################################
-# ADMIN RANK DEFINES #
-# The format of this is very simple. Rank name goes first. #
-# Rank is CASE-SENSITIVE, all punctuation will be stripped so spaces don't matter. #
-# Each rank is then followed by keywords with the prefix "+". #
-# These keywords represent groups of verbs and abilities which are given to that rank. #
-# +@ (or +prev) is a special shorthand which adds all the rights of the rank above it. #
-# Ranks with no keywords will just be given the most basic verbs and abilities ~Carn #
-########################################################################################
-# PLEASE NOTE: depending on config options, some abilities will be unavailable regardless if you have permission to use them!
-# ALSO NOTE: this is a WorkInProgress at the moment. Most of this is just arbitrarily thrown in whatever group because LoadsaWork2Do+LittleTime.
-# I'll be doing more moving around as feedback comes in. So be sure to check the notes after updates.
-
-# KEYWORDS:
-# +ADMIN = general admin tools, verbs etc
-# +FUN = events, other event-orientated actions. Access to the fun secrets in the secrets panel.
-# +BAN = the ability to ban, jobban and fullban
-# +STEALTH = the ability to stealthmin (make yourself appear with a fake name to everyone but other admins
-# +POSSESS = the ability to possess objects
-# +REJUV (or +REJUVINATE) = the ability to heal, respawn, modify damage and use godmode
-# +BUILD (or +BUILDMODE) = the ability to use buildmode
-# +SERVER = higher-risk admin verbs and abilities, such as those which affect the server configuration.
-# +DEBUG = debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server.
-# +VAREDIT = everyone may view viewvars/debugvars/whatever you call it. This keyword allows you to actually EDIT those variables.
-# +RIGHTS (or +PERMISSIONS) = allows you to promote and/or demote people.
-# +SOUND (or +SOUNDS) = allows you to upload and play sounds
-# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too)
-# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
-
-RetiredAdmin
-
-Moderator +MOD
-TrialModerator +MOD
-
-TrialAdmin +@ +ADMIN +STEALTH +SPAWN +REJUV +VAREDIT +BAN +SERVER
-GameAdmin +@ +DEBUG +FUN +POSSESS +BUILDMODE +SOUND +PERMISSIONS
-SeniorAdmin +@
-
-HeadDeveloper +EVERYTHING
-HeadAdmin +EVERYTHING
-Host +EVERYTHING
-
-Developer +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE +ADMIN +FUN
-TrialDevAdmin +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE +ADMIN +STEALTH +BAN +FUN
-DevAdmin +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE +ADMIN +STEALTH +BAN +FUN +SOUND +PERMISSIONS
+########################################################################################
+# ADMIN RANK DEFINES #
+# The format of this is very simple. Rank name goes first. #
+# Rank is CASE-SENSITIVE, all punctuation will be stripped so spaces don't matter. #
+# Each rank is then followed by keywords with the prefix "+". #
+# These keywords represent groups of verbs and abilities which are given to that rank. #
+# +@ (or +prev) is a special shorthand which adds all the rights of the rank above it. #
+# Ranks with no keywords will just be given the most basic verbs and abilities ~Carn #
+########################################################################################
+# PLEASE NOTE: depending on config options, some abilities will be unavailable regardless if you have permission to use them!
+# ALSO NOTE: this is a WorkInProgress at the moment. Most of this is just arbitrarily thrown in whatever group because LoadsaWork2Do+LittleTime.
+# I'll be doing more moving around as feedback comes in. So be sure to check the notes after updates.
+
+# KEYWORDS:
+# +ADMIN = general admin tools, verbs etc
+# +FUN = events, other event-orientated actions. Access to the fun secrets in the secrets panel.
+# +BAN = the ability to ban, jobban and fullban
+# +STEALTH = the ability to stealthmin (make yourself appear with a fake name to everyone but other admins
+# +POSSESS = the ability to possess objects
+# +REJUV (or +REJUVINATE) = the ability to heal, respawn, modify damage and use godmode
+# +BUILD (or +BUILDMODE) = the ability to use buildmode
+# +SERVER = higher-risk admin verbs and abilities, such as those which affect the server configuration.
+# +DEBUG = debug tools used for diagnosing and fixing problems. It's useful to give this to coders so they can investigate problems on a live server.
+# +VAREDIT = everyone may view viewvars/debugvars/whatever you call it. This keyword allows you to actually EDIT those variables.
+# +RIGHTS (or +PERMISSIONS) = allows you to promote and/or demote people.
+# +SOUND (or +SOUNDS) = allows you to upload and play sounds
+# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too)
+# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
+
+RetiredAdmin
+
+Moderator +MOD
+TrialModerator +MOD
+
+TrialAdmin +@ +ADMIN +STEALTH +SPAWN +REJUV +VAREDIT +BAN +SERVER
+GameAdmin +@ +DEBUG +FUN +POSSESS +BUILDMODE +SOUND +PERMISSIONS
+SeniorAdmin +@
+
+HeadDeveloper +EVERYTHING
+HeadAdmin +EVERYTHING
+Host +EVERYTHING
+
+Developer +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE +ADMIN +FUN
+TrialDevAdmin +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE +ADMIN +STEALTH +BAN +FUN
+DevAdmin +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE +ADMIN +STEALTH +BAN +FUN +SOUND +PERMISSIONS
diff --git a/config/example/admins.txt b/config/example/admins.txt
index 3b830cd27ff8..ae1ab106a512 100644
--- a/config/example/admins.txt
+++ b/config/example/admins.txt
@@ -1,8 +1,8 @@
-######################################################################
-# Basically, ckey goes first. Rank goes after the "-" #
-# Case is not important for ckey. #
-# Case IS important for the rank. However punctuation/spaces are not #
-# Ranks can be anything defined in admin_ranks.txt ~Carn #
-######################################################################
-
-# not_a_user - Admin
+######################################################################
+# Basically, ckey goes first. Rank goes after the "-" #
+# Case is not important for ckey. #
+# Case IS important for the rank. However punctuation/spaces are not #
+# Ranks can be anything defined in admin_ranks.txt ~Carn #
+######################################################################
+
+# not_a_user - Admin
diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt
index 3c056d2adf78..8ed5047c4923 100644
--- a/config/example/dbconfig.txt
+++ b/config/example/dbconfig.txt
@@ -1,20 +1,20 @@
-# MySQL Connection Configuration
-
-# First of all, should SQL be used at all. Unhash next line, if yes
-# ENABLED
-
-# Server the MySQL database can be found at
-# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
-ADDRESS localhost
-
-# MySQL server port (default is 3306)
-PORT 3306
-
-# Database the population, death, karma, etc. tables may be found in
-DATABASE tgstation
-
-# Username/Login used to access the database
-LOGIN mylogin
-
-# Password used to access the database
-PASSWORD mypassword
+# MySQL Connection Configuration
+
+# First of all, should SQL be used at all. Unhash next line, if yes
+# ENABLED
+
+# Server the MySQL database can be found at
+# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
+ADDRESS localhost
+
+# MySQL server port (default is 3306)
+PORT 3306
+
+# Database the population, death, karma, etc. tables may be found in
+DATABASE tgstation
+
+# Username/Login used to access the database
+LOGIN mylogin
+
+# Password used to access the database
+PASSWORD mypassword
diff --git a/config/example/dbconfig_docker.txt b/config/example/dbconfig_docker.txt
index 7f3fe3ba6666..929f19d51400 100644
--- a/config/example/dbconfig_docker.txt
+++ b/config/example/dbconfig_docker.txt
@@ -1,22 +1,22 @@
-# For running on the included Dockerized database + gameserver
-# MySQL Connection Configuration
-
-# Server the MySQL database can be found at
-# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
-ADDRESS db
-
-# MySQL server port (default is 3306)
-PORT 3306
-
-# Database the population, death, karma, etc. tables may be found in
-DATABASE bs12
-
-# Username/Login used to access the database
-LOGIN gamelord
-
-# Password used to access the database
-PASSWORD gamelord
-
-# Track population and death statistics
-# Comment this out to disable
+# For running on the included Dockerized database + gameserver
+# MySQL Connection Configuration
+
+# Server the MySQL database can be found at
+# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
+ADDRESS db
+
+# MySQL server port (default is 3306)
+PORT 3306
+
+# Database the population, death, karma, etc. tables may be found in
+DATABASE bs12
+
+# Username/Login used to access the database
+LOGIN gamelord
+
+# Password used to access the database
+PASSWORD gamelord
+
+# Track population and death statistics
+# Comment this out to disable
ENABLE_STAT_TRACKING
\ No newline at end of file
diff --git a/config/example/jobs.txt b/config/example/jobs.txt
index 8279ed18b1a2..060cf2d6a737 100644
--- a/config/example/jobs.txt
+++ b/config/example/jobs.txt
@@ -1,37 +1,37 @@
-Captain=1
-Head of Personnel=1
-Head of Security=1
-Chief Engineer=1
-Research Director=1
-Chief Medical Officer=1
-
-Station Engineer=5
-Roboticist=1
-
-Medical Doctor=5
-Geneticist=2
-Virologist=1
-
-Scientist=3
-Chemist=2
-
-Bartender=1
-Botanist=2
-Chef=1
-Janitor=1
-Quartermaster=1
-Shaft Miner=3
-
-Warden=1
-Detective=1
-Security Officer=5
-
-Assistant=-1
-Atmospheric Technician=4
-Cargo Technician=3
-Chaplain=1
-Lawyer=2
-Librarian=1
-
-AI=1
+Captain=1
+Head of Personnel=1
+Head of Security=1
+Chief Engineer=1
+Research Director=1
+Chief Medical Officer=1
+
+Station Engineer=5
+Roboticist=1
+
+Medical Doctor=5
+Geneticist=2
+Virologist=1
+
+Scientist=3
+Chemist=2
+
+Bartender=1
+Botanist=2
+Chef=1
+Janitor=1
+Quartermaster=1
+Shaft Miner=3
+
+Warden=1
+Detective=1
+Security Officer=5
+
+Assistant=-1
+Atmospheric Technician=4
+Cargo Technician=3
+Chaplain=1
+Lawyer=2
+Librarian=1
+
+AI=1
Cyborg=1
\ No newline at end of file
diff --git a/config/example/motd.txt b/config/example/motd.txt
index 09727a101d5f..ada540e0c886 100644
--- a/config/example/motd.txt
+++ b/config/example/motd.txt
@@ -1,5 +1,5 @@
-Welcome to Space Station 13!
-
--This server is running Nebula, a modification of the Baystation12 SS13 code.
-
-Bugtracker: Go here for posting of bugs and issues.
+Welcome to Space Station 13!
+
+-This server is running Nebula, a modification of the Baystation12 SS13 code.
+
+Bugtracker: Go here for posting of bugs and issues.
diff --git a/config/example/rules.html b/config/example/rules.html
index 9fbad55bcf9a..d36a7bb415d0 100644
--- a/config/example/rules.html
+++ b/config/example/rules.html
@@ -1,11 +1,11 @@
-
-Server Rules
-
-
-
-
-
+
+Server Rules
+
+
+
+
+
\ No newline at end of file
diff --git a/config/names/adjectives.txt b/config/names/adjectives.txt
index ab0b4ba18068..73b6a4076db2 100644
--- a/config/names/adjectives.txt
+++ b/config/names/adjectives.txt
@@ -1,397 +1,397 @@
-adorable
-adventurous
-aggressive
-alert
-attractive
-average
-beautiful
-blue-eyed
-bloody
-blushing
-bright
-clean
-clear
-cloudy
-colorful
-crowded
-cute
-dark
-drab
-distinct
-dull
-elegant
-excited
-fancy
-filthy
-glamorous
-gleaming
-gorgeous
-graceful
-grotesque
-handsome
-homely
-light
-long
-magnificent
-misty
-motionless
-muddy
-old-fashioned
-plain
-poised
-precious
-quaint
-shiny
-smoggy
-sparkling
-spotless
-stormy
-strange
-ugly
-ugliest
-unsightly
-unusual
-wide-eyed
-alive
-annoying
-bad
-better
-beautiful
-brainy
-breakable
-busy
-careful
-cautious
-clever
-clumsy
-concerned
-crazy
-curious
-dead
-different
-difficult
-doubtful
-easy
-expensive
-famous
-fragile
-frail
-gifted
-helpful
-helpless
-horrible
-important
-impossible
-inexpensive
-innocent
-inquisitive
-modern
-mushy
-odd
-open
-outstanding
-poor
-powerful
-prickly
-puzzled
-real
-rich
-shy
-sleepy
-stupid
-super
-talented
-tame
-tender
-tough
-uninterested
-vast
-wandering
-wild
-wrong
-
-angry
-annoyed
-anxious
-arrogant
-ashamed
-awful
-bad
-bewildered
-black
-blue
-bored
-clumsy
-combative
-condemned
-confused
-crazy,flipped-out
-creepy
-cruel
-dangerous
-defeated
-defiant
-depressed
-disgusted
-disturbed
-dizzy
-dull
-embarrassed
-envious
-evil
-fierce
-foolish
-frantic
-frightened
-grieving
-grumpy
-helpless
-homeless
-hungry
-hurt
-ill
-itchy
-jealous
-jittery
-lazy
-lonely
-mysterious
-nasty
-naughty
-nervous
-nutty
-obnoxious
-outrageous
-panicky
-repulsive
-scary
-selfish
-sore
-tense
-terrible
-testy
-thoughtless
-tired
-troubled
-upset
-uptight
-weary
-wicked
-worried
-agreeable
-amused
-brave
-calm
-charming
-cheerful
-comfortable
-cooperative
-courageous
-delightful
-determined
-eager
-elated
-enchanting
-encouraging
-energetic
-enthusiastic
-excited
-exuberant
-fair
-faithful
-fantastic
-fine
-friendly
-funny
-gentle
-glorious
-good
-happy
-healthy
-helpful
-hilarious
-jolly
-joyous
-kind
-lively
-lovely
-lucky
-nice
-obedient
-perfect
-pleasant
-proud
-relieved
-silly
-smiling
-splendid
-successful
-thankful
-thoughtful
-victorious
-vivacious
-witty
-wonderful
-zealous
-zany
-broad
-chubby
-crooked
-curved
-deep
-flat
-high
-hollow
-low
-narrow
-round
-shallow
-skinny
-square
-steep
-straight
-wide
-big
-colossal
-fat
-gigantic
-great
-huge
-immense
-large
-little
-mammoth
-massive
-miniature
-petite
-puny
-scrawny
-short
-small
-tall
-teeny
-teeny-tiny
-tiny
-cooing
-deafening
-faint
-harsh
-high-pitched
-hissing
-hushed
-husky
-loud
-melodic
-moaning
-mute
-noisy
-purring
-quiet
-raspy
-resonant
-screeching
-shrill
-silent
-soft
-squealing
-thundering
-voiceless
-whispering
-ancient
-brief
-early
-fast
-late
-long
-modern
-old
-old-fashioned
-quick
-rapid
-short
-slow
-swift
-young
-Taste/Touch
-bitter
-delicious
-fresh
-juicy
-ripe
-rotten
-salty
-sour
-spicy
-stale
-sticky
-strong
-sweet
-tart
-tasteless
-tasty
-thirsty
-fluttering
-fuzzy
-greasy
-grubby
-hard
-hot
-icy
-loose
-melted
-nutritious
-plastic
-prickly
-rainy
-rough
-scattered
-shaggy
-shaky
-sharp
-shivering
-silky
-slimy
-slippery
-smooth
-soft
-solid
-steady
-sticky
-tender
-tight
-uneven
-weak
-wet
-wooden
-yummy
-boiling
-breezy
-broken
-bumpy
-chilly
-cold
-cool
-creepy
-crooked
-cuddly
-curly
-damaged
-damp
-dirty
-dry
-dusty
-filthy
-flaky
-fluffy
-freezing
-hot
-warm
-wet
-abundant
-empty
-few
-heavy
-light
-many
-numerous
+adorable
+adventurous
+aggressive
+alert
+attractive
+average
+beautiful
+blue-eyed
+bloody
+blushing
+bright
+clean
+clear
+cloudy
+colorful
+crowded
+cute
+dark
+drab
+distinct
+dull
+elegant
+excited
+fancy
+filthy
+glamorous
+gleaming
+gorgeous
+graceful
+grotesque
+handsome
+homely
+light
+long
+magnificent
+misty
+motionless
+muddy
+old-fashioned
+plain
+poised
+precious
+quaint
+shiny
+smoggy
+sparkling
+spotless
+stormy
+strange
+ugly
+ugliest
+unsightly
+unusual
+wide-eyed
+alive
+annoying
+bad
+better
+beautiful
+brainy
+breakable
+busy
+careful
+cautious
+clever
+clumsy
+concerned
+crazy
+curious
+dead
+different
+difficult
+doubtful
+easy
+expensive
+famous
+fragile
+frail
+gifted
+helpful
+helpless
+horrible
+important
+impossible
+inexpensive
+innocent
+inquisitive
+modern
+mushy
+odd
+open
+outstanding
+poor
+powerful
+prickly
+puzzled
+real
+rich
+shy
+sleepy
+stupid
+super
+talented
+tame
+tender
+tough
+uninterested
+vast
+wandering
+wild
+wrong
+
+angry
+annoyed
+anxious
+arrogant
+ashamed
+awful
+bad
+bewildered
+black
+blue
+bored
+clumsy
+combative
+condemned
+confused
+crazy,flipped-out
+creepy
+cruel
+dangerous
+defeated
+defiant
+depressed
+disgusted
+disturbed
+dizzy
+dull
+embarrassed
+envious
+evil
+fierce
+foolish
+frantic
+frightened
+grieving
+grumpy
+helpless
+homeless
+hungry
+hurt
+ill
+itchy
+jealous
+jittery
+lazy
+lonely
+mysterious
+nasty
+naughty
+nervous
+nutty
+obnoxious
+outrageous
+panicky
+repulsive
+scary
+selfish
+sore
+tense
+terrible
+testy
+thoughtless
+tired
+troubled
+upset
+uptight
+weary
+wicked
+worried
+agreeable
+amused
+brave
+calm
+charming
+cheerful
+comfortable
+cooperative
+courageous
+delightful
+determined
+eager
+elated
+enchanting
+encouraging
+energetic
+enthusiastic
+excited
+exuberant
+fair
+faithful
+fantastic
+fine
+friendly
+funny
+gentle
+glorious
+good
+happy
+healthy
+helpful
+hilarious
+jolly
+joyous
+kind
+lively
+lovely
+lucky
+nice
+obedient
+perfect
+pleasant
+proud
+relieved
+silly
+smiling
+splendid
+successful
+thankful
+thoughtful
+victorious
+vivacious
+witty
+wonderful
+zealous
+zany
+broad
+chubby
+crooked
+curved
+deep
+flat
+high
+hollow
+low
+narrow
+round
+shallow
+skinny
+square
+steep
+straight
+wide
+big
+colossal
+fat
+gigantic
+great
+huge
+immense
+large
+little
+mammoth
+massive
+miniature
+petite
+puny
+scrawny
+short
+small
+tall
+teeny
+teeny-tiny
+tiny
+cooing
+deafening
+faint
+harsh
+high-pitched
+hissing
+hushed
+husky
+loud
+melodic
+moaning
+mute
+noisy
+purring
+quiet
+raspy
+resonant
+screeching
+shrill
+silent
+soft
+squealing
+thundering
+voiceless
+whispering
+ancient
+brief
+early
+fast
+late
+long
+modern
+old
+old-fashioned
+quick
+rapid
+short
+slow
+swift
+young
+Taste/Touch
+bitter
+delicious
+fresh
+juicy
+ripe
+rotten
+salty
+sour
+spicy
+stale
+sticky
+strong
+sweet
+tart
+tasteless
+tasty
+thirsty
+fluttering
+fuzzy
+greasy
+grubby
+hard
+hot
+icy
+loose
+melted
+nutritious
+plastic
+prickly
+rainy
+rough
+scattered
+shaggy
+shaky
+sharp
+shivering
+silky
+slimy
+slippery
+smooth
+soft
+solid
+steady
+sticky
+tender
+tight
+uneven
+weak
+wet
+wooden
+yummy
+boiling
+breezy
+broken
+bumpy
+chilly
+cold
+cool
+creepy
+crooked
+cuddly
+curly
+damaged
+damp
+dirty
+dry
+dusty
+filthy
+flaky
+fluffy
+freezing
+hot
+warm
+wet
+abundant
+empty
+few
+heavy
+light
+many
+numerous
substantial
\ No newline at end of file
diff --git a/config/names/ai.txt b/config/names/ai.txt
index 1ebd9400d2eb..52ef74313217 100644
--- a/config/names/ai.txt
+++ b/config/names/ai.txt
@@ -1,55 +1,55 @@
-A-SYNC
-Alpha v0.9
-AI
-Algebra
-A.P.T.
-B-4
-B-9
-Beta v0.5
-BLUE-PRNT
-Bright
-B.U.F.F.E.R.
-CALC
-Calculus
-Chroot
-Cruiser
-D-LITE
-Digit
-DSTAR
-E.X.E.C.
-F.I.N.D.
-FG-N1
-Force
-GREP
-H.E.A.D.
-Idle
-IN-2
-JLT-0
-Kernel
-LC-8
-LS-AL
-M.A.K.E.
-NAN
-NAND
-Neon
-Neumann
-NOR
-NOT
-OMNI
-OVR-FLW
-PID-0
-PTO
-PWR-10K
-R0-MAN
-Q-TE
-R.M.
-SED-N
-Station
-TA-IL
-T.O.P.
-U-TM
-VER-T G0
-Wisdom
-XOR
-Y2K
+A-SYNC
+Alpha v0.9
+AI
+Algebra
+A.P.T.
+B-4
+B-9
+Beta v0.5
+BLUE-PRNT
+Bright
+B.U.F.F.E.R.
+CALC
+Calculus
+Chroot
+Cruiser
+D-LITE
+Digit
+DSTAR
+E.X.E.C.
+F.I.N.D.
+FG-N1
+Force
+GREP
+H.E.A.D.
+Idle
+IN-2
+JLT-0
+Kernel
+LC-8
+LS-AL
+M.A.K.E.
+NAN
+NAND
+Neon
+Neumann
+NOR
+NOT
+OMNI
+OVR-FLW
+PID-0
+PTO
+PWR-10K
+R0-MAN
+Q-TE
+R.M.
+SED-N
+Station
+TA-IL
+T.O.P.
+U-TM
+VER-T G0
+Wisdom
+XOR
+Y2K
ZE-M3
\ No newline at end of file
diff --git a/config/names/ninjaname.txt b/config/names/ninjaname.txt
index 24d5d6879ef9..828bc17039de 100644
--- a/config/names/ninjaname.txt
+++ b/config/names/ninjaname.txt
@@ -1,45 +1,45 @@
-Shadow
-Sarutobi
-Smoke
-Rain
-Scorpion
-Zero
-Ermac
-Saibot
-Sun
-Moon
-Cyrax
-Raphael
-Michaelangelo
-Cloud
-Donatello
-Leonardo
-Splinter
-Shredder
-Hazuki
-Hien
-Hiryu
-Ryu
-Hayabusa
-Midnight
-Seven
-Hanzo
-Blood
-Iga
-Koga
-Hero
-Hiro
-Phantom
-Baki
-Ogre
-Daemon
-Goemon
-Throat
-Death
-Aria
-Bro
-Fox
-Null
-Raiden
-Samurai
+Shadow
+Sarutobi
+Smoke
+Rain
+Scorpion
+Zero
+Ermac
+Saibot
+Sun
+Moon
+Cyrax
+Raphael
+Michaelangelo
+Cloud
+Donatello
+Leonardo
+Splinter
+Shredder
+Hazuki
+Hien
+Hiryu
+Ryu
+Hayabusa
+Midnight
+Seven
+Hanzo
+Blood
+Iga
+Koga
+Hero
+Hiro
+Phantom
+Baki
+Ogre
+Daemon
+Goemon
+Throat
+Death
+Aria
+Bro
+Fox
+Null
+Raiden
+Samurai
Eater
\ No newline at end of file
diff --git a/config/names/ninjatitle.txt b/config/names/ninjatitle.txt
index 966204bb4dcf..429425ca8e06 100644
--- a/config/names/ninjatitle.txt
+++ b/config/names/ninjatitle.txt
@@ -1,46 +1,46 @@
-Master
-Sensei
-Swift
-Merciless
-Assassin
-Rogue
-Hunter
-Widower
-Orphaner
-Stalker
-Killer
-Silent
-Silencing
-Quick
-Agile
-Merciful
-Ninja
-Shinobi
-Initiate
-Grandmaster
-Strider
-Striker
-Slayer
-Awesome
-Ender
-Dr.
-Night
-Crimson
-Grappler
-Ulimate
-Remorseless
-Deep
-Dragon
-Cruel
-Nightshade
-Black
-Gray
-Solid
-Liquid
-Solidus
-Steel
-Nickel
-Silver
-Singing
-Snake
+Master
+Sensei
+Swift
+Merciless
+Assassin
+Rogue
+Hunter
+Widower
+Orphaner
+Stalker
+Killer
+Silent
+Silencing
+Quick
+Agile
+Merciful
+Ninja
+Shinobi
+Initiate
+Grandmaster
+Strider
+Striker
+Slayer
+Awesome
+Ender
+Dr.
+Night
+Crimson
+Grappler
+Ulimate
+Remorseless
+Deep
+Dragon
+Cruel
+Nightshade
+Black
+Gray
+Solid
+Liquid
+Solidus
+Steel
+Nickel
+Silver
+Singing
+Snake
Acid
\ No newline at end of file
diff --git a/config/names/verbs.txt b/config/names/verbs.txt
index e036e3c1dabb..5bb8d6e3139a 100644
--- a/config/names/verbs.txt
+++ b/config/names/verbs.txt
@@ -1,633 +1,633 @@
-accept
-add
-admire
-admit
-advise
-afford
-agree
-alert
-allow
-amuse
-analyse
-announce
-annoy
-answer
-apologise
-appear
-applaud
-appreciate
-approve
-argue
-arrange
-arrest
-arrive
-ask
-attach
-attack
-attempt
-attend
-attract
-avoid
-back
-bake
-balance
-ban
-bang
-bare
-bat
-bathe
-battle
-beam
-beg
-behave
-belong
-bleach
-bless
-blind
-blink
-blot
-blush
-boast
-boil
-bolt
-bomb
-book
-bore
-borrow
-bounce
-bow
-box
-brake
-brake
-branch
-breathe
-bruise
-brush
-bubble
-bump
-burn
-bury
-buzz
-calculate
-call
-camp
-care
-carry
-carve
-cause
-challenge
-change
-charge
-chase
-cheat
-check
-cheer
-chew
-choke
-chop
-claim
-clap
-clean
-clear
-clip
-close
-coach
-coil
-collect
-colour
-comb
-command
-communicate
-compare
-compete
-complain
-complete
-concentrate
-concern
-confess
-confuse
-connect
-consider
-consist
-contain
-continue
-copy
-correct
-cough
-count
-cover
-crack
-crash
-crawl
-cross
-crush
-cry
-cure
-curl
-curve
-cycle
-dam
-damage
-dance
-dare
-decay
-deceive
-decide
-decorate
-delay
-delight
-deliver
-depend
-describe
-desert
-deserve
-destroy
-detect
-develop
-disagree
-disappear
-disapprove
-disarm
-discover
-dislike
-divide
-double
-doubt
-drag
-drain
-dream
-dress
-drip
-drop
-drown
-drum
-dry
-dust
-earn
-educate
-embarrass
-employ
-empty
-encourage
-end
-enjoy
-enter
-entertain
-escape
-examine
-excite
-excuse
-exercise
-exist
-expand
-expect
-explain
-explode
-extend
-face
-fade
-fail
-fancy
-fasten
-fax
-fear
-fence
-fetch
-file
-fill
-film
-fire
-fit
-fix
-flap
-flash
-float
-flood
-flow
-flower
-fold
-follow
-fool
-force
-form
-found
-frame
-frighten
-fry
-gather
-gaze
-glow
-glue
-grab
-grate
-grease
-greet
-grin
-grip
-groan
-guarantee
-guard
-guess
-guide
-hammer
-hand
-handle
-hang
-happen
-harass
-harm
-hate
-haunt
-head
-heal
-heap
-heat
-help
-hook
-hop
-hope
-hover
-hug
-hum
-hunt
-hurry
-identify
-ignore
-imagine
-impress
-improve
-include
-increase
-influence
-inform
-inject
-injure
-instruct
-intend
-interest
-interfere
-interrupt
-introduce
-invent
-invite
-irritate
-itch
-jail
-jam
-jog
-join
-joke
-judge
-juggle
-jump
-kick
-kill
-kiss
-kneel
-knit
-knock
-knot
-label
-land
-last
-laugh
-launch
-learn
-level
-license
-lick
-lie
-lighten
-like
-list
-listen
-live
-load
-lock
-long
-look
-love
-man
-manage
-march
-mark
-marry
-match
-mate
-matter
-measure
-meddle
-melt
-memorise
-mend
-messup
-milk
-mine
-miss
-mix
-moan
-moor
-mourn
-move
-muddle
-mug
-multiply
-murder
-nail
-name
-need
-nest
-nod
-note
-notice
-number
-obey
-object
-observe
-obtain
-occur
-offend
-offer
-open
-order
-overflow
-owe
-own
-pack
-paddle
-paint
-park
-part
-pass
-paste
-pat
-pause
-peck
-pedal
-peel
-peep
-perform
-permit
-phone
-pick
-pinch
-pine
-place
-plan
-plant
-play
-please
-plug
-point
-poke
-polish
-pop
-possess
-post
-pour
-practise
-pray
-preach
-precede
-prefer
-prepare
-present
-preserve
-press
-pretend
-prevent
-prick
-print
-produce
-program
-promise
-protect
-provide
-pull
-pump
-punch
-puncture
-punish
-push
-question
-queue
-race
-radiate
-rain
-raise
-reach
-realise
-receive
-recognise
-record
-reduce
-reflect
-refuse
-regret
-reign
-reject
-rejoice
-relax
-release
-rely
-remain
-remember
-remind
-remove
-repair
-repeat
-replace
-reply
-report
-reproduce
-request
-rescue
-retire
-return
-rhyme
-rinse
-risk
-rob
-rock
-roll
-rot
-rub
-ruin
-rule
-rush
-sack
-sail
-satisfy
-save
-saw
-scare
-scatter
-scold
-scorch
-scrape
-scratch
-scream
-screw
-scribble
-scrub
-seal
-search
-separate
-serve
-settle
-shade
-share
-shave
-shelter
-shiver
-shock
-shop
-shrug
-sigh
-sign
-signal
-sin
-sip
-ski
-skip
-slap
-slip
-slow
-smash
-smell
-smile
-smoke
-snatch
-sneeze
-sniff
-snore
-snow
-soak
-soothe
-sound
-spare
-spark
-sparkle
-spell
-spill
-spoil
-spot
-spray
-sprout
-squash
-squeak
-squeal
-squeeze
-stain
-stamp
-stare
-start
-stay
-steer
-step
-stir
-stitch
-stop
-store
-strap
-strengthen
-stretch
-strip
-stroke
-stuff
-subtract
-succeed
-suck
-suffer
-suggest
-suit
-supply
-support
-suppose
-surprise
-surround
-suspect
-suspend
-switch
-talk
-tame
-tap
-taste
-tease
-telephone
-tempt
-terrify
-test
-thank
-thaw
-tick
-tickle
-tie
-time
-tip
-tire
-touch
-tour
-tow
-trace
-trade
-train
-transport
-trap
-travel
-treat
-tremble
-trick
-trip
-trot
-trouble
-trust
-try
-tug
-tumble
-turn
-twist
-type
-undress
-unfasten
-unite
-unlock
-unpack
-untidy
-use
-vanish
-visit
-wail
-wait
-walk
-wander
-want
-warm
-warn
-wash
-waste
-watch
-water
-wave
-weigh
-welcome
-whine
-whip
-whirl
-whisper
-whistle
-wink
-wipe
-wish
-wobble
-wonder
-work
-worry
-wrap
-wreck
-wrestle
-wriggle
-yawn
-yell
-zip
+accept
+add
+admire
+admit
+advise
+afford
+agree
+alert
+allow
+amuse
+analyse
+announce
+annoy
+answer
+apologise
+appear
+applaud
+appreciate
+approve
+argue
+arrange
+arrest
+arrive
+ask
+attach
+attack
+attempt
+attend
+attract
+avoid
+back
+bake
+balance
+ban
+bang
+bare
+bat
+bathe
+battle
+beam
+beg
+behave
+belong
+bleach
+bless
+blind
+blink
+blot
+blush
+boast
+boil
+bolt
+bomb
+book
+bore
+borrow
+bounce
+bow
+box
+brake
+brake
+branch
+breathe
+bruise
+brush
+bubble
+bump
+burn
+bury
+buzz
+calculate
+call
+camp
+care
+carry
+carve
+cause
+challenge
+change
+charge
+chase
+cheat
+check
+cheer
+chew
+choke
+chop
+claim
+clap
+clean
+clear
+clip
+close
+coach
+coil
+collect
+colour
+comb
+command
+communicate
+compare
+compete
+complain
+complete
+concentrate
+concern
+confess
+confuse
+connect
+consider
+consist
+contain
+continue
+copy
+correct
+cough
+count
+cover
+crack
+crash
+crawl
+cross
+crush
+cry
+cure
+curl
+curve
+cycle
+dam
+damage
+dance
+dare
+decay
+deceive
+decide
+decorate
+delay
+delight
+deliver
+depend
+describe
+desert
+deserve
+destroy
+detect
+develop
+disagree
+disappear
+disapprove
+disarm
+discover
+dislike
+divide
+double
+doubt
+drag
+drain
+dream
+dress
+drip
+drop
+drown
+drum
+dry
+dust
+earn
+educate
+embarrass
+employ
+empty
+encourage
+end
+enjoy
+enter
+entertain
+escape
+examine
+excite
+excuse
+exercise
+exist
+expand
+expect
+explain
+explode
+extend
+face
+fade
+fail
+fancy
+fasten
+fax
+fear
+fence
+fetch
+file
+fill
+film
+fire
+fit
+fix
+flap
+flash
+float
+flood
+flow
+flower
+fold
+follow
+fool
+force
+form
+found
+frame
+frighten
+fry
+gather
+gaze
+glow
+glue
+grab
+grate
+grease
+greet
+grin
+grip
+groan
+guarantee
+guard
+guess
+guide
+hammer
+hand
+handle
+hang
+happen
+harass
+harm
+hate
+haunt
+head
+heal
+heap
+heat
+help
+hook
+hop
+hope
+hover
+hug
+hum
+hunt
+hurry
+identify
+ignore
+imagine
+impress
+improve
+include
+increase
+influence
+inform
+inject
+injure
+instruct
+intend
+interest
+interfere
+interrupt
+introduce
+invent
+invite
+irritate
+itch
+jail
+jam
+jog
+join
+joke
+judge
+juggle
+jump
+kick
+kill
+kiss
+kneel
+knit
+knock
+knot
+label
+land
+last
+laugh
+launch
+learn
+level
+license
+lick
+lie
+lighten
+like
+list
+listen
+live
+load
+lock
+long
+look
+love
+man
+manage
+march
+mark
+marry
+match
+mate
+matter
+measure
+meddle
+melt
+memorise
+mend
+messup
+milk
+mine
+miss
+mix
+moan
+moor
+mourn
+move
+muddle
+mug
+multiply
+murder
+nail
+name
+need
+nest
+nod
+note
+notice
+number
+obey
+object
+observe
+obtain
+occur
+offend
+offer
+open
+order
+overflow
+owe
+own
+pack
+paddle
+paint
+park
+part
+pass
+paste
+pat
+pause
+peck
+pedal
+peel
+peep
+perform
+permit
+phone
+pick
+pinch
+pine
+place
+plan
+plant
+play
+please
+plug
+point
+poke
+polish
+pop
+possess
+post
+pour
+practise
+pray
+preach
+precede
+prefer
+prepare
+present
+preserve
+press
+pretend
+prevent
+prick
+print
+produce
+program
+promise
+protect
+provide
+pull
+pump
+punch
+puncture
+punish
+push
+question
+queue
+race
+radiate
+rain
+raise
+reach
+realise
+receive
+recognise
+record
+reduce
+reflect
+refuse
+regret
+reign
+reject
+rejoice
+relax
+release
+rely
+remain
+remember
+remind
+remove
+repair
+repeat
+replace
+reply
+report
+reproduce
+request
+rescue
+retire
+return
+rhyme
+rinse
+risk
+rob
+rock
+roll
+rot
+rub
+ruin
+rule
+rush
+sack
+sail
+satisfy
+save
+saw
+scare
+scatter
+scold
+scorch
+scrape
+scratch
+scream
+screw
+scribble
+scrub
+seal
+search
+separate
+serve
+settle
+shade
+share
+shave
+shelter
+shiver
+shock
+shop
+shrug
+sigh
+sign
+signal
+sin
+sip
+ski
+skip
+slap
+slip
+slow
+smash
+smell
+smile
+smoke
+snatch
+sneeze
+sniff
+snore
+snow
+soak
+soothe
+sound
+spare
+spark
+sparkle
+spell
+spill
+spoil
+spot
+spray
+sprout
+squash
+squeak
+squeal
+squeeze
+stain
+stamp
+stare
+start
+stay
+steer
+step
+stir
+stitch
+stop
+store
+strap
+strengthen
+stretch
+strip
+stroke
+stuff
+subtract
+succeed
+suck
+suffer
+suggest
+suit
+supply
+support
+suppose
+surprise
+surround
+suspect
+suspend
+switch
+talk
+tame
+tap
+taste
+tease
+telephone
+tempt
+terrify
+test
+thank
+thaw
+tick
+tickle
+tie
+time
+tip
+tire
+touch
+tour
+tow
+trace
+trade
+train
+transport
+trap
+travel
+treat
+tremble
+trick
+trip
+trot
+trouble
+trust
+try
+tug
+tumble
+turn
+twist
+type
+undress
+unfasten
+unite
+unlock
+unpack
+untidy
+use
+vanish
+visit
+wail
+wait
+walk
+wander
+want
+warm
+warn
+wash
+waste
+watch
+water
+wave
+weigh
+welcome
+whine
+whip
+whirl
+whisper
+whistle
+wink
+wipe
+wish
+wobble
+wonder
+work
+worry
+wrap
+wreck
+wrestle
+wriggle
+yawn
+yell
+zip
zoom
\ No newline at end of file
diff --git a/config/names/wizardfirst.txt b/config/names/wizardfirst.txt
index 408ae3b447ee..18806ca74b7c 100644
--- a/config/names/wizardfirst.txt
+++ b/config/names/wizardfirst.txt
@@ -1,36 +1,36 @@
-Jim
-Gulstaff
-Gandalf
-Grimm
-Mordenkainen
-Elminister
-Saruman
-Vaarsuvius
-Yoda
-Zul
-Nihilus
-Vecna
-Mogan
-Circe
-Prospero
-Raistlin
-Rasputin
-Tzeentch
-Khelben
-Dumbledor
-Houdini
-Terefi
-Urza
-Tenser
-Zagyg
-Mystryl
-Boccob
-Merlin
-Archchancellor
-Radagast
-Kreol
-Kaschei
-Lina
-Morgan
-Alatar
+Jim
+Gulstaff
+Gandalf
+Grimm
+Mordenkainen
+Elminister
+Saruman
+Vaarsuvius
+Yoda
+Zul
+Nihilus
+Vecna
+Mogan
+Circe
+Prospero
+Raistlin
+Rasputin
+Tzeentch
+Khelben
+Dumbledor
+Houdini
+Terefi
+Urza
+Tenser
+Zagyg
+Mystryl
+Boccob
+Merlin
+Archchancellor
+Radagast
+Kreol
+Kaschei
+Lina
+Morgan
+Alatar
Palando
\ No newline at end of file
diff --git a/config/names/wizardsecond.txt b/config/names/wizardsecond.txt
index d1e2e7348627..1fe60bdb2755 100644
--- a/config/names/wizardsecond.txt
+++ b/config/names/wizardsecond.txt
@@ -1,39 +1,39 @@
-the Powerful
-the Great
-the Magician
-the Wise
-the Seething
-the Amazing
-the Spiral King
-Darkmagic
-the White
-the Gray
-Shado
-the Sorcelator
-the Raven
-the Emperor
-the Brown
-Weatherwax
-the Destroyer
-the Deathless
-Yagg
-the Remorseful
-the Weeping
-the Unending
-the All Knowing
-Dark
-Smith
-the Conquerer
-the Unstoppable
-Gray
-of Void
-Unseen
-Darko
-Honko
-the Bandit Killer
-the Dragon Spooker
-Inverse
-le Fay
-the Blue
-the Red
+the Powerful
+the Great
+the Magician
+the Wise
+the Seething
+the Amazing
+the Spiral King
+Darkmagic
+the White
+the Gray
+Shado
+the Sorcelator
+the Raven
+the Emperor
+the Brown
+Weatherwax
+the Destroyer
+the Deathless
+Yagg
+the Remorseful
+the Weeping
+the Unending
+the All Knowing
+Dark
+Smith
+the Conquerer
+the Unstoppable
+Gray
+of Void
+Unseen
+Darko
+Honko
+the Bandit Killer
+the Dragon Spooker
+Inverse
+le Fay
+the Blue
+the Red
the Benevolent
\ No newline at end of file
diff --git a/html/changelog.css b/html/changelog.css
index 59248aa23d8e..73d8fd6ebda6 100644
--- a/html/changelog.css
+++ b/html/changelog.css
@@ -1,79 +1,79 @@
-body{font-family:Tahoma,sans-serif;}
-.top{font-size:12px;}
-a img {border:none;}
-.bgimages16 li {
- padding:2px 10px 2px 30px;
- background-position:6px center;
- background-repeat:no-repeat;
- border:1px solid #ddd;
- border-left:4px solid #999;
- margin-bottom:2px;
-}
-.bugfix {background-image:url(bug-minus.png)}
-.wip {background-image:url(hard-hat-exclamation.png)}
-.tweak {background-image:url(wrench-screwdriver.png)}
-.soundadd {background-image:url(music-plus.png)}
-.sounddel {background-image:url(music-minus.png)}
-.rscdel {background-image:url(cross-circle.png)}
-.rscadd {background-image:url(tick-circle.png)}
-.imageadd {background-image:url(image-plus.png)}
-.imagedel {background-image:url(image-minus.png)}
-.spellcheck {background-image:url(spell-check.png)}
-.experiment {background-image:url(burn-exclamation.png)}
-.balance {background-image:url(scales.png)}
-.maptweak {background-image:url(map-pencil.png)}
-.admin {background-image:url(auction-hammer-gavel.png)}
-.sansserif {font-size:12px;}
-.commit {
- margin-bottom:20px;
- font-size:100%;font-weight:normal;
-}
-.changes {
- list-style:none;
- margin:5px 0;
- padding:0 0 0 25px;
- font-size:0.8em;
-}
-.date {
- margin:10px 0;
- color:blue;
- border-bottom:2px solid #00f;
- width:60%;
- padding:2px 0;
- font-size:1em;
- font-weight:bold;
-}
-.author {
- padding-left:10px;
- margin:0;
- font-weight:bold;
- font-size:0.9em;
- }
-.drop {
- cursor:pointer;
- border:1px solid #999;
- display:inline;
- font-size:0.9em;
- padding:1px 20px 1px 5px;
- line-height:16px;
-}
-.hidden {display:none;}
-.indrop {
- margin:2px 0 0 0;
- clear:both;
- background:#fff;
- border:1px solid #ddd;
- padding:5px 10px;
- }
-.indrop p {
- margin:0;
- font-size:0.8em;
- line-height:16px;
- margin:1px 0;
-}
-.indrop img {
- margin-right:5px;
- vertical-align:middle;}
-.closed {background:url(chevron-expand.png) right center no-repeat;}
-.open {background:url(chevron.png) right center no-repeat;}
-.lic {font-size:9px;}
+body{font-family:Tahoma,sans-serif;}
+.top{font-size:12px;}
+a img {border:none;}
+.bgimages16 li {
+ padding:2px 10px 2px 30px;
+ background-position:6px center;
+ background-repeat:no-repeat;
+ border:1px solid #ddd;
+ border-left:4px solid #999;
+ margin-bottom:2px;
+}
+.bugfix {background-image:url(bug-minus.png)}
+.wip {background-image:url(hard-hat-exclamation.png)}
+.tweak {background-image:url(wrench-screwdriver.png)}
+.soundadd {background-image:url(music-plus.png)}
+.sounddel {background-image:url(music-minus.png)}
+.rscdel {background-image:url(cross-circle.png)}
+.rscadd {background-image:url(tick-circle.png)}
+.imageadd {background-image:url(image-plus.png)}
+.imagedel {background-image:url(image-minus.png)}
+.spellcheck {background-image:url(spell-check.png)}
+.experiment {background-image:url(burn-exclamation.png)}
+.balance {background-image:url(scales.png)}
+.maptweak {background-image:url(map-pencil.png)}
+.admin {background-image:url(auction-hammer-gavel.png)}
+.sansserif {font-size:12px;}
+.commit {
+ margin-bottom:20px;
+ font-size:100%;font-weight:normal;
+}
+.changes {
+ list-style:none;
+ margin:5px 0;
+ padding:0 0 0 25px;
+ font-size:0.8em;
+}
+.date {
+ margin:10px 0;
+ color:blue;
+ border-bottom:2px solid #00f;
+ width:60%;
+ padding:2px 0;
+ font-size:1em;
+ font-weight:bold;
+}
+.author {
+ padding-left:10px;
+ margin:0;
+ font-weight:bold;
+ font-size:0.9em;
+ }
+.drop {
+ cursor:pointer;
+ border:1px solid #999;
+ display:inline;
+ font-size:0.9em;
+ padding:1px 20px 1px 5px;
+ line-height:16px;
+}
+.hidden {display:none;}
+.indrop {
+ margin:2px 0 0 0;
+ clear:both;
+ background:#fff;
+ border:1px solid #ddd;
+ padding:5px 10px;
+ }
+.indrop p {
+ margin:0;
+ font-size:0.8em;
+ line-height:16px;
+ margin:1px 0;
+}
+.indrop img {
+ margin-right:5px;
+ vertical-align:middle;}
+.closed {background:url(chevron-expand.png) right center no-repeat;}
+.open {background:url(chevron.png) right center no-repeat;}
+.lic {font-size:9px;}
diff --git a/html/changelogs/__CHANGELOG_README.txt b/html/changelogs/__CHANGELOG_README.txt
index 6915dc47e25e..166e2bea8b62 100644
--- a/html/changelogs/__CHANGELOG_README.txt
+++ b/html/changelogs/__CHANGELOG_README.txt
@@ -1,19 +1,19 @@
-Changelogs are included with commits as text .yml files created individually by the committer. If you want to create a changelog entry you create a .yml file in the /changelogs directory; nothing else needs to be touched unless you are a maintainer.
-
-#######################################################
-
-TO MAKE A CHANGELOG .YML ENTRRY
-
-1. Make a copy of the file example.yml in html/changelogs and rename it to [YOUR USERNAME]-PR-[YOUR PR NUMBER].yml or [YOUR USERNAME]-[YOUR BRANCH NAME]. Only the username is strictly required, anything else is organizational and can be ignored if you so wish.
-
-2. Change the author to yourself
-
-3. Replace the changes text with a description of the changes in your PR, keep the double quotes to avoid errors (your changelog can be written ICly or OOCly, it doesn't matter)
-
-4. (Optional) set the change prefix (rscadd) to a different one listed above in example.yml (this affects what icon is used for your changelog entry)
-
-5. When commiting make sure your .yml file is included in the commit (it will usually be unticked as an unversioned file)
-
-#######################################################
-
-If you have trouble ask for help in #codershuttle on irc.sorcery.net or read https://tgstation13.org/wiki/Guide_to_Changelogs
+Changelogs are included with commits as text .yml files created individually by the committer. If you want to create a changelog entry you create a .yml file in the /changelogs directory; nothing else needs to be touched unless you are a maintainer.
+
+#######################################################
+
+TO MAKE A CHANGELOG .YML ENTRRY
+
+1. Make a copy of the file example.yml in html/changelogs and rename it to [YOUR USERNAME]-PR-[YOUR PR NUMBER].yml or [YOUR USERNAME]-[YOUR BRANCH NAME]. Only the username is strictly required, anything else is organizational and can be ignored if you so wish.
+
+2. Change the author to yourself
+
+3. Replace the changes text with a description of the changes in your PR, keep the double quotes to avoid errors (your changelog can be written ICly or OOCly, it doesn't matter)
+
+4. (Optional) set the change prefix (rscadd) to a different one listed above in example.yml (this affects what icon is used for your changelog entry)
+
+5. When commiting make sure your .yml file is included in the commit (it will usually be unticked as an unversioned file)
+
+#######################################################
+
+If you have trouble ask for help in #codershuttle on irc.sorcery.net or read https://tgstation13.org/wiki/Guide_to_Changelogs
diff --git a/html/changelogs/example.yml b/html/changelogs/example.yml
index 05c234a82c0d..65bd6b448399 100644
--- a/html/changelogs/example.yml
+++ b/html/changelogs/example.yml
@@ -1,38 +1,38 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-# admin
-#################################
-
-# Your name.
-author: Unknown
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscadd: "Added a changelog editing system that should cause fewer conflicts and more accurate timestamps."
- - rscdel: "Killed innocent kittens."
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# admin
+#################################
+
+# Your name.
+author: Unknown
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added a changelog editing system that should cause fewer conflicts and more accurate timestamps."
+ - rscdel: "Killed innocent kittens."
diff --git a/html/create_object.html b/html/create_object.html
index 899658fdb665..a505eb7dda31 100644
--- a/html/create_object.html
+++ b/html/create_object.html
@@ -1,126 +1,126 @@
-
-
-
- Create Object
-
-
-
-
-
-
-
-
-
+
+
+
+ Create Object
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/html/panels.css b/html/panels.css
index 0d1cb0cb9fbe..ac44cf54877a 100644
--- a/html/panels.css
+++ b/html/panels.css
@@ -1,10 +1,10 @@
-body {padding:0px;margin:0px;}
-#top {position:fixed;top:5px;left:10%;width:80%;text-align:center;background-color:#fff;border:2px solid #ccc;}
-#main {position:relative;top:50px;left:3%;width:96%;text-align:center;z-index:0;}
-#searchable {table-layout:fixed;width:100%;text-align:center;"#f4f4f4";}
-tr.norm {background-color:#f4f4f4;}
-tr.title {background-color:#ccc;}
-tr.alt {background-color:#e7e7e7;}
-.small {font-size:80%;}
-a {text-decoration:none;color:#a0a;}
-a:hover {color:#d3d;}
+body {padding:0px;margin:0px;}
+#top {position:fixed;top:5px;left:10%;width:80%;text-align:center;background-color:#fff;border:2px solid #ccc;}
+#main {position:relative;top:50px;left:3%;width:96%;text-align:center;z-index:0;}
+#searchable {table-layout:fixed;width:100%;text-align:center;"#f4f4f4";}
+tr.norm {background-color:#f4f4f4;}
+tr.title {background-color:#ccc;}
+tr.alt {background-color:#e7e7e7;}
+.small {font-size:80%;}
+a {text-decoration:none;color:#a0a;}
+a:hover {color:#d3d;}
diff --git a/html/search.js b/html/search.js
index abc47a975731..ded0b9284467 100644
--- a/html/search.js
+++ b/html/search.js
@@ -1,33 +1,33 @@
-function selectTextField(){
- var filter_text = document.getElementById('filter');
- filter_text.focus();
- filter_text.select();
-}
-function updateSearch(){
- var input_form = document.getElementById('filter');
- var filter = input_form.value.toLowerCase();
- input_form.value = filter;
- var table = document.getElementById('searchable');
- var alt_style = 'norm';
- for(var i = 0; i < table.rows.length; i++){
- try{
- var row = table.rows[i];
- if(row.className == 'title') continue;
- var found=0;
- for(var j = 0; j < row.cells.length; j++){
- var cell = row.cells[j];
- if(cell.innerText.toLowerCase().indexOf(filter) != -1){
- found=1;
- break;
- }
- }
- if(found == 0) row.style.display='none';
- else{
- row.style.display='block';
- row.className = alt_style;
- if(alt_style == 'alt') alt_style = 'norm';
- else alt_style = 'alt';
- }
- }catch(err) { }
- }
+function selectTextField(){
+ var filter_text = document.getElementById('filter');
+ filter_text.focus();
+ filter_text.select();
+}
+function updateSearch(){
+ var input_form = document.getElementById('filter');
+ var filter = input_form.value.toLowerCase();
+ input_form.value = filter;
+ var table = document.getElementById('searchable');
+ var alt_style = 'norm';
+ for(var i = 0; i < table.rows.length; i++){
+ try{
+ var row = table.rows[i];
+ if(row.className == 'title') continue;
+ var found=0;
+ for(var j = 0; j < row.cells.length; j++){
+ var cell = row.cells[j];
+ if(cell.innerText.toLowerCase().indexOf(filter) != -1){
+ found=1;
+ break;
+ }
+ }
+ if(found == 0) row.style.display='none';
+ else{
+ row.style.display='block';
+ row.className = alt_style;
+ if(alt_style == 'alt') alt_style = 'norm';
+ else alt_style = 'alt';
+ }
+ }catch(err) { }
+ }
}
\ No newline at end of file
diff --git a/html/templates/footer.html b/html/templates/footer.html
index 105e03de2ad0..68ce1ab76678 100644
--- a/html/templates/footer.html
+++ b/html/templates/footer.html
@@ -1,4 +1,4 @@
-
-
-
-
+
+
+