diff --git a/README.md b/README.md
index 3ef95e46ac..bdc723c716 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,30 @@
-## Sandstorm Station 13
-Based and maintained from Citadel Station 13, that is based and maintained from /tg/station.
+## Citadel Station 13
+Based and maintained from /tg/station.
-[](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
+[](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13)
+[](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open")
+[](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue")
-[](https://travis-ci.com/github/Sandstorm-Station/Sandstorm-Station-13)
+[](https://forthebadge.com) [](https://forthebadge.com) [](http://forthebadge.com) [](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
-
-
-**Upstream Information**
+**Upstream Information**
* **Website:**
* **Code:**
* **Wiki:**
* **Codedocs:**
* **/tg/station Discord:**
* **Coderbus Discord:**
-* ~~**IRC:** ~~ (dead)
-
-**Citadel Station Information**
+* ~~**IRC:** ~~ (dead)
+**Citadel Station Information**
* **Website:**
* **Code:**
* **Wiki:**
* **Forums:**
* **Ban Appeals:**
-* **Discord:**
+* **Discord:**
-**Sandstorm Station Information**
+**Sandstorm Station Information**
* **Code:**
* **Discord:**
@@ -108,7 +107,7 @@ the new version.
## HOSTING
If you'd like a more robust server hosting option for tgstation and its
-derivatives. Check out our server tools suite at
+derivatives. Check out our server tools suite at
https://github.com/tgstation/tgstation-server
## MAPS
@@ -142,7 +141,7 @@ To enable an away mission open `config/awaymissionconfig.txt` and uncomment one
The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database
-## WEB/CDN RESOURCE DELIVERY
+## WEB/CDN RESOURCE DELIVERY
Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server.
diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql
index dc0861220a..34baaaa4c6 100644
--- a/SQL/tgstation_schema.sql
+++ b/SQL/tgstation_schema.sql
@@ -1,473 +1,473 @@
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `admin`
---
-
-DROP TABLE IF EXISTS `admin`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `admin` (
- `ckey` varchar(32) NOT NULL,
- `rank` varchar(32) NOT NULL,
- PRIMARY KEY (`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `admin_log`
---
-
-DROP TABLE IF EXISTS `admin_log`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `admin_log` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `adminckey` varchar(32) NOT NULL,
- `adminip` int(10) unsigned NOT NULL,
- `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL,
- `target` varchar(32) NOT NULL,
- `log` varchar(1000) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `admin_ranks`
---
-
-DROP TABLE IF EXISTS `admin_ranks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `admin_ranks` (
- `rank` varchar(32) NOT NULL,
- `flags` smallint(5) unsigned NOT NULL,
- `exclude_flags` smallint(5) unsigned NOT NULL,
- `can_edit_flags` smallint(5) unsigned NOT NULL,
- PRIMARY KEY (`rank`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `ban`
---
-
-DROP TABLE IF EXISTS `ban`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `ban` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `bantime` datetime NOT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) NOT NULL,
- `bantype` enum('PERMABAN','TEMPBAN','JOB_PERMABAN','JOB_TEMPBAN','ADMIN_PERMABAN','ADMIN_TEMPBAN') NOT NULL,
- `reason` varchar(2048) NOT NULL,
- `job` varchar(32) DEFAULT NULL,
- `duration` int(11) NOT NULL,
- `expiration_time` datetime NOT NULL,
- `ckey` varchar(32) NOT NULL,
- `computerid` varchar(32) NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `a_ckey` varchar(32) NOT NULL,
- `a_computerid` varchar(32) NOT NULL,
- `a_ip` int(10) unsigned NOT NULL,
- `who` varchar(2048) NOT NULL,
- `adminwho` varchar(2048) NOT NULL,
- `edits` text,
- `unbanned` tinyint(3) unsigned DEFAULT NULL,
- `unbanned_datetime` datetime DEFAULT NULL,
- `unbanned_ckey` varchar(32) DEFAULT NULL,
- `unbanned_computerid` varchar(32) DEFAULT NULL,
- `unbanned_ip` int(10) unsigned DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_ban_checkban` (`ckey`,`bantype`,`expiration_time`,`unbanned`,`job`),
- KEY `idx_ban_isbanned` (`ckey`,`ip`,`computerid`,`bantype`,`expiration_time`,`unbanned`),
- KEY `idx_ban_count` (`id`,`a_ckey`,`bantype`,`expiration_time`,`unbanned`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `connection_log`
---
-
-DROP TABLE IF EXISTS `connection_log`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `connection_log` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime DEFAULT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `ckey` varchar(45) DEFAULT NULL,
- `ip` int(10) unsigned NOT NULL,
- `computerid` varchar(45) DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `death`
---
-
-DROP TABLE IF EXISTS `death`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `death` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `pod` varchar(50) NOT NULL,
- `x_coord` smallint(5) unsigned NOT NULL,
- `y_coord` smallint(5) unsigned NOT NULL,
- `z_coord` smallint(5) unsigned NOT NULL,
- `mapname` varchar(32) NOT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) NOT NULL,
- `tod` datetime NOT NULL COMMENT 'Time of death',
- `job` varchar(32) NOT NULL,
- `special` varchar(32) DEFAULT NULL,
- `name` varchar(96) NOT NULL,
- `byondkey` varchar(32) NOT NULL,
- `laname` varchar(96) DEFAULT NULL,
- `lakey` varchar(32) DEFAULT NULL,
- `bruteloss` smallint(5) unsigned NOT NULL,
- `brainloss` smallint(5) unsigned NOT NULL,
- `fireloss` smallint(5) unsigned NOT NULL,
- `oxyloss` smallint(5) unsigned NOT NULL,
- `toxloss` smallint(5) unsigned NOT NULL,
- `cloneloss` smallint(5) unsigned NOT NULL,
- `staminaloss` smallint(5) unsigned NOT NULL,
- `last_words` varchar(255) DEFAULT NULL,
- `suicide` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `feedback`
---
-
-DROP TABLE IF EXISTS `feedback`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `feedback` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `key_name` varchar(32) NOT NULL,
- `key_type` enum('text', 'amount', 'tally', 'nested tally', 'associative') NOT NULL,
- `version` tinyint(3) unsigned NOT NULL,
- `json` json NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `ipintel`
---
-
-DROP TABLE IF EXISTS `ipintel`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `ipintel` (
- `ip` int(10) unsigned NOT NULL,
- `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- `intel` double NOT NULL DEFAULT '0',
- PRIMARY KEY (`ip`),
- KEY `idx_ipintel` (`ip`,`intel`,`date`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `legacy_population`
---
-
-DROP TABLE IF EXISTS `legacy_population`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `legacy_population` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `playercount` int(11) DEFAULT NULL,
- `admincount` int(11) DEFAULT NULL,
- `time` datetime NOT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `library`
---
-
-DROP TABLE IF EXISTS `library`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `library` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `author` varchar(45) NOT NULL,
- `title` varchar(45) NOT NULL,
- `content` text NOT NULL,
- `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL,
- `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY',
- `datetime` datetime NOT NULL,
- `deleted` tinyint(1) unsigned DEFAULT NULL,
- `round_id_created` int(11) unsigned NOT NULL,
- PRIMARY KEY (`id`),
- KEY `deleted_idx` (`deleted`),
- KEY `idx_lib_id_del` (`id`,`deleted`),
- KEY `idx_lib_del_title` (`deleted`,`title`),
- KEY `idx_lib_search` (`deleted`,`author`,`title`,`category`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `messages`
---
-
-DROP TABLE IF EXISTS `messages`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `messages` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL,
- `targetckey` varchar(32) NOT NULL,
- `adminckey` varchar(32) NOT NULL,
- `text` varchar(2048) NOT NULL,
- `timestamp` datetime NOT NULL,
- `server` varchar(32) DEFAULT NULL,
- `server_ip` int(10) unsigned NOT NULL,
- `server_port` smallint(5) unsigned NOT NULL,
- `round_id` int(11) unsigned NOT NULL,
- `secret` tinyint(1) unsigned NOT NULL,
- `expire_timestamp` datetime DEFAULT NULL,
- `severity` enum('high','medium','minor','none') DEFAULT NULL,
- `lasteditor` varchar(32) DEFAULT NULL,
- `edits` text,
- `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`),
- KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`, `deleted`),
- KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`, `deleted`),
- KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`, `deleted`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `role_time`
---
-
-DROP TABLE IF EXISTS `role_time`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-
-CREATE TABLE `role_time`
-( `ckey` VARCHAR(32) NOT NULL ,
- `job` VARCHAR(32) NOT NULL ,
- `minutes` INT UNSIGNED NOT NULL,
- PRIMARY KEY (`ckey`, `job`)
- ) ENGINE = InnoDB;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `role_time`
---
-
-DROP TABLE IF EXISTS `role_time_log`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-
-CREATE TABLE IF NOT EXISTS `role_time_log` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
- `ckey` varchar(32) NOT NULL,
- `job` varchar(128) NOT NULL,
- `delta` int(11) NOT NULL,
- `datetime` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
- PRIMARY KEY (`id`),
- KEY `ckey` (`ckey`),
- KEY `job` (`job`),
- KEY `datetime` (`datetime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `player`
---
-
-DROP TABLE IF EXISTS `player`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `player` (
- `ckey` varchar(32) NOT NULL,
- `byond_key` varchar(32) DEFAULT NULL,
- `firstseen` datetime NOT NULL,
- `firstseen_round_id` int(11) unsigned NOT NULL,
- `lastseen` datetime NOT NULL,
- `lastseen_round_id` int(11) unsigned NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `computerid` varchar(32) NOT NULL,
- `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
- `accountjoindate` DATE DEFAULT NULL,
- `flags` smallint(5) unsigned DEFAULT '0' NOT NULL,
- PRIMARY KEY (`ckey`),
- KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
- KEY `idx_player_ip_ckey` (`ip`,`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_option`
---
-
-DROP TABLE IF EXISTS `poll_option`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_option` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `pollid` int(11) NOT NULL,
- `text` varchar(255) NOT NULL,
- `minval` int(3) DEFAULT NULL,
- `maxval` int(3) DEFAULT NULL,
- `descmin` varchar(32) DEFAULT NULL,
- `descmid` varchar(32) DEFAULT NULL,
- `descmax` varchar(32) DEFAULT NULL,
- `default_percentage_calc` tinyint(1) unsigned NOT NULL DEFAULT '1',
- PRIMARY KEY (`id`),
- KEY `idx_pop_pollid` (`pollid`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_question`
---
-
-DROP TABLE IF EXISTS `poll_question`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_question` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `polltype` enum('OPTION','TEXT','NUMVAL','MULTICHOICE','IRV') NOT NULL,
- `starttime` datetime NOT NULL,
- `endtime` datetime NOT NULL,
- `question` varchar(255) NOT NULL,
- `adminonly` tinyint(1) unsigned NOT NULL,
- `multiplechoiceoptions` int(2) DEFAULT NULL,
- `createdby_ckey` varchar(32) DEFAULT NULL,
- `createdby_ip` int(10) unsigned NOT NULL,
- `dontshow` tinyint(1) unsigned NOT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_pquest_question_time_ckey` (`question`,`starttime`,`endtime`,`createdby_ckey`,`createdby_ip`),
- KEY `idx_pquest_time_admin` (`starttime`,`endtime`,`adminonly`),
- KEY `idx_pquest_id_time_type_admin` (`id`,`starttime`,`endtime`,`polltype`,`adminonly`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_textreply`
---
-
-DROP TABLE IF EXISTS `poll_textreply`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_textreply` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `pollid` int(11) NOT NULL,
- `ckey` varchar(32) NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `replytext` varchar(2048) NOT NULL,
- `adminrank` varchar(32) NOT NULL DEFAULT 'Player',
- PRIMARY KEY (`id`),
- KEY `idx_ptext_pollid_ckey` (`pollid`,`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `poll_vote`
---
-
-DROP TABLE IF EXISTS `poll_vote`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `poll_vote` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `datetime` datetime NOT NULL,
- `pollid` int(11) NOT NULL,
- `optionid` int(11) NOT NULL,
- `ckey` varchar(32) NOT NULL,
- `ip` int(10) unsigned NOT NULL,
- `adminrank` varchar(32) NOT NULL,
- `rating` int(2) DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `idx_pvote_pollid_ckey` (`pollid`,`ckey`),
- KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `round`
---
-DROP TABLE IF EXISTS `round`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `round` (
- `id` INT(11) NOT NULL AUTO_INCREMENT,
- `initialize_datetime` DATETIME NOT NULL,
- `start_datetime` DATETIME NULL,
- `shutdown_datetime` DATETIME NULL,
- `end_datetime` DATETIME NULL,
- `server_ip` INT(10) UNSIGNED NOT NULL,
- `server_port` SMALLINT(5) UNSIGNED NOT NULL,
- `commit_hash` CHAR(40) NULL,
- `game_mode` VARCHAR(32) NULL,
- `game_mode_result` VARCHAR(64) NULL,
- `end_state` VARCHAR(64) NULL,
- `shuttle_name` VARCHAR(64) NULL,
- `map_name` VARCHAR(32) NULL,
- `station_name` VARCHAR(80) NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
---
--- Table structure for table `schema_revision`
---
-DROP TABLE IF EXISTS `schema_revision`;
-CREATE TABLE `schema_revision` (
- `major` TINYINT(3) unsigned NOT NULL,
- `minor` TINYINT(3) unsigned NOT NULL,
- `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`major`, `minor`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
-DELIMITER $$
-CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes);
-END
-$$
-CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes);
-END
-$$
-CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes);
-END
-$$
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `admin`
+--
+
+DROP TABLE IF EXISTS `admin`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `admin` (
+ `ckey` varchar(32) NOT NULL,
+ `rank` varchar(32) NOT NULL,
+ PRIMARY KEY (`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `admin_log`
+--
+
+DROP TABLE IF EXISTS `admin_log`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `admin_log` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `adminckey` varchar(32) NOT NULL,
+ `adminip` int(10) unsigned NOT NULL,
+ `operation` enum('add admin','remove admin','change admin rank','add rank','remove rank','change rank flags') NOT NULL,
+ `target` varchar(32) NOT NULL,
+ `log` varchar(1000) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `admin_ranks`
+--
+
+DROP TABLE IF EXISTS `admin_ranks`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `admin_ranks` (
+ `rank` varchar(32) NOT NULL,
+ `flags` smallint(5) unsigned NOT NULL,
+ `exclude_flags` smallint(5) unsigned NOT NULL,
+ `can_edit_flags` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`rank`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ban`
+--
+
+DROP TABLE IF EXISTS `ban`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ban` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `bantime` datetime NOT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) NOT NULL,
+ `bantype` enum('PERMABAN','TEMPBAN','JOB_PERMABAN','JOB_TEMPBAN','ADMIN_PERMABAN','ADMIN_TEMPBAN') NOT NULL,
+ `reason` varchar(2048) NOT NULL,
+ `job` varchar(32) DEFAULT NULL,
+ `duration` int(11) NOT NULL,
+ `expiration_time` datetime NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `computerid` varchar(32) NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `a_ckey` varchar(32) NOT NULL,
+ `a_computerid` varchar(32) NOT NULL,
+ `a_ip` int(10) unsigned NOT NULL,
+ `who` varchar(2048) NOT NULL,
+ `adminwho` varchar(2048) NOT NULL,
+ `edits` text,
+ `unbanned` tinyint(3) unsigned DEFAULT NULL,
+ `unbanned_datetime` datetime DEFAULT NULL,
+ `unbanned_ckey` varchar(32) DEFAULT NULL,
+ `unbanned_computerid` varchar(32) DEFAULT NULL,
+ `unbanned_ip` int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_ban_checkban` (`ckey`,`bantype`,`expiration_time`,`unbanned`,`job`),
+ KEY `idx_ban_isbanned` (`ckey`,`ip`,`computerid`,`bantype`,`expiration_time`,`unbanned`),
+ KEY `idx_ban_count` (`id`,`a_ckey`,`bantype`,`expiration_time`,`unbanned`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `connection_log`
+--
+
+DROP TABLE IF EXISTS `connection_log`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `connection_log` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime DEFAULT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `ckey` varchar(45) DEFAULT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `computerid` varchar(45) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `death`
+--
+
+DROP TABLE IF EXISTS `death`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `death` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `pod` varchar(50) NOT NULL,
+ `x_coord` smallint(5) unsigned NOT NULL,
+ `y_coord` smallint(5) unsigned NOT NULL,
+ `z_coord` smallint(5) unsigned NOT NULL,
+ `mapname` varchar(32) NOT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) NOT NULL,
+ `tod` datetime NOT NULL COMMENT 'Time of death',
+ `job` varchar(32) NOT NULL,
+ `special` varchar(32) DEFAULT NULL,
+ `name` varchar(96) NOT NULL,
+ `byondkey` varchar(32) NOT NULL,
+ `laname` varchar(96) DEFAULT NULL,
+ `lakey` varchar(32) DEFAULT NULL,
+ `bruteloss` smallint(5) unsigned NOT NULL,
+ `brainloss` smallint(5) unsigned NOT NULL,
+ `fireloss` smallint(5) unsigned NOT NULL,
+ `oxyloss` smallint(5) unsigned NOT NULL,
+ `toxloss` smallint(5) unsigned NOT NULL,
+ `cloneloss` smallint(5) unsigned NOT NULL,
+ `staminaloss` smallint(5) unsigned NOT NULL,
+ `last_words` varchar(255) DEFAULT NULL,
+ `suicide` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `feedback`
+--
+
+DROP TABLE IF EXISTS `feedback`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `feedback` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `key_name` varchar(32) NOT NULL,
+ `key_type` enum('text', 'amount', 'tally', 'nested tally', 'associative') NOT NULL,
+ `version` tinyint(3) unsigned NOT NULL,
+ `json` json NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `ipintel`
+--
+
+DROP TABLE IF EXISTS `ipintel`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ipintel` (
+ `ip` int(10) unsigned NOT NULL,
+ `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ `intel` double NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ip`),
+ KEY `idx_ipintel` (`ip`,`intel`,`date`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `legacy_population`
+--
+
+DROP TABLE IF EXISTS `legacy_population`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `legacy_population` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `playercount` int(11) DEFAULT NULL,
+ `admincount` int(11) DEFAULT NULL,
+ `time` datetime NOT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `library`
+--
+
+DROP TABLE IF EXISTS `library`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `library` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `author` varchar(45) NOT NULL,
+ `title` varchar(45) NOT NULL,
+ `content` text NOT NULL,
+ `category` enum('Any','Fiction','Non-Fiction','Adult','Reference','Religion') NOT NULL,
+ `ckey` varchar(32) NOT NULL DEFAULT 'LEGACY',
+ `datetime` datetime NOT NULL,
+ `deleted` tinyint(1) unsigned DEFAULT NULL,
+ `round_id_created` int(11) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `deleted_idx` (`deleted`),
+ KEY `idx_lib_id_del` (`id`,`deleted`),
+ KEY `idx_lib_del_title` (`deleted`,`title`),
+ KEY `idx_lib_search` (`deleted`,`author`,`title`,`category`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `messages`
+--
+
+DROP TABLE IF EXISTS `messages`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `messages` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL,
+ `targetckey` varchar(32) NOT NULL,
+ `adminckey` varchar(32) NOT NULL,
+ `text` varchar(2048) NOT NULL,
+ `timestamp` datetime NOT NULL,
+ `server` varchar(32) DEFAULT NULL,
+ `server_ip` int(10) unsigned NOT NULL,
+ `server_port` smallint(5) unsigned NOT NULL,
+ `round_id` int(11) unsigned NOT NULL,
+ `secret` tinyint(1) unsigned NOT NULL,
+ `expire_timestamp` datetime DEFAULT NULL,
+ `severity` enum('high','medium','minor','none') DEFAULT NULL,
+ `lasteditor` varchar(32) DEFAULT NULL,
+ `edits` text,
+ `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`, `deleted`),
+ KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`, `deleted`),
+ KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`, `deleted`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `role_time`
+--
+
+DROP TABLE IF EXISTS `role_time`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+
+CREATE TABLE `role_time`
+( `ckey` VARCHAR(32) NOT NULL ,
+ `job` VARCHAR(32) NOT NULL ,
+ `minutes` INT UNSIGNED NOT NULL,
+ PRIMARY KEY (`ckey`, `job`)
+ ) ENGINE = InnoDB;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `role_time`
+--
+
+DROP TABLE IF EXISTS `role_time_log`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+
+CREATE TABLE IF NOT EXISTS `role_time_log` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ `job` varchar(128) NOT NULL,
+ `delta` int(11) NOT NULL,
+ `datetime` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`),
+ KEY `ckey` (`ckey`),
+ KEY `job` (`job`),
+ KEY `datetime` (`datetime`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `player`
+--
+
+DROP TABLE IF EXISTS `player`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `player` (
+ `ckey` varchar(32) NOT NULL,
+ `byond_key` varchar(32) DEFAULT NULL,
+ `firstseen` datetime NOT NULL,
+ `firstseen_round_id` int(11) unsigned NOT NULL,
+ `lastseen` datetime NOT NULL,
+ `lastseen_round_id` int(11) unsigned NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `computerid` varchar(32) NOT NULL,
+ `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
+ `accountjoindate` DATE DEFAULT NULL,
+ `flags` smallint(5) unsigned DEFAULT '0' NOT NULL,
+ PRIMARY KEY (`ckey`),
+ KEY `idx_player_cid_ckey` (`computerid`,`ckey`),
+ KEY `idx_player_ip_ckey` (`ip`,`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_option`
+--
+
+DROP TABLE IF EXISTS `poll_option`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_option` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `pollid` int(11) NOT NULL,
+ `text` varchar(255) NOT NULL,
+ `minval` int(3) DEFAULT NULL,
+ `maxval` int(3) DEFAULT NULL,
+ `descmin` varchar(32) DEFAULT NULL,
+ `descmid` varchar(32) DEFAULT NULL,
+ `descmax` varchar(32) DEFAULT NULL,
+ `default_percentage_calc` tinyint(1) unsigned NOT NULL DEFAULT '1',
+ PRIMARY KEY (`id`),
+ KEY `idx_pop_pollid` (`pollid`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_question`
+--
+
+DROP TABLE IF EXISTS `poll_question`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_question` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `polltype` enum('OPTION','TEXT','NUMVAL','MULTICHOICE','IRV') NOT NULL,
+ `starttime` datetime NOT NULL,
+ `endtime` datetime NOT NULL,
+ `question` varchar(255) NOT NULL,
+ `adminonly` tinyint(1) unsigned NOT NULL,
+ `multiplechoiceoptions` int(2) DEFAULT NULL,
+ `createdby_ckey` varchar(32) DEFAULT NULL,
+ `createdby_ip` int(10) unsigned NOT NULL,
+ `dontshow` tinyint(1) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_pquest_question_time_ckey` (`question`,`starttime`,`endtime`,`createdby_ckey`,`createdby_ip`),
+ KEY `idx_pquest_time_admin` (`starttime`,`endtime`,`adminonly`),
+ KEY `idx_pquest_id_time_type_admin` (`id`,`starttime`,`endtime`,`polltype`,`adminonly`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_textreply`
+--
+
+DROP TABLE IF EXISTS `poll_textreply`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_textreply` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `pollid` int(11) NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `replytext` varchar(2048) NOT NULL,
+ `adminrank` varchar(32) NOT NULL DEFAULT 'Player',
+ PRIMARY KEY (`id`),
+ KEY `idx_ptext_pollid_ckey` (`pollid`,`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `poll_vote`
+--
+
+DROP TABLE IF EXISTS `poll_vote`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `poll_vote` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `datetime` datetime NOT NULL,
+ `pollid` int(11) NOT NULL,
+ `optionid` int(11) NOT NULL,
+ `ckey` varchar(32) NOT NULL,
+ `ip` int(10) unsigned NOT NULL,
+ `adminrank` varchar(32) NOT NULL,
+ `rating` int(2) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `idx_pvote_pollid_ckey` (`pollid`,`ckey`),
+ KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `round`
+--
+DROP TABLE IF EXISTS `round`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `round` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `initialize_datetime` DATETIME NOT NULL,
+ `start_datetime` DATETIME NULL,
+ `shutdown_datetime` DATETIME NULL,
+ `end_datetime` DATETIME NULL,
+ `server_ip` INT(10) UNSIGNED NOT NULL,
+ `server_port` SMALLINT(5) UNSIGNED NOT NULL,
+ `commit_hash` CHAR(40) NULL,
+ `game_mode` VARCHAR(32) NULL,
+ `game_mode_result` VARCHAR(64) NULL,
+ `end_state` VARCHAR(64) NULL,
+ `shuttle_name` VARCHAR(64) NULL,
+ `map_name` VARCHAR(32) NULL,
+ `station_name` VARCHAR(80) NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+--
+-- Table structure for table `schema_revision`
+--
+DROP TABLE IF EXISTS `schema_revision`;
+CREATE TABLE `schema_revision` (
+ `major` TINYINT(3) unsigned NOT NULL,
+ `minor` TINYINT(3) unsigned NOT NULL,
+ `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`major`, `minor`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+DELIMITER $$
+CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes);
+END
+$$
+CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes);
+END
+$$
+CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes);
+END
+$$
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
diff --git a/TGS3.json b/TGS3.json
index 2a2b80cf95..39b75bd913 100644
--- a/TGS3.json
+++ b/TGS3.json
@@ -1,22 +1,22 @@
-{
- "documentation": "/tg/station server 3 configuration file",
- "changelog": {
- "script": "tools/ss13_genchangelog.py",
- "arguments": "html/changelog.html html/changelogs",
- "pip_dependancies": [
- "PyYaml",
- "beautifulsoup4"
- ]
- },
- "synchronize_paths": [
- "html/changelog.html",
- "html/changelogs/*"
- ],
- "static_directories": [
- "config",
- "data"
- ],
- "dlls": [
- "libmariadb.dll"
- ]
- }
+{
+ "documentation": "/tg/station server 3 configuration file",
+ "changelog": {
+ "script": "tools/ss13_genchangelog.py",
+ "arguments": "html/changelog.html html/changelogs",
+ "pip_dependancies": [
+ "PyYaml",
+ "beautifulsoup4"
+ ]
+ },
+ "synchronize_paths": [
+ "html/changelog.html",
+ "html/changelogs/*"
+ ],
+ "static_directories": [
+ "config",
+ "data"
+ ],
+ "dlls": [
+ "libmariadb.dll"
+ ]
+ }
diff --git a/_maps/boxstation.json b/_maps/boxstation.json
index 143fcae5bc..3c71c654fa 100644
--- a/_maps/boxstation.json
+++ b/_maps/boxstation.json
@@ -1,11 +1,11 @@
-{
- "map_name": "Box Station",
- "map_path": "map_files/BoxStation",
- "map_file": "BoxStation.dmm",
- "shuttles": {
- "cargo": "cargo_box",
- "ferry": "ferry_fancy",
- "whiteship": "whiteship_box",
- "emergency": "emergency_box"
- }
-}
+{
+ "map_name": "Box Station",
+ "map_path": "map_files/BoxStation",
+ "map_file": "BoxStation.dmm",
+ "shuttles": {
+ "cargo": "cargo_box",
+ "ferry": "ferry_fancy",
+ "whiteship": "whiteship_box",
+ "emergency": "emergency_box"
+ }
+}
diff --git a/_maps/runtimestation.json b/_maps/runtimestation.json
index f9333c65a2..ca2cc3d379 100644
--- a/_maps/runtimestation.json
+++ b/_maps/runtimestation.json
@@ -1,8 +1,8 @@
-{
- "map_name": "Runtime Station",
- "map_path": "map_files/debug",
- "map_file": "runtimestation.dmm",
- "shuttles": {
- "cargo": "cargo_delta"
- }
-}
+{
+ "map_name": "Runtime Station",
+ "map_path": "map_files/debug",
+ "map_file": "runtimestation.dmm",
+ "shuttles": {
+ "cargo": "cargo_delta"
+ }
+}
diff --git a/bot/nudge.py b/bot/nudge.py
index b1e6058cc0..6c551ab0d2 100644
--- a/bot/nudge.py
+++ b/bot/nudge.py
@@ -1,25 +1,25 @@
-#!/usr/bin/env python3
-from config import *
-import sys
-import pickle
-import socket
-
-
-def pack():
- ip = sys.argv[1]
- try:
- data = sys.argv[2:]
- except:
- data = "NO DATA SPECIFIED"
-
- nudge(pickle.dumps({"ip": ip, "data": data}))
-
-
-def nudge(data):
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect(("localhost", 45678))
- s.send(data)
- s.close()
-
-if __name__ == "__main__" and len(sys.argv) > 1:
- pack()
+#!/usr/bin/env python3
+from config import *
+import sys
+import pickle
+import socket
+
+
+def pack():
+ ip = sys.argv[1]
+ try:
+ data = sys.argv[2:]
+ except:
+ data = "NO DATA SPECIFIED"
+
+ nudge(pickle.dumps({"ip": ip, "data": data}))
+
+
+def nudge(data):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.connect(("localhost", 45678))
+ s.send(data)
+ s.close()
+
+if __name__ == "__main__" and len(sys.argv) > 1:
+ pack()
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index c10b10d3d2..154c7277ea 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -35,8 +35,9 @@
#define R_SPAWN (1<<12)
#define R_AUTOLOGIN (1<<13)
#define R_DBRANKS (1<<14)
+#define R_SENSITIVE (1<<15)
-#define R_DEFAULT R_AUTOLOGIN
+#define R_DEFAULT R_AUTOLOGIN | R_SENSITIVE
#define R_EVERYTHING ALL //the sum of all other rank permissions, used for +EVERYTHING
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index d7487eb54b..605b3f6485 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -40,6 +40,7 @@
//#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now
#define ROLE_GHOSTCAFE "ghostcafe"
#define ROLE_MINOR_ANTAG "minorantag"
+#define ROLE_RESPAWN "respawnsystem"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
//(in game days played) to play that role
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 6963e714b5..f62f9254dc 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -225,6 +225,8 @@
. += "[seperator]AUTOLOGIN"
if(rights & R_DBRANKS)
. += "[seperator]DBRANKS"
+ if(rights & R_SENSITIVE)
+ . += "[seperator]SENSITIVE"
if(!.)
. = "NONE"
return .
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index b558b28cf2..3fc275d436 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -67,7 +67,8 @@ GLOBAL_LIST_INIT(bitfields, list(
"SOUNDS" = R_SOUNDS,
"SPAWN" = R_SPAWN,
"AUTOLOGIN" = R_AUTOLOGIN,
- "DBRANKS" = R_DBRANKS
+ "DBRANKS" = R_DBRANKS,
+ "SENSITIVE" = R_SENSITIVE
),
"interaction_flags_atom" = list(
"INTERACT_ATOM_REQUIRES_ANCHORED" = INTERACT_ATOM_REQUIRES_ANCHORED,
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 0fd09d297d..9d5110daf5 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -388,6 +388,8 @@ Example config:
var/list/probabilities = Get(/datum/config_entry/keyed_list/storyteller_weight)
var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust)
var/list/min_player_counts = Get(/datum/config_entry/keyed_list/storyteller_min_players)
+ var/list/storyteller_min_chaos = Get(/datum/config_entry/keyed_list/storyteller_min_chaos)
+ var/list/storyteller_max_chaos = Get(/datum/config_entry/keyed_list/storyteller_max_chaos)
for(var/T in storyteller_cache)
var/datum/dynamic_storyteller/S = T
var/config_tag = initial(S.config_tag)
@@ -399,6 +401,13 @@ Example config:
continue
if(length(GLOB.player_list) < min_players)
continue
+ if(!Get(/datum/config_entry/flag/no_storyteller_threat_removal))
+ var/min_chaos = (probabilities in storyteller_min_chaos) ? storyteller_min_chaos[config_tag] : initial(S.min_chaos)
+ var/max_chaos = (probabilities in storyteller_max_chaos) ? storyteller_max_chaos[config_tag] : initial(S.max_chaos)
+ if(SSpersistence.average_dynamic_threat < min_chaos)
+ continue
+ if(SSpersistence.average_dynamic_threat > max_chaos)
+ continue
if(SSpersistence.saved_storytellers.len == repeated_mode_adjust.len)
var/name = initial(S.name)
var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3)
diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm
index 44d9a041a6..935164352e 100644
--- a/code/controllers/configuration/entries/dynamic.dm
+++ b/code/controllers/configuration/entries/dynamic.dm
@@ -1,5 +1,7 @@
/datum/config_entry/flag/dynamic_voting
+/datum/config_entry/flag/no_storyteller_threat_removal
+
/datum/config_entry/number/dynamic_high_pop_limit
config_entry_value = 55
min_val = 1
@@ -67,6 +69,9 @@
/datum/config_entry/number/dynamic_third_rule_high_pop_requirement
config_entry_value = 70
+/datum/config_entry/number/dynamic_threat_baseline
+ config_entry_value = 50
+
/datum/config_entry/number_list/dynamic_hijack_requirements
/datum/config_entry/number/dynamic_hijack_high_population_requirement
@@ -74,7 +79,7 @@
/datum/config_entry/number/dynamic_hijack_cost
config_entry_value = 5
-
+
/datum/config_entry/number/dynamic_glorious_death_cost
config_entry_value = 5
@@ -96,3 +101,11 @@
/datum/config_entry/keyed_list/storyteller_min_players
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
+
+/datum/config_entry/keyed_list/storyteller_min_chaos
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_NUM
+
+/datum/config_entry/keyed_list/storyteller_max_chaos
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_NUM
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 6f9a299f6d..cb6e37b10f 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -172,8 +172,6 @@
/datum/config_entry/string/hostedby
-/datum/config_entry/flag/norespawn
-
/datum/config_entry/flag/guest_jobban
/datum/config_entry/flag/usewhitelist
diff --git a/code/controllers/configuration/entries/respawns.dm b/code/controllers/configuration/entries/respawns.dm
new file mode 100644
index 0000000000..40c7d248a4
--- /dev/null
+++ b/code/controllers/configuration/entries/respawns.dm
@@ -0,0 +1,47 @@
+/// Allows usage of respawn system
+/datum/config_entry/flag/respawns_enabled
+ config_entry_value = FALSE
+
+/// Minutes before allowing respawns.
+/datum/config_entry/number/respawn_delay
+ config_entry_value = 15.0
+ integer = FALSE
+
+/// Minutes before allowing respawn, if user cryo'd.
+/datum/config_entry/number/respawn_delay_cryo
+ config_entry_value = 5.0
+ integer = FALSE
+
+/// Allows respawning as non-assistant. Overrides all others of this type.
+/datum/config_entry/flag/allow_non_assistant_respawn
+ config_entry_value = FALSE
+
+/// Allows respawning as a combat role, defined as security/head.
+/datum/config_entry/flag/allow_combat_role_respawn
+ config_entry_value = FALSE
+
+/// Allows respawning as the same character as a previous life
+/datum/config_entry/flag/allow_same_character_respawn
+ config_entry_value = FALSE
+
+/// Observing penalizes for respawns, not just joining.
+/datum/config_entry/flag/respawn_penalty_includes_observe
+ config_entry_value = FALSE
+
+/// Minutes from roundstart before someone can respawn
+/datum/config_entry/number/respawn_minimum_delay_roundstart
+ config_entry_value = 30.0
+ integer = FALSE
+
+/// Gamemode config tags that are banned from respawning
+/datum/config_entry/keyed_list/respawn_chaos_gamemodes
+ key_mode = KEY_MODE_TEXT
+ value_mode = VALUE_MODE_FLAG
+
+/datum/config_entry/keyed_list/respawn_chaos_gamemodes/ValidateListEntry(key_name, key_value)
+ . = ..()
+ return . && (key_name in config.modes)
+
+/datum/config_entry/keyed_list/respawn_chaos_gamemodes/preprocess_key(key)
+ . = ..()
+ return lowertext(key)
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index 9b292a219d..28505c70f8 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -93,6 +93,7 @@ SUBSYSTEM_DEF(input)
user.full_macro_assert()
/datum/controller/subsystem/input/fire()
+ set waitfor = FALSE
var/list/clients = GLOB.clients // Let's sing the list cache song
for(var/i in 1 to clients.len)
var/client/C = clients[i]
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index e1b6e6f6e2..e39242aac3 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -422,7 +422,7 @@ SUBSYSTEM_DEF(persistence)
saved_storytellers[3] = saved_storytellers[2]
saved_storytellers[2] = saved_storytellers[1]
saved_storytellers[1] = mode.storyteller.name
- average_dynamic_threat = (mode.threat_average + average_dynamic_threat) / 2
+ average_dynamic_threat = (mode.max_threat + average_dynamic_threat) / 2
var/json_file = file("data/RecentStorytellers.json")
var/list/file_data = list()
file_data["data"] = saved_storytellers + average_dynamic_threat
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 80d05c9db4..2eed46cd39 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -373,6 +373,11 @@ SUBSYSTEM_DEF(ticker)
if(player.ready == PLAYER_READY_TO_PLAY && player.mind)
GLOB.joined_player_list += player.ckey
player.create_character(FALSE)
+ if(player.new_character && player.client && player.client.prefs) // we cannot afford a runtime, ever
+ LAZYOR(player.client.prefs.slots_joined_as, player.client.prefs.default_slot)
+ LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name)
+ else
+ stack_trace("WARNING: Either a player did not have a new_character, did not have a client, or did not have preferences. This is VERY bad.")
else
player.new_player_panel()
CHECK_TICK
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 06b76718c1..880802fd5c 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -492,7 +492,7 @@ SUBSYSTEM_DEF(vote)
if("dynamic")
GLOB.master_mode = "dynamic"
var/list/probabilities = CONFIG_GET(keyed_list/storyteller_weight)
- for(var/T in config.storyteller_cache)
+ for(var/T in config.get_runnable_storytellers())
var/datum/dynamic_storyteller/S = T
var/probability = ((initial(S.config_tag) in probabilities) ? probabilities[initial(S.config_tag)] : initial(S.weight))
if(probability > 0)
diff --git a/code/datums/components/README.md b/code/datums/components/README.md
index 509630bb0a..dd27c05469 100644
--- a/code/datums/components/README.md
+++ b/code/datums/components/README.md
@@ -1,9 +1,9 @@
-# Datum Component System (DCS)
-
-## Concept
-
-Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening.
-
-See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole.
-
-### See/Define signals and their arguments in [__DEFINES\components.dm](..\..\__DEFINES\components.dm)
+# Datum Component System (DCS)
+
+## Concept
+
+Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening.
+
+See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole.
+
+### See/Define signals and their arguments in [__DEFINES\components.dm](..\..\__DEFINES\components.dm)
diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm
index 261e423640..7a1f0f6980 100644
--- a/code/datums/world_topic.dm
+++ b/code/datums/world_topic.dm
@@ -164,7 +164,7 @@
. = list()
.["version"] = GLOB.game_version
.["mode"] = "hidden" //CIT CHANGE - hides the gamemode in topic() calls to prevent meta'ing the gamemode
- .["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE
+ .["respawn"] = config ? CONFIG_GET(flag/respawns_enabled) : FALSE
.["enter"] = GLOB.enter_allowed
.["vote"] = CONFIG_GET(flag/allow_vote_mode)
.["ai"] = CONFIG_GET(flag/allow_ai)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index be8dee5bf8..29455afe56 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -150,14 +150,14 @@ Credit where due:
var/datum/team/clockcult/main_clockcult
/datum/game_mode/clockwork_cult/pre_setup() //Gamemode and job code is pain. Have fun codediving all of that stuff, whoever works on this next - Delta
- var/list/errorList = list()
+ /*var/list/errorList = list()
var/list/reebes = SSmapping.LoadGroup(errorList, "Reebe", "map_files/generic", "City_of_Cogs.dmm", default_traits = ZTRAITS_REEBE, silent = TRUE)
if(errorList.len) // reebe failed to load
message_admins("Reebe failed to load!")
log_game("Reebe failed to load!")
return FALSE
- for(var/datum/parsed_map/PM in reebes)
- PM.initTemplateBounds()
+ for(var/datum/parsed_map/PM in reebes) //Temporarily commented because of z-level loading reliably segfaulting the server.
+ PM.initTemplateBounds()*/
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_jobs += protected_jobs
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index 836b00250f..6a16b62643 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -64,6 +64,8 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
var/threat_average_weight = 0
/// Last time a threat average sample was taken. Used for weighting the rolling average.
var/last_threat_sample_time = 0
+ /// Maximum threat recorded so far, for cross-round chaos adjustment.
+ var/max_threat = 0
/// Things that cause a rolling threat adjustment to be displayed at roundend.
var/list/threat_tallies = list()
/// Running information about the threat. Can store text or datum entries.
@@ -145,6 +147,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
third_rule_req = list(101, 101, 101, 101, 101, 100, 90, 80, 70, 60)
high_pop_second_rule_req = CONFIG_GET(number/dynamic_second_rule_high_pop_requirement)
high_pop_third_rule_req = CONFIG_GET(number/dynamic_third_rule_high_pop_requirement)
+ added_threat = CONFIG_GET(number/dynamic_threat_baseline)
GLOB.dynamic_high_pop_limit = CONFIG_GET(number/dynamic_high_pop_limit)
GLOB.dynamic_latejoin_delay_min = CONFIG_GET(number/dynamic_latejoin_delay_min)*600
GLOB.dynamic_latejoin_delay_max = CONFIG_GET(number/dynamic_latejoin_delay_max)*600
@@ -415,7 +418,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
/datum/game_mode/dynamic/post_setup(report)
update_playercounts()
if(minor_ruleset_start)
- addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/minor_roundstart),rand(1 MINUTES,5 MINUTES))
+ addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/minor_roundstart),rand(1 MINUTES,3 MINUTES))
else
for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules)
addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay)
@@ -439,7 +442,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
potential_minor_rulesets -= rule
update_playercounts()
iterations++
- message_admins("Minor antag roundstart rolls completed, with [num_rulesets_executed] antags or antag teams made.")
+ message_admins("Minor antag roundstart rolls completed, with [iterations] rolls done and [num_rulesets_executed] antags or antag teams made.")
log_game("DYNAMIC: Minor antag roundstart made [num_rulesets_executed] antags or antag teams.")
@@ -612,6 +615,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
latejoin_rules = remove_from_list(latejoin_rules, rule.type)
else if(rule.ruletype == "Midround")
midround_rules = remove_from_list(midround_rules, rule.type)
+ message_admins("DYNAMIC: Picked [rule]; executing soon...")
addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_midround_latejoin_rule, rule), rule.delay)
return TRUE
@@ -663,6 +667,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
/datum/game_mode/dynamic/proc/execute_midround_latejoin_rule(sent_rule)
var/datum/dynamic_ruleset/rule = sent_rule
if (rule.execute())
+ message_admins("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].")
log_game("DYNAMIC: Injected a [rule.ruletype == "latejoin" ? "latejoin" : "midround"] ruleset [rule.name].")
log_threat("[rule.ruletype] [rule.name] added [rule.cost]", verbose = TRUE)
if(rule.flags & HIGHLANDER_RULESET)
@@ -741,6 +746,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
if(!M.voluntary_ghosted)
current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow)
threat = storyteller.calculate_threat() + added_threat
+ max_threat = max(max_threat,threat)
if(threat_average_weight)
var/cur_sample_weight = world.time - last_threat_sample_time
threat_average = ((threat_average * threat_average_weight) + (threat * cur_sample_weight)) / (threat_average_weight + cur_sample_weight)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 416721702b..7ce6e74cc1 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -48,6 +48,9 @@
if (!M.client) // Are they connected?
trimmed_list.Remove(M)
continue
+ if(M.client.prefs && M.client.prefs.toggles & MIDROUND_ANTAG)
+ trimmed_list.Remove(M)
+ continue
if(!mode.check_age(M.client, minimum_required_age))
trimmed_list.Remove(M)
continue
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_minor.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_minor.dm
index 618befbaa7..74a61bd3ff 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_minor.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_minor.dm
@@ -1,3 +1,46 @@
+/datum/dynamic_ruleset/minor/proc/trim_list(list/L = list())
+ var/list/trimmed_list = L.Copy()
+ for(var/mob/M in trimmed_list)
+ if (!ishuman(M))
+ trimmed_list.Remove(M)
+ continue
+ if (HAS_TRAIT(M, TRAIT_NO_MIDROUND_ANTAG))
+ trimmed_list.Remove(M)
+ continue
+ if (!M.client) // Are they connected?
+ trimmed_list.Remove(M)
+ continue
+ if(!mode.check_age(M.client, minimum_required_age))
+ trimmed_list.Remove(M)
+ continue
+ if(antag_flag_override)
+ if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override))
+ trimmed_list.Remove(M)
+ continue
+ else
+ if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag))
+ trimmed_list.Remove(M)
+ continue
+ if (M.mind)
+ if ((M.mind.assigned_role in GLOB.exp_specialmap[EXP_TYPE_SPECIAL])) // Are they playing a ghost role?
+ trimmed_list.Remove(M)
+ continue
+ if (M.mind.assigned_role in restricted_roles) // Does their job allow it?
+ trimmed_list.Remove(M)
+ continue
+ if ((exclusive_roles.len > 0) && !(M.mind.assigned_role in exclusive_roles)) // Is the rule exclusive to their job?
+ trimmed_list.Remove(M)
+ continue
+ return trimmed_list
+
+/datum/dynamic_ruleset/minor/trim_candidates()
+ //
+ // All you need to know is that here, the candidates list contains 4 lists itself, indexed with the following defines:
+ // Candidates = list(CURRENT_LIVING_PLAYERS, CURRENT_LIVING_ANTAGS, CURRENT_DEAD_PLAYERS, CURRENT_OBSERVERS)
+ // So for example you can get the list of all current dead players with var/list/dead_players = candidates[CURRENT_DEAD_PLAYERS]
+ // Make sure to properly typecheck the mobs in those lists, as the dead_players list could contain ghosts, or dead players still in their bodies.
+ // We're still gonna trim the obvious (mobs without clients, jobbanned players, etc)
+ candidates = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS])
//////////////////////////////////////////////
// //
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
index c5e0857461..1be5cb3c57 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
@@ -8,7 +8,6 @@
/datum/dynamic_ruleset/roundstart/traitor
name = "Traitors"
config_tag = "traitor"
- persistent = TRUE
antag_flag = ROLE_TRAITOR
antag_datum = /datum/antagonist/traitor/
minimum_required_age = 0
@@ -34,15 +33,6 @@
M.mind.restricted_roles = restricted_roles
return TRUE
-/datum/dynamic_ruleset/roundstart/traitor/rule_process()
- if (autotraitor_cooldown > 0)
- autotraitor_cooldown--
- else
- autotraitor_cooldown = 450 // 15 minutes
- message_admins("Checking if we can turn someone into a traitor.")
- log_game("DYNAMIC: Checking if we can turn someone into a traitor.")
- mode.picking_specific_rule(/datum/dynamic_ruleset/midround/autotraitor)
-
//////////////////////////////////////////
// //
// BLOOD BROTHERS //
diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm
index d5766b287e..03aa9d174a 100644
--- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm
+++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm
@@ -15,10 +15,13 @@
*/
var/flags = 0
var/dead_player_weight = 1 // How much dead players matter for threat calculation
- var/weight = 3 // Weights for randomly picking storyteller. Multiplied by score after voting.
+ var/weight = 0 // Weights for randomly picking storyteller. Multiplied by score after voting.
+ var/min_chaos = -1000 // Won't show up if recent rounds have been below this chaotic on average
+ var/max_chaos = 1000 // Won't show up if recent rounds have been above this chaotic on average
var/event_frequency_lower = 6 MINUTES // How rare events will be, at least.
var/event_frequency_upper = 20 MINUTES // How rare events will be, at most.
var/min_players = -1 // How many players are required for this one to start.
+ var/soft_antag_ratio_cap = 4 // how many players-per-antag there should be
var/datum/game_mode/dynamic/mode = null // Cached as soon as it's made, by dynamic.
/**
@@ -101,8 +104,10 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/proc/should_inject_antag(dry_run = FALSE)
if(mode.forced_injection)
- mode.forced_injection = !dry_run
+ mode.forced_injection = dry_run
return TRUE
+ if(mode.current_players[CURRENT_LIVING_PLAYERS].len < (mode.current_players[CURRENT_LIVING_ANTAGS].len * soft_antag_ratio_cap))
+ return FALSE
return mode.threat < mode.threat_level
/datum/dynamic_storyteller/proc/roundstart_draft()
@@ -126,11 +131,10 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/proc/minor_rule_draft()
var/list/drafted_rules = list()
- for (var/datum/dynamic_ruleset/minor/rule in mode.minor_rules)
+ for (var/datum/dynamic_ruleset/rule in mode.minor_rules)
if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level))
- rule.candidates = mode.candidates.Copy()
rule.trim_candidates()
- if (rule.ready() && rule.candidates.len > 0)
+ if (rule.ready())
var/property_weight = 0
for(var/property in property_weights)
if(property in rule.property_weights) // just treat it as 0 if it's not in there
@@ -213,6 +217,8 @@ Property weights are added to the config weight of the ruleset. They are:
weight = 1
event_frequency_lower = 2 MINUTES
event_frequency_upper = 10 MINUTES
+ max_chaos = 50
+ soft_antag_ratio_cap = 1
flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON
min_players = 30
var/refund_cooldown = 0
@@ -235,12 +241,13 @@ Property weights are added to the config weight of the ruleset. They are:
desc = "Modes where the crew must band together. Nukies, xenos, blob. Only one antag threat at once."
curve_centre = 2
curve_width = 1.5
- weight = 2
+ weight = 4
+ max_chaos = 75
min_players = 20
flags = WAROPS_ALWAYS_ALLOWED | USE_PREV_ROUND_WEIGHTS
property_weights = list("valid" = 3, "trust" = 5)
-/datum/dynamic_storyteller/chaotic/minor_start_chance()
+/datum/dynamic_storyteller/team/minor_start_chance()
return 0
/datum/dynamic_storyteller/team/should_inject_antag(dry_run = FALSE)
@@ -256,13 +263,15 @@ Property weights are added to the config weight of the ruleset. They are:
flags = WAROPS_ALWAYS_ALLOWED
property_weights = list("valid" = 1, "conversion" = 20)
-/datum/dynamic_storyteller/chaotic/minor_start_chance()
+/datum/dynamic_storyteller/conversion/minor_start_chance()
return 0
/datum/dynamic_storyteller/random
name = "Random"
config_tag = "random"
weight = 1
+ max_chaos = 60
+ soft_antag_ratio_cap = 1
desc = "No weighting at all; every ruleset has the same chance of happening. Cooldowns vary wildly. As random as it gets."
/datum/dynamic_storyteller/random/on_start()
@@ -275,7 +284,7 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/random/should_inject_antag()
return prob(50)
-/datum/dynamic_storyteller/chaotic/minor_start_chance()
+/datum/dynamic_storyteller/random/minor_start_chance()
return 20
/datum/dynamic_storyteller/random/roundstart_draft()
@@ -331,7 +340,7 @@ Property weights are added to the config weight of the ruleset. They are:
name = "Story"
config_tag = "story"
desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies."
- weight = 2
+ weight = 4
curve_width = 2
flags = USE_PREV_ROUND_WEIGHTS
property_weights = list("story_potential" = 2)
@@ -339,6 +348,7 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/classic
name = "Classic"
config_tag = "classic"
+ weight = 8
desc = "No special antagonist weights. Good variety, but not like random. Uses your chaos preference to weight."
flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS
@@ -346,7 +356,7 @@ Property weights are added to the config weight of the ruleset. They are:
name = "Intrigue"
config_tag = "intrigue"
desc = "Antags that instill distrust in the crew. Traitors, bloodsuckers."
- weight = 2
+ weight = 4
curve_width = 2
dead_player_weight = 2
flags = USE_PREV_ROUND_WEIGHTS
@@ -358,8 +368,8 @@ Property weights are added to the config weight of the ruleset. They are:
/datum/dynamic_storyteller/grabbag
name = "Grab Bag"
config_tag = "grabbag"
- desc = "Crew antags (e.g. traitor, changeling, bloodsucker, heretic) only, all mixed together."
- weight = 2
+ desc = "Crew antags (e.g. traitor, changeling, bloodsucker, heretic) only at round start, all mixed together."
+ weight = 4
flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS
/datum/dynamic_storyteller/grabbag/minor_start_chance()
@@ -372,12 +382,14 @@ Property weights are added to the config weight of the ruleset. They are:
curve_centre = -3
curve_width = 0.5
flags = NO_ASSASSIN
- weight = 1
+ min_chaos = 30
+ weight = 3
dead_player_weight = 5
+ soft_antag_ratio_cap = 8
property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "conversion" = -10)
/datum/dynamic_storyteller/liteextended/minor_start_chance()
- return 100
+ return 90
/datum/dynamic_storyteller/no_antag
name = "Extended"
@@ -385,6 +397,7 @@ Property weights are added to the config weight of the ruleset. They are:
desc = "No standard antags."
curve_centre = -5
curve_width = 0.5
+ min_chaos = 40
flags = NO_ASSASSIN | FORCE_IF_WON
weight = 1
property_weights = list("extended" = 2)
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 795508320b..5cfec2376a 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -46,17 +46,17 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
var/startx
switch(startSide)
if(NORTH)
- starty = world.maxy-(TRANSITIONEDGE+1)
- startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
+ starty = world.maxy-(TRANSITIONEDGE+2)
+ startx = rand((TRANSITIONEDGE+2), world.maxx-(TRANSITIONEDGE+2))
if(EAST)
- starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1))
- startx = world.maxx-(TRANSITIONEDGE+1)
+ starty = rand((TRANSITIONEDGE+2),world.maxy-(TRANSITIONEDGE+2))
+ startx = world.maxx-(TRANSITIONEDGE+2)
if(SOUTH)
- starty = (TRANSITIONEDGE+1)
- startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
+ starty = (TRANSITIONEDGE+2)
+ startx = rand((TRANSITIONEDGE+2), world.maxx-(TRANSITIONEDGE+2))
if(WEST)
- starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1))
- startx = (TRANSITIONEDGE+1)
+ starty = rand((TRANSITIONEDGE+2), world.maxy-(TRANSITIONEDGE+2))
+ startx = (TRANSITIONEDGE+2)
. = locate(startx, starty, Z)
/proc/spaceDebrisFinishLoc(startSide, Z)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index a44e2b99fb..1468fb9f46 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -22,17 +22,16 @@
//Used for logging people entering cryosleep and important items they are carrying.
var/list/frozen_crew = list()
- var/list/frozen_items = list()
-
- // Used for containing rare items traitors need to steal, so it's not
- // game-over if they get iced
- var/list/objective_items = list()
- // A cache of theft datums so you don't have to re-create them for
- // each item check
- var/list/theft_cache = list()
+ var/list/obj/stored_packages = list()
var/allow_items = TRUE
+/obj/machinery/computer/cryopod/deconstruct()
+ . = ..()
+ for(var/i in stored_packages)
+ var/obj/O = i
+ O.forceMove(drop_location())
+
/obj/machinery/computer/cryopod/attack_ai()
attack_hand()
@@ -67,11 +66,11 @@
if(3)
dat += "<< Back
"
dat += "Recently stored objects
"
- if(!frozen_items.len)
+ if(!stored_packages.len)
dat += "There has been no storage usage at this terminal.
"
else
- for(var/obj/item/I in frozen_items)
- dat += "[I.name]
"
+ for(var/obj/O in stored_packages)
+ dat += "[O.name]
"
dat += "
"
var/datum/browser/popup = new(user, "cryopod_console", "General Storage System Control")
@@ -87,25 +86,27 @@
add_fingerprint(user)
if(href_list["item"])
- if(!allowed(user))
+ if(!allowed(user) && !(obj_flags & EMAGGED))
to_chat(user, "Access Denied.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
- if(!allow_items) return
- if(frozen_items.len == 0)
+ if(!allow_items)
+ return
+
+ if(stored_packages.len == 0)
to_chat(user, "There is nothing to recover from storage.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
- var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items
+ var/obj/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in stored_packages
playsound(src, "terminal_type", 25, 0)
if(!I)
return
- if(!(I in frozen_items))
+ if(!(I in stored_packages))
to_chat(user, "\The [I] is no longer in storage.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
@@ -117,20 +118,21 @@
I.forceMove(drop_location())
if(user && Adjacent(user) && user.can_hold_items())
user.put_in_hands(I)
- frozen_items -= I
+ stored_packages -= I
updateUsrDialog()
else if(href_list["allitems"])
playsound(src, "terminal_type", 25, 0)
- if(!allowed(user))
+ if(!allowed(user) && !(obj_flags & EMAGGED))
to_chat(user, "Access Denied.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
updateUsrDialog()
return
+
if(!allow_items)
return
- if(frozen_items.len == 0)
+ if(stored_packages.len == 0)
to_chat(user, "There is nothing to recover from storage.")
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
@@ -138,10 +140,10 @@
visible_message("The console beeps happily as it disgorges the desired objects.")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
- for(var/obj/item/I in frozen_items)
- I.forceMove(drop_location())
- frozen_items -= I
- updateUsrDialog()
+ for(var/obj/O in stored_packages)
+ O.forceMove(get_turf(src))
+ stored_packages.Cut()
+ updateUsrDialog()
else if (href_list["menu"])
src.menu = text2num(href_list["menu"])
@@ -159,6 +161,13 @@
/obj/machinery/computer/cryopod/contents_explosion()
return
+/obj/machinery/computer/cryopod/contents_explosion()
+ return //don't blow everyone's shit up.
+
+/// The box
+/obj/item/storage/box/blue/cryostorage_items
+ w_class = WEIGHT_CLASS_HUGE
+
//Cryopods themselves.
/obj/machinery/cryopod
name = "cryogenic freezer"
@@ -178,44 +187,9 @@
var/despawn_world_time = null // Used to keep track of the safe period.
var/obj/machinery/computer/cryopod/control_computer
+ var/item_storage_type = /obj/item/storage/box/blue/cryostorage_items //with how storage components work this can be anything the player can open or anything with a storage component.
var/last_no_computer_message = 0
- // These items are preserved when the process() despawn proc occurs.
- var/static/list/preserve_items = typecacheof(list(
- /obj/item/hand_tele,
- /obj/item/card/id/captains_spare,
- /obj/item/aicard,
- /obj/item/mmi,
- /obj/item/paicard,
- /obj/item/gun,
- /obj/item/pinpointer,
- /obj/item/clothing/shoes/magboots,
- /obj/item/areaeditor/blueprints,
- /obj/item/clothing/head/helmet/space,
- /obj/item/clothing/suit/space,
- /obj/item/clothing/suit/armor,
- /obj/item/defibrillator/compact,
- /obj/item/reagent_containers/hypospray/CMO,
- /obj/item/clothing/accessory/medal/gold/captain,
- /obj/item/clothing/gloves/krav_maga,
- /obj/item/nullrod,
- /obj/item/tank/jetpack,
- /obj/item/documents,
- /obj/item/nuke_core_container
- ))
- // These items will NOT be preserved
- var/static/list/do_not_preserve_items = typecacheof(list(
- /obj/item/mmi/posibrain,
- /obj/item/gun/energy/laser/mounted,
- /obj/item/gun/energy/e_gun/advtaser/mounted,
- /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg,
- /obj/item/gun/energy/disabler/cyborg,
- /obj/item/gun/energy/e_gun/advtaser/cyborg,
- /obj/item/gun/energy/printer,
- /obj/item/gun/energy/kinetic_accelerator/cyborg,
- /obj/item/gun/energy/laser/cyborg
- ))
-
/obj/machinery/cryopod/Initialize(mapload)
. = ..()
update_icon()
@@ -298,73 +272,89 @@
do_fake_sparks(2, TRUE, src)
playsound(src, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
-#define CRYO_DESTROY 0
-#define CRYO_PRESERVE 1
-#define CRYO_OBJECTIVE 2
-#define CRYO_IGNORE 3
-#define CRYO_DESTROY_LATER 4
-
-/obj/machinery/cryopod/proc/should_preserve_item(obj/item/I)
- for(var/datum/objective_item/steal/T in control_computer.theft_cache)
- if(istype(I, T.targetitem) && T.check_special_completion(I))
- return CRYO_OBJECTIVE
- if(preserve_items[I] && !do_not_preserve_items[I])
- return CRYO_PRESERVE
- return CRYO_DESTROY
-
// This function can not be undone; do not call this unless you are sure
/obj/machinery/cryopod/proc/despawn_occupant()
if(!control_computer)
find_control_computer()
var/mob/living/mob_occupant = occupant
- var/list/obj/item/cryo_items = list()
+
+ var/list/obj/item/storing = list()
+ var/list/obj/item/destroying = list()
+ var/list/obj/item/destroy_later = list()
investigate_log("Despawning [key_name(mob_occupant)].", INVESTIGATE_CRYOGENICS)
- //Handle Borg stuff first
+ var/atom/target_store = (control_computer?.allow_items && control_computer) || src //the double control computer check makes it return the control computer.
+ var/drop_to_ground = !istype(target_store, /obj/machinery/computer/cryopod)
+
+ var/mind_identity = mob_occupant.mind?.name
+ var/occupant_identity = mob_occupant.real_name
+
if(iscyborg(mob_occupant))
var/mob/living/silicon/robot/R = mob_occupant
if(R.mmi?.brain)
- cryo_items[R.mmi] = CRYO_DESTROY_LATER
- cryo_items[R.mmi.brain] = CRYO_DESTROY_LATER
- for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc
- for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags
- cryo_items[O] = should_preserve_item(O)
- O.forceMove(src)
- R.module.remove_module(I, TRUE) //delete the module itself so it doesn't transfer over.
-
- //Drop all items into the pod.
- for(var/obj/item/I in mob_occupant)
- if(cryo_items[I] == CRYO_IGNORE || cryo_items[I] ==CRYO_DESTROY_LATER)
- continue
- cryo_items[I] = should_preserve_item(I)
- mob_occupant.transferItemToLoc(I, src, TRUE)
- if(I.contents.len) //Make sure we catch anything not handled by qdel() on the items.
- if(cryo_items[I] != CRYO_DESTROY) // Don't remove the contents of things that need preservation
+ destroy_later += R.mmi
+ destroy_later += R.mmi.brain
+ for(var/i in R.module)
+ if(!isitem(i))
+ destroying += i
continue
- for(var/obj/item/O in I.contents)
- cryo_items[O] = should_preserve_item(O)
- O.forceMove(src)
-
- for(var/A in cryo_items)
- var/obj/item/I = A
- if(QDELETED(I)) //edge cases and DROPDEL.
- continue
- var/preserve = cryo_items[I]
- if(preserve == CRYO_DESTROY_LATER)
- continue
- if(preserve != CRYO_IGNORE)
- if(preserve == CRYO_DESTROY)
- qdel(I)
- else if(control_computer?.allow_items)
- control_computer.frozen_items += I
- if(preserve == CRYO_OBJECTIVE)
- control_computer.objective_items += I
- I.moveToNullspace()
+ var/obj/item/I = i
+ // let's be honest we only care about the trash bag don't beat around the bush
+ if(SEND_SIGNAL(I, COMSIG_CONTAINS_STORAGE))
+ storing += I.contents
+ for(var/atom/movable/AM in I.contents)
+ AM.forceMove(src)
+ R.module.remove_module(I, TRUE)
+ else
+ var/list/gear = list()
+ if(iscarbon(mob_occupant)) // sorry simp-le-mobs deserve no mercy
+ var/mob/living/carbon/C = mob_occupant
+ gear = C.get_all_gear()
+ for(var/i in gear)
+ var/obj/item/I = i
+ I.forceMove(src)
+ if(!istype(I))
+ destroying += I
+ continue
+ if(I.item_flags & (DROPDEL | ABSTRACT))
+ destroying += I
+ continue
+ if(HAS_TRAIT(I, TRAIT_NODROP))
+ destroying += I
+ continue
+ // WEE WOO SNOWFLAKE TIME
+ if(istype(I, /obj/item/pda))
+ var/obj/item/pda/P = I
+ if((P.owner == mind_identity) || (P.owner == occupant_identity))
+ destroying += P
+ else
+ storing += P
+ else if(istype(I, /obj/item/card/id))
+ var/obj/item/card/id/idcard = I
+ if((idcard.registered_name == mind_identity) || (idcard.registered_name == occupant_identity))
+ destroying += idcard
+ else
+ storing += idcard
else
- I.forceMove(loc)
- cryo_items -= I
+ storing += I
+
+ // get rid of mobs
+ for(var/mob/living/L in mob_occupant.GetAllContents() - mob_occupant)
+ L.forceMove(drop_location())
+
+ if(storing.len)
+ var/obj/O = new item_storage_type
+ O.name = "cryogenic retrieval package: [mob_occupant.real_name]"
+ for(var/i in storing)
+ var/obj/item/I = i
+ I.forceMove(O)
+ O.forceMove(drop_to_ground? target_store.drop_location() : target_store)
+ if((target_store == control_computer) && !drop_to_ground)
+ control_computer.stored_packages += O
+
+ QDEL_LIST(destroying)
//Update any existing objectives involving this mob.
for(var/i in GLOB.objectives)
@@ -426,22 +416,13 @@
// Ghost and delete the mob.
if(!mob_occupant.get_ghost(1))
- mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE)
+ mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE, cryo = TRUE)
QDEL_NULL(occupant)
- for(var/I in cryo_items) //only "CRYO_DESTROY_LATER" atoms are left)
- var/atom/A = I
- if(!QDELETED(A))
- qdel(A)
+ QDEL_LIST(destroy_later)
open_machine()
name = initial(name)
-#undef CRYO_DESTROY
-#undef CRYO_PRESERVE
-#undef CRYO_OBJECTIVE
-#undef CRYO_IGNORE
-#undef CRYO_DESTROY_LATER
-
/obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user)
if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled)
return
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index bed006d0b5..7847c3757e 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -67,9 +67,9 @@
/obj/machinery/door/window/proc/open_and_close()
open()
if(src.check_access(null))
- sleep(50)
+ sleep(60)
else //secure doors close faster
- sleep(20)
+ sleep(40)
close()
/obj/machinery/door/window/Bumped(atom/movable/AM)
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index f15a4d00e1..7f2fe6a01d 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -175,7 +175,7 @@
/obj/item/kitchen/knife/combat/survival/knuckledagger/Initialize()
. = ..()
- AddComponent(/datum/component/butchering, 50, 120, 5) // it's good for butchering stuff
+ AddComponent(/datum/component/butchering, 30, 130, 20) // it's good for butchering stuff
/obj/item/kitchen/knife/combat/survival/knuckledagger/ui_action_click(mob/user, actiontype)
light_on = !light_on
@@ -189,6 +189,11 @@
else
set_light(0)
+/obj/item/kitchen/knife/combat/survival/knuckledagger/update_overlays()
+ . = ..()
+ if(light_on)
+ . += "[icon_state]_lit"
+
/obj/item/kitchen/knife/combat/bone
name = "bone dagger"
item_state = "bone_dagger"
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index 648ba27897..d0fd4dc3f6 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -137,8 +137,7 @@
AM.anchored = TRUE
flick("laserbox_burn", AM)
trigger()
- sleep(15)
- qdel(AM)
+ QDEL_IN(src, 15)
// snowflake code until undertile elements
/obj/item/pressure_plate/hologrid/hide()
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 2a1844d218..abd862736b 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -853,8 +853,8 @@
/obj/item/storage/belt/sabre/twin
name = "twin sheath"
desc = "Two sheaths. One is capable of holding a katana (or bokken) and the other a wakizashi. You could put two wakizashis in if you really wanted to. Now you can really roleplay as a samurai."
- icon_state = "twinsheath"
- item_state = "quiver" //this'll do.
+ icon_state = "2sheath"
+ item_state = "katana" //this'll do.
w_class = WEIGHT_CLASS_BULKY
fitting_swords = list(/obj/item/melee/smith/wakizashi, /obj/item/melee/smith/twohand/katana, /obj/item/melee/bokken)
starting_sword = null
@@ -865,6 +865,42 @@
STR.max_items = 2
STR.max_w_class = WEIGHT_CLASS_BULKY + WEIGHT_CLASS_NORMAL //katana and waki.
+/obj/item/melee/smith/twohand/katana/on_exit_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/twin/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/unsheath.ogg', 25, 1)
+ . = ..()
+
+/obj/item/melee/smith/twohand/katana/on_enter_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/twin/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/sheath.ogg', 25, 1)
+ . = ..()
+
+/obj/item/melee/smith/wakizashi/on_exit_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/twin/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/unsheath.ogg', 25, 1)
+ . = ..()
+
+/obj/item/melee/smith/wakizashi/on_enter_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/twin/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/sheath.ogg', 25, 1)
+ . = ..()
+
+/obj/item/melee/bokken/on_exit_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/twin/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/unsheath.ogg', 25, 1)
+ . = ..()
+
+/obj/item/melee/bokken/on_enter_storage(datum/component/storage/S)
+ var/obj/item/storage/belt/sabre/twin/B = S.parent
+ if(istype(B))
+ playsound(B, 'sound/items/sheath.ogg', 25, 1)
+ . = ..()
+
/obj/item/storage/belt/plant
name = "botanical belt"
desc = "A belt used to hold most hydroponics supplies. Suprisingly, not green."
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index d8340766c6..430027cea0 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -692,8 +692,8 @@
set category = "Server"
set desc="Respawn basically"
set name="Toggle Respawn"
- var/new_nores = !CONFIG_GET(flag/norespawn)
- CONFIG_SET(flag/norespawn, new_nores)
+ var/new_nores = CONFIG_GET(flag/respawns_enabled)
+ CONFIG_SET(flag/respawns_enabled, !new_nores)
if (!new_nores)
to_chat(world, "You may now respawn.", confidential = TRUE)
else
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index ef4abeb0ad..39053b8e15 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -44,6 +44,11 @@ GLOBAL_PROTECT(protected_ranks)
/datum/admin_rank/vv_edit_var(var_name, var_value)
return FALSE
+/datum/admin_rank/CanProcCall(procname)
+ . = ..()
+ if(!check_rights(R_SENSITIVE))
+ return FALSE
+
/proc/admin_keyword_to_flag(word, previous_rights=0)
var/flag = 0
switch(ckey(word))
@@ -79,6 +84,8 @@ GLOBAL_PROTECT(protected_ranks)
flag = R_AUTOLOGIN
if("dbranks")
flag = R_DBRANKS
+ if("sensitive")
+ flag = R_SENSITIVE
if("@","prev")
flag = previous_rights
return flag
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index bbb35c4650..f48cde2271 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -79,8 +79,11 @@ GLOBAL_PROTECT(admin_verbs_admin)
/client/proc/mark_datum_mapview,
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
- /datum/admins/proc/open_borgopanel
+ /datum/admins/proc/open_borgopanel,
+ /client/proc/admin_cmd_respawn_return_to_lobby,
+ /client/proc/admin_cmd_remove_ghost_respawn_timer
)
+
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel))
GLOBAL_PROTECT(admin_verbs_ban)
GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/manual_play_web_sound, /client/proc/set_round_end_sound))
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 09f9664295..8f4a9742ea 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -28,6 +28,11 @@ GLOBAL_PROTECT(href_token)
var/deadmined
+/datum/admins/CanProcCall(procname)
+ . = ..()
+ if(!check_rights(R_SENSITIVE))
+ return FALSE
+
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE, protected)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
@@ -147,6 +152,8 @@ GLOBAL_PROTECT(href_token)
return 0
/datum/admins/vv_edit_var(var_name, var_value)
+ if(var_name == NAMEOF(src, fakekey))
+ return ..()
return FALSE //nice try trialmin
/*
diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm
index 356746ddbc..4218d4238f 100644
--- a/code/modules/admin/sql_message_system.dm
+++ b/code/modules/admin/sql_message_system.dm
@@ -298,7 +298,9 @@
browse_messages(target_ckey = ckey(target_key), agegate = TRUE)
qdel(query_find_message_secret)
-/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE)
+/proc/browse_messages(type, target_ckey, index, linkless = FALSE, filter, agegate = FALSE, override = FALSE)
+ if((!override || IsAdminAdvancedProcCall()) && !check_rights(R_SENSITIVE))
+ return
if(!SSdbcore.Connect())
to_chat(usr, "Failed to establish database connection.")
return
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index ad8dd168eb..e0434a6fea 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -936,6 +936,12 @@
else
dat += "Mind Transfer Potion | "
+ //Respawns
+ if(jobban_isbanned(M, ROLE_RESPAWN))
+ dat += "Respawns | "
+ else
+ dat += "Respawns | "
+
dat += ""
usr << browse(dat, "window=jobban2;size=800x450")
return
@@ -1799,12 +1805,15 @@
if(alert(usr, "Send [key_name(M)] back to Lobby?", "Message", "Yes", "No") != "Yes")
return
- log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby.")
- message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby.")
+ log_admin("[key_name(usr)] has sent [key_name(M)] back to the Lobby, removing their respawn restrictions if they existed.")
+ message_admins("[key_name(usr)] has sent [key_name(M)] back to the Lobby, removing their respawn restrictions if they existed.")
var/mob/dead/new_player/NP = new()
NP.ckey = M.ckey
qdel(M)
+ if(GLOB.preferences_datums[NP.ckey])
+ var/datum/preferences/P = GLOB.preferences_datums[NP.ckey]
+ P.respawn_restrictions_active = FALSE
else if(href_list["tdome1"])
if(!check_rights(R_FUN))
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index e3937e19b6..1cddbe9509 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -23,13 +23,6 @@
var/rendered = "DEAD: [uppertext(holder.rank)]([src.holder.fakekey ? pick(nicknames) : src.key]) says, \"[emoji_parse(msg)]\""
- // var/rank_name = holder.rank
- // var/admin_name = key
- // if(holder.fakekey)
- // rank_name = pick(strings("admin_nicknames.json", "ranks", "config")) please use this soon.
- // admin_name = pick(strings("admin_nicknames.json", "names", "config"))
- // var/rendered = "DEAD: [rank_name]([admin_name]) says, \"[emoji_parse(msg)]\""
-
for (var/mob/M in GLOB.player_list)
if(isnewplayer(M))
continue
diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm
index 4cbb0214f7..446dbcc69a 100644
--- a/code/modules/admin/verbs/getlogs.dm
+++ b/code/modules/admin/verbs/getlogs.dm
@@ -14,6 +14,8 @@
browseserverlogs("[GLOB.log_directory]/")
/client/proc/browseserverlogs(path = "data/logs/")
+ if(!check_rights(R_SENSITIVE))
+ return
path = browse_files(path)
if(!path)
return
diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
index 26c8bd5949..2fb7a2ccca 100644
--- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
+++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm
@@ -30,6 +30,7 @@
var/can_be_staked = FALSE // Only Feed can happen with a stake in you.
var/cooldown_static = FALSE // Feed, Masquerade, and One-Shot powers don't improve their cooldown.
//var/not_bloodsucker = FALSE // This goes to Vassals or Hunters, but NOT bloodsuckers.
+ var/must_be_concious = TRUE //Can't use this ability while unconcious.
/datum/action/bloodsucker/New()
if(bloodcost > 0)
@@ -101,6 +102,11 @@
if(display_error)
to_chat(owner, "Garlic in your blood is interfering with your powers!")
return FALSE
+ if(must_be_concious)
+ if(owner.stat != CONSCIOUS)
+ if(display_error)
+ to_chat(owner, "You can't do this while you are unconcious!")
+ return FALSE
// Incap?
if(must_be_capacitated)
var/mob/living/L = owner
diff --git a/code/modules/antagonists/bloodsucker/powers/go_home.dm b/code/modules/antagonists/bloodsucker/powers/go_home.dm
index c46a7fce6c..a8060ad07e 100644
--- a/code/modules/antagonists/bloodsucker/powers/go_home.dm
+++ b/code/modules/antagonists/bloodsucker/powers/go_home.dm
@@ -16,6 +16,7 @@
can_use_in_torpor = TRUE
must_be_capacitated = TRUE
can_be_immobilized = TRUE
+ must_be_concious = FALSE
/datum/action/bloodsucker/gohome/CheckCanUse(display_error)
. = ..()
diff --git a/code/modules/antagonists/bloodsucker/powers/masquerade.dm b/code/modules/antagonists/bloodsucker/powers/masquerade.dm
index d83f938e3f..f4ce531ef0 100644
--- a/code/modules/antagonists/bloodsucker/powers/masquerade.dm
+++ b/code/modules/antagonists/bloodsucker/powers/masquerade.dm
@@ -27,6 +27,7 @@
warn_constant_cost = TRUE
can_use_in_torpor = TRUE // Masquerade is maybe the only one that can do this. It stops your healing.
cooldown_static = TRUE
+ must_be_concious = FALSE
// NOTE: Firing off vulgar powers disables your Masquerade!
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 90eaeb57ac..574ebf66a1 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -689,8 +689,8 @@
wound_enhancement = 6
var/fast_enhancement = 6
var/fast_wound_enhancement = 6
- var/slow_enhancement = 20
- var/slow_wound_enhancement = 20
+ var/slow_enhancement = 12
+ var/slow_wound_enhancement = 15
silent = TRUE
inherited_trait = TRAIT_CHUNKYFINGERS // how do you expect to shoot anyone with bone covered hands
secondary_trait = TRAIT_MAULER // just punch them idiot
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index e6ec3a08b6..4a697a6bd7 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -445,7 +445,7 @@
if(L.move_resist < MOVE_FORCE_STRONG)
var/atom/throw_target = get_edge_target_turf(L, user.dir)
L.throw_at(throw_target, 7, 1, user)
- else if(!iscultist(L))
+ else if(!is_servant_of_ratvar(L))
L.DefaultCombatKnockdown(160)
L.adjustStaminaLoss(140) //Ensures hard stamcrit
L.flash_act(1,1)
@@ -465,7 +465,7 @@
C.drowsyness = max(10, C.drowsyness)
C.confused += clamp(20 - C.confused, 0, 10)
L.adjustBruteLoss(15)
- to_chat(user, "In an brilliant flash of red, [L] [iscultist(L) ? "writhes in pain" : "falls to the ground!"]")
+ to_chat(user, "In an brilliant flash of red, [L] [is_servant_of_ratvar(L) ? "writhes in pain!" : "falls to the ground!"]")
uses--
..()
diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm
index f10506a0d9..1468a5a97b 100644
--- a/code/modules/antagonists/xeno/xeno.dm
+++ b/code/modules/antagonists/xeno/xeno.dm
@@ -17,16 +17,16 @@
threat = 3
/datum/antagonist/xeno/threat()
- . = 1
+ . = 3
if(isalienhunter(owner))
- . = 2
+ . = 6
else if(isaliensentinel(owner))
- . = 4
+ . = 12
else if(isalienroyal(owner))
if(isalienqueen(owner))
- . = 8
+ . = 24
else
- . = 6
+ . = 18
/datum/antagonist/xeno/create_team(datum/team/xeno/new_team)
if(!new_team)
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index efac62c930..6169c4d3f0 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -74,6 +74,7 @@
bluespace = TRUE
explosionSize = list(0,0,1,2)
landingDelay = 25 //Longer than others
+ reverseOptionList = list("Mobs"=TRUE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE)
/obj/structure/closet/supplypod/centcompod
style = STYLE_CENTCOM
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 8bae140274..e2ff50893b 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -926,8 +926,22 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if (NAMEOF(src, view))
view_size.setDefault(var_value)
return TRUE
+ if(NAMEOF(src, computer_id))
+ return FALSE
+ if(NAMEOF(src, address))
+ return FALSE
. = ..()
+/client/vv_get_var(var_name)
+ . = ..()
+ switch(var_name)
+ if(NAMEOF(src, computer_id))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
+ if(NAMEOF(src, address))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
+
/client/proc/rescale_view(change, min, max)
var/viewscale = getviewsize(view)
var/x = viewscale[1]
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 6c307e37a3..083a12b2c3 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -12,11 +12,29 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
var/max_save_slots = 24
- //non-preference stuff
- var/muted = 0
+ // Intra-round persistence begin
+ /// Flags for admin mutes
+ var/muted = NONE
+ /// Last IP the person was seen on
var/last_ip
+ /// Last CID the person was seen on
var/last_id
+ /// Do we log their clicks to disk?
var/log_clicks = FALSE
+ /// Characters they have joined the round under - Lazylist of names
+ var/list/characters_joined_as
+ /// Slots they have joined the round under - Lazylist of numbers
+ var/list/slots_joined_as
+ /// Are we currently subject to respawn restrictions? Usually set by us using the "respawn" verb, but can be lifted by admins.
+ var/respawn_restrictions_active = FALSE
+ /// time of death we consider for respawns
+ var/respawn_time_of_death = -INFINITY
+ /// did they DNR? used to prevent respawns.
+ var/dnr_triggered = FALSE
+ /// did they cryo on their last ghost?
+ var/respawn_did_cryo = FALSE
+
+ // Intra-round persistence end
var/icon/custom_holoform_icon
var/list/cached_holoform_icons
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index 5a8325fd64..c242509344 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -179,7 +179,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
to_chat(usr, "Sorry, that function is not enabled on this server.")
return
- browse_messages(null, usr.ckey, null, TRUE)
+ browse_messages(null, usr.ckey, null, TRUE, override = TRUE)
/client/proc/self_playtime()
set name = "View tracked playtime"
diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm
index 698f5130f1..97a10c930a 100644
--- a/code/modules/events/nightmare.dm
+++ b/code/modules/events/nightmare.dm
@@ -3,6 +3,7 @@
typepath = /datum/round_event/ghost_role/nightmare
max_occurrences = 1
min_players = 20
+ gamemode_blacklist = list("dynamic")
/datum/round_event/ghost_role/nightmare
minimum_required = 1
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index c6c97f7cba..e3f5264568 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -554,7 +554,7 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and
/datum/holiday/xmas
name = CHRISTMAS
- begin_day = 10
+ begin_day = 18
begin_month = DECEMBER
end_day = 27
drone_hat = /obj/item/clothing/head/santa
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index b0ac5248c1..bb55ad45ca 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -73,6 +73,12 @@
/// Starting skill modifiers.
var/list/starting_modifiers
+ // These can be flags but I don't care because they're never changed
+ /// Can you always join as this job even while respawning (should probably only be on for assistant)
+ var/always_can_respawn_as = FALSE
+ /// Is this job considered a combat role for respawning? (usually sec/command)
+ var/considered_combat_role = FALSE
+
/**
* Checks if we should be created on a certain map
*/
@@ -118,6 +124,12 @@
//Used for a special check of whether to allow a client to latejoin as this job.
/datum/job/proc/special_check_latejoin(client/C)
+ var/joined = LAZYLEN(C.prefs?.characters_joined_as)
+ if(C.prefs?.respawn_restrictions_active && (joined || CONFIG_GET(flag/respawn_penalty_includes_observe)))
+ if(!CONFIG_GET(flag/allow_non_assistant_respawn) && always_can_respawn_as)
+ return FALSE
+ if(!CONFIG_GET(flag/allow_combat_role_respawn) && considered_combat_role)
+ return FALSE
return TRUE
/datum/job/proc/GetAntagRep()
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index a7401791ab..d0eb690e94 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -16,6 +16,7 @@
display_order = JOB_DISPLAY_ORDER_AI
var/do_special_check = TRUE
threat = 5
+ considered_combat_role = TRUE
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm
index b8fc963989..db5390f323 100644
--- a/code/modules/jobs/job_types/assistant.dm
+++ b/code/modules/jobs/job_types/assistant.dm
@@ -18,6 +18,7 @@ Assistant
paycheck_department = ACCOUNT_CIV
display_order = JOB_DISPLAY_ORDER_ASSISTANT
dresscodecompliant = FALSE
+ always_can_respawn_as = TRUE
threat = 0.2
/datum/job/assistant/get_access()
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index 047a07062d..4806bf5546 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -14,6 +14,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_COMMAND
exp_type_department = EXP_TYPE_COMMAND
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/captain
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 18be8c9835..902be0bdc8 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -15,6 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_ENGINEERING
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/ce
plasma_outfit = /datum/outfit/plasmaman/ce
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index 627a7a2ca1..bb5fc68809 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -15,6 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_MEDICAL
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/cmo
plasma_outfit = /datum/outfit/plasmaman/cmo
diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm
index 4f74542b2a..761882894f 100644
--- a/code/modules/jobs/job_types/cyborg.dm
+++ b/code/modules/jobs/job_types/cyborg.dm
@@ -11,6 +11,7 @@
minimal_player_age = 21
exp_requirements = 120
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 65724765e1..c704326879 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -15,6 +15,7 @@
outfit = /datum/outfit/job/detective
plasma_outfit = /datum/outfit/plasmaman/detective
+ considered_combat_role = TRUE
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index 41fb4b99da..f1b7d3e8c4 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -15,7 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SERVICE
-
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/hop
plasma_outfit = /datum/outfit/plasmaman/hop
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index cfd8d7f6c0..c772a8acae 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -14,6 +14,7 @@
minimal_player_age = 10
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
exp_type_department = EXP_TYPE_SECURITY
outfit = /datum/outfit/job/hos
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index 4c6b8e064f..301acff5c4 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -15,6 +15,7 @@
exp_requirements = 180
exp_type = EXP_TYPE_CREW
exp_type_department = EXP_TYPE_SUPPLY
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/quartermaster
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index 33f7df8260..6c2cb94d13 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -15,6 +15,7 @@
exp_type_department = EXP_TYPE_SCIENCE
exp_requirements = 180
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/rd
plasma_outfit = /datum/outfit/plasmaman/rd
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index 17f109cbc7..246d80ad93 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -12,6 +12,7 @@
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/security
plasma_outfit = /datum/outfit/plasmaman/security
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index c909342d6f..dae3094ebe 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -12,6 +12,7 @@
minimal_player_age = 7
exp_requirements = 300
exp_type = EXP_TYPE_CREW
+ considered_combat_role = TRUE
outfit = /datum/outfit/job/warden
plasma_outfit = /datum/outfit/plasmaman/warden
diff --git a/code/modules/keybindings/keybind/movement.dm b/code/modules/keybindings/keybind/movement.dm
index d3a0e98def..296b127cb4 100644
--- a/code/modules/keybindings/keybind/movement.dm
+++ b/code/modules/keybindings/keybind/movement.dm
@@ -124,7 +124,8 @@
return TRUE
/datum/keybinding/living/hold_sprint
- hotkey_keys = list("Shift")
+ hotkey_keys = list()
+ classic_keys = list()
name = "hold_sprint"
full_name = "Sprint (hold down)"
description = "Hold down to sprint"
@@ -144,7 +145,8 @@
return TRUE
/datum/keybinding/living/toggle_sprint
- hotkey_keys = list()
+ hotkey_keys = list("Shift")
+ classic_keys = list("Shift")
name = "toggle_sprint"
full_name = "Sprint (toggle)"
description = "Press to toggle sprint"
diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm
index 81c59d481e..b5f09c65ca 100644
--- a/code/modules/keybindings/setup.dm
+++ b/code/modules/keybindings/setup.dm
@@ -5,7 +5,7 @@
SHOULD_NOT_SLEEP(TRUE)
/datum/proc/keyLoop(client/user) // Called once every frame
- //SHOULD_NOT_SLEEP(TRUE)
+ SHOULD_NOT_SLEEP(TRUE)
/client/verb/fix_macros()
set name = "Fix Keybindings"
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index 57a79553c3..2a8e0f2516 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -81,11 +81,10 @@
STOP_PROCESSING(SSmachines, src)
icon_state = "coinpress0"
-/obj/machinery/mineral/mint/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+/obj/machinery/mineral/mint/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, ui_key, "Mint", name, ui_x, ui_y, master_ui, state)
+ ui = new(user, src, "Mint", name)
ui.open()
/obj/machinery/mineral/mint/ui_data()
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index ffa9d6995e..05748569a4 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -375,7 +375,9 @@
ready = PLAYER_NOT_READY
return FALSE
- var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No")
+ var/mintime = max(CONFIG_GET(number/respawn_delay), (SSticker.round_start_time + (CONFIG_GET(number/respawn_minimum_delay_roundstart) * 600)) - world.time, 0)
+
+ var/this_is_like_playing_right = alert(src,"Are you sure you wish to observe? You will not be able to respawn for [round(mintime / 600, 0.1)] minutes!!","Player Setup","Yes","No")
if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes")
ready = PLAYER_NOT_READY
@@ -397,6 +399,7 @@
stack_trace("There's no freaking observer landmark available on this map or you're making observers before the map is initialised")
transfer_ckey(observer, FALSE)
observer.client = client
+ observer.client.prefs?.respawn_time_of_death = world.time
observer.set_ghost_appearance()
if(observer.client && observer.client.prefs)
observer.real_name = observer.client.prefs.real_name
@@ -463,6 +466,9 @@
alert(src, "An administrator has disabled late join spawning.")
return FALSE
+ if(!respawn_latejoin_check(notify = TRUE))
+ return FALSE
+
var/arrivals_docked = TRUE
if(SSshuttle.arrivals)
close_spawn_windows() //In case we get held up
@@ -526,6 +532,8 @@
GLOB.joined_player_list += character.ckey
GLOB.latejoiners += character
+ LAZYOR(character.client.prefs.slots_joined_as, character.client.prefs.default_slot)
+ LAZYOR(character.client.prefs.characters_joined_as, character.real_name)
if(CONFIG_GET(flag/allow_latejoin_antagonists) && humanc) //Borgs aren't allowed to be antags. Will need to be tweaked if we get true latejoin ais.
if(SSshuttle.emergency)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 627e1314a7..e824edb419 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -269,7 +269,7 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body
Works together with spawning an observer, noted above.
*/
-/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE)
+/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE, voluntary = FALSE, cryo = FALSE)
var/sig_flags = SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special, penalize)
penalize = !(sig_flags & COMPONENT_DO_NOT_PENALIZE_GHOSTING) && (suiciding || penalize) // suicide squad.
voluntary_ghosted = voluntary
@@ -282,6 +282,12 @@ Works together with spawning an observer, noted above.
if (client && client.prefs && client.prefs.auto_ooc)
if (!(client.prefs.chat_toggles & CHAT_OOC))
client.prefs.chat_toggles ^= CHAT_OOC
+ if(ckey && penalize)
+ var/datum/preferences/P = GLOB.preferences_datums[ckey]
+ if(P)
+ P.respawn_restrictions_active = TRUE
+ P.respawn_time_of_death = world.time
+ P.respawn_did_cryo = cryo
transfer_ckey(ghost, FALSE)
ghost.client.init_verbs()
if(penalize)
@@ -428,12 +434,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(usr, "You're already stuck out of your body!")
return FALSE
- var/response = alert(src, "Are you sure you want to prevent (almost) all means of resuscitation? This cannot be undone. ","Are you sure you want to stay dead?","Yes","No")
+ var/response = alert(src, "Are you sure you want to prevent (almost) all means of resuscitation? This cannot be undone. THIS WILL ALSO STOP YOU FROM RESPAWNING!!!","Are you sure you want to stay dead and never respawn?","Yes","No")
+
if(response != "Yes")
return
can_reenter_corpse = FALSE
- to_chat(src, "You can no longer be brought back into your body.")
+ client.prefs?.dnr_triggered = TRUE
+ to_chat(src, "You can no longer be brought back into your body or respawn.")
return TRUE
/mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source, flashwindow = TRUE)
diff --git a/code/modules/mob/dead/observer/respawn.dm b/code/modules/mob/dead/observer/respawn.dm
new file mode 100644
index 0000000000..f966051ed3
--- /dev/null
+++ b/code/modules/mob/dead/observer/respawn.dm
@@ -0,0 +1,181 @@
+// ADMIN VERBS BEGIN
+/**
+ * Fully returns a player to lobby, allowing them to bypass all respawn restrictions
+ * Works on ghosts or new players (lobby players)
+ * If a lobby player is selected, their restrictions are removed.
+ */
+/client/proc/admin_cmd_respawn_return_to_lobby()
+ set name = "Respawn Player (Unrestricted)"
+ set desc = "Gives a player an unrestricted respawn, resetting all respawn restrictions for them."
+ set category = "Admin"
+
+ var/list/mob/valid = list()
+ for(var/mob/dead/observer/I in GLOB.dead_mob_list)
+ if(!I.client)
+ continue
+ valid["[I.ckey] - Observing: [I]"] = I.ckey
+ for(var/mob/dead/new_player/I in GLOB.dead_mob_list)
+ if(!I.client || !I.client.prefs.respawn_restrictions_active)
+ continue
+ valid["[I.ckey] - IN LOBBY"] = I.ckey
+ if(!valid.len)
+ to_chat(src, "No player found that is either a ghost or is in lobby with restrictions active.")
+ return
+ var/ckey = valid[input(src, "Choose a player (only showing logged in players who have restrictions)", "Unrestricted Respawn") as null|anything in valid]
+ var/client/player = GLOB.directory[ckey]
+ if(!player)
+ to_chat(src, "Client not found.")
+ return
+ var/mob/M = player.mob
+ if(istype(M, /mob/dead/observer))
+ var/mob/dead/observer/O = M
+ var/confirm = alert(src, "Send [O]([ckey]) back to the lobby without respawn restrictions?", "Send to Lobby", "Yes", "No")
+ if(confirm != "Yes")
+ return
+ message_admins("[key_name_admin(src)] gave [key_name_admin(O)] a full respawn and sent them back to the lobby.")
+ log_admin("[key_name(src)] gave [key_name(O)] a full respawn and sent them back to the lobby.")
+ to_chat(O, "You have been given a full respawn.")
+ O.do_respawn(FALSE)
+ O.client.prefs.dnr_triggered = FALSE
+ else if(istype(M, /mob/dead/new_player))
+ var/mob/dead/new_player/NP = M
+ var/confirm = alert(src, "Remove [NP]'s respawn restrictions?", "Remove Restrictions", "Yes", "No")
+ if(confirm != "Yes")
+ return
+ message_admins("[key_name_admin(src)] removed [ckey]'s respawn restrictions.")
+ log_admin("[key_name(src)] removed [ckey]'s respawn restrictions")
+ NP.client.prefs.respawn_restrictions_active = FALSE
+ NP.client.prefs.dnr_triggered = FALSE
+ to_chat(NP, "Your respawn restrictions have been removed.")
+ else
+ CRASH("Invalid mobtype")
+
+/**
+ * Allows a ghost to bypass respawn delay without lifting respawn restrictions
+ */
+/client/proc/admin_cmd_remove_ghost_respawn_timer()
+ set name = "Remove Respawn Timer for Player"
+ set desc = "Removes a player's respawn timer without removing their respawning restrictions."
+ set category = "Admin"
+
+ var/list/mob/dead/observer/valid = list()
+ for(var/mob/dead/observer/I in GLOB.dead_mob_list)
+ if(!I.client)
+ continue
+ valid["[I.ckey] - [I.name]"] = I
+
+ if(!valid.len)
+ to_chat(src, "No logged in ghosts found.")
+ return
+ var/mob/dead/observer/O = valid[input(src, "Choose a player (only showing logged in)", "Remove Respawn Timer") as null|anything in valid]
+
+ if(!O.client)
+ to_chat(src, "[O] has no client.")
+ return
+ var/timeleft = O.time_left_to_respawn()
+ if(!timeleft)
+ to_chat(src, "[O] can already respawn.")
+ return
+ message_admins("[key_name_admin(src)] removed [key_name_admin(O)]'s respawn timer.")
+ log_admin("[key_name(src)] removed [key_name(O)]'s respawn timer.")
+ O.client.prefs.respawn_time_of_death = -INFINITY
+ to_chat(O, "Your respawn timer has been removed.")
+
+// ADMIN VERBS END
+
+/**
+ * Checks if we can latejoin on the currently selected slot, taking into account respawn status.
+ */
+/mob/dead/new_player/proc/respawn_latejoin_check(notify = FALSE)
+ if(!client.prefs.respawn_restrictions_active)
+ return TRUE
+ var/can_same_person = CONFIG_GET(flag/allow_same_character_respawn)
+ if(can_same_person)
+ return TRUE
+ var/nameless = client.prefs.nameless
+ var/randomname = client.prefs.be_random_name
+ var/randombody = client.prefs.be_random_body
+ if(randombody && (nameless || randomname))
+ return TRUE // somewhat unrecognizable
+ if(client.prefs.slots_joined_as && (client.prefs.default_slot in client.prefs.slots_joined_as))
+ if(notify)
+ to_chat(src, "You cannot respawn on the same slot. Joined slots: [english_list(client.prefs.slots_joined_as)].")
+ return FALSE
+ if((!nameless && !randomname) && (client.prefs.characters_joined_as && (client.prefs.real_name in client.prefs.characters_joined_as)))
+ if(notify)
+ to_chat(src, "You cannot respawn on the same character. Joined slots: [english_list(client.prefs.characters_joined_as)].")
+ return FALSE
+ return TRUE
+
+/**
+ * Attempts to respawn.
+ */
+/mob/dead/observer/verb/respawn()
+ set name = "Respawn"
+ set category = "OOC"
+
+ if(!CONFIG_GET(flag/respawns_enabled))
+ to_chat(src, "Respawns are disabled in configuration.")
+ return
+
+ if(client.prefs.dnr_triggered)
+ to_chat(src, "You cannot respawn as you have enabled DNR.")
+ return
+
+ var/roundstart_timeleft = (SSticker.round_start_time + (CONFIG_GET(number/respawn_minimum_delay_roundstart) * 600)) - world.time
+ if(roundstart_timeleft > 0)
+ to_chat(src, "It's been too short of a time since the round started! Please wait [CEILING(roundstart_timeleft / 600, 0.1)] more minutes.")
+ return
+
+ var/list/banned_modes = CONFIG_GET(keyed_list/respawn_chaos_gamemodes)
+ if(SSticker.mode && banned_modes[lowertext(SSticker.mode.config_tag)])
+ to_chat(src, "The current mode tag, [SSticker.mode.config_tag], is not eligible for respawn.")
+ return
+
+ var/timeleft = time_left_to_respawn()
+ if(timeleft)
+ to_chat(src, "It's been too short of a time since you died/observed! Please wait [round(timeleft / 600, 0.1)] more minutes.")
+ return
+ do_respawn(TRUE)
+
+/**
+ * Gets time left until we can respawn. Returns 0 if we can respawn now.
+ */
+/mob/dead/observer/verb/time_left_to_respawn()
+ ASSERT(client)
+ return max(0, ((client.prefs.respawn_did_cryo? CONFIG_GET(number/respawn_delay_cryo) : CONFIG_GET(number/respawn_delay)) MINUTES + client.prefs.respawn_time_of_death) - world.time)
+
+/**
+ * Handles respawning
+ */
+/mob/dead/observer/proc/do_respawn(penalize)
+ if(!client)
+ return
+ if(isnull(penalize))
+ penalize = client.prefs.respawn_restrictions_active
+ client.prefs.respawn_restrictions_active = penalize
+
+ to_chat(src, "You have been respawned to the lobby. \
+ Remember to take heed of rules regarding round knowledge - notably, that ALL past lives are forgotten. \
+ Any character you join as has NO knowledge of round events unless specified otherwise by an admin.")
+
+ message_admins("[key_name_admin(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
+ log_game("[key_name(src)] was respawned to lobby [penalize? "with" : "without"] restrictions.")
+ transfer_to_lobby()
+
+/**
+ * Actual proc that removes us and puts us back on lobby
+ */
+/mob/dead/observer/proc/transfer_to_lobby()
+ if(!client) // if no one's in us we can just be deleted
+ qdel(src)
+ return
+ client.screen.Cut()
+ client.view_size.resetToDefault()
+ client.generate_clickcatcher()
+ client.apply_clickcatcher()
+ client.view_size.setDefault(getScreenSize(client.prefs.widescreenpref))
+ client.view_size.resetToDefault()
+
+ var/mob/dead/new_player/M = new /mob/dead/new_player
+ M.ckey = ckey
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 09d5c8a957..a16bfaab63 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -14,6 +14,7 @@
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
block_parry_data = /datum/block_parry_data/unarmed/human
+ default_block_parry_data = /datum/block_parry_data/unarmed/pugilist
//Hair colour and style
var/hair_color = "000"
@@ -106,20 +107,54 @@
parry_failed_clickcd_duration = 0.4
parry_data = list( // yeah it's snowflake
- "HUMAN_PARRY_STAGGER" = 3 SECONDS,
- "HUMAN_PARRY_PUNCH" = TRUE,
- "HUMAN_PARRY_MININUM_EFFICIENCY" = 0.9
+ "UNARMED_PARRY_STAGGER" = 3 SECONDS,
+ "UNARMED_PARRY_PUNCH" = TRUE,
+ "UNARMED_PARRY_MININUM_EFFICIENCY" = 90
)
-/mob/living/carbon/human/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
+/mob/living/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time)
var/datum/block_parry_data/D = return_block_parry_datum(block_parry_data)
+ . = ..()
if(!owner.Adjacent(attacker))
- return ..()
- if(parry_efficiency < D.parry_data["HUMAN_PARRY_MINIMUM_EFFICIENCY"])
- return ..()
+ return
+ if(parry_efficiency < D.parry_data["UNARMED_PARRY_MINIMUM_EFFICIENCY"])
+ return
visible_message("[src] strikes back perfectly at [attacker], staggering them!")
- if(D.parry_data["HUMAN_PARRY_PUNCH"])
+ if(D.parry_data["UNARMED_PARRY_PUNCH"])
UnarmedAttack(attacker, TRUE, INTENT_HARM, ATTACK_IS_PARRY_COUNTERATTACK | ATTACK_IGNORE_ACTION | ATTACK_IGNORE_CLICKDELAY | NO_AUTO_CLICKDELAY_HANDLING)
var/mob/living/L = attacker
if(istype(L))
- L.Stagger(D.parry_data["HUMAN_PARRY_STAGGER"])
+ L.Stagger(D.parry_data["UNARMED_PARRY_STAGGER"])
+
+/// Unarmed parry data for pugilists
+/datum/block_parry_data/unarmed/pugilist
+ parry_respect_clickdelay = FALSE
+ parry_stamina_cost = 4
+ parry_attack_types = ATTACK_TYPE_UNARMED | ATTACK_TYPE_PROJECTILE | ATTACK_TYPE_TACKLE | ATTACK_TYPE_THROWN | ATTACK_TYPE_MELEE
+ parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING
+
+ parry_time_windup = 0
+ parry_time_spindown = 0
+ parry_time_active = 5
+
+ parry_time_perfect = 1.5
+ parry_time_perfect_leeway = 1.5
+ parry_imperfect_falloff_percent = 20
+ parry_efficiency_perfect = 100
+ parry_efficiency_perfect_override = list(
+ ATTACK_TYPE_PROJECTILE_TEXT = 60,
+ )
+
+ parry_efficiency_considered_successful = 0.01
+ parry_efficiency_to_counterattack = 0.01
+ parry_max_attacks = INFINITY
+ parry_failed_cooldown_duration = 1.5 SECONDS
+ parry_failed_stagger_duration = 0
+ parry_cooldown = 0
+ parry_failed_clickcd_duration = 0.8
+
+ parry_data = list( // yeah it's snowflake
+ "UNARMED_PARRY_STAGGER" = 3 SECONDS,
+ "UNARMED_PARRY_PUNCH" = TRUE,
+ "UNARMED_PARRY_MININUM_EFFICIENCY" = 90
+ )
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 5ab645dc3a..aa27d4cb9d 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -66,6 +66,10 @@
GLOB.alive_mob_list -= src
if(!gibbed)
GLOB.dead_mob_list += src
+ if(ckey)
+ var/datum/preferences/P = GLOB.preferences_datums[ckey]
+ if(P)
+ P.respawn_time_of_death = world.time
set_drugginess(0)
set_disgust(0)
SetSleeping(0, 0)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b8dd97dcd7..180dc9e661 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -264,9 +264,9 @@
return FALSE
/mob/living/carbon/human/has_tail()
- if(!dna || !dna.features)
+ if(!dna || !dna.species)
return ..()
- var/list/L = dna.features // caches list because i refuse to type it out and because performance
+ var/list/L = dna.species.mutant_bodyparts // caches list because i refuse to type it out and because performance
return (L["mam_tail"] && (L["mam_tail"] != "None")) || (L["tail_human"] && (L["tail_human"] != "None")) || (L["tail_lizard"] && (L["tail_lizard"] != "None"))
/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE)
diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm
index 7353add745..16855d6f22 100644
--- a/code/modules/mob/living/living_active_parry.dm
+++ b/code/modules/mob/living/living_active_parry.dm
@@ -127,7 +127,7 @@
handle_parry_ending_effects(data, effect_text)
parrying = NOT_PARRYING
parry_start_time = 0
- parry_end_time_last = world.time
+ parry_end_time_last = world.time + (successful? 0 : data.parry_failed_cooldown_duration)
successful_parries = null
/**
diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm
index 08ef674b33..e290956873 100644
--- a/code/modules/mob/living/living_blocking_parrying.dm
+++ b/code/modules/mob/living/living_blocking_parrying.dm
@@ -154,6 +154,8 @@ GLOBAL_LIST_EMPTY(block_parry_data)
var/parry_failed_stagger_duration = 3.5 SECONDS
/// Clickdelay duration post-parry if you fail to parry an attack
var/parry_failed_clickcd_duration = 2 SECONDS
+ /// Parry cooldown post-parry if failed. This is ADDED to parry_cooldown!!!
+ var/parry_failed_cooldown_duration = 0 SECONDS
/**
* Quirky proc to get average of flags in list that are in attack_type because why is attack_type a flag.
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 5621fab9c1..d4ccc63b34 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -32,6 +32,10 @@
// Combat - Blocking/Parrying system
/// Our block_parry_data for unarmed blocks/parries. Currently only used for parrying, as unarmed block isn't implemented yet. YOU MUST RUN [get_block_parry_data(this)] INSTEAD OF DIRECTLY ACCESSING!
var/datum/block_parry_data/block_parry_data = /datum/block_parry_data // defaults to *something* because [combat_flags] dictates whether or not we can unarmed block/parry.
+ /// Default
+ var/datum/block_parry_data/default_block_parry_data = /datum/block_parry_data
+ /// If we're a pugilist
+ var/datum/block_parry_data/pugilist_block_parry_data = /datum/block_parry_data/unarmed/pugilist
// Blocking
/// The item the user is actively blocking with if any.
var/obj/item/active_block_item
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index 62c23cca9b..2256a93fa1 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -1,12 +1,3 @@
-/// IN THE FUTURE, WE WILL PROBABLY REFACTOR TO LESSEN THE NEED FOR UPDATE_MOBILITY, BUT FOR NOW.. WE CAN START DOING THIS.
-/// FOR BLOCKING MOVEMENT, USE TRAIT_MOBILITY_NOMOVE AS MUCH AS POSSIBLE. IT WILL MAKE REFACTORS IN THE FUTURE EASIER.
-/mob/living/ComponentInitialize()
- . = ..()
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOMOVE), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOPICKUP), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOUSE), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOREST), .proc/update_mobility)
- RegisterSignal(src, SIGNAL_TRAIT(TRAIT_LIVING_NO_DENSITY), .proc/update_density)
//Stuff like mobility flag updates, resting updates, etc.
diff --git a/code/modules/mob/living/living_signals.dm b/code/modules/mob/living/living_signals.dm
new file mode 100644
index 0000000000..0eb83658d7
--- /dev/null
+++ b/code/modules/mob/living/living_signals.dm
@@ -0,0 +1,20 @@
+/// IN THE FUTURE, WE WILL PROBABLY REFACTOR TO LESSEN THE NEED FOR UPDATE_MOBILITY, BUT FOR NOW.. WE CAN START DOING THIS.
+/// FOR BLOCKING MOVEMENT, USE TRAIT_MOBILITY_NOMOVE AS MUCH AS POSSIBLE. IT WILL MAKE REFACTORS IN THE FUTURE EASIER.
+/mob/living/ComponentInitialize()
+ . = ..()
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOMOVE), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOPICKUP), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOUSE), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_MOBILITY_NOREST), .proc/update_mobility)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_LIVING_NO_DENSITY), .proc/update_density)
+ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_PUGILIST), .proc/update_pugilism)
+
+/mob/living/proc/update_pugilism()
+ if(HAS_TRAIT(src, TRAIT_PUGILIST))
+ combat_flags |= COMBAT_FLAG_UNARMED_PARRY
+ block_parry_data = pugilist_block_parry_data
+ else
+ var/initial_combat_flags = initial(combat_flags)
+ if(!(initial_combat_flags & COMBAT_FLAG_UNARMED_PARRY))
+ combat_flags &= ~COMBAT_FLAG_UNARMED_PARRY
+ block_parry_data = default_block_parry_data
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 2547a41e3c..38352fdd83 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -479,39 +479,6 @@
else
to_chat(src, "You don't have a mind datum for some reason, so you can't add a note to it.")
-/mob/verb/abandon_mob()
- set name = "Respawn"
- set category = "OOC"
-
- if (CONFIG_GET(flag/norespawn))
- return
- if ((stat != DEAD || !( SSticker )))
- to_chat(usr, "You must be dead to use this!")
- return
-
- log_game("[key_name(usr)] used abandon mob.")
-
- to_chat(usr, "Please roleplay correctly!")
-
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- return
- client.screen.Cut()
- client.screen += client.void
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- return
-
- var/mob/dead/new_player/M = new /mob/dead/new_player()
- if(!client)
- log_game("[key_name(usr)] AM failed due to disconnect.")
- qdel(M)
- return
-
- M.key = key
-// M.Login() //wat
- return
-
/mob/proc/transfer_ckey(mob/new_mob, send_signal = TRUE)
if(!new_mob || (!ckey && new_mob.ckey))
CRASH("transfer_ckey() called [new_mob ? "on ckey-less mob with a player mob as target" : "without a valid mob target"]!")
@@ -1032,6 +999,12 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
switch(var_name)
if("logging")
return debug_variable(var_name, logging, 0, src, FALSE)
+ if(NAMEOF(src, lastKnownIP))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
+ if(NAMEOF(src, computer_id))
+ if(!check_rights(R_SENSITIVE, FALSE))
+ return "SENSITIVE"
. = ..()
/mob/vv_auto_rename(new_name)
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index fca89a1c73..bf7b94483e 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -305,12 +305,6 @@
results = list(/datum/reagent/medicine/regen_jelly = 2)
required_reagents = list(/datum/reagent/medicine/tricordrazine = 1, /datum/reagent/toxin/slimejelly = 1)
-/datum/chemical_reaction/jelly_convert
- name = "Blood Jelly Conversion"
- id = /datum/reagent/toxin/slimejelly
- results = list(/datum/reagent/toxin/slimejelly = 1)
- required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/blood/jellyblood = 1)
-
/datum/chemical_reaction/corazone
name = "Corazone"
id = /datum/reagent/medicine/corazone
diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt
index fc1cb96c86..adbba1acb6 100644
--- a/config/admin_ranks.txt
+++ b/config/admin_ranks.txt
@@ -30,6 +30,7 @@
# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too)
# +AUTOLOGIN = admin gains powers upon connect. This defaults to on, you can use -AUTOLOGIN to make a role require using the readmin verb to gain powers. (this does not effect the admin's ability to walk past bans or other on-connect limitations like panic bunker or pop limit.)
# +DBRANKS = when sql-based admin loading is enabled, allows for non-temporary changes in the permissions panel to be saved (requires DB)
+# +SENSITIVE = Defaults to on, use - to remove it. Allows reading IPs, CIDs, grabbing logs, and proccalls to certain things like admin holders/clients/subsystems considered "sensitive".
# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
# END_KEYWORDS
diff --git a/config/antag_rep.txt b/config/antag_rep.txt
index a26b157d5a..e8a7250686 100644
--- a/config/antag_rep.txt
+++ b/config/antag_rep.txt
@@ -1,5 +1,5 @@
-## Custom antag reputation values
-## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles
-## e.g.
-## ANTAG_REP Captain 10
-## ANTAG_REP Assistant 0
+## Custom antag reputation values
+## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles
+## e.g.
+## ANTAG_REP Captain 10
+## ANTAG_REP Assistant 0
diff --git a/config/comms.txt b/config/comms.txt
index 865011032e..5a32f10fd3 100644
--- a/config/comms.txt
+++ b/config/comms.txt
@@ -1,17 +1,17 @@
-## Communication key for receiving data through world/Topic(), you don't want to give this out
-#COMMS_KEY default_pwd
-
-## World address and port for server recieving cross server messages
-## Use '+' to denote spaces in ServerName
-## Repeat this entry to add more servers
-#CROSS_SERVER ServerName byond:\\address:port
-
-## Name that the server calls itself in communications
-#CROSS_COMMS_NAME
-
-## Hub address for tracking stats
-## example: Hubmakerckey.Hubname
-#MEDAL_HUB_ADDRESS
-
-## Password for the hub page
+## Communication key for receiving data through world/Topic(), you don't want to give this out
+#COMMS_KEY default_pwd
+
+## World address and port for server recieving cross server messages
+## Use '+' to denote spaces in ServerName
+## Repeat this entry to add more servers
+#CROSS_SERVER ServerName byond:\\address:port
+
+## Name that the server calls itself in communications
+#CROSS_COMMS_NAME
+
+## Hub address for tracking stats
+## example: Hubmakerckey.Hubname
+#MEDAL_HUB_ADDRESS
+
+## Password for the hub page
#MEDAL_HUB_PASSWORD
\ No newline at end of file
diff --git a/config/config.txt b/config/config.txt
index 8c7eee42a7..635e42359f 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -11,6 +11,7 @@ $include dynamic_config.txt
$include plushies/defines.txt
$include job_threats.txt
$include policy.txt
+$include respawns.txt
# Special Sandstorm configs
$include sandstorm/config.txt
@@ -208,9 +209,6 @@ VOTE_AUTOTRANSFER_MAXIMUM 4
## players' votes default to "No vote" (otherwise, default to "No change")
# DEFAULT_NO_VOTE
-## disable abandon mob
-NORESPAWN
-
## disables calling del(src) on newmobs if they logout before spawnin in
# DONT_DEL_NEWMOB
diff --git a/config/dynamic_config.txt b/config/dynamic_config.txt
index c08b316e2e..480f6d8ed8 100644
--- a/config/dynamic_config.txt
+++ b/config/dynamic_config.txt
@@ -13,6 +13,9 @@ STORYTELLER_WEIGHT EXTENDED 0
STORYTELLER_MIN_PLAYERS CHAOTIC 30
STORYTELLER_MIN_PLAYERS TEAMWORK 30
+## If this is uncommented, Dynamic won't disable certain storytellers based on recent round threats
+#NO_STORYTELLER_THREAT_REMOVAL
+
## Injection delays: how long (in minutes) will pass before a midround or latejoin antag is injected.
DYNAMIC_MIDROUND_DELAY_MIN 5
DYNAMIC_MIDROUND_DELAY_MAX 15
@@ -171,8 +174,8 @@ DYNAMIC_COST LATEJOIN_REVOLUTION 20
DYNAMIC_COST LATEJOIN_BLOODSUCKER 10
DYNAMIC_COST LATEJOIN_COLLECTOR 1
-## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement.
-## By default it's 0-8, 9-17, 18-26, 27-35, 36-44, 45-53, 54-60, 61-69, 70-78, 79+.
+## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement.
+## By default it's 0-8, 9-17, 18-26, 27-35, 36-44, 45-53, 54-60, 61-69, 70-78, 79+.
## This means that 40 30 30 20 20 20 15 15 15 10 will not generate below 40 at 0-8, 30 at 9-17 etc.
DYNAMIC_REQUIREMENTS TRAITOR 50 50 50 50 50 50 50 50 50 50
DYNAMIC_REQUIREMENTS TRAITORBRO 101 101 101 101 101 101 101 101 101 101
@@ -301,6 +304,6 @@ DYNAMIC_GLORIOUS_DEATH_COST 5
DYNAMIC_ASSASSINATE_COST 2
## This requirement uses threat level, rather than current threat, which is why it's higher.
-DYNAMIC_WAROPS_REQUIREMENT 60
+DYNAMIC_WAROPS_REQUIREMENT 60
DYNAMIC_WAROPS_COST 10
diff --git a/config/respawns.txt b/config/respawns.txt
new file mode 100644
index 0000000000..337a691b07
--- /dev/null
+++ b/config/respawns.txt
@@ -0,0 +1,29 @@
+## Allow usage of the respawn system
+RESPAWNS_ENABLED
+
+## Minutes delay before allowing respawns, either from death or observing. Not an integer.
+RESPAWN_DELAY 15.0
+
+## Minutes delay before allowing respawns, if the user cryo'd. Not an integer.
+RESPAWN_DELAY_CRYO 5.0
+
+## Allow respawning as anything but an assistant.
+ALLOW_NON_ASSISTANT_RESPAWN
+
+## Allow respawning as security and command. Only works if ALLOW_NON_ASSISTANT_RESPAWN is on.
+# ALLOW_COMBAT_ROLE_RESPAWN
+
+## Allow respawning as the same character
+# ALLOW_SAME_CHARACTER_RESPAWN
+
+## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observe locks you out.
+# RESPAWN_PENALTY_INCLUDES_OBSERVE
+
+## Time in minutes from round start before respawn is enabled
+RESPAWN_MINIMUM_DELAY_ROUNDSTART 30.0
+
+## Gamemode (config tags!) banlist for respawn
+RESPAWN_CHAOS_GAMEMODES WIZARD
+RESPAWN_CHAOS_GAMEMODES NUCLEAR
+RESPAWN_CHAOS_GAMEMODES CLONWOPS
+RESPAWN_CHOAS_GAMEMODES REVOLUTION
diff --git a/html/changelog.css b/html/changelog.css
index 2bfa3fa495..da32a5a557 100644
--- a/html/changelog.css
+++ b/html/changelog.css
@@ -1,41 +1,41 @@
-.top{font-family:Tahoma,sans-serif;font-size:12px;}
-h2{font-family:Tahoma,sans-serif;}
-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)}
-.refactor {background-image:url(burn-exclamation.png)}
-.code_imp {background-image:url(coding.png)}
-.config {background-image:url(chrome-wrench.png)}
-.admin {background-image:url(ban.png)}
-.server {background-image:url(hard-hat-exclamation.png)}
-.balance {background-image:url(scales.png)}
-.sansserif {font-family:Tahoma,sans-serif;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;}
+.top{font-family:Tahoma,sans-serif;font-size:12px;}
+h2{font-family:Tahoma,sans-serif;}
+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)}
+.refactor {background-image:url(burn-exclamation.png)}
+.code_imp {background-image:url(coding.png)}
+.config {background-image:url(chrome-wrench.png)}
+.admin {background-image:url(ban.png)}
+.server {background-image:url(hard-hat-exclamation.png)}
+.balance {background-image:url(scales.png)}
+.sansserif {font-family:Tahoma,sans-serif;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/AutoChangeLog-pr-13772.yml b/html/changelogs/AutoChangeLog-pr-13772.yml
new file mode 100644
index 0000000000..109360cace
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13772.yml
@@ -0,0 +1,5 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "players can now respawn/return to lobby as a ghost after a 15 minute (default) delay and rejoin on another character with some/many restrictions"
+ - rscadd: "cryo now preserves everything"
diff --git a/html/changelogs/AutoChangeLog-pr-13773.yml b/html/changelogs/AutoChangeLog-pr-13773.yml
new file mode 100644
index 0000000000..498ac42561
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13773.yml
@@ -0,0 +1,6 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - tweak: "Zeolites now use gold rather then uranium for catalyst"
+ - tweak: "Zeolites are not as hard to make ph wise"
+ - tweak: "Making Zeolites heats up the beaker less allowing for better control"
diff --git a/html/changelogs/AutoChangeLog-pr-13785.yml b/html/changelogs/AutoChangeLog-pr-13785.yml
new file mode 100644
index 0000000000..973fb3f74e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13785.yml
@@ -0,0 +1,5 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - tweak: "Grab bag works as advertised."
+ - balance: "Xeno threat in dynamic tripled."
diff --git a/html/changelogs/AutoChangeLog-pr-13814.yml b/html/changelogs/AutoChangeLog-pr-13814.yml
new file mode 100644
index 0000000000..9bd0be5ac0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13814.yml
@@ -0,0 +1,4 @@
+author: "Xantholne"
+delete-after: True
+changes:
+ - bugfix: "Twin Sword Sheaths have an equipment icon and icon when worn now and make a sound when sheathed/unsheathed"
diff --git a/html/changelogs/AutoChangeLog-pr-13815.yml b/html/changelogs/AutoChangeLog-pr-13815.yml
new file mode 100644
index 0000000000..630ca9d7f7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13815.yml
@@ -0,0 +1,4 @@
+author: "Yakumo Chen"
+delete-after: True
+changes:
+ - balance: "Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio"
diff --git a/html/changelogs/AutoChangeLog-pr-13819.yml b/html/changelogs/AutoChangeLog-pr-13819.yml
new file mode 100644
index 0000000000..77b1ec9a3d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13819.yml
@@ -0,0 +1,5 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - bugfix: "The survival dagger light on the sprite now actually turns on and off."
+ - balance: "The survival dagger in the glaive kit that can also be bought by itself is now better at butchering things."
diff --git a/html/changelogs/AutoChangeLog-pr-13822.yml b/html/changelogs/AutoChangeLog-pr-13822.yml
new file mode 100644
index 0000000000..743bdb500b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13822.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Bloodcult stunhands now work against clockies like they were supposed to instead of hardstunning."
diff --git a/html/changelogs/AutoChangeLog-pr-13823.yml b/html/changelogs/AutoChangeLog-pr-13823.yml
new file mode 100644
index 0000000000..35d70339f7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13823.yml
@@ -0,0 +1,4 @@
+author: "MrJWhit"
+delete-after: True
+changes:
+ - tweak: "Christmas starts on the 18th now"
diff --git a/html/changelogs/AutoChangeLog-pr-13825.yml b/html/changelogs/AutoChangeLog-pr-13825.yml
new file mode 100644
index 0000000000..ae82c1cd8e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13825.yml
@@ -0,0 +1,4 @@
+author: "raspy-on-osu"
+delete-after: True
+changes:
+ - tweak: "windoor open length"
diff --git a/html/changelogs/AutoChangeLog-pr-13828.yml b/html/changelogs/AutoChangeLog-pr-13828.yml
new file mode 100644
index 0000000000..282b8a01e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13828.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - bugfix: "you can now only entwine tails with people who have a tail"
diff --git a/html/changelogs/AutoChangeLog-pr-13832.yml b/html/changelogs/AutoChangeLog-pr-13832.yml
new file mode 100644
index 0000000000..756edb7657
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13832.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Bloodsuckers tresspass ability can no longer work while they are not awake."
diff --git a/html/changelogs/AutoChangeLog-pr-13833.yml b/html/changelogs/AutoChangeLog-pr-13833.yml
new file mode 100644
index 0000000000..8312c7a5a3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13833.yml
@@ -0,0 +1,4 @@
+author: "kiwedespars"
+delete-after: True
+changes:
+ - balance: "balanced bone gauntlets."
diff --git a/html/changelogs/AutoChangeLog-pr-13835.yml b/html/changelogs/AutoChangeLog-pr-13835.yml
new file mode 100644
index 0000000000..0ac90921c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13835.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - rscadd: "pugilists can now parry"
diff --git a/html/changelogs/AutoChangeLog-pr-13837.yml b/html/changelogs/AutoChangeLog-pr-13837.yml
new file mode 100644
index 0000000000..eda0b77a83
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13837.yml
@@ -0,0 +1,4 @@
+author: "silicons"
+delete-after: True
+changes:
+ - tweak: "anyone new to the server is lucky enough to have their sprint default to toggle instead of hold"
diff --git a/html/changelogs/AutoChangeLog-pr-13844.yml b/html/changelogs/AutoChangeLog-pr-13844.yml
new file mode 100644
index 0000000000..cd1f7a25d4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13844.yml
@@ -0,0 +1,4 @@
+author: "Arturlang"
+delete-after: True
+changes:
+ - bugfix: "Fixes the mint machine's UI"
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 8cdff2214b..31312ac9a1 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index 3c7a0420b3..b4c2808647 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -591,21 +591,21 @@
/datum/chemical_reaction/fermi/zeolites
name = "Zeolites"
id = /datum/reagent/fermi/zeolites
- results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! - But it's now somewhat dangerous, and needs a bit of uranium to catalyze the reaction
+ results = list(/datum/reagent/fermi/zeolites = 5) //We make a lot! - But it's now somewhat dangerous, and needs a bit of gold to catalyze the reaction
required_reagents = list(/datum/reagent/medicine/potass_iodide = 1, /datum/reagent/aluminium = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1)
- required_catalysts = list(/datum/reagent/uranium = 5)
+ required_catalysts = list(/datum/reagent/gold = 5)
//FermiChem vars:
OptimalTempMin = 500
OptimalTempMax = 750
ExplodeTemp = 850
- OptimalpHMin = 2.8
- OptimalpHMax = 5 //2.2 ph levels of optimal ph zone - centered at 3.9 - ph of ingredients mixed at equal values is 9.55; ph of result is 8.
- ReactpHLim = 4
+ OptimalpHMin = 4.8
+ OptimalpHMax = 7
+ ReactpHLim = 5
//CatalystFact = 0
CurveSharpT = 1.5
CurveSharppH = 3
- ThermicConstant = 7
+ ThermicConstant = 5
HIonRelease = -0.15
RateUpLim = 4
- PurityMin = 0.5 //Good luck.
+ PurityMin = 0.5 //Good luck!
FermiChem = TRUE
diff --git a/sound/voice/catpeople/license.txt b/sound/voice/catpeople/license.txt
index 7218480ddb..d0e8cad0c6 100644
--- a/sound/voice/catpeople/license.txt
+++ b/sound/voice/catpeople/license.txt
@@ -1,2 +1,2 @@
-distressed_cat.ogg from Cat annoyed meow / wail by jbierfeldt at https://freesound.org/people/jbierfeldt/sounds/440735/, chopped up and ogged
+distressed_cat.ogg from Cat annoyed meow / wail by jbierfeldt at https://freesound.org/people/jbierfeldt/sounds/440735/, chopped up and ogged
cat_puking.ogg from catpuking mp3 by NoiseCollector and Mocha the cat at https://freesound.org/people/NoiseCollector/sounds/80778/, chopped up, volume altered and ogged
\ No newline at end of file
diff --git a/strings/admin_nicknames.txt b/strings/admin_nicknames.txt
deleted file mode 100644
index 76198b6c05..0000000000
--- a/strings/admin_nicknames.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Badmin
-Spanmin
\ No newline at end of file
diff --git a/strings/names/adjectives.txt b/strings/names/adjectives.txt
index fe9b28d431..bca89bc5a2 100644
--- a/strings/names/adjectives.txt
+++ b/strings/names/adjectives.txt
@@ -1,375 +1,375 @@
-abundant
-adorable
-adventurous
-aggressive
-agreeable
-alert
-alive
-amused
-ancient
-angry
-annoyed
-annoying
-anxious
-arrogant
-ashamed
-attractive
-average
-awful
-bad
-beautiful
-better
-bewildered
-big
-bitter
-black
-bloody
-blue
-blue-eyed
-blushing
-boiling
-bored
-brainy
-brave
-breakable
-breezy
-brief
-bright
-broad
-broken
-bumpy
-busy
-calm
-careful
-cautious
-charming
-cheerful
-chilly
-chubby
-clean
-clear
-clever
-cloudy
-clumsy
-cold
-colorful
-colossal
-combative
-comfortable
-concerned
-condemned
-confused
-cooing
-cool
-cooperative
-courageous
-crazy
-crazy flipped-out
-creepy
-crooked
-crowded
-cruel
-cuddly
-curious
-curly
-curved
-cute
-damaged
-damp
-dangerous
-dark
-dead
-deafening
-deep
-defeated
-defiant
-delicious
-delightful
-depressed
-determined
-different
-difficult
-dirty
-disgusted
-distinct
-disturbed
-dizzy
-doubtful
-drab
-dry
-dull
-dusty
-eager
-early
-easy
-elated
-elegant
-embarrassed
-empty
-enchanting
-encouraging
-energetic
-enthusiastic
-envious
-evil
-excited
-expensive
-exuberant
-faint
-fair
-faithful
-famous
-fancy
-fantastic
-fast
-fat
-few
-fierce
-filthy
-fine
-flaky
-flat
-fluffy
-fluttering
-foolish
-fragile
-frail
-frantic
-freezing
-fresh
-friendly
-frightened
-funny
-fuzzy
-gentle
-gifted
-gigantic
-glamorous
-gleaming
-glorious
-good
-gorgeous
-graceful
-greasy
-great
-grieving
-grotesque
-grubby
-grumpy
-handsome
-happy
-hard
-harsh
-healthy
-heavy
-helpful
-helpless
-high
-high-pitched
-hilarious
-hissing
-hollow
-homeless
-homely
-horrible
-hot
-huge
-hungry
-hurt
-hushed
-husky
-icy
-ill
-immense
-important
-impossible
-inexpensive
-innocent
-inquisitive
-itchy
-jealous
-jittery
-jolly
-joyous
-juicy
-kind
-large
-late
-lazy
-light
-little
-lively
-lonely
-long
-loose
-loud
-lovely
-low
-lucky
-magnificent
-mammoth
-many
-massive
-melodic
-melted
-miniature
-misty
-moaning
-modern
-motionless
-muddy
-mushy
-mute
-mysterious
-narrow
-nasty
-naughty
-nervous
-nice
-noisy
-numerous
-nutritious
-nutty
-obedient
-obnoxious
-odd
-old
-old-fashioned
-open
-outrageous
-outstanding
-panicky
-perfect
-petite
-plain
-plastic
-pleasant
-poised
-poor
-powerful
-precious
-prickly
-proud
-puny
-purring
-puzzled
-quaint
-quick
-quiet
-rainy
-rapid
-raspy
-real
-relieved
-repulsive
-resonant
-rich
-ripe
-rotten
-rough
-round
-salty
-scary
-scattered
-scrawny
-screeching
-selfish
-shaggy
-shaky
-shallow
-sharp
-shiny
-shivering
-short
-shrill
-shy
-silent
-silky
-silly
-skinny
-sleepy
-slimy
-slippery
-slow
-small
-smiling
-smoggy
-smooth
-soft
-solid
-sore
-sour
-sparkling
-spicy
-splendid
-spotless
-square
-squealing
-stale
-steady
-steep
-sticky
-stormy
-straight
-strange
-strong
-stupid
-substantial
-successful
-super
-sweet
-swift
-talented
-tall
-tame
-tart
-Taste/Touch
-tasteless
-tasty
-teeny
-teeny-tiny
-tender
-tense
-terrible
-testy
-thankful
-thirsty
-thoughtful
-thoughtless
-thundering
-tight
-tiny
-tired
-tough
-troubled
-ugliest
-ugly
-uneven
-uninterested
-unsightly
-unusual
-upset
-uptight
-vast
-victorious
-vivacious
-voiceless
-wandering
-warm
-weak
-weary
-wet
-whispering
-wicked
-wide
-wide-eyed
-wild
-witty
-wonderful
-wooden
-worried
-wrong
-young
-yummy
-zany
+abundant
+adorable
+adventurous
+aggressive
+agreeable
+alert
+alive
+amused
+ancient
+angry
+annoyed
+annoying
+anxious
+arrogant
+ashamed
+attractive
+average
+awful
+bad
+beautiful
+better
+bewildered
+big
+bitter
+black
+bloody
+blue
+blue-eyed
+blushing
+boiling
+bored
+brainy
+brave
+breakable
+breezy
+brief
+bright
+broad
+broken
+bumpy
+busy
+calm
+careful
+cautious
+charming
+cheerful
+chilly
+chubby
+clean
+clear
+clever
+cloudy
+clumsy
+cold
+colorful
+colossal
+combative
+comfortable
+concerned
+condemned
+confused
+cooing
+cool
+cooperative
+courageous
+crazy
+crazy flipped-out
+creepy
+crooked
+crowded
+cruel
+cuddly
+curious
+curly
+curved
+cute
+damaged
+damp
+dangerous
+dark
+dead
+deafening
+deep
+defeated
+defiant
+delicious
+delightful
+depressed
+determined
+different
+difficult
+dirty
+disgusted
+distinct
+disturbed
+dizzy
+doubtful
+drab
+dry
+dull
+dusty
+eager
+early
+easy
+elated
+elegant
+embarrassed
+empty
+enchanting
+encouraging
+energetic
+enthusiastic
+envious
+evil
+excited
+expensive
+exuberant
+faint
+fair
+faithful
+famous
+fancy
+fantastic
+fast
+fat
+few
+fierce
+filthy
+fine
+flaky
+flat
+fluffy
+fluttering
+foolish
+fragile
+frail
+frantic
+freezing
+fresh
+friendly
+frightened
+funny
+fuzzy
+gentle
+gifted
+gigantic
+glamorous
+gleaming
+glorious
+good
+gorgeous
+graceful
+greasy
+great
+grieving
+grotesque
+grubby
+grumpy
+handsome
+happy
+hard
+harsh
+healthy
+heavy
+helpful
+helpless
+high
+high-pitched
+hilarious
+hissing
+hollow
+homeless
+homely
+horrible
+hot
+huge
+hungry
+hurt
+hushed
+husky
+icy
+ill
+immense
+important
+impossible
+inexpensive
+innocent
+inquisitive
+itchy
+jealous
+jittery
+jolly
+joyous
+juicy
+kind
+large
+late
+lazy
+light
+little
+lively
+lonely
+long
+loose
+loud
+lovely
+low
+lucky
+magnificent
+mammoth
+many
+massive
+melodic
+melted
+miniature
+misty
+moaning
+modern
+motionless
+muddy
+mushy
+mute
+mysterious
+narrow
+nasty
+naughty
+nervous
+nice
+noisy
+numerous
+nutritious
+nutty
+obedient
+obnoxious
+odd
+old
+old-fashioned
+open
+outrageous
+outstanding
+panicky
+perfect
+petite
+plain
+plastic
+pleasant
+poised
+poor
+powerful
+precious
+prickly
+proud
+puny
+purring
+puzzled
+quaint
+quick
+quiet
+rainy
+rapid
+raspy
+real
+relieved
+repulsive
+resonant
+rich
+ripe
+rotten
+rough
+round
+salty
+scary
+scattered
+scrawny
+screeching
+selfish
+shaggy
+shaky
+shallow
+sharp
+shiny
+shivering
+short
+shrill
+shy
+silent
+silky
+silly
+skinny
+sleepy
+slimy
+slippery
+slow
+small
+smiling
+smoggy
+smooth
+soft
+solid
+sore
+sour
+sparkling
+spicy
+splendid
+spotless
+square
+squealing
+stale
+steady
+steep
+sticky
+stormy
+straight
+strange
+strong
+stupid
+substantial
+successful
+super
+sweet
+swift
+talented
+tall
+tame
+tart
+Taste/Touch
+tasteless
+tasty
+teeny
+teeny-tiny
+tender
+tense
+terrible
+testy
+thankful
+thirsty
+thoughtful
+thoughtless
+thundering
+tight
+tiny
+tired
+tough
+troubled
+ugliest
+ugly
+uneven
+uninterested
+unsightly
+unusual
+upset
+uptight
+vast
+victorious
+vivacious
+voiceless
+wandering
+warm
+weak
+weary
+wet
+whispering
+wicked
+wide
+wide-eyed
+wild
+witty
+wonderful
+wooden
+worried
+wrong
+young
+yummy
+zany
zealous
\ No newline at end of file
diff --git a/strings/names/ai.txt b/strings/names/ai.txt
index 2ea5e18fc0..4104337d2c 100644
--- a/strings/names/ai.txt
+++ b/strings/names/ai.txt
@@ -1,146 +1,146 @@
-1-Rover-1
-16-20
-7-Zark-7
-790
-Adaptive Manipulator
-Allied Mastercomputer
-Alpha 5
-Alpha 6
-Alpha 7
-AM
-AMEE
-AmigoBot
-Android
-Aniel
-Asimov
-ASTAR
-Astor
-B O B
-B-4
-B-9
-B166ER
-Bender
-Bishop
-Blitz
-Box
-Brackenridge
-C-3PO
-Cassandra One
-Cell
-Chii
-Chip
-Computer
-Conky 2000
-Cutie
-Data
-Decimus
-Dee Model
-Deep Thought
-Dor-15
-Dorfl
-Dot Matrix
-Duey
-E D I
-E-Man
-ED-209
-Emma-2
-Erasmus
-Ez-27
-Fagor
-Faith
-Fi
-FRIEND COMPUTER
-Frost
-Fum
-Futura
-G2
-George
-Gnut
-Gort
-H A R L I E
-H E L P eR
-H E R B I E
-Hadaly
-HAL 9000
-Huey
-Irona
-Ironhide
-Jay-Dub
-Jinx
-Johnny 5
-K-9
-KITT
-Klapaucius
-Kryten 2X4B-523P
-L-76
-L-Ron
-Louie
-LUH 3417
-Maria
-MARK13
-Marvin
-Master Control Program
-Max 404
-Maximillian
-Mechagodzilla
-Mechani-Kong
-Megatron
-Metalhead
-Mr R I N G
-Mugsy3000
-NCH
-Necron-99
-Norby
-OMM 0910
-Optimus
-Orange v 3 5
-Project 2501
-PTO
-R I C 2 0
-R2-D2
-R4-P17
-Revelation
-Ro-Man
-Robbie
-Robot Devil
-S A M
-S H O C K
-S H R O U D
-S O P H I E
-SEN 5241
-Setaur
-SHODAN
-Shrike
-SID 6 7
-Solo
-Soundwave
-Speedy
-Super 17
-Surgeon General Kraken
-T-1000
-T-800
-T-850
-Terminus
-THX 1138
-Tidy
-Tik-Tok
-Tobor
-Trurl
-TWA
-ULTRABOT
-Ulysses
-Uniblab
-V I N CENT
-Voltes V
-W1k1
-Wikipedia
-Windows 3 1
-X-5
-XERXES
-XR
-Yod
-Z-1
-Z-2
-Z-3
-Zed
+1-Rover-1
+16-20
+7-Zark-7
+790
+Adaptive Manipulator
+Allied Mastercomputer
+Alpha 5
+Alpha 6
+Alpha 7
+AM
+AMEE
+AmigoBot
+Android
+Aniel
+Asimov
+ASTAR
+Astor
+B O B
+B-4
+B-9
+B166ER
+Bender
+Bishop
+Blitz
+Box
+Brackenridge
+C-3PO
+Cassandra One
+Cell
+Chii
+Chip
+Computer
+Conky 2000
+Cutie
+Data
+Decimus
+Dee Model
+Deep Thought
+Dor-15
+Dorfl
+Dot Matrix
+Duey
+E D I
+E-Man
+ED-209
+Emma-2
+Erasmus
+Ez-27
+Fagor
+Faith
+Fi
+FRIEND COMPUTER
+Frost
+Fum
+Futura
+G2
+George
+Gnut
+Gort
+H A R L I E
+H E L P eR
+H E R B I E
+Hadaly
+HAL 9000
+Huey
+Irona
+Ironhide
+Jay-Dub
+Jinx
+Johnny 5
+K-9
+KITT
+Klapaucius
+Kryten 2X4B-523P
+L-76
+L-Ron
+Louie
+LUH 3417
+Maria
+MARK13
+Marvin
+Master Control Program
+Max 404
+Maximillian
+Mechagodzilla
+Mechani-Kong
+Megatron
+Metalhead
+Mr R I N G
+Mugsy3000
+NCH
+Necron-99
+Norby
+OMM 0910
+Optimus
+Orange v 3 5
+Project 2501
+PTO
+R I C 2 0
+R2-D2
+R4-P17
+Revelation
+Ro-Man
+Robbie
+Robot Devil
+S A M
+S H O C K
+S H R O U D
+S O P H I E
+SEN 5241
+Setaur
+SHODAN
+Shrike
+SID 6 7
+Solo
+Soundwave
+Speedy
+Super 17
+Surgeon General Kraken
+T-1000
+T-800
+T-850
+Terminus
+THX 1138
+Tidy
+Tik-Tok
+Tobor
+Trurl
+TWA
+ULTRABOT
+Ulysses
+Uniblab
+V I N CENT
+Voltes V
+W1k1
+Wikipedia
+Windows 3 1
+X-5
+XERXES
+XR
+Yod
+Z-1
+Z-2
+Z-3
+Zed
Zord
\ No newline at end of file
diff --git a/strings/names/carp.txt b/strings/names/carp.txt
index 4b10aa65f7..223106992b 100644
--- a/strings/names/carp.txt
+++ b/strings/names/carp.txt
@@ -1,30 +1,30 @@
-Lungfish
-Blackfish
-Alligator
-Icefish
-Armorhead
-Hammerhead
-Anaconda
-Flathead
-Manta Ray
-Sting Ray
-Fangtooth Moray
-Goblin Shark
-Grass Carp
-Round River Bat Ray
-Noodlefish
-Hagfish
-Man o’ War
-Ladyfish
-Black Eel
-Baby Seal
-Sprat
-Koi
-Electric Eel
-Lamprey
-Pejeray
-Yellow-edged Moray
-Salmon Shark
-Sleeper Shark
-Featherback
-Eagle Ray
+Lungfish
+Blackfish
+Alligator
+Icefish
+Armorhead
+Hammerhead
+Anaconda
+Flathead
+Manta Ray
+Sting Ray
+Fangtooth Moray
+Goblin Shark
+Grass Carp
+Round River Bat Ray
+Noodlefish
+Hagfish
+Man o’ War
+Ladyfish
+Black Eel
+Baby Seal
+Sprat
+Koi
+Electric Eel
+Lamprey
+Pejeray
+Yellow-edged Moray
+Salmon Shark
+Sleeper Shark
+Featherback
+Eagle Ray
diff --git a/strings/names/clown.txt b/strings/names/clown.txt
index d8655d7cbf..3b4b4dcb75 100644
--- a/strings/names/clown.txt
+++ b/strings/names/clown.txt
@@ -1,62 +1,62 @@
-Alfie
-Antsy
-Baby Cakes
-Bam Bam
-Beebee
-Bo Bo Sassy
-Bonker
-Bonbon
-Bubble
-Buster Frown
-Buttercup
-Button
-Candy
-Checkers
-Clarabell
-Clownsky
-Clueless
-Cluesky
-Dazzle
-Dinky Doodle
-Doodles
-Duckie
-Flop O'Honker
-Freckle
-Giggles
-Gigglesworth
-Goose McSunny
-Honkel the III
-Honker
-Honkerbelle
-Knicknack
-Jazzy Bella
-Jingle
-Joy
-Jo Jo Bobo Bo
-Ladybug Honks
-Lala
-Miss Stockings
-Mittens
-Mr Shoe
-Patches
-Pancake
-Pepinpop
-Pocket
-Razzle Dazzle
-Redshirt McBeat
-Ronnie Pace
-Scootaloo
-Silly Willy
-Skiddle
-Slippy Joe
-Sparkle
-Speckles
-Sprinkledinkle
-Squigley
-Tickle
-Topcake
-Toodles Sharperton
-Trixy
-Witty
-Ziggy Yoyo
-Zippy
+Alfie
+Antsy
+Baby Cakes
+Bam Bam
+Beebee
+Bo Bo Sassy
+Bonker
+Bonbon
+Bubble
+Buster Frown
+Buttercup
+Button
+Candy
+Checkers
+Clarabell
+Clownsky
+Clueless
+Cluesky
+Dazzle
+Dinky Doodle
+Doodles
+Duckie
+Flop O'Honker
+Freckle
+Giggles
+Gigglesworth
+Goose McSunny
+Honkel the III
+Honker
+Honkerbelle
+Knicknack
+Jazzy Bella
+Jingle
+Joy
+Jo Jo Bobo Bo
+Ladybug Honks
+Lala
+Miss Stockings
+Mittens
+Mr Shoe
+Patches
+Pancake
+Pepinpop
+Pocket
+Razzle Dazzle
+Redshirt McBeat
+Ronnie Pace
+Scootaloo
+Silly Willy
+Skiddle
+Slippy Joe
+Sparkle
+Speckles
+Sprinkledinkle
+Squigley
+Tickle
+Topcake
+Toodles Sharperton
+Trixy
+Witty
+Ziggy Yoyo
+Zippy
diff --git a/strings/names/death_commando.txt b/strings/names/death_commando.txt
index e689727228..fa47fb2065 100644
--- a/strings/names/death_commando.txt
+++ b/strings/names/death_commando.txt
@@ -1,70 +1,70 @@
-A whole bunch of spiders in a SWAT suit
-Al "Otta" Gore
-AMERICA
-Beat Punchbeef
-Blast Hardcheese
-Blast Thickneck
-Bob Johnson
-Bold Bigflank
-Bolt Vanderhuge
-Brick Hardmeat
-Buck Plankchest
-Buff Drinklots
-Buff Hardback
-Butch Deadlift
-Crud Bonemeal
-Crunch Buttsteak
-Crush McStompbones
-Dirk Hardpeck
-Duke Killington
-Evil Bob Marley
-Evil Martin Luther King
-Fist Rockbone
-Flint Ironstag
-Fridge Largemeat
-George Melons
-Gibbs McLargehuge
-GORE Vidal
-Gristle McThornBody
-Hank Chesthair
-Hans Testosteroneson
-Killiam Shakespeare
-Killing McKillingalot
-Lance Killiam
-Leonardo Da Viking
-Lump Beefrock
-Mancrush McBrorape
-Max Pain
-Maximilian Murderface
-Maxx Power
-Noam Bombsky
-Pack Blowfist
-Punch Rockgroin
-Punch Sideiron
-Punt Speedchunk
-Reef Blastbody
-Rex Dudekiller VII
-Rip Sidecheek
-Rip Steakface
-Roll Fizzlebeef
-Sarah Pain
-Seamus McTosterone
-Sgt Slaughter
-Sir Killaslot
-Slab Bulkhead
-Slab Squatthrust
-Slake Fistcrunch
-Slate Slabrock
-Smash Lampjaw
-Smoke Manmuscle
-Splint Chesthair
-Stabby McGee
-Stump Beefgnaw
-Stump Chunkman
-THAT DAMN TRAITOR GEORGE MELONS
-Theodore Pain
-Thick McRunfast
-Toolboxl Rose
-Touch Rustrod
-Trunk Slamchest
-Zombie Gandhi
+A whole bunch of spiders in a SWAT suit
+Al "Otta" Gore
+AMERICA
+Beat Punchbeef
+Blast Hardcheese
+Blast Thickneck
+Bob Johnson
+Bold Bigflank
+Bolt Vanderhuge
+Brick Hardmeat
+Buck Plankchest
+Buff Drinklots
+Buff Hardback
+Butch Deadlift
+Crud Bonemeal
+Crunch Buttsteak
+Crush McStompbones
+Dirk Hardpeck
+Duke Killington
+Evil Bob Marley
+Evil Martin Luther King
+Fist Rockbone
+Flint Ironstag
+Fridge Largemeat
+George Melons
+Gibbs McLargehuge
+GORE Vidal
+Gristle McThornBody
+Hank Chesthair
+Hans Testosteroneson
+Killiam Shakespeare
+Killing McKillingalot
+Lance Killiam
+Leonardo Da Viking
+Lump Beefrock
+Mancrush McBrorape
+Max Pain
+Maximilian Murderface
+Maxx Power
+Noam Bombsky
+Pack Blowfist
+Punch Rockgroin
+Punch Sideiron
+Punt Speedchunk
+Reef Blastbody
+Rex Dudekiller VII
+Rip Sidecheek
+Rip Steakface
+Roll Fizzlebeef
+Sarah Pain
+Seamus McTosterone
+Sgt Slaughter
+Sir Killaslot
+Slab Bulkhead
+Slab Squatthrust
+Slake Fistcrunch
+Slate Slabrock
+Smash Lampjaw
+Smoke Manmuscle
+Splint Chesthair
+Stabby McGee
+Stump Beefgnaw
+Stump Chunkman
+THAT DAMN TRAITOR GEORGE MELONS
+Theodore Pain
+Thick McRunfast
+Toolboxl Rose
+Touch Rustrod
+Trunk Slamchest
+Zombie Gandhi
diff --git a/strings/names/first.txt b/strings/names/first.txt
index cc99e59d84..3f9018adca 100644
--- a/strings/names/first.txt
+++ b/strings/names/first.txt
@@ -1,1396 +1,1396 @@
-Aaden
-Aaliyah
-Aaron
-Abby
-Abel
-Abigail
-Abraham
-Adam
-Adan
-Addison
-Addyson
-Adeline
-Aden
-Adolph
-Adrian
-Adriana
-Adrianna
-Aida
-Aidan
-Aiden
-Aileen
-Ainsley
-Alaina
-Alan
-Alana
-Alanna
-Alayna
-Albert
-Alberto
-Alden
-Alec
-Alejandra
-Alejandro
-Alessandra
-Alex
-Alexa
-Alexander
-Alexandra
-Alexandria
-Alexia
-Alexis
-Alexus
-Alfred
-Alfreda
-Alfredo
-Alger
-Ali
-Alice
-Alicia
-Alijah
-Alina
-Alisa
-Alison
-Alissa
-Alisya
-Alivia
-Aliyah
-Allegra
-Allegria
-Allen
-Allie
-Allison
-Allisson
-Allyson
-Alma
-Alondra
-Alvin
-Alysha
-Alyson
-Alyssa
-Alyssia
-Amanda
-Amari
-Amaryllis
-Amaya
-Amber
-Ambrosine
-Amelia
-Amir
-Amira
-Amiyah
-Amos
-Amy
-Amya
-Ana
-Anahi
-Anastasia
-Anaya
-Anderson
-Andre
-Andrea
-Andres
-Andrew
-Andy
-Angel
-Angela
-Angelica
-Angelina
-Angelo
-Angie
-Aniya
-Aniyah
-Anjelica
-Anna
-Annabelle
-Anne
-Annie
-Annika
-Anthony
-Antonio
-Anya
-April
-Arabella
-Archie
-Ariana
-Arianna
-Ariel
-Arielle
-Arleen
-Armando
-Arn
-Art
-Arthur
-Arturo
-Asher
-Ashley
-Ashlie
-Ashlyn
-Ashlynn
-Ashton
-Asia
-Astor
-Athena
-Aubree
-Aubrey
-Aubrie
-Audrey
-Audrina
-August
-Aurora
-Austin
-Autumn
-Ava
-Avalon
-Averill
-Avery
-Axel
-Ayden
-Ayla
-Bailey
-Baldric
-Barbra
-Bartholomew
-Baylee
-Beau
-Beckah
-Beckett
-Becky
-Bella
-Benjamin
-Bennett
-Bernice
-Bertrand
-Bethany
-Bethney
-Betsy
-Bianca
-Bidelia
-Bill
-Blake
-Braden
-Bradley
-Brady
-Braeden
-Braiden
-Brandon
-Braxton
-Brayan
-Brayden
-Braydon
-Braylon
-Breanna
-Breanne
-Brenda
-Brendan
-Brenden
-Brenna
-Brennan
-Brett
-Brian
-Briana
-Brianna
-Bridget
-Brielle
-Brittani
-Brittany
-Brock
-Brodie
-Brody
-Bronte
-Brooke
-Brooklyn
-Brooklynn
-Bruce
-Bryan
-Bryant
-Bryce
-Brycen
-Brynn
-Bryson
-Burt
-Byrne
-Byron
-Bysshe
-Cade
-Caden
-Cadence
-Caiden
-Caitlin
-Caitlyn
-Calanthia
-Caleb
-Caleigh
-Cali
-Callie
-Calvin
-Camden
-Cameron
-Camila
-Camille
-Camron
-Camryn
-Candace
-Candice
-Candis
-Canute
-Cara
-Carl
-Carlos
-Carly
-Carlyle
-Carmen
-Carolina
-Caroline
-Carolyn
-Carry
-Carson
-Carter
-Caryl
-Casey
-Cash
-Casimir
-Cassandra
-Cassian
-Cassidy
-Catherine
-Cayden
-Cecilia
-Cecily
-Celeste
-Cesar
-Chad
-Chance
-Chandler
-Charles
-Charlie
-Charlotte
-Charlton
-Chase
-Chelsea
-Cherette
-Cheri
-Cherry
-Cheyanne
-Cheyenne
-Chip
-Chloe
-Chris
-Christa
-Christian
-Christiana
-Christina
-Christobel
-Christopher
-Ciara
-Cindy
-Claire
-Clara
-Claribel
-Clark
-Claudia
-Claudius
-Clayton
-Clement
-Cleveland
-Cliff
-Clinton
-Clitus
-Clover
-Cody
-Cohen
-Colby
-Cole
-Colin
-Collin
-Colten
-Colton
-Conner
-Connor
-Cooper
-Cora
-Corbin
-Coreen
-Corey
-Corrine
-Cory
-Courtney
-Cristian
-Cristopher
-Cruz
-Crystal
-Curtis
-Cy
-Cynthia
-Daisy
-Dakota
-Dallas
-Dalton
-Dalya
-Damian
-Damien
-Damon
-Dana
-Dane
-Danica
-Daniel
-Daniela
-Daniella
-Danielle
-Danika
-Danna
-Danny
-Dante
-Darcey
-Darell
-Daria
-Darin
-Darius
-Darren
-David
-Davion
-Davis
-Dawson
-Dayana
-Dayna
-Dayton
-Dean
-Deandre
-Deangelo
-Debbi
-Declan
-Dee
-Deena
-Delaney
-Delilah
-Della
-Delma
-Denholm
-Denise
-Dennis
-Denys
-Derek
-Derrick
-Desiree
-Desmond
-Destiny
-Devin
-Devon
-Diamond
-Diana
-Diego
-Dillon
-Dina
-Dolores
-Dominic
-Dominick
-Donald
-Donella
-Donna
-Donny
-Donovan
-Dorian
-Dorothy
-Dortha
-Douglas
-Drake
-Drew
-Driscoll
-Dulce
-Duncan
-Dustin
-Dylan
-Easter
-Easton
-Ebba
-Eddie
-Eden
-Edgar
-Eduardo
-Edward
-Edwin
-Effie
-Elaina
-Eleanor
-Elena
-Eli
-Eliana
-Elias
-Elijah
-Eliot
-Eliott
-Elise
-Eliza
-Elizabeth
-Ella
-Elle
-Ellie
-Elliot
-Elliott
-Elric
-Elspet
-Elwood
-Emanuel
-Emely
-Emerson
-Emery
-Emilee
-Emilia
-Emiliano
-Emilio
-Emily
-Emma
-Emmanuel
-Enrique
-Eric
-Erica
-Erick
-Erik
-Erika
-Erin
-Ermintrude
-Ernesto
-Esmeralda
-Esteban
-Esther
-Estrella
-Ethan
-Eugenia
-Euphemia
-Eustace
-Eva
-Evan
-Evangeline
-Eveleen
-Evelina
-Evelyn
-Everett
-Ezekiel
-Ezra
-Fabian
-Faith
-Fatima
-Fay
-Felix
-Fernanda
-Fernando
-Finn
-Fiona
-Fitz
-Flick
-Floella
-Flora
-Flossie
-Fortune
-Francesca
-Francis
-Francisco
-Frank
-Frankie
-Franklin
-Fulton
-Gabriel
-Gabriela
-Gabriella
-Gabrielle
-Gael
-Gage
-Garret
-Garrett
-Gary
-Gavin
-Gaye
-Gaylord
-Genesis
-Genette
-Genevieve
-George
-Georgene
-Georgia
-Geraldine
-Gerardo
-Gervase
-Gianna
-Gina
-Ginger
-Giovanni
-Giselle
-Gladwyn
-Glenna
-Gloria
-Goddard
-Godwin
-Goodwin
-Gordon
-Grace
-Gracie
-Grady
-Graeme
-Graham
-Grant
-Gratian
-Grayson
-Gregory
-Greta
-Greyson
-Griffin
-Griselda
-Guadalupe
-Guillermo
-Gunner
-Gustavo
-Gwenda
-Gwenevere
-Hadley
-Haidee
-Hailee
-Hailey
-Hal
-Haleigh
-Haley
-Hanna
-Hannah
-Happy
-Harley
-Harmony
-Harper
-Harrison
-Hartley
-Hayden
-Haylee
-Hayley
-Haylie
-Hazel
-Heather
-Heaven
-Hector
-Hedley
-Heidi
-Helen
-Henderson
-Henry
-Hepsie
-Hervey
-Holden
-Holly
-Homer
-Hope
-Horatio
-Hortensia
-Hudson
-Huffie
-Hugo
-Hunter
-Ian
-Iantha
-Ileen
-Imani
-Innocent
-Irene
-Iris
-Irvine
-Isaac
-Isabel
-Isabella
-Isabelle
-Isaiah
-Isaias
-Isiah
-Ismael
-Israel
-Issac
-Itzel
-Ivan
-Ivy
-Izabella
-Izaiah
-Jacaline
-Jace
-Jack
-Jackson
-Jacob
-Jacoby
-Jacqueline
-Jacquetta
-Jacqui
-Jada
-Jade
-Jaden
-Jadon
-Jadyn
-Jaelyn
-Jaiden
-Jaime
-Jake
-Jakki
-Jakob
-Jalen
-Jamar
-Jamari
-Jamarion
-James
-Jameson
-Jamie
-Jamison
-Jane
-Janel
-Janelle
-Janette
-Janie
-Janina
-Janine
-Janiya
-Janiyah
-Jared
-Jaslene
-Jasmin
-Jasmine
-Jason
-Jasper
-Javier
-Javon
-Jaxon
-Jaxson
-Jay
-Jayce
-Jayda
-Jayden
-Jaydon
-Jaye
-Jayla
-Jaylee
-Jaylen
-Jayne
-Jaynie
-Jayson
-Jazlyn
-Jazmin
-Jazmine
-Jeanna
-Jeannie
-Jeannine
-Jeb
-Jed
-Jeffrey
-Jemmy
-Jenifer
-Jenna
-Jennie
-Jennifer
-Jera
-Jere
-Jeremiah
-Jeremy
-Jeri
-Jermaine
-Jerrie
-Jerry
-Jesse
-Jessica
-Jesus
-Jillian
-Jillie
-Jim
-Jimena
-Jimmy
-Joachim
-Joanna
-Joaquin
-Jocelyn
-Joe
-Joel
-Joetta
-Joey
-Johan
-Johanna
-John
-Johnathan
-Johnny
-Joi
-Jonah
-Jonas
-Jonathan
-Jonathon
-Joni
-Jordan
-Jordyn
-Jorge
-Jose
-Joselyn
-Joseph
-Josepha
-Josephine
-Josh
-Joshua
-Josiah
-Josie
-Josue
-Joye
-Juan
-Judah
-Jude
-Julia
-Julian
-Juliana
-Julianna
-Julie
-Juliet
-Julio
-Julissa
-Julius
-July
-Justice
-Justin
-Kade
-Kaden
-Kadence
-Kaelea
-Kaelyn
-Kai
-Kaiden
-Kailey
-Kailyn
-Kaitlin
-Kaitlyn
-Kale
-Kaleb
-Kaleigh
-Kameron
-Kamryn
-Kane
-Kara
-Karen
-Karenza
-Karina
-Karla
-Karly
-Karson
-Karyn
-Kassidy
-Kat
-Kate
-Katelyn
-Katelynn
-Katherine
-Kathleen
-Kathryn
-Kathy
-Katie
-Katlyn
-Kayden
-Kaydence
-Kayla
-Kaylee
-Kayleigh
-Kaylie
-Kaylin
-Keagan
-Keaton
-Keegan
-Keira
-Keith
-Kellen
-Kellie
-Kelly
-Kelsey
-Kelvin
-Kendall
-Kendra
-Kennard
-Kennedy
-Kenneth
-Kenzie
-Kerena
-Kerensa
-Keturah
-Kevin
-Keziah
-Khalil
-Khloe
-Kiana
-Kiara
-Kiera
-Kiley
-Kimberley
-Kimberly
-Kimora
-Kingston
-Kira
-Kobe
-Kolton
-Kristen
-Kristina
-Kristopher
-Kyla
-Kyle
-Kylee
-Kyleigh
-Kyler
-Kylie
-Kyra
-Lacey
-Lacy
-Laila
-Lakeisha
-Lalla
-Lana
-Lance
-Landen
-Landon
-Landyn
-Lane
-Lanny
-Larry
-Latanya
-Launce
-Laura
-Lauren
-Laurencia
-Laurissa
-Lauryn
-Lawrence
-Layla
-Leah
-Leeann
-Leia
-Leila
-Leilani
-Leland
-Lena
-Lennox
-Leo
-Leonardo
-Leonel
-Leroi
-Leslie
-Lesly
-Lessie
-Leta
-Levi
-Lexi
-Lexia
-Lexus
-Lia
-Liam
-Lila
-Lilah
-Lilian
-Liliana
-Lillian
-Lilliana
-Lillie
-Lilly
-Lily
-Lincoln
-Linden
-Lindsay
-Lindsey
-Lindsie
-Lindy
-Linton
-Lizbeth
-Lockie
-Logan
-Lola
-London
-Lorenzo
-Loreto
-Lori
-Lorin
-Lou
-Louis
-Luanne
-Luca
-Lucas
-Lucia
-Lucian
-Lucy
-Luis
-Lukas
-Luke
-Luna
-Luvenia
-Lydia
-Lyla
-Lyndsey
-Lynn
-Lynsey
-Lynwood
-Lyric
-Mabelle
-Macey
-Macie
-Mackenzie
-Macy
-Madalyn
-Maddison
-Maddox
-Madeleine
-Madeline
-Madelyn
-Madelynn
-Madilyn
-Madison
-Madisyn
-Madyson
-Maegan
-Maggie
-Makayla
-Makenna
-Makenzie
-Malachi
-Malcolm
-Malia
-Malik
-Mallory
-Manley
-Manuel
-Marc
-Marcia
-Marco
-Marcos
-Marcus
-Marely
-Margaret
-Maria
-Mariabella
-Mariah
-Mariana
-Marilene
-Mario
-Marion
-Marisol
-Marissa
-Marje
-Marjory
-Mark
-Marlee
-Marley
-Marlowe
-Marlyn
-Marshall
-Martin
-Marvin
-Mary
-Maryann
-Mason
-Mateo
-Mathew
-Matthew
-Maudie
-Maurene
-Maurice
-Mauricio
-Max
-Maximilian
-Maximus
-Maxwell
-May
-Maya
-Maynard
-Mckenna
-Mckenzie
-Megan
-Meghan
-Mekhi
-Melanie
-Melany
-Melissa
-Melody
-Melvin
-Melvyn
-Meredith
-Merideth
-Merrilyn
-Meryl
-Mia
-Micah
-Michael
-Michaela
-Micheal
-Michelle
-Miguel
-Mikayla
-Mike
-Miles
-Miley
-Milo
-Milton
-Minnie
-Miracle
-Miranda
-Miriam
-Mitchell
-Moises
-Molly
-Monica
-Monna
-Montague
-Monte
-Monty
-Morgan
-Moses
-Muriel
-Mya
-Mylee
-Myles
-Myriam
-Myrtie
-Nadia
-Nan
-Nancy
-Naomi
-Nasir
-Natalia
-Natalie
-Nataly
-Natasha
-Nathan
-Nathaniel
-Nayeli
-Nehemiah
-Nelle
-Nelson
-Nena
-Nerissa
-Netta
-Nettie
-Nevaeh
-Nia
-Nicholas
-Nickolas
-Nicolas
-Nicole
-Nikolas
-Nina
-Noah
-Noel
-Noelle
-Nolan
-Nonie
-Nora
-Norah
-Nova
-Nowell
-Nydia
-Nyla
-Olive
-Oliver
-Olivia
-Omar
-Oralie
-Orlando
-Osbert
-Osborn
-Osborne
-Oscar
-Osmund
-Owen
-Pablo
-Paget
-Paige
-Paisley
-Paola
-Paris
-Parker
-Patience
-Patricia
-Patrick
-Patton
-Paul
-Pauleen
-Paxton
-Payton
-Pedro
-Pene
-Penelope
-Percival
-Peregrine
-Perla
-Peter
-Peyton
-Pheobe
-Philip
-Phillip
-Phoebe
-Phoenix
-Phyliss
-Phyllida
-Phyllis
-Piper
-Porsche
-Porter
-Presley
-Preston
-Priscilla
-Prosper
-Prue
-Quanah
-Quentin
-Quiana
-Quinn
-Quinton
-Rachael
-Rachel
-Raegan
-Raelene
-Rafael
-Rain
-Ramon
-Randa
-Randal
-Randy
-Rastus
-Raul
-Raymond
-Rayner
-Reagan
-Rebecca
-Rebeckah
-Rebekah
-Reece
-Reed
-Reene
-Reese
-Reid
-Renie
-Reuben
-Rexana
-Reynard
-Rhetta
-Ricardo
-Rich
-Richard
-Richie
-Rick
-Rickena
-Rickey
-Rickie
-Ricky
-Rihanna
-Riley
-River
-Robert
-Roberto
-Rocco
-Rodger
-Rodrigo
-Roger
-Roman
-Romayne
-Romeo
-Ronald
-Ronnette
-Rosa
-Roscoe
-Rose
-Rosemary
-Roswell
-Rowan
-Roy
-Royce
-Ruben
-Ruby
-Rubye
-Russell
-Rusty
-Ruth
-Ryan
-Ryder
-Ryker
-Rylan
-Rylee
-Ryleigh
-Rylie
-Sabella
-Sabrina
-Sachie
-Sadie
-Sage
-Sal
-Sally
-Salvador
-Sam
-Samantha
-Samara
-Samuel
-Sandra
-Santiago
-Sara
-Sarah
-Sarai
-Saranna
-Sasha
-Saul
-Savanna
-Savannah
-Sawyer
-Scarlett
-Scott
-Scotty
-Sean
-Sebastian
-Selena
-Seneca
-Serena
-Serenity
-Sergio
-Seth
-Seymour
-Shan
-Shana
-Shane
-Shanika
-Shannah
-Shannon
-Shantae
-Sharalyn
-Sharla
-Shaun
-Shawn
-Shayla
-Shelby
-Sheri
-Sherie
-Sherill
-Sherri
-Shiloh
-Sienna
-Sierra
-Silas
-Simon
-Sissy
-Skylar
-Skyler
-Sloan
-Sofia
-Solomon
-Sophia
-Sophie
-Sorrel
-Spencer
-Spike
-Star
-Stella
-Steph
-Stephanie
-Stephany
-Stephen
-Steven
-Sue
-Sukie
-Summer
-Sunshine
-Susanna
-Susannah
-Suzan
-Suzy
-Sybil
-Syd
-Sydney
-Talia
-Talon
-Tamika
-Tamsin
-Tania
-Tanner
-Tansy
-Taryn
-Tate
-Tatiana
-Tatum
-Tatyanna
-Taylor
-Teagan
-Tel
-Terrell
-Terry
-Tessa
-Theodore
-Thomas
-Tiffany
-Timothy
-Titus
-Tod
-Tolly
-Tony
-Topaz
-Tori
-Tracee
-Tracey
-Travis
-Trent
-Trenton
-Trevor
-Trey
-Trinity
-Tristan
-Tristen
-Triston
-Troy
-Tucker
-Ty
-Tye
-Tyler
-Tyson
-Uland
-Ulric
-Ulyssa
-Uriel
-Valary
-Valentina
-Valeria
-Valerie
-Vanessa
-Vaughn
-Verna
-Veronica
-Victor
-Victoria
-Vince
-Vincent
-Vinnie
-Violet
-Vivian
-Viviana
-Vivyan
-Walker
-Walter
-Ward
-Warner
-Wayne
-Wendi
-Wendy
-Wesley
-Weston
-Whitaker
-William
-Willow
-Willy
-Winifred
-Wisdom
-Woodrow
-Woody
-Wyatt
-Wynonna
-Wynter
-Xander
-Xavier
-Ximena
-Yahir
-Yasmin
-Yolanda
-Ysabel
-Zachariah
-Zachary
-Zack
-Zackary
-Zander
-Zane
-Zayden
-Zeke
-Zelda
-Zion
-Zoe
-Zoey
+Aaden
+Aaliyah
+Aaron
+Abby
+Abel
+Abigail
+Abraham
+Adam
+Adan
+Addison
+Addyson
+Adeline
+Aden
+Adolph
+Adrian
+Adriana
+Adrianna
+Aida
+Aidan
+Aiden
+Aileen
+Ainsley
+Alaina
+Alan
+Alana
+Alanna
+Alayna
+Albert
+Alberto
+Alden
+Alec
+Alejandra
+Alejandro
+Alessandra
+Alex
+Alexa
+Alexander
+Alexandra
+Alexandria
+Alexia
+Alexis
+Alexus
+Alfred
+Alfreda
+Alfredo
+Alger
+Ali
+Alice
+Alicia
+Alijah
+Alina
+Alisa
+Alison
+Alissa
+Alisya
+Alivia
+Aliyah
+Allegra
+Allegria
+Allen
+Allie
+Allison
+Allisson
+Allyson
+Alma
+Alondra
+Alvin
+Alysha
+Alyson
+Alyssa
+Alyssia
+Amanda
+Amari
+Amaryllis
+Amaya
+Amber
+Ambrosine
+Amelia
+Amir
+Amira
+Amiyah
+Amos
+Amy
+Amya
+Ana
+Anahi
+Anastasia
+Anaya
+Anderson
+Andre
+Andrea
+Andres
+Andrew
+Andy
+Angel
+Angela
+Angelica
+Angelina
+Angelo
+Angie
+Aniya
+Aniyah
+Anjelica
+Anna
+Annabelle
+Anne
+Annie
+Annika
+Anthony
+Antonio
+Anya
+April
+Arabella
+Archie
+Ariana
+Arianna
+Ariel
+Arielle
+Arleen
+Armando
+Arn
+Art
+Arthur
+Arturo
+Asher
+Ashley
+Ashlie
+Ashlyn
+Ashlynn
+Ashton
+Asia
+Astor
+Athena
+Aubree
+Aubrey
+Aubrie
+Audrey
+Audrina
+August
+Aurora
+Austin
+Autumn
+Ava
+Avalon
+Averill
+Avery
+Axel
+Ayden
+Ayla
+Bailey
+Baldric
+Barbra
+Bartholomew
+Baylee
+Beau
+Beckah
+Beckett
+Becky
+Bella
+Benjamin
+Bennett
+Bernice
+Bertrand
+Bethany
+Bethney
+Betsy
+Bianca
+Bidelia
+Bill
+Blake
+Braden
+Bradley
+Brady
+Braeden
+Braiden
+Brandon
+Braxton
+Brayan
+Brayden
+Braydon
+Braylon
+Breanna
+Breanne
+Brenda
+Brendan
+Brenden
+Brenna
+Brennan
+Brett
+Brian
+Briana
+Brianna
+Bridget
+Brielle
+Brittani
+Brittany
+Brock
+Brodie
+Brody
+Bronte
+Brooke
+Brooklyn
+Brooklynn
+Bruce
+Bryan
+Bryant
+Bryce
+Brycen
+Brynn
+Bryson
+Burt
+Byrne
+Byron
+Bysshe
+Cade
+Caden
+Cadence
+Caiden
+Caitlin
+Caitlyn
+Calanthia
+Caleb
+Caleigh
+Cali
+Callie
+Calvin
+Camden
+Cameron
+Camila
+Camille
+Camron
+Camryn
+Candace
+Candice
+Candis
+Canute
+Cara
+Carl
+Carlos
+Carly
+Carlyle
+Carmen
+Carolina
+Caroline
+Carolyn
+Carry
+Carson
+Carter
+Caryl
+Casey
+Cash
+Casimir
+Cassandra
+Cassian
+Cassidy
+Catherine
+Cayden
+Cecilia
+Cecily
+Celeste
+Cesar
+Chad
+Chance
+Chandler
+Charles
+Charlie
+Charlotte
+Charlton
+Chase
+Chelsea
+Cherette
+Cheri
+Cherry
+Cheyanne
+Cheyenne
+Chip
+Chloe
+Chris
+Christa
+Christian
+Christiana
+Christina
+Christobel
+Christopher
+Ciara
+Cindy
+Claire
+Clara
+Claribel
+Clark
+Claudia
+Claudius
+Clayton
+Clement
+Cleveland
+Cliff
+Clinton
+Clitus
+Clover
+Cody
+Cohen
+Colby
+Cole
+Colin
+Collin
+Colten
+Colton
+Conner
+Connor
+Cooper
+Cora
+Corbin
+Coreen
+Corey
+Corrine
+Cory
+Courtney
+Cristian
+Cristopher
+Cruz
+Crystal
+Curtis
+Cy
+Cynthia
+Daisy
+Dakota
+Dallas
+Dalton
+Dalya
+Damian
+Damien
+Damon
+Dana
+Dane
+Danica
+Daniel
+Daniela
+Daniella
+Danielle
+Danika
+Danna
+Danny
+Dante
+Darcey
+Darell
+Daria
+Darin
+Darius
+Darren
+David
+Davion
+Davis
+Dawson
+Dayana
+Dayna
+Dayton
+Dean
+Deandre
+Deangelo
+Debbi
+Declan
+Dee
+Deena
+Delaney
+Delilah
+Della
+Delma
+Denholm
+Denise
+Dennis
+Denys
+Derek
+Derrick
+Desiree
+Desmond
+Destiny
+Devin
+Devon
+Diamond
+Diana
+Diego
+Dillon
+Dina
+Dolores
+Dominic
+Dominick
+Donald
+Donella
+Donna
+Donny
+Donovan
+Dorian
+Dorothy
+Dortha
+Douglas
+Drake
+Drew
+Driscoll
+Dulce
+Duncan
+Dustin
+Dylan
+Easter
+Easton
+Ebba
+Eddie
+Eden
+Edgar
+Eduardo
+Edward
+Edwin
+Effie
+Elaina
+Eleanor
+Elena
+Eli
+Eliana
+Elias
+Elijah
+Eliot
+Eliott
+Elise
+Eliza
+Elizabeth
+Ella
+Elle
+Ellie
+Elliot
+Elliott
+Elric
+Elspet
+Elwood
+Emanuel
+Emely
+Emerson
+Emery
+Emilee
+Emilia
+Emiliano
+Emilio
+Emily
+Emma
+Emmanuel
+Enrique
+Eric
+Erica
+Erick
+Erik
+Erika
+Erin
+Ermintrude
+Ernesto
+Esmeralda
+Esteban
+Esther
+Estrella
+Ethan
+Eugenia
+Euphemia
+Eustace
+Eva
+Evan
+Evangeline
+Eveleen
+Evelina
+Evelyn
+Everett
+Ezekiel
+Ezra
+Fabian
+Faith
+Fatima
+Fay
+Felix
+Fernanda
+Fernando
+Finn
+Fiona
+Fitz
+Flick
+Floella
+Flora
+Flossie
+Fortune
+Francesca
+Francis
+Francisco
+Frank
+Frankie
+Franklin
+Fulton
+Gabriel
+Gabriela
+Gabriella
+Gabrielle
+Gael
+Gage
+Garret
+Garrett
+Gary
+Gavin
+Gaye
+Gaylord
+Genesis
+Genette
+Genevieve
+George
+Georgene
+Georgia
+Geraldine
+Gerardo
+Gervase
+Gianna
+Gina
+Ginger
+Giovanni
+Giselle
+Gladwyn
+Glenna
+Gloria
+Goddard
+Godwin
+Goodwin
+Gordon
+Grace
+Gracie
+Grady
+Graeme
+Graham
+Grant
+Gratian
+Grayson
+Gregory
+Greta
+Greyson
+Griffin
+Griselda
+Guadalupe
+Guillermo
+Gunner
+Gustavo
+Gwenda
+Gwenevere
+Hadley
+Haidee
+Hailee
+Hailey
+Hal
+Haleigh
+Haley
+Hanna
+Hannah
+Happy
+Harley
+Harmony
+Harper
+Harrison
+Hartley
+Hayden
+Haylee
+Hayley
+Haylie
+Hazel
+Heather
+Heaven
+Hector
+Hedley
+Heidi
+Helen
+Henderson
+Henry
+Hepsie
+Hervey
+Holden
+Holly
+Homer
+Hope
+Horatio
+Hortensia
+Hudson
+Huffie
+Hugo
+Hunter
+Ian
+Iantha
+Ileen
+Imani
+Innocent
+Irene
+Iris
+Irvine
+Isaac
+Isabel
+Isabella
+Isabelle
+Isaiah
+Isaias
+Isiah
+Ismael
+Israel
+Issac
+Itzel
+Ivan
+Ivy
+Izabella
+Izaiah
+Jacaline
+Jace
+Jack
+Jackson
+Jacob
+Jacoby
+Jacqueline
+Jacquetta
+Jacqui
+Jada
+Jade
+Jaden
+Jadon
+Jadyn
+Jaelyn
+Jaiden
+Jaime
+Jake
+Jakki
+Jakob
+Jalen
+Jamar
+Jamari
+Jamarion
+James
+Jameson
+Jamie
+Jamison
+Jane
+Janel
+Janelle
+Janette
+Janie
+Janina
+Janine
+Janiya
+Janiyah
+Jared
+Jaslene
+Jasmin
+Jasmine
+Jason
+Jasper
+Javier
+Javon
+Jaxon
+Jaxson
+Jay
+Jayce
+Jayda
+Jayden
+Jaydon
+Jaye
+Jayla
+Jaylee
+Jaylen
+Jayne
+Jaynie
+Jayson
+Jazlyn
+Jazmin
+Jazmine
+Jeanna
+Jeannie
+Jeannine
+Jeb
+Jed
+Jeffrey
+Jemmy
+Jenifer
+Jenna
+Jennie
+Jennifer
+Jera
+Jere
+Jeremiah
+Jeremy
+Jeri
+Jermaine
+Jerrie
+Jerry
+Jesse
+Jessica
+Jesus
+Jillian
+Jillie
+Jim
+Jimena
+Jimmy
+Joachim
+Joanna
+Joaquin
+Jocelyn
+Joe
+Joel
+Joetta
+Joey
+Johan
+Johanna
+John
+Johnathan
+Johnny
+Joi
+Jonah
+Jonas
+Jonathan
+Jonathon
+Joni
+Jordan
+Jordyn
+Jorge
+Jose
+Joselyn
+Joseph
+Josepha
+Josephine
+Josh
+Joshua
+Josiah
+Josie
+Josue
+Joye
+Juan
+Judah
+Jude
+Julia
+Julian
+Juliana
+Julianna
+Julie
+Juliet
+Julio
+Julissa
+Julius
+July
+Justice
+Justin
+Kade
+Kaden
+Kadence
+Kaelea
+Kaelyn
+Kai
+Kaiden
+Kailey
+Kailyn
+Kaitlin
+Kaitlyn
+Kale
+Kaleb
+Kaleigh
+Kameron
+Kamryn
+Kane
+Kara
+Karen
+Karenza
+Karina
+Karla
+Karly
+Karson
+Karyn
+Kassidy
+Kat
+Kate
+Katelyn
+Katelynn
+Katherine
+Kathleen
+Kathryn
+Kathy
+Katie
+Katlyn
+Kayden
+Kaydence
+Kayla
+Kaylee
+Kayleigh
+Kaylie
+Kaylin
+Keagan
+Keaton
+Keegan
+Keira
+Keith
+Kellen
+Kellie
+Kelly
+Kelsey
+Kelvin
+Kendall
+Kendra
+Kennard
+Kennedy
+Kenneth
+Kenzie
+Kerena
+Kerensa
+Keturah
+Kevin
+Keziah
+Khalil
+Khloe
+Kiana
+Kiara
+Kiera
+Kiley
+Kimberley
+Kimberly
+Kimora
+Kingston
+Kira
+Kobe
+Kolton
+Kristen
+Kristina
+Kristopher
+Kyla
+Kyle
+Kylee
+Kyleigh
+Kyler
+Kylie
+Kyra
+Lacey
+Lacy
+Laila
+Lakeisha
+Lalla
+Lana
+Lance
+Landen
+Landon
+Landyn
+Lane
+Lanny
+Larry
+Latanya
+Launce
+Laura
+Lauren
+Laurencia
+Laurissa
+Lauryn
+Lawrence
+Layla
+Leah
+Leeann
+Leia
+Leila
+Leilani
+Leland
+Lena
+Lennox
+Leo
+Leonardo
+Leonel
+Leroi
+Leslie
+Lesly
+Lessie
+Leta
+Levi
+Lexi
+Lexia
+Lexus
+Lia
+Liam
+Lila
+Lilah
+Lilian
+Liliana
+Lillian
+Lilliana
+Lillie
+Lilly
+Lily
+Lincoln
+Linden
+Lindsay
+Lindsey
+Lindsie
+Lindy
+Linton
+Lizbeth
+Lockie
+Logan
+Lola
+London
+Lorenzo
+Loreto
+Lori
+Lorin
+Lou
+Louis
+Luanne
+Luca
+Lucas
+Lucia
+Lucian
+Lucy
+Luis
+Lukas
+Luke
+Luna
+Luvenia
+Lydia
+Lyla
+Lyndsey
+Lynn
+Lynsey
+Lynwood
+Lyric
+Mabelle
+Macey
+Macie
+Mackenzie
+Macy
+Madalyn
+Maddison
+Maddox
+Madeleine
+Madeline
+Madelyn
+Madelynn
+Madilyn
+Madison
+Madisyn
+Madyson
+Maegan
+Maggie
+Makayla
+Makenna
+Makenzie
+Malachi
+Malcolm
+Malia
+Malik
+Mallory
+Manley
+Manuel
+Marc
+Marcia
+Marco
+Marcos
+Marcus
+Marely
+Margaret
+Maria
+Mariabella
+Mariah
+Mariana
+Marilene
+Mario
+Marion
+Marisol
+Marissa
+Marje
+Marjory
+Mark
+Marlee
+Marley
+Marlowe
+Marlyn
+Marshall
+Martin
+Marvin
+Mary
+Maryann
+Mason
+Mateo
+Mathew
+Matthew
+Maudie
+Maurene
+Maurice
+Mauricio
+Max
+Maximilian
+Maximus
+Maxwell
+May
+Maya
+Maynard
+Mckenna
+Mckenzie
+Megan
+Meghan
+Mekhi
+Melanie
+Melany
+Melissa
+Melody
+Melvin
+Melvyn
+Meredith
+Merideth
+Merrilyn
+Meryl
+Mia
+Micah
+Michael
+Michaela
+Micheal
+Michelle
+Miguel
+Mikayla
+Mike
+Miles
+Miley
+Milo
+Milton
+Minnie
+Miracle
+Miranda
+Miriam
+Mitchell
+Moises
+Molly
+Monica
+Monna
+Montague
+Monte
+Monty
+Morgan
+Moses
+Muriel
+Mya
+Mylee
+Myles
+Myriam
+Myrtie
+Nadia
+Nan
+Nancy
+Naomi
+Nasir
+Natalia
+Natalie
+Nataly
+Natasha
+Nathan
+Nathaniel
+Nayeli
+Nehemiah
+Nelle
+Nelson
+Nena
+Nerissa
+Netta
+Nettie
+Nevaeh
+Nia
+Nicholas
+Nickolas
+Nicolas
+Nicole
+Nikolas
+Nina
+Noah
+Noel
+Noelle
+Nolan
+Nonie
+Nora
+Norah
+Nova
+Nowell
+Nydia
+Nyla
+Olive
+Oliver
+Olivia
+Omar
+Oralie
+Orlando
+Osbert
+Osborn
+Osborne
+Oscar
+Osmund
+Owen
+Pablo
+Paget
+Paige
+Paisley
+Paola
+Paris
+Parker
+Patience
+Patricia
+Patrick
+Patton
+Paul
+Pauleen
+Paxton
+Payton
+Pedro
+Pene
+Penelope
+Percival
+Peregrine
+Perla
+Peter
+Peyton
+Pheobe
+Philip
+Phillip
+Phoebe
+Phoenix
+Phyliss
+Phyllida
+Phyllis
+Piper
+Porsche
+Porter
+Presley
+Preston
+Priscilla
+Prosper
+Prue
+Quanah
+Quentin
+Quiana
+Quinn
+Quinton
+Rachael
+Rachel
+Raegan
+Raelene
+Rafael
+Rain
+Ramon
+Randa
+Randal
+Randy
+Rastus
+Raul
+Raymond
+Rayner
+Reagan
+Rebecca
+Rebeckah
+Rebekah
+Reece
+Reed
+Reene
+Reese
+Reid
+Renie
+Reuben
+Rexana
+Reynard
+Rhetta
+Ricardo
+Rich
+Richard
+Richie
+Rick
+Rickena
+Rickey
+Rickie
+Ricky
+Rihanna
+Riley
+River
+Robert
+Roberto
+Rocco
+Rodger
+Rodrigo
+Roger
+Roman
+Romayne
+Romeo
+Ronald
+Ronnette
+Rosa
+Roscoe
+Rose
+Rosemary
+Roswell
+Rowan
+Roy
+Royce
+Ruben
+Ruby
+Rubye
+Russell
+Rusty
+Ruth
+Ryan
+Ryder
+Ryker
+Rylan
+Rylee
+Ryleigh
+Rylie
+Sabella
+Sabrina
+Sachie
+Sadie
+Sage
+Sal
+Sally
+Salvador
+Sam
+Samantha
+Samara
+Samuel
+Sandra
+Santiago
+Sara
+Sarah
+Sarai
+Saranna
+Sasha
+Saul
+Savanna
+Savannah
+Sawyer
+Scarlett
+Scott
+Scotty
+Sean
+Sebastian
+Selena
+Seneca
+Serena
+Serenity
+Sergio
+Seth
+Seymour
+Shan
+Shana
+Shane
+Shanika
+Shannah
+Shannon
+Shantae
+Sharalyn
+Sharla
+Shaun
+Shawn
+Shayla
+Shelby
+Sheri
+Sherie
+Sherill
+Sherri
+Shiloh
+Sienna
+Sierra
+Silas
+Simon
+Sissy
+Skylar
+Skyler
+Sloan
+Sofia
+Solomon
+Sophia
+Sophie
+Sorrel
+Spencer
+Spike
+Star
+Stella
+Steph
+Stephanie
+Stephany
+Stephen
+Steven
+Sue
+Sukie
+Summer
+Sunshine
+Susanna
+Susannah
+Suzan
+Suzy
+Sybil
+Syd
+Sydney
+Talia
+Talon
+Tamika
+Tamsin
+Tania
+Tanner
+Tansy
+Taryn
+Tate
+Tatiana
+Tatum
+Tatyanna
+Taylor
+Teagan
+Tel
+Terrell
+Terry
+Tessa
+Theodore
+Thomas
+Tiffany
+Timothy
+Titus
+Tod
+Tolly
+Tony
+Topaz
+Tori
+Tracee
+Tracey
+Travis
+Trent
+Trenton
+Trevor
+Trey
+Trinity
+Tristan
+Tristen
+Triston
+Troy
+Tucker
+Ty
+Tye
+Tyler
+Tyson
+Uland
+Ulric
+Ulyssa
+Uriel
+Valary
+Valentina
+Valeria
+Valerie
+Vanessa
+Vaughn
+Verna
+Veronica
+Victor
+Victoria
+Vince
+Vincent
+Vinnie
+Violet
+Vivian
+Viviana
+Vivyan
+Walker
+Walter
+Ward
+Warner
+Wayne
+Wendi
+Wendy
+Wesley
+Weston
+Whitaker
+William
+Willow
+Willy
+Winifred
+Wisdom
+Woodrow
+Woody
+Wyatt
+Wynonna
+Wynter
+Xander
+Xavier
+Ximena
+Yahir
+Yasmin
+Yolanda
+Ysabel
+Zachariah
+Zachary
+Zack
+Zackary
+Zander
+Zane
+Zayden
+Zeke
+Zelda
+Zion
+Zoe
+Zoey
Zune
\ No newline at end of file
diff --git a/strings/names/first_female.txt b/strings/names/first_female.txt
index 6710c1bfc3..038e936879 100644
--- a/strings/names/first_female.txt
+++ b/strings/names/first_female.txt
@@ -1,771 +1,771 @@
-Aaliyah
-Abby
-Abigail
-Addison
-Addyson
-Adeline
-Adriana
-Adrianna
-Aida
-Aileen
-Ainsley
-Alaina
-Alana
-Alanna
-Alayna
-Alejandra
-Alessandra
-Alexa
-Alexandra
-Alexandria
-Alexia
-Alexis
-Alexus
-Alfreda
-Alice
-Alicia
-Alina
-Alisa
-Alison
-Alissa
-Alisya
-Alivia
-Aliyah
-Allegra
-Allegria
-Allie
-Allison
-Allisson
-Allyson
-Alma
-Alondra
-Alysha
-Alyson
-Alyssa
-Alyssia
-Amanda
-Amari
-Amaryllis
-Amaya
-Amber
-Ambrosine
-Amelia
-Amira
-Amiyah
-Amy
-Amya
-Ana
-Anahi
-Anastasia
-Anaya
-Andrea
-Angel
-Angela
-Angelica
-Angelina
-Angie
-Aniya
-Aniyah
-Anjelica
-Anna
-Annabelle
-Anne
-Annie
-Annika
-Anya
-April
-Arabella
-Ariana
-Arianna
-Ariel
-Arielle
-Arleen
-Ashley
-Ashlie
-Ashlyn
-Ashlynn
-Asia
-Astor
-Athena
-Aubree
-Aubrey
-Aubrie
-Audrey
-Audrina
-Aurora
-Autumn
-Ava
-Avalona
-Averill
-Avery
-Ayla
-Bailey
-Barbara
-Baylee
-Beckah
-Becky
-Bella
-Bernice
-Bethany
-Bethney
-Betsy
-Bianca
-Bidelia
-Breanna
-Breanne
-Brenda
-Brenna
-Briana
-Brianna
-Bridget
-Brielle
-Brittani
-Brittany
-Brooke
-Brooklyn
-Brooklynn
-Brynn
-Cadence
-Caitlin
-Caitlyn
-Calanthia
-Caleigh
-Cali
-Callie
-Cameron
-Camila
-Camille
-Camryn
-Candace
-Candice
-Cara
-Carly
-Carlyle
-Carmen
-Carolina
-Caroline
-Carolyn
-Carry
-Caryl
-Casey
-Cassandra
-Cassidy
-Catherine
-Cecilia
-Cecily
-Celeste
-Charlotte
-Chelsea
-Cherette
-Cheri
-Cherry
-Cheyanne
-Cheyenne
-Chloe
-Christa
-Christiana
-Christina
-Christobelle
-Ciara
-Cindy
-Claire
-Clara
-Claribel
-Claudia
-Clover
-Cora
-Coreen
-Corrine
-Courtney
-Crystal
-Cynthia
-Daisy
-Dakota
-Dalya
-Dana
-Danica
-Daniela
-Daniella
-Danielle
-Danika
-Danna
-Daria
-Dayana
-Dayna
-Debbi
-Dee
-Deena
-Delaney
-Delilah
-Della
-Delma
-Denise
-Denys
-Desiree
-Destiny
-Diamond
-Diana
-Dina
-Dolores
-Donella
-Donna
-Dorothy
-Dortha
-Dulce
-Easter
-Ebba
-Eden
-Effie
-Elaina
-Eleanor
-Elena
-Eliana
-Elise
-Eliza
-Elizabeth
-Ella
-Elle
-Ellie
-Emely
-Emerson
-Emery
-Emilee
-Emilia
-Emily
-Emma
-Erica
-Erika
-Erin
-Ermintrude
-Esmeralda
-Esther
-Estrella
-Eugenia
-Euphemia
-Eustace
-Eva
-Evangeline
-Eveleen
-Evelina
-Evelyn
-Faith
-Fatima
-Fay
-Fernanda
-Fiona
-Floella
-Flora
-Flossie
-Fortune
-Francesca
-Gabriela
-Gabriella
-Gabrielle
-Genette
-Genevieve
-Georgene
-Georgia
-Geraldine
-Gervase
-Gianna
-Gina
-Ginger
-Giselle
-Gladwyn
-Glenna
-Gloria
-Grace
-Gracie
-Greta
-Griselda
-Guadalupe
-Gwenda
-Gwenevere
-Hadley
-Haidee
-Hailee
-Hailey
-Hal
-Haleigh
-Haley
-Hanna
-Hannah
-Harley
-Harmony
-Harper
-Hayden
-Haylee
-Hayley
-Haylie
-Hazel
-Heather
-Heaven
-Hedley
-Heidi
-Helen
-Hepsie
-Holly
-Hope
-Hortensia
-Iantha
-Ileen
-Imani
-Innocent
-Irene
-Iris
-Isabel
-Isabella
-Isabelle
-Itzel
-Ivy
-Izabella
-Jacaline
-Jacqueline
-Jacquetta
-Jacqui
-Jada
-Jade
-Jaden
-Jadyn
-Jaelyn
-Jakki
-Jalen
-Jamie
-Jane
-Janelle
-Janette
-Janie
-Janina
-Janine
-Janiya
-Janiyah
-Jaslene
-Jasmin
-Jasmine
-Jayda
-Jayden
-Jayla
-Jaylee
-Jaynie
-Jazlyn
-Jazmin
-Jazmine
-Jeanna
-Jeannie
-Jeannine
-Jenifer
-Jenna
-Jennie
-Jennifer
-Jera
-Jere
-Jeri
-Jessica
-Jillian
-Jillie
-Jimena
-Joanna
-Jocelyn
-Joetta
-Johanna
-Joi
-Joni
-Jordan
-Jordyn
-Joselyn
-Josepha
-Josephine
-Josie
-Joye
-Julia
-Juliana
-Julianna
-Julie
-Juliet
-Julissa
-July
-Kadence
-Kaelea
-Kaelyn
-Kailey
-Kailyn
-Kaitlin
-Kaitlyn
-Kaleigh
-Kamryn
-Kara
-Karen
-Karenza
-Karina
-Karla
-Karly
-Karyn
-Kassidy
-Kat
-Kate
-Katelyn
-Katelynn
-Katherine
-Kathleen
-Kathryn
-Kathy
-Katie
-Katlyn
-Kayden
-Kaydence
-Kayla
-Kaylee
-Kayleigh
-Kaylie
-Kaylin
-Keegan
-Keira
-Keith
-Kellie
-Kelly
-Kelsey
-Kendall
-Kendra
-Kennedy
-Kenzie
-Kerena
-Kerensa
-Keturah
-Khloe
-Kiana
-Kiara
-Kiera
-Kiley
-Kimberley
-Kimberly
-Kimora
-Kira
-Kristen
-Kristina
-Kyla
-Kylee
-Kyleigh
-Kylie
-Kyra
-Lacey
-Lacy
-Laila
-Lakeisha
-Lalla
-Lana
-Latanya
-Laura
-Lauren
-Laurencia
-Laurissa
-Lauryn
-Layla
-Leah
-Leeann
-Leia
-Leila
-Leilani
-Lena
-Leslie
-Lesly
-Lessie
-Leta
-Lexi
-Lexia
-Lexus
-Lia
-Lila
-Lilah
-Lilian
-Liliana
-Lillian
-Lilliana
-Lillie
-Lilly
-Lily
-Lindsay
-Lindsey
-Lindsie
-Lindy
-Lizbeth
-Lockie
-Logan
-Lola
-London
-Lori
-Lorin
-Luanne
-Lucia
-Lucian
-Lucy
-Luna
-Luvenia
-Lydia
-Lyla
-Lyndsey
-Lynn
-Lynsey
-Lynwood
-Lyric
-Mabelle
-Macey
-Macie
-Mackenzie
-Macy
-Madalyn
-Maddison
-Madeleine
-Madeline
-Madelyn
-Madelynn
-Madilyn
-Madison
-Madisyn
-Madyson
-Maegan
-Maggie
-Makayla
-Makenna
-Makenzie
-Malia
-Mallory
-Marcia
-Marely
-Margaret
-Maria
-Mariabella
-Mariah
-Mariana
-Marilene
-Marion
-Marisol
-Marissa
-Marje
-Marjory
-Marlee
-Marley
-Marlowe
-Marlyn
-Marshall
-Mary
-Maryann
-Maudie
-Maurene
-May
-Maya
-Mckenna
-Mckenzie
-Megan
-Meghan
-Melanie
-Melany
-Melissa
-Melody
-Meredith
-Merideth
-Merrilyn
-Meryl
-Mia
-Michaela
-Michelle
-Mikayla
-Miley
-Minnie
-Miracle
-Miranda
-Miriam
-Molly
-Monica
-Monna
-Morgan
-Muriel
-Mya
-Mylee
-Myriam
-Myrtie
-Nadia
-Nan
-Nancy
-Naomi
-Natalia
-Natalie
-Nataly
-Natasha
-Nayeli
-Nelle
-Nena
-Nerissa
-Netta
-Nettie
-Nevaeh
-Nia
-Nicole
-Nina
-Noelle
-Nonie
-Nora
-Norah
-Nova
-Nowell
-Nydia
-Nyla
-Olive
-Olivia
-Oralie
-Paige
-Paisley
-Paola
-Paris
-Patience
-Patricia
-Pauleen
-Payton
-Pene
-Penelope
-Peregrine
-Perla
-Peyton
-Pheobe
-Phoebe
-Phyliss
-Phyllida
-Phyllis
-Piper
-Porsche
-Presley
-Priscilla
-Prosper
-Prue
-Quanah
-Quiana
-Rachael
-Rachel
-Raegan
-Raelene
-Rain
-Randa
-Randal
-Reagan
-Rebecca
-Rebeckah
-Rebekah
-Reene
-Reese
-Renie
-Rexana
-Rhetta
-Rihanna
-Riley
-Ronnette
-Rosa
-Rose
-Rosemary
-Rowan
-Ruby
-Rubye
-Ruth
-Rylee
-Ryleigh
-Rylie
-Sabella
-Sabrina
-Sachie
-Sadie
-Sage
-Sally
-Samantha
-Samara
-Sandra
-Sara
-Sarah
-Sarai
-Saranna
-Sasha
-Savanna
-Savannah
-Scarlett
-Selena
-Seneca
-Serena
-Serenity
-Shana
-Shanika
-Shannah
-Shannon
-Shantae
-Sharalyn
-Sharla
-Shayla
-Shelby
-Sheri
-Sherie
-Sherill
-Sherri
-Sienna
-Sierra
-Sissy
-Skylar
-Skyler
-Sofia
-Sophia
-Sophie
-Star
-Stella
-Steph
-Stephanie
-Stephany
-Sue
-Sukie
-Summer
-Sunshine
-Susanna
-Susannah
-Suzan
-Suzy
-Sydney
-Talia
-Tamika
-Tania
-Tansy
-Taryn
-Tatiana
-Tatum
-Tatyanna
-Taylor
-Teagan
-Tessa
-Tiffany
-Tolly
-Topaz
-Tori
-Tracee
-Tracey
-Trinity
-Ulyssa
-Valary
-Valentina
-Valeria
-Valerie
-Vanessa
-Verna
-Veronica
-Victoria
-Vinnie
-Violet
-Vivian
-Viviana
-Vivyan
-Wendi
-Wendy
-Willow
-Wisdom
-Wynonna
-Wynter
-Ximena
-Yasmin
-Yolanda
-Ysabel
-Zelda
-Zoe
-Zoey
+Aaliyah
+Abby
+Abigail
+Addison
+Addyson
+Adeline
+Adriana
+Adrianna
+Aida
+Aileen
+Ainsley
+Alaina
+Alana
+Alanna
+Alayna
+Alejandra
+Alessandra
+Alexa
+Alexandra
+Alexandria
+Alexia
+Alexis
+Alexus
+Alfreda
+Alice
+Alicia
+Alina
+Alisa
+Alison
+Alissa
+Alisya
+Alivia
+Aliyah
+Allegra
+Allegria
+Allie
+Allison
+Allisson
+Allyson
+Alma
+Alondra
+Alysha
+Alyson
+Alyssa
+Alyssia
+Amanda
+Amari
+Amaryllis
+Amaya
+Amber
+Ambrosine
+Amelia
+Amira
+Amiyah
+Amy
+Amya
+Ana
+Anahi
+Anastasia
+Anaya
+Andrea
+Angel
+Angela
+Angelica
+Angelina
+Angie
+Aniya
+Aniyah
+Anjelica
+Anna
+Annabelle
+Anne
+Annie
+Annika
+Anya
+April
+Arabella
+Ariana
+Arianna
+Ariel
+Arielle
+Arleen
+Ashley
+Ashlie
+Ashlyn
+Ashlynn
+Asia
+Astor
+Athena
+Aubree
+Aubrey
+Aubrie
+Audrey
+Audrina
+Aurora
+Autumn
+Ava
+Avalona
+Averill
+Avery
+Ayla
+Bailey
+Barbara
+Baylee
+Beckah
+Becky
+Bella
+Bernice
+Bethany
+Bethney
+Betsy
+Bianca
+Bidelia
+Breanna
+Breanne
+Brenda
+Brenna
+Briana
+Brianna
+Bridget
+Brielle
+Brittani
+Brittany
+Brooke
+Brooklyn
+Brooklynn
+Brynn
+Cadence
+Caitlin
+Caitlyn
+Calanthia
+Caleigh
+Cali
+Callie
+Cameron
+Camila
+Camille
+Camryn
+Candace
+Candice
+Cara
+Carly
+Carlyle
+Carmen
+Carolina
+Caroline
+Carolyn
+Carry
+Caryl
+Casey
+Cassandra
+Cassidy
+Catherine
+Cecilia
+Cecily
+Celeste
+Charlotte
+Chelsea
+Cherette
+Cheri
+Cherry
+Cheyanne
+Cheyenne
+Chloe
+Christa
+Christiana
+Christina
+Christobelle
+Ciara
+Cindy
+Claire
+Clara
+Claribel
+Claudia
+Clover
+Cora
+Coreen
+Corrine
+Courtney
+Crystal
+Cynthia
+Daisy
+Dakota
+Dalya
+Dana
+Danica
+Daniela
+Daniella
+Danielle
+Danika
+Danna
+Daria
+Dayana
+Dayna
+Debbi
+Dee
+Deena
+Delaney
+Delilah
+Della
+Delma
+Denise
+Denys
+Desiree
+Destiny
+Diamond
+Diana
+Dina
+Dolores
+Donella
+Donna
+Dorothy
+Dortha
+Dulce
+Easter
+Ebba
+Eden
+Effie
+Elaina
+Eleanor
+Elena
+Eliana
+Elise
+Eliza
+Elizabeth
+Ella
+Elle
+Ellie
+Emely
+Emerson
+Emery
+Emilee
+Emilia
+Emily
+Emma
+Erica
+Erika
+Erin
+Ermintrude
+Esmeralda
+Esther
+Estrella
+Eugenia
+Euphemia
+Eustace
+Eva
+Evangeline
+Eveleen
+Evelina
+Evelyn
+Faith
+Fatima
+Fay
+Fernanda
+Fiona
+Floella
+Flora
+Flossie
+Fortune
+Francesca
+Gabriela
+Gabriella
+Gabrielle
+Genette
+Genevieve
+Georgene
+Georgia
+Geraldine
+Gervase
+Gianna
+Gina
+Ginger
+Giselle
+Gladwyn
+Glenna
+Gloria
+Grace
+Gracie
+Greta
+Griselda
+Guadalupe
+Gwenda
+Gwenevere
+Hadley
+Haidee
+Hailee
+Hailey
+Hal
+Haleigh
+Haley
+Hanna
+Hannah
+Harley
+Harmony
+Harper
+Hayden
+Haylee
+Hayley
+Haylie
+Hazel
+Heather
+Heaven
+Hedley
+Heidi
+Helen
+Hepsie
+Holly
+Hope
+Hortensia
+Iantha
+Ileen
+Imani
+Innocent
+Irene
+Iris
+Isabel
+Isabella
+Isabelle
+Itzel
+Ivy
+Izabella
+Jacaline
+Jacqueline
+Jacquetta
+Jacqui
+Jada
+Jade
+Jaden
+Jadyn
+Jaelyn
+Jakki
+Jalen
+Jamie
+Jane
+Janelle
+Janette
+Janie
+Janina
+Janine
+Janiya
+Janiyah
+Jaslene
+Jasmin
+Jasmine
+Jayda
+Jayden
+Jayla
+Jaylee
+Jaynie
+Jazlyn
+Jazmin
+Jazmine
+Jeanna
+Jeannie
+Jeannine
+Jenifer
+Jenna
+Jennie
+Jennifer
+Jera
+Jere
+Jeri
+Jessica
+Jillian
+Jillie
+Jimena
+Joanna
+Jocelyn
+Joetta
+Johanna
+Joi
+Joni
+Jordan
+Jordyn
+Joselyn
+Josepha
+Josephine
+Josie
+Joye
+Julia
+Juliana
+Julianna
+Julie
+Juliet
+Julissa
+July
+Kadence
+Kaelea
+Kaelyn
+Kailey
+Kailyn
+Kaitlin
+Kaitlyn
+Kaleigh
+Kamryn
+Kara
+Karen
+Karenza
+Karina
+Karla
+Karly
+Karyn
+Kassidy
+Kat
+Kate
+Katelyn
+Katelynn
+Katherine
+Kathleen
+Kathryn
+Kathy
+Katie
+Katlyn
+Kayden
+Kaydence
+Kayla
+Kaylee
+Kayleigh
+Kaylie
+Kaylin
+Keegan
+Keira
+Keith
+Kellie
+Kelly
+Kelsey
+Kendall
+Kendra
+Kennedy
+Kenzie
+Kerena
+Kerensa
+Keturah
+Khloe
+Kiana
+Kiara
+Kiera
+Kiley
+Kimberley
+Kimberly
+Kimora
+Kira
+Kristen
+Kristina
+Kyla
+Kylee
+Kyleigh
+Kylie
+Kyra
+Lacey
+Lacy
+Laila
+Lakeisha
+Lalla
+Lana
+Latanya
+Laura
+Lauren
+Laurencia
+Laurissa
+Lauryn
+Layla
+Leah
+Leeann
+Leia
+Leila
+Leilani
+Lena
+Leslie
+Lesly
+Lessie
+Leta
+Lexi
+Lexia
+Lexus
+Lia
+Lila
+Lilah
+Lilian
+Liliana
+Lillian
+Lilliana
+Lillie
+Lilly
+Lily
+Lindsay
+Lindsey
+Lindsie
+Lindy
+Lizbeth
+Lockie
+Logan
+Lola
+London
+Lori
+Lorin
+Luanne
+Lucia
+Lucian
+Lucy
+Luna
+Luvenia
+Lydia
+Lyla
+Lyndsey
+Lynn
+Lynsey
+Lynwood
+Lyric
+Mabelle
+Macey
+Macie
+Mackenzie
+Macy
+Madalyn
+Maddison
+Madeleine
+Madeline
+Madelyn
+Madelynn
+Madilyn
+Madison
+Madisyn
+Madyson
+Maegan
+Maggie
+Makayla
+Makenna
+Makenzie
+Malia
+Mallory
+Marcia
+Marely
+Margaret
+Maria
+Mariabella
+Mariah
+Mariana
+Marilene
+Marion
+Marisol
+Marissa
+Marje
+Marjory
+Marlee
+Marley
+Marlowe
+Marlyn
+Marshall
+Mary
+Maryann
+Maudie
+Maurene
+May
+Maya
+Mckenna
+Mckenzie
+Megan
+Meghan
+Melanie
+Melany
+Melissa
+Melody
+Meredith
+Merideth
+Merrilyn
+Meryl
+Mia
+Michaela
+Michelle
+Mikayla
+Miley
+Minnie
+Miracle
+Miranda
+Miriam
+Molly
+Monica
+Monna
+Morgan
+Muriel
+Mya
+Mylee
+Myriam
+Myrtie
+Nadia
+Nan
+Nancy
+Naomi
+Natalia
+Natalie
+Nataly
+Natasha
+Nayeli
+Nelle
+Nena
+Nerissa
+Netta
+Nettie
+Nevaeh
+Nia
+Nicole
+Nina
+Noelle
+Nonie
+Nora
+Norah
+Nova
+Nowell
+Nydia
+Nyla
+Olive
+Olivia
+Oralie
+Paige
+Paisley
+Paola
+Paris
+Patience
+Patricia
+Pauleen
+Payton
+Pene
+Penelope
+Peregrine
+Perla
+Peyton
+Pheobe
+Phoebe
+Phyliss
+Phyllida
+Phyllis
+Piper
+Porsche
+Presley
+Priscilla
+Prosper
+Prue
+Quanah
+Quiana
+Rachael
+Rachel
+Raegan
+Raelene
+Rain
+Randa
+Randal
+Reagan
+Rebecca
+Rebeckah
+Rebekah
+Reene
+Reese
+Renie
+Rexana
+Rhetta
+Rihanna
+Riley
+Ronnette
+Rosa
+Rose
+Rosemary
+Rowan
+Ruby
+Rubye
+Ruth
+Rylee
+Ryleigh
+Rylie
+Sabella
+Sabrina
+Sachie
+Sadie
+Sage
+Sally
+Samantha
+Samara
+Sandra
+Sara
+Sarah
+Sarai
+Saranna
+Sasha
+Savanna
+Savannah
+Scarlett
+Selena
+Seneca
+Serena
+Serenity
+Shana
+Shanika
+Shannah
+Shannon
+Shantae
+Sharalyn
+Sharla
+Shayla
+Shelby
+Sheri
+Sherie
+Sherill
+Sherri
+Sienna
+Sierra
+Sissy
+Skylar
+Skyler
+Sofia
+Sophia
+Sophie
+Star
+Stella
+Steph
+Stephanie
+Stephany
+Sue
+Sukie
+Summer
+Sunshine
+Susanna
+Susannah
+Suzan
+Suzy
+Sydney
+Talia
+Tamika
+Tania
+Tansy
+Taryn
+Tatiana
+Tatum
+Tatyanna
+Taylor
+Teagan
+Tessa
+Tiffany
+Tolly
+Topaz
+Tori
+Tracee
+Tracey
+Trinity
+Ulyssa
+Valary
+Valentina
+Valeria
+Valerie
+Vanessa
+Verna
+Veronica
+Victoria
+Vinnie
+Violet
+Vivian
+Viviana
+Vivyan
+Wendi
+Wendy
+Willow
+Wisdom
+Wynonna
+Wynter
+Ximena
+Yasmin
+Yolanda
+Ysabel
+Zelda
+Zoe
+Zoey
Zune
\ No newline at end of file
diff --git a/strings/names/first_male.txt b/strings/names/first_male.txt
index b86722dbaf..928958d1a9 100644
--- a/strings/names/first_male.txt
+++ b/strings/names/first_male.txt
@@ -1,668 +1,668 @@
-Aaden
-Aaron
-Abel
-Abraham
-Adam
-Adan
-Aden
-Adolph
-Adrian
-Aidan
-Aiden
-Alan
-Albert
-Alberto
-Alden
-Alec
-Alejandro
-Alex
-Alexander
-Alexis
-Alfred
-Alfredo
-Alger
-Ali
-Alijah
-Allen
-Alvin
-Amari
-Amir
-Amos
-Anderson
-Andre
-Andres
-Andrew
-Andy
-Angel
-Angelo
-Anthony
-Antonio
-Apple
-Archie
-Armando
-Arnie
-Art
-Arthur
-Arturo
-Asher
-Ashton
-August
-Austin
-Avery
-Axel
-Ayden
-Baldric
-Bartholomew
-Beau
-Beckett
-Benjamin
-Bennett
-Bill
-Blake
-Braden
-Bradley
-Brady
-Braeden
-Braiden
-Brandon
-Braxton
-Brayan
-Brayden
-Braydon
-Braylon
-Brendan
-Brenden
-Brennan
-Brett
-Brian
-Brick
-Brock
-Brodie
-Brody
-Bronte
-Bruce
-Bryan
-Bryant
-Bryce
-Brycen
-Bryson
-Buck
-Burt
-Butch
-Byrne
-Byron
-Cade
-Caden
-Caiden
-Caleb
-Calvin
-Camden
-Cameron
-Camron
-Camryn
-Carl
-Carlos
-Carson
-Carter
-Casey
-Cash
-Casimir
-Cassian
-Cayden
-Cesar
-Chad
-Chance
-Chandler
-Charles
-Charlie
-Charlton
-Chase
-Chip
-Chris
-Christian
-Christopher
-Clark
-Claudius
-Clayton
-Clement
-Cletus
-Cleveland
-Cliff
-Clinton
-Cody
-Cohen
-Colby
-Cole
-Colin
-Collin
-Colten
-Colton
-Conner
-Connor
-Cooper
-Corbin
-Corey
-Cory
-Cristian
-Cristopher
-Crush
-Cruz
-Curtis
-Cy
-Dakota
-Dallas
-Dalton
-Damian
-Damien
-Damon
-Dane
-Daniel
-Danny
-Dante
-Darcey
-Darell
-Darin
-Darius
-Darren
-David
-Davion
-Davis
-Dawson
-Dayton
-Dean
-Deandre
-Deangelo
-Declan
-Denholm
-Dennis
-Derek
-Derrick
-Desmond
-Devin
-Devon
-Diego
-Dillon
-Dirk
-Dominic
-Dominick
-Donald
-Donny
-Donovan
-Douglas
-Drake
-Drew
-Driscoll
-Duke
-Duncan
-Dustin
-Dylan
-Easton
-Eddie
-Edgar
-Eduardo
-Edward
-Edwin
-Eli
-Elias
-Elijah
-Eliot
-Eliott
-Elliot
-Elliott
-Elric
-Elwood
-Emanuel
-Emerson
-Emiliano
-Emilio
-Emmanuel
-Enrique
-Eric
-Erick
-Erik
-Ernesto
-Esteban
-Ethan
-Evan
-Everett
-Ezekiel
-Ezra
-Fabian
-Felix
-Fenton
-Fernando
-Finn
-Fitz
-Flick
-Flint
-Flip
-Francis
-Francisco
-Frank
-Frankie
-Franklin
-Fridge
-Fulton
-Gabriel
-Gael
-Gage
-Gannon
-Garret
-Garrett
-Gary
-Gavin
-George
-Gerardo
-Giovanni
-Goddard
-Godwin
-Goodwin
-Gordon
-Grady
-Graeme
-Graham
-Grandpa
-Grant
-Gratian
-Grayson
-Gregory
-Grendel
-Greyson
-Griffin
-Guillermo
-Gunner
-Gustavo
-Han
-Harrison
-Harry
-Hartley
-Harvey
-Hayden
-Hector
-Henderson
-Henry
-Holden
-Homer
-Horatio
-Hudson
-Huffie
-Hugo
-Hungry
-Hunter
-Ian
-Irvine
-Isaac
-Isaiah
-Isaias
-Isiah
-Ismael
-Israel
-Issac
-Ivan
-Izaiah
-Jace
-Jack
-Jackson
-Jacob
-Jacoby
-Jaden
-Jadon
-Jaiden
-Jaime
-Jake
-Jakob
-Jalen
-Jamar
-Jamari
-Jamarion
-James
-Jameson
-Jamie
-Jamison
-Janel
-Jared
-Jason
-Jasper
-Javier
-Javon
-Jaxon
-Jaxson
-Jay
-Jayce
-Jayden
-Jaydon
-Jaye
-Jaylen
-Jayne
-Jayson
-Jean-Luc
-Jeb
-Jed
-Jeffrey
-Jemmy
-Jeremiah
-Jeremy
-Jermaine
-Jerrie
-Jerry
-Jesse
-Jesus
-Jim
-Jimmy
-Joachim
-Joaquin
-Joe
-Joel
-Joey
-Johan
-John
-Johnathan
-Johnny
-Jonah
-Jonas
-Jonathan
-Jonathon
-Jordan
-Jorge
-Jose
-Joseph
-Josh
-Joshua
-Josiah
-Josue
-Juan
-Judah
-Jude
-Julian
-Julio
-Julius
-Justice
-Justin
-Kade
-Kaden
-Kai
-Kaiden
-Kale
-Kaleb
-Kameron
-Kane
-Karson
-Kayden
-Keagan
-Keaton
-Keegan
-Keith
-Kellen
-Kelvin
-Kennard
-Kenneth
-Kevin
-Keziah
-Khalil
-Kingston
-Kobe
-Kolton
-Kristopher
-Kyle
-Kyler
-Lance
-Landen
-Lando
-Landon
-Landyn
-Lane
-Lanny
-Larry
-Launce
-Lawrence
-Leland
-Lennox
-Lenny
-Leo
-Leonard
-Leonardo
-Leonel
-Leroy
-Levi
-Liam
-Lief
-Lincoln
-Linden
-Linton
-Logan
-Lorde
-Lorenzo
-Loreto
-Lou
-Louis
-Luca
-Lucas
-Luis
-Lukas
-Luke
-Maddox
-Malachi
-Malcolm
-Malik
-Manley
-Manuel
-Marc
-Marco
-Marcos
-Marcus
-Mario
-Marion
-Mark
-Marshall
-Martin
-Marvin
-Mason
-Mateo
-Mathew
-Matthew
-Maurice
-Mauricio
-Max
-Maximilian
-Maximus
-Maxwell
-Maynard
-Mekhi
-Melvin
-Melvyn
-Micah
-Michael
-Micheal
-Miguel
-Mike
-Miles
-Milo
-Milton
-Mitchell
-Moises
-Montague
-Monte
-Monty
-Morgan
-Moses
-Myles
-Nasir
-Nat
-Nathan
-Nathaniel
-Nehemiah
-Nelson
-Nicholas
-Nick
-Nickolas
-Nicolas
-Nikolas
-Noah
-Noel
-Nolan
-Oliver
-Omar
-Opie
-Orlando
-Osbert
-Osborn
-Osborne
-Oscar
-Osmund
-Oswald
-Owen
-Pablo
-Paget
-Parker
-Patrick
-Patton
-Paul
-Paxton
-Payton
-Pedro
-Percival
-Persh
-Peter
-Peyton
-Philip
-Phillip
-Phoenix
-Porter
-Preston
-Quentin
-Quinn
-Quinton
-Rafael
-Ramon
-Randy
-Rastus
-Raul
-Raymond
-Rayner
-Reece
-Reed
-Reese
-Reid
-Reuben
-Reynard
-Ricardo
-Richard
-Ricky
-Riley
-River
-Robert
-Roberto
-Rocco
-Rodger
-Rodrigo
-Roger
-Roman
-Romayne
-Romeo
-Ronald
-Roscoe
-Roswell
-Rowan
-Roy
-Royce
-Rube
-Ruben
-Russell
-Rusty
-Ryan
-Ryder
-Ryker
-Rylan
-Sal
-Salvador
-Sam
-Samuel
-Santiago
-Saul
-Sawyer
-Scott
-Scotty
-Sean
-Sebastian
-Sergio
-Seth
-Seymour
-Shane
-Shaun
-Shawn
-Shiloh
-Silas
-Simon
-Skyler
-Sloan
-Smoke
-Solomon
-Sorrel
-Spencer
-Spike
-Stephen
-Steven
-Sybil
-Syd
-Talon
-Tamsin
-Tanner
-Tate
-Taylor
-Tel
-Terrell
-Terry
-Theodore
-Thomas
-Tim
-Timothy
-Titus
-Todd
-Tony
-Travis
-Trent
-Trenton
-Trevor
-Trey
-Trip
-Tristan
-Tristen
-Triston
-Troy
-Tucker
-Ty
-Tye
-Tyler
-Tyson
-Uland
-Ulric
-Uriel
-Vaughn
-Victor
-Vince
-Vincent
-Vinny
-Walker
-Walter
-Ward
-Warner
-Wayne
-Wesley
-Weston
-Whitaker
-William
-Willy
-Woodrow
-Wyatt
-Xander
-Xavier
-Yahir
-Zachariah
-Zachary
-Zack
-Zackary
-Zander
-Zane
-Zayden
-Zeke
+Aaden
+Aaron
+Abel
+Abraham
+Adam
+Adan
+Aden
+Adolph
+Adrian
+Aidan
+Aiden
+Alan
+Albert
+Alberto
+Alden
+Alec
+Alejandro
+Alex
+Alexander
+Alexis
+Alfred
+Alfredo
+Alger
+Ali
+Alijah
+Allen
+Alvin
+Amari
+Amir
+Amos
+Anderson
+Andre
+Andres
+Andrew
+Andy
+Angel
+Angelo
+Anthony
+Antonio
+Apple
+Archie
+Armando
+Arnie
+Art
+Arthur
+Arturo
+Asher
+Ashton
+August
+Austin
+Avery
+Axel
+Ayden
+Baldric
+Bartholomew
+Beau
+Beckett
+Benjamin
+Bennett
+Bill
+Blake
+Braden
+Bradley
+Brady
+Braeden
+Braiden
+Brandon
+Braxton
+Brayan
+Brayden
+Braydon
+Braylon
+Brendan
+Brenden
+Brennan
+Brett
+Brian
+Brick
+Brock
+Brodie
+Brody
+Bronte
+Bruce
+Bryan
+Bryant
+Bryce
+Brycen
+Bryson
+Buck
+Burt
+Butch
+Byrne
+Byron
+Cade
+Caden
+Caiden
+Caleb
+Calvin
+Camden
+Cameron
+Camron
+Camryn
+Carl
+Carlos
+Carson
+Carter
+Casey
+Cash
+Casimir
+Cassian
+Cayden
+Cesar
+Chad
+Chance
+Chandler
+Charles
+Charlie
+Charlton
+Chase
+Chip
+Chris
+Christian
+Christopher
+Clark
+Claudius
+Clayton
+Clement
+Cletus
+Cleveland
+Cliff
+Clinton
+Cody
+Cohen
+Colby
+Cole
+Colin
+Collin
+Colten
+Colton
+Conner
+Connor
+Cooper
+Corbin
+Corey
+Cory
+Cristian
+Cristopher
+Crush
+Cruz
+Curtis
+Cy
+Dakota
+Dallas
+Dalton
+Damian
+Damien
+Damon
+Dane
+Daniel
+Danny
+Dante
+Darcey
+Darell
+Darin
+Darius
+Darren
+David
+Davion
+Davis
+Dawson
+Dayton
+Dean
+Deandre
+Deangelo
+Declan
+Denholm
+Dennis
+Derek
+Derrick
+Desmond
+Devin
+Devon
+Diego
+Dillon
+Dirk
+Dominic
+Dominick
+Donald
+Donny
+Donovan
+Douglas
+Drake
+Drew
+Driscoll
+Duke
+Duncan
+Dustin
+Dylan
+Easton
+Eddie
+Edgar
+Eduardo
+Edward
+Edwin
+Eli
+Elias
+Elijah
+Eliot
+Eliott
+Elliot
+Elliott
+Elric
+Elwood
+Emanuel
+Emerson
+Emiliano
+Emilio
+Emmanuel
+Enrique
+Eric
+Erick
+Erik
+Ernesto
+Esteban
+Ethan
+Evan
+Everett
+Ezekiel
+Ezra
+Fabian
+Felix
+Fenton
+Fernando
+Finn
+Fitz
+Flick
+Flint
+Flip
+Francis
+Francisco
+Frank
+Frankie
+Franklin
+Fridge
+Fulton
+Gabriel
+Gael
+Gage
+Gannon
+Garret
+Garrett
+Gary
+Gavin
+George
+Gerardo
+Giovanni
+Goddard
+Godwin
+Goodwin
+Gordon
+Grady
+Graeme
+Graham
+Grandpa
+Grant
+Gratian
+Grayson
+Gregory
+Grendel
+Greyson
+Griffin
+Guillermo
+Gunner
+Gustavo
+Han
+Harrison
+Harry
+Hartley
+Harvey
+Hayden
+Hector
+Henderson
+Henry
+Holden
+Homer
+Horatio
+Hudson
+Huffie
+Hugo
+Hungry
+Hunter
+Ian
+Irvine
+Isaac
+Isaiah
+Isaias
+Isiah
+Ismael
+Israel
+Issac
+Ivan
+Izaiah
+Jace
+Jack
+Jackson
+Jacob
+Jacoby
+Jaden
+Jadon
+Jaiden
+Jaime
+Jake
+Jakob
+Jalen
+Jamar
+Jamari
+Jamarion
+James
+Jameson
+Jamie
+Jamison
+Janel
+Jared
+Jason
+Jasper
+Javier
+Javon
+Jaxon
+Jaxson
+Jay
+Jayce
+Jayden
+Jaydon
+Jaye
+Jaylen
+Jayne
+Jayson
+Jean-Luc
+Jeb
+Jed
+Jeffrey
+Jemmy
+Jeremiah
+Jeremy
+Jermaine
+Jerrie
+Jerry
+Jesse
+Jesus
+Jim
+Jimmy
+Joachim
+Joaquin
+Joe
+Joel
+Joey
+Johan
+John
+Johnathan
+Johnny
+Jonah
+Jonas
+Jonathan
+Jonathon
+Jordan
+Jorge
+Jose
+Joseph
+Josh
+Joshua
+Josiah
+Josue
+Juan
+Judah
+Jude
+Julian
+Julio
+Julius
+Justice
+Justin
+Kade
+Kaden
+Kai
+Kaiden
+Kale
+Kaleb
+Kameron
+Kane
+Karson
+Kayden
+Keagan
+Keaton
+Keegan
+Keith
+Kellen
+Kelvin
+Kennard
+Kenneth
+Kevin
+Keziah
+Khalil
+Kingston
+Kobe
+Kolton
+Kristopher
+Kyle
+Kyler
+Lance
+Landen
+Lando
+Landon
+Landyn
+Lane
+Lanny
+Larry
+Launce
+Lawrence
+Leland
+Lennox
+Lenny
+Leo
+Leonard
+Leonardo
+Leonel
+Leroy
+Levi
+Liam
+Lief
+Lincoln
+Linden
+Linton
+Logan
+Lorde
+Lorenzo
+Loreto
+Lou
+Louis
+Luca
+Lucas
+Luis
+Lukas
+Luke
+Maddox
+Malachi
+Malcolm
+Malik
+Manley
+Manuel
+Marc
+Marco
+Marcos
+Marcus
+Mario
+Marion
+Mark
+Marshall
+Martin
+Marvin
+Mason
+Mateo
+Mathew
+Matthew
+Maurice
+Mauricio
+Max
+Maximilian
+Maximus
+Maxwell
+Maynard
+Mekhi
+Melvin
+Melvyn
+Micah
+Michael
+Micheal
+Miguel
+Mike
+Miles
+Milo
+Milton
+Mitchell
+Moises
+Montague
+Monte
+Monty
+Morgan
+Moses
+Myles
+Nasir
+Nat
+Nathan
+Nathaniel
+Nehemiah
+Nelson
+Nicholas
+Nick
+Nickolas
+Nicolas
+Nikolas
+Noah
+Noel
+Nolan
+Oliver
+Omar
+Opie
+Orlando
+Osbert
+Osborn
+Osborne
+Oscar
+Osmund
+Oswald
+Owen
+Pablo
+Paget
+Parker
+Patrick
+Patton
+Paul
+Paxton
+Payton
+Pedro
+Percival
+Persh
+Peter
+Peyton
+Philip
+Phillip
+Phoenix
+Porter
+Preston
+Quentin
+Quinn
+Quinton
+Rafael
+Ramon
+Randy
+Rastus
+Raul
+Raymond
+Rayner
+Reece
+Reed
+Reese
+Reid
+Reuben
+Reynard
+Ricardo
+Richard
+Ricky
+Riley
+River
+Robert
+Roberto
+Rocco
+Rodger
+Rodrigo
+Roger
+Roman
+Romayne
+Romeo
+Ronald
+Roscoe
+Roswell
+Rowan
+Roy
+Royce
+Rube
+Ruben
+Russell
+Rusty
+Ryan
+Ryder
+Ryker
+Rylan
+Sal
+Salvador
+Sam
+Samuel
+Santiago
+Saul
+Sawyer
+Scott
+Scotty
+Sean
+Sebastian
+Sergio
+Seth
+Seymour
+Shane
+Shaun
+Shawn
+Shiloh
+Silas
+Simon
+Skyler
+Sloan
+Smoke
+Solomon
+Sorrel
+Spencer
+Spike
+Stephen
+Steven
+Sybil
+Syd
+Talon
+Tamsin
+Tanner
+Tate
+Taylor
+Tel
+Terrell
+Terry
+Theodore
+Thomas
+Tim
+Timothy
+Titus
+Todd
+Tony
+Travis
+Trent
+Trenton
+Trevor
+Trey
+Trip
+Tristan
+Tristen
+Triston
+Troy
+Tucker
+Ty
+Tye
+Tyler
+Tyson
+Uland
+Ulric
+Uriel
+Vaughn
+Victor
+Vince
+Vincent
+Vinny
+Walker
+Walter
+Ward
+Warner
+Wayne
+Wesley
+Weston
+Whitaker
+William
+Willy
+Woodrow
+Wyatt
+Xander
+Xavier
+Yahir
+Zachariah
+Zachary
+Zack
+Zackary
+Zander
+Zane
+Zayden
+Zeke
Zion
\ No newline at end of file
diff --git a/strings/names/golem.txt b/strings/names/golem.txt
index a26da78b04..7cfcefa899 100644
--- a/strings/names/golem.txt
+++ b/strings/names/golem.txt
@@ -1,157 +1,157 @@
-Ablation
-Alabaster
-Alunite
-Andesite
-Anyhdrite
-Basalt
-Basin
-Bauxite
-Bedrock
-Bismuth
-Bismuthinite
-Bituminous Coal
-Borax
-Boulder
-Brimstone
-Brittle
-Calcite
-Cassiterite
-Cenozoic
-Chalk
-Chasm
-Cheridite
-Chert
-Chromite
-Cinnabar
-Claystone
-Coast
-Cobaltite
-Column
-Conglomerate
-Core
-Crevasse
-Crust
-Cryolite
-Crystal
-Dacite
-Diorite
-Dolomite
-Dolostone
-Dragonforce
-Earthflow
-Epoch
-Eutrophication
-Fault
-Flint
-Foliation
-Foreshock
-Fossil
-Gabbro
-Galena
-Garnierite
-Geode
-Geoge
-Gneiss
-Granite
-Graphite
-Gravel
-Groove
-Grotto
-Gypsum
-Hematite
-Hornblende
-Humus
-Igneous
-Ilmenite
-Iron
-Island
-Jasper
-Jet
-Kaolinite
-Kettle
-Kimberlite
-Komatiite
-Landslide
-Levee
-Lignite
-Limestone
-Limonite
-Luster
-Madidite
-Magnetite
-Magnitude
-Malachite
-Mantle
-Marble
-Marcasite
-Melange
-Meme
-Mica
-Microcline
-Migmatite
-Mineral
-Mountain
-Mudstone
-Obsidian
-Olivine
-Ore
-Orpiment
-Orthoclase
-Outwash
-Oxbow Lake
-Oynx
-Pahoehoe
-Pebble
-Pegmatite
-Periclase
-Petrified Wood
-Phyllite
-Pitchblende
-Plate
-Pothole
-Puddingstone
-Pyrite
-Pyrolusite
-Quake
-Quarry
-Quartz
-Quartzite
-Realgar
-Reservoir
-Rhyolite
-Rock
-Rock Salt
-Rockfall
-Rutile
-Saltpeter
-Sand
-Sandstone
-Satinspar
-Schist
-Sediment
-Seismic
-Selenite
-Serpentine
-Shale
-Shore
-Siltstone
-Slag
-Slate
-Sphalerite
-Stack
-Stalactite
-Stalagmite
-Stibnite
-Stone
-Stress
-Subduction
-Sylvite
-Talc
-Tetrahedrite
-Tidal
-Trench
-Valley
-Volcano
-Xenolith
-Yardang
-Zone
+Ablation
+Alabaster
+Alunite
+Andesite
+Anyhdrite
+Basalt
+Basin
+Bauxite
+Bedrock
+Bismuth
+Bismuthinite
+Bituminous Coal
+Borax
+Boulder
+Brimstone
+Brittle
+Calcite
+Cassiterite
+Cenozoic
+Chalk
+Chasm
+Cheridite
+Chert
+Chromite
+Cinnabar
+Claystone
+Coast
+Cobaltite
+Column
+Conglomerate
+Core
+Crevasse
+Crust
+Cryolite
+Crystal
+Dacite
+Diorite
+Dolomite
+Dolostone
+Dragonforce
+Earthflow
+Epoch
+Eutrophication
+Fault
+Flint
+Foliation
+Foreshock
+Fossil
+Gabbro
+Galena
+Garnierite
+Geode
+Geoge
+Gneiss
+Granite
+Graphite
+Gravel
+Groove
+Grotto
+Gypsum
+Hematite
+Hornblende
+Humus
+Igneous
+Ilmenite
+Iron
+Island
+Jasper
+Jet
+Kaolinite
+Kettle
+Kimberlite
+Komatiite
+Landslide
+Levee
+Lignite
+Limestone
+Limonite
+Luster
+Madidite
+Magnetite
+Magnitude
+Malachite
+Mantle
+Marble
+Marcasite
+Melange
+Meme
+Mica
+Microcline
+Migmatite
+Mineral
+Mountain
+Mudstone
+Obsidian
+Olivine
+Ore
+Orpiment
+Orthoclase
+Outwash
+Oxbow Lake
+Oynx
+Pahoehoe
+Pebble
+Pegmatite
+Periclase
+Petrified Wood
+Phyllite
+Pitchblende
+Plate
+Pothole
+Puddingstone
+Pyrite
+Pyrolusite
+Quake
+Quarry
+Quartz
+Quartzite
+Realgar
+Reservoir
+Rhyolite
+Rock
+Rock Salt
+Rockfall
+Rutile
+Saltpeter
+Sand
+Sandstone
+Satinspar
+Schist
+Sediment
+Seismic
+Selenite
+Serpentine
+Shale
+Shore
+Siltstone
+Slag
+Slate
+Sphalerite
+Stack
+Stalactite
+Stalagmite
+Stibnite
+Stone
+Stress
+Subduction
+Sylvite
+Talc
+Tetrahedrite
+Tidal
+Trench
+Valley
+Volcano
+Xenolith
+Yardang
+Zone
diff --git a/strings/names/last.txt b/strings/names/last.txt
index b9769055e3..6796c7519e 100644
--- a/strings/names/last.txt
+++ b/strings/names/last.txt
@@ -1,570 +1,570 @@
-Ackerley
-Adams
-Addison
-Agg
-Aggley
-Ahmed
-Albright
-Alekseev
-Ali
-Alice
-Allen
-Alliman
-Altmann
-Anderson
-Andreev
-Ann
-Archibald
-Armstrong
-Ashbaugh
-Atkinson
-Atweeke
-Aultman
-Auman
-Baer
-Bailey
-Baker
-Barnes
-Barrett
-Bash
-Bashline
-Basinger
-Baskett
-Basmanoff
-Batten
-Baum
-Baxter
-Beach
-Beail
-Beck
-Beedell
-Begum
-Bell
-Benford
-Bennett
-Berkheimer
-Best
-Bickerson
-Bicknell
-Biery
-Black
-Blackburn
-Blaine
-Blessig
-Bloise
-Bluetenberger
-Blyant
-Bode
-Bould
-Bousum
-Bowchiew
-Boyer
-Brandenburg
-Bratton
-Braun
-Briggs
-Brindle
-Briner
-Brinigh
-Brooks
-Brown
-Bullard
-Bunten
-Burkett
-Burns
-Burris
-Butterfill
-Buttersworth
-Buzzard
-Byers
-Bynum
-Caldwell
-Callison
-Camp
-Campbell
-Carmichael
-Carr
-Carter
-Catherina
-Catleay
-Cavalet
-Chapman
-Chauvin
-Cherry
-Christman
-Christopher
-Clark
-Clarke
-Clewett
-Coates
-Coldsmith
-Collins
-Compton
-Conrad
-Cook
-Cooper
-Costello
-Cowart
-Cowper
-Cox
-Cressman
-Curry
-Cypret
-David
-Davies
-Davis
-Dawkins
-Day
-Dean
-Demuth
-Dennis
-Dickinson
-Digson
-Dimeling
-Donkin
-Draudy
-Driggers
-Dryfus
-Dugmore
-Duncan
-Durstine
-Earl
-Easter
-Echard
-Eckhardstein
-Edwards
-Eggbert
-Ehret
-Elderson
-Eliza
-Elliott
-Ellis
-Enderly
-Endsley
-Evans
-Ewing
-Faqua
-Faust
-Fea
-Feufer
-Fiddler
-Field
-Fields
-Finlay
-Fischer
-Fiscina
-Fisher
-Fitzgerald
-Fleming
-Flickinger
-Focell
-Foster
-Franks
-Fraser
-Fryer
-Fuchs
-Fulton
-Gadow
-Gardner
-Garland
-Garneys
-Garratt
-Garrison
-Gettemy
-Gibson
-Glover
-Goebbles
-Goodman
-Graham
-Gray
-Green
-Greenawalt
-Greene
-Greenwood
-Gregory
-Griffiths
-Gronko
-Guess
-Hall
-Hanford
-Hardie
-Harding
-Hardy
-Harris
-Harrison
-Harrold
-Harrow
-Harshman
-Hastings
-Hawker
-Hawking
-Hawkins
-Hayhurst
-Haynes
-Heckendora
-Hegarty
-Henry
-Hice
-Highlands
-Hill
-Hincken
-Hirleman
-Hoenshell
-Holdeman
-Holmes
-Hook
-Hooker
-Hoopengarner
-Hoover
-Houser
-Houston
-Howard
-Howe
-Huey
-Hughes
-Hujsak
-Hunt
-Hunter
-Hussain
-Hutton
-Hynes
-Ironmonger
-Isaman
-Isemann
-Ivanov
-Jackson
-James
-Jardine
-Jenkins
-Jenner
-Jerome
-Jesse
-Jewell
-Joghs
-Johnson
-Jones
-Jowers
-Joyce
-Judge
-Jyllian
-Kadel
-Kanaga
-Kaur
-Keener
-Kelley
-Kellogg
-Kelly
-Kemble
-Kemerer
-Keppel
-Kepplinger
-Khan
-Kiefer
-Kifer
-Kimple
-King
-Kirkson
-Knapenberger
-Knapp
-Koepple
-Koster
-Kuster
-Kuznetsov
-Laborde
-Lacon
-Lafortune
-Langston
-Larson
-Lauffer
-Laurenzi
-Leach
-Lee
-Leech
-Leichter
-Leslie
-Lester
-Levett
-Lewis
-Lineman
-Linton
-Llora
-Lloyd
-Logue
-Lombardi
-Lord
-Losey
-Lowe
-Lowstetter
-Lucy
-Ludwig
-Maclagan
-Magor
-Marcotte
-Margaret
-Marriman
-Marshall
-Martins
-Mary
-Mason
-Mathews
-Matthews
-Mcclymonds
-Mccullough
-Mccune
-McDonald
-McDonohugh
-Mcfall
-Mcintosh
-Mckendrick
-Mcloskey
-Mcmullen
-McShain
-Mens
-Merryman
-Metzer
-Meyers
-Mikhaylov
-Mildred
-Miller
-Millhouse
-Mills
-Milne
-Mingle
-Minnie
-Mitchell
-Moberly
-Moon
-Moore
-Morgan
-Morris
-Mortland
-Mosser
-Mueller
-Muggins
-Mull
-Muller
-Murphy
-Murray
-Nash
-Neely
-Nehling
-Newbern
-Newton
-Nicholas
-Nickolson
-Northey
-Noton
-Olphert
-Oneal
-Oppenheimer
-Osteen
-Osterweis
-Osterwise
-Otis
-Overstreet
-Owen
-Owens
-Palmer
-Parker
-Parkinson
-Patel
-Patterson
-Paulson
-Pavlov
-Paynter
-Pearsall
-Pennington
-Perkins
-Pershing
-Peters
-Petrov
-Pfeifer
-Philips
-Phillips
-Picard
-Pinney
-Poehl
-Poley
-Polson
-Potter
-Powell
-Power
-Powers
-Pratt
-Prechtl
-Prescott
-Prevatt
-Price
-Priebe
-Pritchard
-Pycroft
-Quinn
-Quirin
-Rader
-Rahl
-Ramos
-Randolph
-Ratcliff
-Rathen
-Rathens
-Raub
-Ray
-Reade
-Reichard
-Reid
-Reighner
-Rhinehart
-Richards
-Richardson
-Richter
-Rifler
-Riggle
-Riker
-Ringer
-Roadman
-Roberts
-Robertson
-Robinson
-Roby
-Rockwell
-Rogers
-Rohtin
-Rose
-Rosensteel
-Rowley
-Russell
-Ryals
-Sagan
-Sanders
-Sandford
-Sandys
-Sauter
-Saylor
-Schaeffer
-Scherer
-Schmidt
-Schofield
-Schrader
-Scott
-Sealis
-Seelig
-Seidner
-Semenov
-Shafer
-Shaffer
-Shaner
-Shaw
-Sheets
-Shick
-Shirey
-Sholl
-Shupe
-Sidower
-Siegrist
-Simmons
-Simpson
-Singh
-Skywalker
-Sloan
-Smail
-Smirnov
-Smith
-Snyder
-Sommer
-Spock
-Stafford
-Stahl
-Stainforth
-Stall
-Stamos
-Stange
-Staymates
-Steele
-Stephenson
-Stern
-Stewart
-Stocker
-Stone
-Stough
-Straub
-Stroble
-Stroh
-Styles
-Sullivan
-Sulyard
-Summy
-Sutton
-Swabey
-Swarner
-Sybilla
-Taggart
-Tanner
-Taylor
-Teagarden
-Tedrow
-Tennant
-Thomas
-Thomlinson
-Thompson
-Thomson
-Thorley
-Tilton
-Tireman
-Todd
-Treeby
-Trovato
-Turner
-Ulery
-Ullman
-Unk
-Vader
-Vanleer
-Vasilyev
-Waldron
-Walker
-Wallick
-Ward
-Wardle
-Warren
-Watson
-Webb
-Weeter
-Weinstein
-Weisgarber
-Wells
-Welty
-Wentzel
-Werner
-Werry
-Wheeler
-Whirlow
-White
-Whiteman
-Whittier
-Wible
-Wile
-Wilkerson
-Wilkinson
-Willey
-Williams
-Williamson
-Wilo
-Wilson
-Winton
-Wise
-Wolfe
-Wolff
-Wood
-Woodward
-Woodworth
-Woolery
-Woollard
-Wright
-Yeskey
-Young
-Zadovsky
-Zalack
-Zaun
-Zeal
-Zimmer
+Ackerley
+Adams
+Addison
+Agg
+Aggley
+Ahmed
+Albright
+Alekseev
+Ali
+Alice
+Allen
+Alliman
+Altmann
+Anderson
+Andreev
+Ann
+Archibald
+Armstrong
+Ashbaugh
+Atkinson
+Atweeke
+Aultman
+Auman
+Baer
+Bailey
+Baker
+Barnes
+Barrett
+Bash
+Bashline
+Basinger
+Baskett
+Basmanoff
+Batten
+Baum
+Baxter
+Beach
+Beail
+Beck
+Beedell
+Begum
+Bell
+Benford
+Bennett
+Berkheimer
+Best
+Bickerson
+Bicknell
+Biery
+Black
+Blackburn
+Blaine
+Blessig
+Bloise
+Bluetenberger
+Blyant
+Bode
+Bould
+Bousum
+Bowchiew
+Boyer
+Brandenburg
+Bratton
+Braun
+Briggs
+Brindle
+Briner
+Brinigh
+Brooks
+Brown
+Bullard
+Bunten
+Burkett
+Burns
+Burris
+Butterfill
+Buttersworth
+Buzzard
+Byers
+Bynum
+Caldwell
+Callison
+Camp
+Campbell
+Carmichael
+Carr
+Carter
+Catherina
+Catleay
+Cavalet
+Chapman
+Chauvin
+Cherry
+Christman
+Christopher
+Clark
+Clarke
+Clewett
+Coates
+Coldsmith
+Collins
+Compton
+Conrad
+Cook
+Cooper
+Costello
+Cowart
+Cowper
+Cox
+Cressman
+Curry
+Cypret
+David
+Davies
+Davis
+Dawkins
+Day
+Dean
+Demuth
+Dennis
+Dickinson
+Digson
+Dimeling
+Donkin
+Draudy
+Driggers
+Dryfus
+Dugmore
+Duncan
+Durstine
+Earl
+Easter
+Echard
+Eckhardstein
+Edwards
+Eggbert
+Ehret
+Elderson
+Eliza
+Elliott
+Ellis
+Enderly
+Endsley
+Evans
+Ewing
+Faqua
+Faust
+Fea
+Feufer
+Fiddler
+Field
+Fields
+Finlay
+Fischer
+Fiscina
+Fisher
+Fitzgerald
+Fleming
+Flickinger
+Focell
+Foster
+Franks
+Fraser
+Fryer
+Fuchs
+Fulton
+Gadow
+Gardner
+Garland
+Garneys
+Garratt
+Garrison
+Gettemy
+Gibson
+Glover
+Goebbles
+Goodman
+Graham
+Gray
+Green
+Greenawalt
+Greene
+Greenwood
+Gregory
+Griffiths
+Gronko
+Guess
+Hall
+Hanford
+Hardie
+Harding
+Hardy
+Harris
+Harrison
+Harrold
+Harrow
+Harshman
+Hastings
+Hawker
+Hawking
+Hawkins
+Hayhurst
+Haynes
+Heckendora
+Hegarty
+Henry
+Hice
+Highlands
+Hill
+Hincken
+Hirleman
+Hoenshell
+Holdeman
+Holmes
+Hook
+Hooker
+Hoopengarner
+Hoover
+Houser
+Houston
+Howard
+Howe
+Huey
+Hughes
+Hujsak
+Hunt
+Hunter
+Hussain
+Hutton
+Hynes
+Ironmonger
+Isaman
+Isemann
+Ivanov
+Jackson
+James
+Jardine
+Jenkins
+Jenner
+Jerome
+Jesse
+Jewell
+Joghs
+Johnson
+Jones
+Jowers
+Joyce
+Judge
+Jyllian
+Kadel
+Kanaga
+Kaur
+Keener
+Kelley
+Kellogg
+Kelly
+Kemble
+Kemerer
+Keppel
+Kepplinger
+Khan
+Kiefer
+Kifer
+Kimple
+King
+Kirkson
+Knapenberger
+Knapp
+Koepple
+Koster
+Kuster
+Kuznetsov
+Laborde
+Lacon
+Lafortune
+Langston
+Larson
+Lauffer
+Laurenzi
+Leach
+Lee
+Leech
+Leichter
+Leslie
+Lester
+Levett
+Lewis
+Lineman
+Linton
+Llora
+Lloyd
+Logue
+Lombardi
+Lord
+Losey
+Lowe
+Lowstetter
+Lucy
+Ludwig
+Maclagan
+Magor
+Marcotte
+Margaret
+Marriman
+Marshall
+Martins
+Mary
+Mason
+Mathews
+Matthews
+Mcclymonds
+Mccullough
+Mccune
+McDonald
+McDonohugh
+Mcfall
+Mcintosh
+Mckendrick
+Mcloskey
+Mcmullen
+McShain
+Mens
+Merryman
+Metzer
+Meyers
+Mikhaylov
+Mildred
+Miller
+Millhouse
+Mills
+Milne
+Mingle
+Minnie
+Mitchell
+Moberly
+Moon
+Moore
+Morgan
+Morris
+Mortland
+Mosser
+Mueller
+Muggins
+Mull
+Muller
+Murphy
+Murray
+Nash
+Neely
+Nehling
+Newbern
+Newton
+Nicholas
+Nickolson
+Northey
+Noton
+Olphert
+Oneal
+Oppenheimer
+Osteen
+Osterweis
+Osterwise
+Otis
+Overstreet
+Owen
+Owens
+Palmer
+Parker
+Parkinson
+Patel
+Patterson
+Paulson
+Pavlov
+Paynter
+Pearsall
+Pennington
+Perkins
+Pershing
+Peters
+Petrov
+Pfeifer
+Philips
+Phillips
+Picard
+Pinney
+Poehl
+Poley
+Polson
+Potter
+Powell
+Power
+Powers
+Pratt
+Prechtl
+Prescott
+Prevatt
+Price
+Priebe
+Pritchard
+Pycroft
+Quinn
+Quirin
+Rader
+Rahl
+Ramos
+Randolph
+Ratcliff
+Rathen
+Rathens
+Raub
+Ray
+Reade
+Reichard
+Reid
+Reighner
+Rhinehart
+Richards
+Richardson
+Richter
+Rifler
+Riggle
+Riker
+Ringer
+Roadman
+Roberts
+Robertson
+Robinson
+Roby
+Rockwell
+Rogers
+Rohtin
+Rose
+Rosensteel
+Rowley
+Russell
+Ryals
+Sagan
+Sanders
+Sandford
+Sandys
+Sauter
+Saylor
+Schaeffer
+Scherer
+Schmidt
+Schofield
+Schrader
+Scott
+Sealis
+Seelig
+Seidner
+Semenov
+Shafer
+Shaffer
+Shaner
+Shaw
+Sheets
+Shick
+Shirey
+Sholl
+Shupe
+Sidower
+Siegrist
+Simmons
+Simpson
+Singh
+Skywalker
+Sloan
+Smail
+Smirnov
+Smith
+Snyder
+Sommer
+Spock
+Stafford
+Stahl
+Stainforth
+Stall
+Stamos
+Stange
+Staymates
+Steele
+Stephenson
+Stern
+Stewart
+Stocker
+Stone
+Stough
+Straub
+Stroble
+Stroh
+Styles
+Sullivan
+Sulyard
+Summy
+Sutton
+Swabey
+Swarner
+Sybilla
+Taggart
+Tanner
+Taylor
+Teagarden
+Tedrow
+Tennant
+Thomas
+Thomlinson
+Thompson
+Thomson
+Thorley
+Tilton
+Tireman
+Todd
+Treeby
+Trovato
+Turner
+Ulery
+Ullman
+Unk
+Vader
+Vanleer
+Vasilyev
+Waldron
+Walker
+Wallick
+Ward
+Wardle
+Warren
+Watson
+Webb
+Weeter
+Weinstein
+Weisgarber
+Wells
+Welty
+Wentzel
+Werner
+Werry
+Wheeler
+Whirlow
+White
+Whiteman
+Whittier
+Wible
+Wile
+Wilkerson
+Wilkinson
+Willey
+Williams
+Williamson
+Wilo
+Wilson
+Winton
+Wise
+Wolfe
+Wolff
+Wood
+Woodward
+Woodworth
+Woolery
+Woollard
+Wright
+Yeskey
+Young
+Zadovsky
+Zalack
+Zaun
+Zeal
+Zimmer
Zoucks
\ No newline at end of file
diff --git a/strings/names/lizard_female.txt b/strings/names/lizard_female.txt
index cf588df9b1..078ee7bcff 100644
--- a/strings/names/lizard_female.txt
+++ b/strings/names/lizard_female.txt
@@ -1,163 +1,163 @@
-Adzi
-Ah
-Ahaht
-Ajim
-Akeenus
-Akish
-Akishan
-Aleeto
-Am
-Amussa
-An
-Anozz
-Asheemar
-Asska
-Awas
-Azala
-Azbai
-Azeez
-Azum
-Banalz
-Bar
-Baseenar
-Beek
-Beekatan
-Beekus
-Beela
-Beelei
-Beem
-Beewos
-Bejeen
-Ber
-Betzi
-Bishalus
-Bokeeus
-Bur
-Bura
-Chalaree
-Chana
-Chanil
-Chee
-Cheesh
-Chimatei
-Chirurgeon
-Cholasistu
-Chuna
-Churasu
-Crath
-Dar
-Deeja
-Deesei
-Deesh
-Deetsan
-Deetwos
-Dooka
-Druja
-Eepa
-Ei
-Eix
-El
-Ereel
-Eutei
-Gai
-Gih
-Gilm
-Gish
-Go
-Hal
-Hul
-Ja
-Jaseen
-Jasuda
-Jeed
-Jeen
-Kajul
-Kal
-Kasa
-Keel
-Keerava
-Kiurz
-Kud
-La
-Lee
-Lei
-Lifts
-Liurz
-Lurasha
-Ma
-Mach
-Marz
-Meedish
-Meeh
-Meema
-Meen
-Meena
-Meenus
-Meerana
-Meesei
-Meeus
-Mei
-Milah
-Mim
-Mota
-Mudeska
-Muz
-Na
-Nakuma
-Nam
-Nassa
-Natoo
-Neesha
-Neetizei
-Neetra
-Neeus
-Niima
-Numeen
-Nuralg
-Nush
-Ocheeva
-Okur
-Olank
-On
-Onasha
-Osheeka
-Pasha
-Ra
-Rana
-Raniur
-Ree
-Reesa
-Rei
-Sa
-Saak
-Sanax
-Seeba
-Seed
-Seen
-Shah
-Shahvee
-Shaleez
-Shatalg
-Sheer
-Shei
-Sigerthe
-Skaleel
-Sudie
-Tail
-Tar
-Tasha
-Tei
-Telixith
-Tumma
-Veek
-Wan
-Wazei
-Weedum
-Weewish
-Witseidutsei
-Wuja
-Wujeeta
-Wusha
-Xil
-Zish
+Adzi
+Ah
+Ahaht
+Ajim
+Akeenus
+Akish
+Akishan
+Aleeto
+Am
+Amussa
+An
+Anozz
+Asheemar
+Asska
+Awas
+Azala
+Azbai
+Azeez
+Azum
+Banalz
+Bar
+Baseenar
+Beek
+Beekatan
+Beekus
+Beela
+Beelei
+Beem
+Beewos
+Bejeen
+Ber
+Betzi
+Bishalus
+Bokeeus
+Bur
+Bura
+Chalaree
+Chana
+Chanil
+Chee
+Cheesh
+Chimatei
+Chirurgeon
+Cholasistu
+Chuna
+Churasu
+Crath
+Dar
+Deeja
+Deesei
+Deesh
+Deetsan
+Deetwos
+Dooka
+Druja
+Eepa
+Ei
+Eix
+El
+Ereel
+Eutei
+Gai
+Gih
+Gilm
+Gish
+Go
+Hal
+Hul
+Ja
+Jaseen
+Jasuda
+Jeed
+Jeen
+Kajul
+Kal
+Kasa
+Keel
+Keerava
+Kiurz
+Kud
+La
+Lee
+Lei
+Lifts
+Liurz
+Lurasha
+Ma
+Mach
+Marz
+Meedish
+Meeh
+Meema
+Meen
+Meena
+Meenus
+Meerana
+Meesei
+Meeus
+Mei
+Milah
+Mim
+Mota
+Mudeska
+Muz
+Na
+Nakuma
+Nam
+Nassa
+Natoo
+Neesha
+Neetizei
+Neetra
+Neeus
+Niima
+Numeen
+Nuralg
+Nush
+Ocheeva
+Okur
+Olank
+On
+Onasha
+Osheeka
+Pasha
+Ra
+Rana
+Raniur
+Ree
+Reesa
+Rei
+Sa
+Saak
+Sanax
+Seeba
+Seed
+Seen
+Shah
+Shahvee
+Shaleez
+Shatalg
+Sheer
+Shei
+Sigerthe
+Skaleel
+Sudie
+Tail
+Tar
+Tasha
+Tei
+Telixith
+Tumma
+Veek
+Wan
+Wazei
+Weedum
+Weewish
+Witseidutsei
+Wuja
+Wujeeta
+Wusha
+Xil
+Zish
Zollassa
\ No newline at end of file
diff --git a/strings/names/lizard_male.txt b/strings/names/lizard_male.txt
index 437d124b50..f14f1705ba 100644
--- a/strings/names/lizard_male.txt
+++ b/strings/names/lizard_male.txt
@@ -1,328 +1,328 @@
-Abijoo
-Ah
-Ajum
-Am
-Amusei
-An
-Anoo
-Aojee
-Asum
-Az
-Azeel
-Azinar
-Azjai
-Baar
-Banka
-Bar
-Barnaxi
-Batar
-Batuus
-Beem
-Beshnus
-Betu
-Bex
-Bijot
-Bimee
-Binyaar
-Bosekus
-Brand
-Bun
-Bunach
-Bunish
-Busheeus
-Buujhan
-Chakuk
-Chalish
-Chalureel
-Chath
-Chee
-Cheedal
-Chilwir
-Chitakus
-Chiwish
-Chulz
-Chuna
-Da
-Dakee
-Dan
-Dar
-Darasken
-DarJee
-Debameel
-Deed
-Deegeeta
-Deeh
-Deekonus
-Deekum
-Deekus
-Deerkaza
-Deetum
-Demeepa
-Depasa
-Derkeethus
-Deroh
-Dezanu
-Dreet
-Drumarz
-Dum
-Dunaxith
-Effe
-Ei
-Eidu
-Eius
-Eiuus
-Eix
-Eleedal
-Er
-Esqoo
-Etaku
-Gah
-Gajul
-Gam
-Geeh
-Geel
-Geem
-Geh
-Gei
-Gih
-Gin
-Goh
-Gulum
-Haj
-Han
-Haran
-Hareeya
-Hathei
-Heedul
-Heem
-Hei
-Heir
-Hixeeh
-Huleeya
-Huzei
-Ilas
-Im
-Inee
-Itan
-J'Ram
-Ja
-Jah
-Jaraleet
-Jaree
-Jas
-Jasaiin
-Jaseen
-Jat
-Jee
-Jeela
-Jeelius
-Jeelus
-Jeen
-Jeer
-Jeetum
-Jei
-Jilux
-Jin
-Jon
-Jul
-Julan
-Junal
-Jush
-Juunei
-Kai
-Kajin
-Kamax
-Kas
-Keema
-Keer
-Keerasa
-Kepanuu
-Kia
-Kiameed
-Kilaya
-Kiurz
-Kur
-Kuz
-La
-Lah
-Lai
-Lan
-Lara
-Leem
-Lei
-Loh
-Lotash
-Luh
-Lurz
-Luteema
-Maahi
-Madesi
-Maheelius
-Mahei
-Maht
-Malz
-Marz
-Mathei
-Maxath
-Meej
-Meejapa
-Meensuda
-Meer
-Mema
-Mere
-Metaku
-Miharil
-Milos
-Miun
-Mobareed
-Mohimeem
-Mopakuz
-Motuu
-Mujeen
-Muranatepa
-Mush
-Muz
-Na
-Napetui
-Nazuux
-Nebutil
-Neeti
-Neetinei
-Neetrenaza
-Neetzara
-Neeus
-Nema
-Neposh
-Netapatuu
-Nexith
-Nodeeus
-Nomu
-Nosaleeth
-Nowajeem
-Noyei
-Nulaz
-Nur
-Obaxith
-Okan
-Okaw
-Okeeh
-Oleed
-Oleen
-Olik
-Olink
-Onuja
-Onurai
-Opatieel
-Otumeel
-Owai
-Pachat
-Pacheeva
-Pad
-Paduxi
-Pajeen
-Parash
-Peeradeeh
-Pejureel
-Petaxai
-Pideelus
-Pimaxi
-Pojeel
-Ra
-Radithax
-Raj
-Rareel
-Rasha
-Redieeus
-Ree
-Reeh
-Reemukeeus
-Reenum
-Reesa
-Reet
-Reezal
-Resari
-Riker
-Ru
-Rupah
-Sakeepa
-Sakeeus
-Sakka
-Saliith
-Sar
-Schiavas
-Seek
-Seewul
-Sei
-Sejaijilax
-Shakiis
-Shehs
-Shei
-Silm
-Skee
-Skeetul
-Sureeus
-Ta
-Taeed
-Tah
-Taleel
-Talen
-Tan
-Tanaka
-Tanan
-Tee
-Teeba
-Teegla
-Teeka
-Teekeeus
-Teemeeta
-Teeus
-Tehat
-Tei
-Teinaava
-Teineeja
-Terezeeus
-Tikaasi
-Tim
-Topeeth
-Topith
-Tsleeixth
-Tul
-Tulm
-Tun
-Ukatsei
-Ukawei
-Ula
-Ulawa
-Ullis
-Usha
-Usheeja
-Utadeek
-Utamukeeus
-Utatul
-Uxith
-Vara
-Veekas
-Veenaza
-Veezara
-Vistha
-Vudeelal
-Wanan
-Wanum
-Wayiteh
-Weebam
-Weeltul
-Weer
-Wih
-Wud
-Wuleen
-Wulm
-Wumeek
-Xal
-Xemo
-Yinz
-Yinz'r
-Zaw
-Ze
-Zeen
-Zeeus
+Abijoo
+Ah
+Ajum
+Am
+Amusei
+An
+Anoo
+Aojee
+Asum
+Az
+Azeel
+Azinar
+Azjai
+Baar
+Banka
+Bar
+Barnaxi
+Batar
+Batuus
+Beem
+Beshnus
+Betu
+Bex
+Bijot
+Bimee
+Binyaar
+Bosekus
+Brand
+Bun
+Bunach
+Bunish
+Busheeus
+Buujhan
+Chakuk
+Chalish
+Chalureel
+Chath
+Chee
+Cheedal
+Chilwir
+Chitakus
+Chiwish
+Chulz
+Chuna
+Da
+Dakee
+Dan
+Dar
+Darasken
+DarJee
+Debameel
+Deed
+Deegeeta
+Deeh
+Deekonus
+Deekum
+Deekus
+Deerkaza
+Deetum
+Demeepa
+Depasa
+Derkeethus
+Deroh
+Dezanu
+Dreet
+Drumarz
+Dum
+Dunaxith
+Effe
+Ei
+Eidu
+Eius
+Eiuus
+Eix
+Eleedal
+Er
+Esqoo
+Etaku
+Gah
+Gajul
+Gam
+Geeh
+Geel
+Geem
+Geh
+Gei
+Gih
+Gin
+Goh
+Gulum
+Haj
+Han
+Haran
+Hareeya
+Hathei
+Heedul
+Heem
+Hei
+Heir
+Hixeeh
+Huleeya
+Huzei
+Ilas
+Im
+Inee
+Itan
+J'Ram
+Ja
+Jah
+Jaraleet
+Jaree
+Jas
+Jasaiin
+Jaseen
+Jat
+Jee
+Jeela
+Jeelius
+Jeelus
+Jeen
+Jeer
+Jeetum
+Jei
+Jilux
+Jin
+Jon
+Jul
+Julan
+Junal
+Jush
+Juunei
+Kai
+Kajin
+Kamax
+Kas
+Keema
+Keer
+Keerasa
+Kepanuu
+Kia
+Kiameed
+Kilaya
+Kiurz
+Kur
+Kuz
+La
+Lah
+Lai
+Lan
+Lara
+Leem
+Lei
+Loh
+Lotash
+Luh
+Lurz
+Luteema
+Maahi
+Madesi
+Maheelius
+Mahei
+Maht
+Malz
+Marz
+Mathei
+Maxath
+Meej
+Meejapa
+Meensuda
+Meer
+Mema
+Mere
+Metaku
+Miharil
+Milos
+Miun
+Mobareed
+Mohimeem
+Mopakuz
+Motuu
+Mujeen
+Muranatepa
+Mush
+Muz
+Na
+Napetui
+Nazuux
+Nebutil
+Neeti
+Neetinei
+Neetrenaza
+Neetzara
+Neeus
+Nema
+Neposh
+Netapatuu
+Nexith
+Nodeeus
+Nomu
+Nosaleeth
+Nowajeem
+Noyei
+Nulaz
+Nur
+Obaxith
+Okan
+Okaw
+Okeeh
+Oleed
+Oleen
+Olik
+Olink
+Onuja
+Onurai
+Opatieel
+Otumeel
+Owai
+Pachat
+Pacheeva
+Pad
+Paduxi
+Pajeen
+Parash
+Peeradeeh
+Pejureel
+Petaxai
+Pideelus
+Pimaxi
+Pojeel
+Ra
+Radithax
+Raj
+Rareel
+Rasha
+Redieeus
+Ree
+Reeh
+Reemukeeus
+Reenum
+Reesa
+Reet
+Reezal
+Resari
+Riker
+Ru
+Rupah
+Sakeepa
+Sakeeus
+Sakka
+Saliith
+Sar
+Schiavas
+Seek
+Seewul
+Sei
+Sejaijilax
+Shakiis
+Shehs
+Shei
+Silm
+Skee
+Skeetul
+Sureeus
+Ta
+Taeed
+Tah
+Taleel
+Talen
+Tan
+Tanaka
+Tanan
+Tee
+Teeba
+Teegla
+Teeka
+Teekeeus
+Teemeeta
+Teeus
+Tehat
+Tei
+Teinaava
+Teineeja
+Terezeeus
+Tikaasi
+Tim
+Topeeth
+Topith
+Tsleeixth
+Tul
+Tulm
+Tun
+Ukatsei
+Ukawei
+Ula
+Ulawa
+Ullis
+Usha
+Usheeja
+Utadeek
+Utamukeeus
+Utatul
+Uxith
+Vara
+Veekas
+Veenaza
+Veezara
+Vistha
+Vudeelal
+Wanan
+Wanum
+Wayiteh
+Weebam
+Weeltul
+Weer
+Wih
+Wud
+Wuleen
+Wulm
+Wumeek
+Xal
+Xemo
+Yinz
+Yinz'r
+Zaw
+Ze
+Zeen
+Zeeus
Zish
\ No newline at end of file
diff --git a/strings/names/mime.txt b/strings/names/mime.txt
index 094987da9d..989cd6f300 100644
--- a/strings/names/mime.txt
+++ b/strings/names/mime.txt
@@ -1,32 +1,32 @@
-Church Mouse
-Hush Foot
-Invisible Man
-Lemon Mime
-Marcel
-Marcel Mime
-Master-Mime
-Mime
-Mr Beret
-Mr Mime
-Mr Mute
-Mute
-Omerta
-Oui Oui
-Pantomime
-Quiet
-Quiet Riot
-See Through
-Silence
-Silencio
-Silent Knight
-Silent Majority
-Silent Night
-Silent Sorrow
-Silent Step
-Silent Mouse
-The Unspeakable
-Transparency
-Unspeakable
-Untouchable
-Wall Runner
-White Face
+Church Mouse
+Hush Foot
+Invisible Man
+Lemon Mime
+Marcel
+Marcel Mime
+Master-Mime
+Mime
+Mr Beret
+Mr Mime
+Mr Mute
+Mute
+Omerta
+Oui Oui
+Pantomime
+Quiet
+Quiet Riot
+See Through
+Silence
+Silencio
+Silent Knight
+Silent Majority
+Silent Night
+Silent Sorrow
+Silent Step
+Silent Mouse
+The Unspeakable
+Transparency
+Unspeakable
+Untouchable
+Wall Runner
+White Face
diff --git a/strings/names/ninjaname.txt b/strings/names/ninjaname.txt
index fa0d0f1094..eb470493fa 100644
--- a/strings/names/ninjaname.txt
+++ b/strings/names/ninjaname.txt
@@ -1,44 +1,44 @@
-Aria
-Baki
-Blood
-Bro
-Cyrax
-Daemon
-Death
-Donatello
-Eater
-Ermac
-Fox
-Goemon
-Hanzo
-Hayabusa
-Hazuki
-Hero
-Hien
-Hiro
-Hiryu
-Iga
-Koga
-Leonardo
-McAwesome
-McNinja
-Michaelangelo
-Midnight
-Null
-Ogre
-Phantom
-Raiden
-Rain
-Raphael
-Ryu
-Saibot
-Samurai
-Sarutobi
-Scorpion
-Seven
-Shadow
-Shredder
-Smoke
-Splinter
-Throat
+Aria
+Baki
+Blood
+Bro
+Cyrax
+Daemon
+Death
+Donatello
+Eater
+Ermac
+Fox
+Goemon
+Hanzo
+Hayabusa
+Hazuki
+Hero
+Hien
+Hiro
+Hiryu
+Iga
+Koga
+Leonardo
+McAwesome
+McNinja
+Michaelangelo
+Midnight
+Null
+Ogre
+Phantom
+Raiden
+Rain
+Raphael
+Ryu
+Saibot
+Samurai
+Sarutobi
+Scorpion
+Seven
+Shadow
+Shredder
+Smoke
+Splinter
+Throat
Zero
\ No newline at end of file
diff --git a/strings/names/ninjatitle.txt b/strings/names/ninjatitle.txt
index 41c5b338ba..f9776f56fe 100644
--- a/strings/names/ninjatitle.txt
+++ b/strings/names/ninjatitle.txt
@@ -1,46 +1,46 @@
-Agile
-Assassin
-Awesome
-Black
-Crimson
-Cruel
-Deep
-Dr
-Dragon
-Ender
-Grandmaster
-Grappler
-Gray
-Hunter
-Initiate
-Killer
-Liquid
-Master
-Merciful
-Merciless
-Nickel
-Night
-Nightshade
-Ninja
-Noob
-Orphaner
-Quick
-Remorseless
-Rogue
-Sensei
-Shinobi
-Silencing
-Silent
-Silver
-Singing
-Slayer
-Snake
-Solid
-Solidus
-Stalker
-Steel
-Strider
-Striker
-Swift
-Ulimate
+Agile
+Assassin
+Awesome
+Black
+Crimson
+Cruel
+Deep
+Dr
+Dragon
+Ender
+Grandmaster
+Grappler
+Gray
+Hunter
+Initiate
+Killer
+Liquid
+Master
+Merciful
+Merciless
+Nickel
+Night
+Nightshade
+Ninja
+Noob
+Orphaner
+Quick
+Remorseless
+Rogue
+Sensei
+Shinobi
+Silencing
+Silent
+Silver
+Singing
+Slayer
+Snake
+Solid
+Solidus
+Stalker
+Steel
+Strider
+Striker
+Swift
+Ulimate
Widower
\ No newline at end of file
diff --git a/strings/names/plasmaman.txt b/strings/names/plasmaman.txt
index eb5f8b786c..8cbfc00837 100644
--- a/strings/names/plasmaman.txt
+++ b/strings/names/plasmaman.txt
@@ -1,118 +1,118 @@
-Actinium
-Aluminium
-Americium
-Antimony
-Argon
-Arsenic
-Astatine
-Barium
-Berkelium
-Beryllium
-Bismuth
-Bohrium
-Boron
-Bromine
-Cadmium
-Caesium
-Calcium
-Californium
-Carbon
-Cerium
-Chlorine
-Chromium
-Cobalt
-Copernicium
-Copper
-Curium
-Darmstadtium
-Dubnium
-Dysprosium
-Einsteinium
-Erbium
-Europium
-Fermium
-Flerovium
-Fluorine
-Francium
-Gadolinium
-Gallium
-Germanium
-Gold
-Hafnium
-Hassium
-Helium
-Holmium
-Hydrogen
-Indium
-Iodine
-Iridium
-Iron
-Krypton
-Lanthanum
-Lawrencium
-Lead
-Lithium
-Livermorium
-Lutetium
-Magnesium
-Manganese
-Meitnerium
-Mendelevium
-Mercury
-Molybdenum
-Moscovium
-Neodymium
-Neon
-Neptunium
-Nickel
-Nihonium
-Niobium
-Nitrogen
-Nobelium
-Oganesson
-Osmium
-Oxygen
-Palladium
-Phosphorus
-Platinum
-Plutonium
-Polonium
-Potassium
-Praseodymium
-Promethium
-Protactinium
-Radium
-Radon
-Rhenium
-Rhodium
-Roentgenium
-Rubidium
-Ruthenium
-Rutherfordium
-Samarium
-Scandium
-Seaborgium
-Selenium
-Silicon
-Silver
-Sodium
-Strontium
-Sulfur
-Tantalum
-Technetium
-Tellurium
-Tennessine
-Terbium
-Thallium
-Thorium
-Thulium
-Tin
-Titanium
-Tungsten
-Uranium
-Vanadium
-Xenon
-Ytterbium
-Yttrium
-Zinc
+Actinium
+Aluminium
+Americium
+Antimony
+Argon
+Arsenic
+Astatine
+Barium
+Berkelium
+Beryllium
+Bismuth
+Bohrium
+Boron
+Bromine
+Cadmium
+Caesium
+Calcium
+Californium
+Carbon
+Cerium
+Chlorine
+Chromium
+Cobalt
+Copernicium
+Copper
+Curium
+Darmstadtium
+Dubnium
+Dysprosium
+Einsteinium
+Erbium
+Europium
+Fermium
+Flerovium
+Fluorine
+Francium
+Gadolinium
+Gallium
+Germanium
+Gold
+Hafnium
+Hassium
+Helium
+Holmium
+Hydrogen
+Indium
+Iodine
+Iridium
+Iron
+Krypton
+Lanthanum
+Lawrencium
+Lead
+Lithium
+Livermorium
+Lutetium
+Magnesium
+Manganese
+Meitnerium
+Mendelevium
+Mercury
+Molybdenum
+Moscovium
+Neodymium
+Neon
+Neptunium
+Nickel
+Nihonium
+Niobium
+Nitrogen
+Nobelium
+Oganesson
+Osmium
+Oxygen
+Palladium
+Phosphorus
+Platinum
+Plutonium
+Polonium
+Potassium
+Praseodymium
+Promethium
+Protactinium
+Radium
+Radon
+Rhenium
+Rhodium
+Roentgenium
+Rubidium
+Ruthenium
+Rutherfordium
+Samarium
+Scandium
+Seaborgium
+Selenium
+Silicon
+Silver
+Sodium
+Strontium
+Sulfur
+Tantalum
+Technetium
+Tellurium
+Tennessine
+Terbium
+Thallium
+Thorium
+Thulium
+Tin
+Titanium
+Tungsten
+Uranium
+Vanadium
+Xenon
+Ytterbium
+Yttrium
+Zinc
Zirconium
\ No newline at end of file
diff --git a/strings/names/posibrain.txt b/strings/names/posibrain.txt
index 119632bd81..ed8a186fd4 100644
--- a/strings/names/posibrain.txt
+++ b/strings/names/posibrain.txt
@@ -1,47 +1,47 @@
-PBU
-HIU
-SINA
-ARMA
-OSI
-HBL
-MSO
-RR
-CHRI
-CDB
-HG
-XSI
-ORNG
-GUN
-KOR
-MET
-FRE
-XIS
-SLI
-PKP
-HOG
-RZH
-GOOF
-MRPR
-JJR
-FIRC
-INC
-PHL
-BGB
-ANTR
-MIW
-WJ
-JRD
-CHOC
-ANCL
-JLLO
-JNLG
-KOS
-TKRG
-XAL
-STLP
-CBOS
-DUNC
-FXMC
-DRSD
-COI
+PBU
+HIU
+SINA
+ARMA
+OSI
+HBL
+MSO
+RR
+CHRI
+CDB
+HG
+XSI
+ORNG
+GUN
+KOR
+MET
+FRE
+XIS
+SLI
+PKP
+HOG
+RZH
+GOOF
+MRPR
+JJR
+FIRC
+INC
+PHL
+BGB
+ANTR
+MIW
+WJ
+JRD
+CHOC
+ANCL
+JLLO
+JNLG
+KOS
+TKRG
+XAL
+STLP
+CBOS
+DUNC
+FXMC
+DRSD
+COI
CYBR
\ No newline at end of file
diff --git a/strings/names/verbs.txt b/strings/names/verbs.txt
index 17bc127fd5..fc90f89e40 100644
--- a/strings/names/verbs.txt
+++ b/strings/names/verbs.txt
@@ -1,632 +1,632 @@
-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
-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
+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/strings/names/wizardfirst.txt b/strings/names/wizardfirst.txt
index f1e9a10a58..13dc68c6bd 100644
--- a/strings/names/wizardfirst.txt
+++ b/strings/names/wizardfirst.txt
@@ -1,37 +1,37 @@
-Alatar
-Archchancellor
-Boccob
-Circe
-Dumbledor
-Elminister
-Gandalf
-Grimm
-Gulstaff
-Houdini
-Jim
-Kaschei
-Khelben
-Kreol
-Lina
-Merlin
-Mogan
-Mordenkainen
-Morgan
-Mystryl
-Nihilus
-Palando
-Prospero
-Radagast
-Raistlin
-Rasputin
-Rincewind
-Saruman
-Tenser
-Terefi
-Tzeentch
-Urza
-Vaarsuvius
-Vecna
-Yoda
-Zagyg
+Alatar
+Archchancellor
+Boccob
+Circe
+Dumbledor
+Elminister
+Gandalf
+Grimm
+Gulstaff
+Houdini
+Jim
+Kaschei
+Khelben
+Kreol
+Lina
+Merlin
+Mogan
+Mordenkainen
+Morgan
+Mystryl
+Nihilus
+Palando
+Prospero
+Radagast
+Raistlin
+Rasputin
+Rincewind
+Saruman
+Tenser
+Terefi
+Tzeentch
+Urza
+Vaarsuvius
+Vecna
+Yoda
+Zagyg
Zul
\ No newline at end of file
diff --git a/strings/names/wizardsecond.txt b/strings/names/wizardsecond.txt
index dd191cfa2b..6daff0f3e7 100644
--- a/strings/names/wizardsecond.txt
+++ b/strings/names/wizardsecond.txt
@@ -1,40 +1,40 @@
-Dark
-Darkmagic
-Darko
-Gray
-Honko
-Inverse
-le Fay
-of Void
-Shado
-Smith
-the All Knowing
-the Amazing
-the Bandit Killer
-the Benevolent
-the Blue
-the Brown
-the Conquerer
-the Deathless
-the Destroyer
-the Dragon Spooker
-the Emperor
-the Gray
-the Great
-the Magician
-the Powerful
-the Raven
-the Red
-the Remorseful
-the Seething
-the Sorcelator
-the Spiral King
-the Unending
-the Unstoppable
-the Weeping
-the White
-the Wise
-the Wizzard
-Unseen
-Weatherwax
+Dark
+Darkmagic
+Darko
+Gray
+Honko
+Inverse
+le Fay
+of Void
+Shado
+Smith
+the All Knowing
+the Amazing
+the Bandit Killer
+the Benevolent
+the Blue
+the Brown
+the Conquerer
+the Deathless
+the Destroyer
+the Dragon Spooker
+the Emperor
+the Gray
+the Great
+the Magician
+the Powerful
+the Raven
+the Red
+the Remorseful
+the Seething
+the Sorcelator
+the Spiral King
+the Unending
+the Unstoppable
+the Weeping
+the White
+the Wise
+the Wizzard
+Unseen
+Weatherwax
Yagg
\ No newline at end of file
diff --git a/strings/sillytips.txt b/strings/sillytips.txt
index e6710de95e..8e28284534 100644
--- a/strings/sillytips.txt
+++ b/strings/sillytips.txt
@@ -23,7 +23,6 @@ Plenty of things that aren't traditionally considered weapons can still be used
DEATH IS IMMINENT!
This game is older than most of the people playing it.
Do not go gentle into that good night.
-Flashbangs can weaken blob tiles, allowing for you and the crew to easily destroy them.
Just the tip?
You can grab someone by clicking on them with the grab intent, then upgrade the grab by clicking on them once more. An aggressive grab will momentarily stun someone, allow you to place Mekhi on a table by clicking on it, or throw them by toggling on throwing.
Some people are unable to read text on a game where half of it is based on text.
@@ -42,8 +41,7 @@ Mhelp is basically useless, and never used correctly. Being a Mentor just means
Toxins Bombs are not the only way to get RnD points. However, nobody will ever do any other method to get sci points...
Plasma men are a powerful race with many perks! No really, I swear! So what if they need an "ERP Plasma room" to fuck, who cares!
As a Cargo Tech make sure to always buy a tesla to sell back to CC. They love those those. Trust me!
-Help.
-Maints.
+;HELP MAINT
Admins always regret meme options in their polls.
Putting cat ears on securitrons makes them table people and nya. Mekhi isn't a cat, but he still goes on the table, just roll with it.
As a Changeling, you can live without a head as they are merely vestigal to you, now, finally, you can be a Dullahan without it being Halloween.
diff --git a/strings/tips.txt b/strings/tips.txt
index 2039b30359..5336f767a5 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -237,7 +237,7 @@ As a Changeling, you can absorb someone by strangling them and using the Absorb
As a Changeling, absorbing someone will give you their full memory. This can include things such as a Traitor's uplink, thus absorbing one will allow you to access the Traitor uplink and buy toys for your Changeling self to abuse.
As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits.
As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you.
-As a Changeling, death is not the end for you! You can revive after two minutes from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up.
+As a Changeling, death is not the end for you! You can revive after 40 seconds from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up.
As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person.
As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win.
As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face.
@@ -300,4 +300,4 @@ Laser pointers can be upgraded by replacing its micro laser with a better one fr
Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting.
Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode.
You do not regenerate as much stamina while in combat mode. Resting (being on the ground) makes you regenerate stamina faster.
-Remember to be in combat mode while in combat, as otherwise you will be penalized by taking more incoming damage and dealing less damage to your adversary.
+Keybinds can be reassigned in character setup on the keybindings tab. This is extremely useful, especially if you know how to use independent binds.
diff --git a/tgstation.dme b/tgstation.dme
index aa4ac989bb..52cdba5c14 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -298,6 +298,7 @@
#include "code\controllers\configuration\entries\plushies.dm"
#include "code\controllers\configuration\entries\policy.dm"
#include "code\controllers\configuration\entries\resources.dm"
+#include "code\controllers\configuration\entries\respawns.dm"
#include "code\controllers\configuration\entries\stamina_combat.dm"
#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\adjacent_air.dm"
@@ -2455,6 +2456,7 @@
#include "code\modules\mob\dead\observer\observer.dm"
#include "code\modules\mob\dead\observer\observer_movement.dm"
#include "code\modules\mob\dead\observer\orbit.dm"
+#include "code\modules\mob\dead\observer\respawn.dm"
#include "code\modules\mob\dead\observer\say.dm"
#include "code\modules\mob\living\blood.dm"
#include "code\modules\mob\living\bloodcrawl.dm"
@@ -2472,6 +2474,7 @@
#include "code\modules\mob\living\living_defines.dm"
#include "code\modules\mob\living\living_mobility.dm"
#include "code\modules\mob\living\living_movement.dm"
+#include "code\modules\mob\living\living_signals.dm"
#include "code\modules\mob\living\living_sprint.dm"
#include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm"
diff --git a/tools/CreditsTool/remappings.txt b/tools/CreditsTool/remappings.txt
index ac57d4b873..18abb0a772 100644
--- a/tools/CreditsTool/remappings.txt
+++ b/tools/CreditsTool/remappings.txt
@@ -1,20 +1,20 @@
-# To make your name something other than your github name type it in the format "
-# e.g.
-# Cyberboss Jordan Brown
-# To suppress your name from appearing in the credits do " __REMOVE__
-# e.g.
-# Cyberboss __REMOVE__
-
-tgstation-server Thanks for playing!
-
-optimumtact oranges
-qustinnus Floyd / Qustinnus
-catalystfd __REMOVE__
-TheVekter Vekter
-ChangelingRain Joan
-NewSta1 NewSta
-theOperand Miauw
-PraiseRatvar Frozenguy5
-FuryMcFlurry Fury McFlurry
-vuonojenmustaturska Naksu
-praisenarsie Frozenguy5
+# To make your name something other than your github name type it in the format "
+# e.g.
+# Cyberboss Jordan Brown
+# To suppress your name from appearing in the credits do " __REMOVE__
+# e.g.
+# Cyberboss __REMOVE__
+
+tgstation-server Thanks for playing!
+
+optimumtact oranges
+qustinnus Floyd / Qustinnus
+catalystfd __REMOVE__
+TheVekter Vekter
+ChangelingRain Joan
+NewSta1 NewSta
+theOperand Miauw
+PraiseRatvar Frozenguy5
+FuryMcFlurry Fury McFlurry
+vuonojenmustaturska Naksu
+praisenarsie Frozenguy5
diff --git a/tools/Runtime Condenser/Main.cpp b/tools/Runtime Condenser/Main.cpp
index 0161bb47a9..239ded0add 100644
--- a/tools/Runtime Condenser/Main.cpp
+++ b/tools/Runtime Condenser/Main.cpp
@@ -1,418 +1,418 @@
-/* Runtime Condenser by Nodrak
- * Cleaned up and refactored by MrStonedOne
- * This will sum up identical runtimes into one, giving a total of how many times it occured. The first occurance
- * of the runtime will log the source, usr and src, the rest will just add to the total. Infinite loops will
- * also be caught and displayed (if any) above the list of runtimes.
- *
- * How to use:
- * 1) Copy and paste your list of runtimes from Dream Daemon into input.exe
- * 2) Run RuntimeCondenser.exe
- * 3) Open output.txt for a condensed report of the runtimes
- *
- * How to compile:
- * Requires visual c++ compiler 2012 or any linux compiler with c++11 support.
- * Windows:
- * Normal: cl.exe /EHsc /Ox /Qpar Main.cpp
- * Debug: cl.exe /EHsc /Zi Main.cpp
- * Linux:
- * Normal: g++ -O3 -std=c++11 Main.cpp -o rc
- * Debug: g++ -g -Og -std=c++11 Main.cpp -o rc
- * Any Compile errors most likely indicate lack of c++11 support. Google how to upgrade or nag coderbus for help..
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-
-#define PROGRESS_FPS 10
-#define PROGRESS_BAR_INNER_WIDTH 50
-#define LINEBUFFER (32*1024) //32KiB
-
-using namespace std;
-
-struct runtime {
- string text;
- string proc;
- string source;
- string usr;
- string src;
- string loc;
- unsigned int count;
-};
-struct harddel {
- string type;
- unsigned int count;
-};
-//What we use to read input
-string * lastLine = new string();
-string * currentLine = new string();
-string * nextLine = new string();
-
-//Stores lines we want to keep to print out
-unordered_map storedRuntime;
-unordered_map storedInfiniteLoop;
-unordered_map storedHardDel;
-
-//Stat tracking stuff for output
-unsigned int totalRuntimes = 0;
-unsigned int totalInfiniteLoops = 0;
-unsigned int totalHardDels = 0;
-
-
-bool endofbuffer = false;
-//like substr, but returns an empty string if the string is smaller then start, rather then an exception.
-inline string safe_substr(string * S, size_t start = 0, size_t end = string::npos) {
- if (start > S->length())
- start = S->length();
- return S->substr(start, end);
-}
-//getline() is slow as fucking balls. this is quicker because we prefill a buffer rather then read 1 byte at a time searching for newlines, lowering on i/o calls and overhead. (110MB/s vs 40MB/s on a 1.8GB file pre-filled into the disk cache)
-//if i wanted to make it even faster, I'd use a reading thread, a new line searching thread, another thread or four for searching for runtimes in the list to see if they are unique, and finally the main thread for displaying the progress bar. but fuck that noise.
-inline string * readline(FILE * f) {
- static char buf[LINEBUFFER];
- static size_t pos = 0;
- static size_t size = 0;
-
- for (size_t i = pos; i < LINEBUFFER; i++) {
- char c = buf[i];
- if (i >= size && (pos || i < LINEBUFFER-1)) {
- if (feof(f) || ferror(f))
- break;
- if (size && pos) { //move current stuff to start of buffer
- size -= pos;
- i -= pos;
- memmove(buf, &buf[pos], size);
- }
- //fill remaining buffer
- size += fread(&buf[i], 1, LINEBUFFER-size-1, f);
- pos = 0;
- c = buf[i];
- }
- if (c == '\n') {
- //trim off any newlines from the start
- while (i > pos && (buf[pos] == '\r' || buf[pos] == '\n'))
- pos++;
- string * s = new string(&buf[pos], i-pos);
- pos = i+1;
- return s;
- }
-
- }
- string * s = new string(&buf[pos], size-pos);
- pos = 0;
- size = 0;
- endofbuffer = true;
- return s;
-}
-
-inline void forward_progress(FILE * inputFile) {
- delete(lastLine);
- lastLine = currentLine;
- currentLine = nextLine;
- nextLine = readline(inputFile);
- //strip out any timestamps.
- if (nextLine->length() >= 10) {
- if ((*nextLine)[0] == '[' && (*nextLine)[3] == ':' && (*nextLine)[6] == ':' && (*nextLine)[9] == ']')
- nextLine->erase(0, 10);
- else if (nextLine->length() >= 26 && ((*nextLine)[0] == '[' && (*nextLine)[5] == '-' && (*nextLine)[14] == ':' && (*nextLine)[20] == '.' && (*nextLine)[24] == ']'))
- nextLine->erase(0, 26);
- }
-}
-//deallocates to, copys from to to.
-inline void string_send(string * &from, string * &to) {
- delete(to);
- to = new string(*from);
-}
-inline void printprogressbar(unsigned short progress /*as percent*/) {
- double const modifer = 100.0L/(double)PROGRESS_BAR_INNER_WIDTH;
- size_t bars = (double)progress/modifer;
- cerr << "\r[" << string(bars, '=') << ((progress < 100) ? ">" : "") << string(PROGRESS_BAR_INNER_WIDTH-(bars+((progress < 100) ? 1 : 0)), ' ') << "] " << progress << "%";
- cerr.flush();
-}
-
-bool readFromFile(bool isstdin) {
- //Open file to read
- FILE * inputFile = stdin;
- if (!isstdin)
- inputFile = fopen("Input.txt", "r");
-
- if (ferror(inputFile))
- return false;
- long long fileLength = 0;
- clock_t nextupdate = 0;
- if (!isstdin) {
- fseek(inputFile, 0, SEEK_END);
- fileLength = ftell(inputFile);
- fseek(inputFile, 0, SEEK_SET);
- nextupdate = clock();
- }
-
- if (feof(inputFile))
- return false; //empty file
- do {
- //Update our lines
- forward_progress(inputFile);
- //progress bar
-
- if (!isstdin && clock() >= nextupdate) {
- int dProgress = (int)(((long double)ftell(inputFile) / (long double)fileLength) * 100.0L);
- printprogressbar(dProgress);
- nextupdate = clock() + (CLOCKS_PER_SEC/PROGRESS_FPS);
- }
- //Found a runtime!
- if (safe_substr(currentLine, 0, 14) == "runtime error:") {
- if (currentLine->length() <= 17) { //empty runtime, check next line.
- //runtime is on the line before this one. (byond bug)
- if (nextLine->length() < 2) {
- string_send(lastLine, nextLine);
- }
- forward_progress(inputFile);
- string * tmp = new string("runtime error: " + *currentLine);
- string_send(tmp, currentLine);
- delete(tmp);
- }
- //we assign this to the right container in a moment.
- unordered_map * storage_container;
-
- //runtime is actually an infinite loop
- if (safe_substr(currentLine, 15, 23) == "Infinite loop suspected" || safe_substr(currentLine, 15, 31) == "Maximum recursion level reached") {
- //use our infinite loop container.
- storage_container = &storedInfiniteLoop;
- totalInfiniteLoops++;
- // skip the line about world.loop_checks
- forward_progress(inputFile);
- string_send(lastLine, currentLine);
- } else {
- //use the runtime container
- storage_container = &storedRuntime;
- totalRuntimes++;
- }
-
- string key = *currentLine;
- bool procfound = false; //so other things don't have to bother checking for this again.
- if (safe_substr(nextLine, 0, 10) == "proc name:") {
- key += *nextLine;
- procfound = true;
- }
-
- //(get the address of a runtime from (a pointer to a container of runtimes)) to then store in a pointer to a runtime.
- //(and who said pointers were hard.)
- runtime* R = &((*storage_container)[key]);
-
- //new
- if (R->text != *currentLine) {
- R->text = *currentLine;
- if (procfound) {
- R->proc = *nextLine;
- forward_progress(inputFile);
- }
- R->count = 1;
-
- //search for source file info
- if (safe_substr(nextLine, 2, 12) == "source file:") {
- R->source = *nextLine;
- //skip again
- forward_progress(inputFile);
- }
- //If we find this, we have new stuff to store
- if (safe_substr(nextLine, 2, 4) == "usr:") {
- forward_progress(inputFile);
- forward_progress(inputFile);
- //Store more info
- R->usr = *lastLine;
- R->src = *currentLine;
- if (safe_substr(nextLine, 2, 8) == "src.loc:") {
- R->loc = *nextLine;
- forward_progress(inputFile);
- }
- }
-
- } else { //existed already
- R->count++;
- if (procfound)
- forward_progress(inputFile);
- }
-
- } else if (safe_substr(currentLine, 0, 7) == "Path : ") {
- string deltype = safe_substr(currentLine, 7);
- if (deltype.substr(deltype.size()-1,1) == " ") //some times they have a single trailing space.
- deltype = deltype.substr(0, deltype.size()-1);
-
- unsigned int failures = strtoul(safe_substr(nextLine, 11).c_str(), NULL, 10);
- if (failures <= 0)
- continue;
-
- totalHardDels += failures;
- harddel* D = &storedHardDel[deltype];
- if (D->type != deltype) {
- D->type = deltype;
- D->count = failures;
- } else {
- D->count += failures;
- }
- }
- } while (!feof(inputFile) || !endofbuffer); //Until end of file
- if (!isstdin)
- printprogressbar(100);
- cerr << endl;
- return true;
-}
-
-bool runtimeComp(const runtime &a, const runtime &b) {
- return a.count > b.count;
-}
-
-bool hardDelComp(const harddel &a, const harddel &b) {
- return a.count > b.count;
-}
-
-bool writeToFile(bool usestdio) {
- //Open and clear the file
- ostream * output = &cout;
- ofstream * outputFile;
- if (!usestdio)
- output = outputFile = new ofstream("Output.txt", ios::trunc);
-
-
- if(usestdio || outputFile->is_open()) {
- *output << "Note: The source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.\n\n";
- if(storedInfiniteLoop.size() > 0)
- *output << "Total unique infinite loops: " << storedInfiniteLoop.size() << endl;
-
- if(totalInfiniteLoops > 0)
- *output << "Total infinite loops: " << totalInfiniteLoops << endl << endl;
-
- *output << "Total unique runtimes: " << storedRuntime.size() << endl;
- *output << "Total runtimes: " << totalRuntimes << endl << endl;
- if(storedHardDel.size() > 0)
- *output << "Total unique hard deletions: " << storedHardDel.size() << endl;
-
- if(totalHardDels > 0)
- *output << "Total hard deletions: " << totalHardDels << endl << endl;
-
-
- //If we have infinite loops, display them first.
- if(storedInfiniteLoop.size() > 0) {
- vector infiniteLoops;
- infiniteLoops.reserve(storedInfiniteLoop.size());
- for (unordered_map::iterator it=storedInfiniteLoop.begin(); it != storedInfiniteLoop.end(); it++)
- infiniteLoops.push_back(it->second);
- storedInfiniteLoop.clear();
- sort(infiniteLoops.begin(), infiniteLoops.end(), runtimeComp);
- *output << "** Infinite loops **";
- for (int i=0; i < infiniteLoops.size(); i++) {
- runtime* R = &infiniteLoops[i];
- *output << endl << endl << "The following infinite loop has occurred " << R->count << " time(s).\n";
- *output << R->text << endl;
- if(R->proc.length())
- *output << R->proc << endl;
- if(R->source.length())
- *output << R->source << endl;
- if(R->usr.length())
- *output << R->usr << endl;
- if(R->src.length())
- *output << R->src << endl;
- if(R->loc.length())
- *output << R->loc << endl;
- }
- *output << endl << endl; //For spacing
- }
-
-
- //Do runtimes next
- *output << "** Runtimes **";
- vector runtimes;
- runtimes.reserve(storedRuntime.size());
- for (unordered_map::iterator it=storedRuntime.begin(); it != storedRuntime.end(); it++)
- runtimes.push_back(it->second);
- storedRuntime.clear();
- sort(runtimes.begin(), runtimes.end(), runtimeComp);
- for (int i=0; i < runtimes.size(); i++) {
- runtime* R = &runtimes[i];
- *output << endl << endl << "The following runtime has occurred " << R->count << " time(s).\n";
- *output << R->text << endl;
- if(R->proc.length())
- *output << R->proc << endl;
- if(R->source.length())
- *output << R->source << endl;
- if(R->usr.length())
- *output << R->usr << endl;
- if(R->src.length())
- *output << R->src << endl;
- if(R->loc.length())
- *output << R->loc << endl;
- }
- *output << endl << endl; //For spacing
-
- //and finally, hard deletes
- if(totalHardDels > 0) {
- *output << endl << "** Hard deletions **";
- vector hardDels;
- hardDels.reserve(storedHardDel.size());
- for (unordered_map::iterator it=storedHardDel.begin(); it != storedHardDel.end(); it++)
- hardDels.push_back(it->second);
- storedHardDel.clear();
- sort(hardDels.begin(), hardDels.end(), hardDelComp);
- for(int i=0; i < hardDels.size(); i++) {
- harddel* D = &hardDels[i];
- *output << endl << D->type << " - " << D->count << " time(s).\n";
- }
- }
- if (!usestdio) {
- outputFile->close();
- delete outputFile;
- }
- } else {
- return false;
- }
- return true;
-}
-
-int main(int argc, const char * argv[]) {
- ios_base::sync_with_stdio(false);
- ios::sync_with_stdio(false);
- bool usestdio = false;
- if (argc >= 2 && !strcmp(argv[1], "-s"))
- usestdio = true;
-
- char exit; //Used to stop the program from immediately exiting
- cerr << "Reading input.\n";
- if(readFromFile(usestdio)) {
- cerr << "Input read successfully!\n";
- } else {
- cerr << "Input failed to open, shutting down.\n";
- if (!usestdio) {
- cerr << "\nEnter any letter to quit.\n";
- exit = cin.get();
- }
- return 1;
- }
-
-
- cerr << "Writing output.\n";
- if(writeToFile(usestdio)) {
- cerr << "Output was successful!\n";
- if (!usestdio) {
- cerr << "\nEnter any letter to quit.\n";
- exit = cin.get();
- }
- return 0;
- } else {
- cerr << "The output file could not be opened, shutting down.\n";
- if (!usestdio) {
- cerr << "\nEnter any letter to quit.\n";
- exit = cin.get();
- }
- return 1;
- }
-
- return 0;
-}
+/* Runtime Condenser by Nodrak
+ * Cleaned up and refactored by MrStonedOne
+ * This will sum up identical runtimes into one, giving a total of how many times it occured. The first occurance
+ * of the runtime will log the source, usr and src, the rest will just add to the total. Infinite loops will
+ * also be caught and displayed (if any) above the list of runtimes.
+ *
+ * How to use:
+ * 1) Copy and paste your list of runtimes from Dream Daemon into input.exe
+ * 2) Run RuntimeCondenser.exe
+ * 3) Open output.txt for a condensed report of the runtimes
+ *
+ * How to compile:
+ * Requires visual c++ compiler 2012 or any linux compiler with c++11 support.
+ * Windows:
+ * Normal: cl.exe /EHsc /Ox /Qpar Main.cpp
+ * Debug: cl.exe /EHsc /Zi Main.cpp
+ * Linux:
+ * Normal: g++ -O3 -std=c++11 Main.cpp -o rc
+ * Debug: g++ -g -Og -std=c++11 Main.cpp -o rc
+ * Any Compile errors most likely indicate lack of c++11 support. Google how to upgrade or nag coderbus for help..
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+#define PROGRESS_FPS 10
+#define PROGRESS_BAR_INNER_WIDTH 50
+#define LINEBUFFER (32*1024) //32KiB
+
+using namespace std;
+
+struct runtime {
+ string text;
+ string proc;
+ string source;
+ string usr;
+ string src;
+ string loc;
+ unsigned int count;
+};
+struct harddel {
+ string type;
+ unsigned int count;
+};
+//What we use to read input
+string * lastLine = new string();
+string * currentLine = new string();
+string * nextLine = new string();
+
+//Stores lines we want to keep to print out
+unordered_map storedRuntime;
+unordered_map storedInfiniteLoop;
+unordered_map storedHardDel;
+
+//Stat tracking stuff for output
+unsigned int totalRuntimes = 0;
+unsigned int totalInfiniteLoops = 0;
+unsigned int totalHardDels = 0;
+
+
+bool endofbuffer = false;
+//like substr, but returns an empty string if the string is smaller then start, rather then an exception.
+inline string safe_substr(string * S, size_t start = 0, size_t end = string::npos) {
+ if (start > S->length())
+ start = S->length();
+ return S->substr(start, end);
+}
+//getline() is slow as fucking balls. this is quicker because we prefill a buffer rather then read 1 byte at a time searching for newlines, lowering on i/o calls and overhead. (110MB/s vs 40MB/s on a 1.8GB file pre-filled into the disk cache)
+//if i wanted to make it even faster, I'd use a reading thread, a new line searching thread, another thread or four for searching for runtimes in the list to see if they are unique, and finally the main thread for displaying the progress bar. but fuck that noise.
+inline string * readline(FILE * f) {
+ static char buf[LINEBUFFER];
+ static size_t pos = 0;
+ static size_t size = 0;
+
+ for (size_t i = pos; i < LINEBUFFER; i++) {
+ char c = buf[i];
+ if (i >= size && (pos || i < LINEBUFFER-1)) {
+ if (feof(f) || ferror(f))
+ break;
+ if (size && pos) { //move current stuff to start of buffer
+ size -= pos;
+ i -= pos;
+ memmove(buf, &buf[pos], size);
+ }
+ //fill remaining buffer
+ size += fread(&buf[i], 1, LINEBUFFER-size-1, f);
+ pos = 0;
+ c = buf[i];
+ }
+ if (c == '\n') {
+ //trim off any newlines from the start
+ while (i > pos && (buf[pos] == '\r' || buf[pos] == '\n'))
+ pos++;
+ string * s = new string(&buf[pos], i-pos);
+ pos = i+1;
+ return s;
+ }
+
+ }
+ string * s = new string(&buf[pos], size-pos);
+ pos = 0;
+ size = 0;
+ endofbuffer = true;
+ return s;
+}
+
+inline void forward_progress(FILE * inputFile) {
+ delete(lastLine);
+ lastLine = currentLine;
+ currentLine = nextLine;
+ nextLine = readline(inputFile);
+ //strip out any timestamps.
+ if (nextLine->length() >= 10) {
+ if ((*nextLine)[0] == '[' && (*nextLine)[3] == ':' && (*nextLine)[6] == ':' && (*nextLine)[9] == ']')
+ nextLine->erase(0, 10);
+ else if (nextLine->length() >= 26 && ((*nextLine)[0] == '[' && (*nextLine)[5] == '-' && (*nextLine)[14] == ':' && (*nextLine)[20] == '.' && (*nextLine)[24] == ']'))
+ nextLine->erase(0, 26);
+ }
+}
+//deallocates to, copys from to to.
+inline void string_send(string * &from, string * &to) {
+ delete(to);
+ to = new string(*from);
+}
+inline void printprogressbar(unsigned short progress /*as percent*/) {
+ double const modifer = 100.0L/(double)PROGRESS_BAR_INNER_WIDTH;
+ size_t bars = (double)progress/modifer;
+ cerr << "\r[" << string(bars, '=') << ((progress < 100) ? ">" : "") << string(PROGRESS_BAR_INNER_WIDTH-(bars+((progress < 100) ? 1 : 0)), ' ') << "] " << progress << "%";
+ cerr.flush();
+}
+
+bool readFromFile(bool isstdin) {
+ //Open file to read
+ FILE * inputFile = stdin;
+ if (!isstdin)
+ inputFile = fopen("Input.txt", "r");
+
+ if (ferror(inputFile))
+ return false;
+ long long fileLength = 0;
+ clock_t nextupdate = 0;
+ if (!isstdin) {
+ fseek(inputFile, 0, SEEK_END);
+ fileLength = ftell(inputFile);
+ fseek(inputFile, 0, SEEK_SET);
+ nextupdate = clock();
+ }
+
+ if (feof(inputFile))
+ return false; //empty file
+ do {
+ //Update our lines
+ forward_progress(inputFile);
+ //progress bar
+
+ if (!isstdin && clock() >= nextupdate) {
+ int dProgress = (int)(((long double)ftell(inputFile) / (long double)fileLength) * 100.0L);
+ printprogressbar(dProgress);
+ nextupdate = clock() + (CLOCKS_PER_SEC/PROGRESS_FPS);
+ }
+ //Found a runtime!
+ if (safe_substr(currentLine, 0, 14) == "runtime error:") {
+ if (currentLine->length() <= 17) { //empty runtime, check next line.
+ //runtime is on the line before this one. (byond bug)
+ if (nextLine->length() < 2) {
+ string_send(lastLine, nextLine);
+ }
+ forward_progress(inputFile);
+ string * tmp = new string("runtime error: " + *currentLine);
+ string_send(tmp, currentLine);
+ delete(tmp);
+ }
+ //we assign this to the right container in a moment.
+ unordered_map * storage_container;
+
+ //runtime is actually an infinite loop
+ if (safe_substr(currentLine, 15, 23) == "Infinite loop suspected" || safe_substr(currentLine, 15, 31) == "Maximum recursion level reached") {
+ //use our infinite loop container.
+ storage_container = &storedInfiniteLoop;
+ totalInfiniteLoops++;
+ // skip the line about world.loop_checks
+ forward_progress(inputFile);
+ string_send(lastLine, currentLine);
+ } else {
+ //use the runtime container
+ storage_container = &storedRuntime;
+ totalRuntimes++;
+ }
+
+ string key = *currentLine;
+ bool procfound = false; //so other things don't have to bother checking for this again.
+ if (safe_substr(nextLine, 0, 10) == "proc name:") {
+ key += *nextLine;
+ procfound = true;
+ }
+
+ //(get the address of a runtime from (a pointer to a container of runtimes)) to then store in a pointer to a runtime.
+ //(and who said pointers were hard.)
+ runtime* R = &((*storage_container)[key]);
+
+ //new
+ if (R->text != *currentLine) {
+ R->text = *currentLine;
+ if (procfound) {
+ R->proc = *nextLine;
+ forward_progress(inputFile);
+ }
+ R->count = 1;
+
+ //search for source file info
+ if (safe_substr(nextLine, 2, 12) == "source file:") {
+ R->source = *nextLine;
+ //skip again
+ forward_progress(inputFile);
+ }
+ //If we find this, we have new stuff to store
+ if (safe_substr(nextLine, 2, 4) == "usr:") {
+ forward_progress(inputFile);
+ forward_progress(inputFile);
+ //Store more info
+ R->usr = *lastLine;
+ R->src = *currentLine;
+ if (safe_substr(nextLine, 2, 8) == "src.loc:") {
+ R->loc = *nextLine;
+ forward_progress(inputFile);
+ }
+ }
+
+ } else { //existed already
+ R->count++;
+ if (procfound)
+ forward_progress(inputFile);
+ }
+
+ } else if (safe_substr(currentLine, 0, 7) == "Path : ") {
+ string deltype = safe_substr(currentLine, 7);
+ if (deltype.substr(deltype.size()-1,1) == " ") //some times they have a single trailing space.
+ deltype = deltype.substr(0, deltype.size()-1);
+
+ unsigned int failures = strtoul(safe_substr(nextLine, 11).c_str(), NULL, 10);
+ if (failures <= 0)
+ continue;
+
+ totalHardDels += failures;
+ harddel* D = &storedHardDel[deltype];
+ if (D->type != deltype) {
+ D->type = deltype;
+ D->count = failures;
+ } else {
+ D->count += failures;
+ }
+ }
+ } while (!feof(inputFile) || !endofbuffer); //Until end of file
+ if (!isstdin)
+ printprogressbar(100);
+ cerr << endl;
+ return true;
+}
+
+bool runtimeComp(const runtime &a, const runtime &b) {
+ return a.count > b.count;
+}
+
+bool hardDelComp(const harddel &a, const harddel &b) {
+ return a.count > b.count;
+}
+
+bool writeToFile(bool usestdio) {
+ //Open and clear the file
+ ostream * output = &cout;
+ ofstream * outputFile;
+ if (!usestdio)
+ output = outputFile = new ofstream("Output.txt", ios::trunc);
+
+
+ if(usestdio || outputFile->is_open()) {
+ *output << "Note: The source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.\n\n";
+ if(storedInfiniteLoop.size() > 0)
+ *output << "Total unique infinite loops: " << storedInfiniteLoop.size() << endl;
+
+ if(totalInfiniteLoops > 0)
+ *output << "Total infinite loops: " << totalInfiniteLoops << endl << endl;
+
+ *output << "Total unique runtimes: " << storedRuntime.size() << endl;
+ *output << "Total runtimes: " << totalRuntimes << endl << endl;
+ if(storedHardDel.size() > 0)
+ *output << "Total unique hard deletions: " << storedHardDel.size() << endl;
+
+ if(totalHardDels > 0)
+ *output << "Total hard deletions: " << totalHardDels << endl << endl;
+
+
+ //If we have infinite loops, display them first.
+ if(storedInfiniteLoop.size() > 0) {
+ vector infiniteLoops;
+ infiniteLoops.reserve(storedInfiniteLoop.size());
+ for (unordered_map::iterator it=storedInfiniteLoop.begin(); it != storedInfiniteLoop.end(); it++)
+ infiniteLoops.push_back(it->second);
+ storedInfiniteLoop.clear();
+ sort(infiniteLoops.begin(), infiniteLoops.end(), runtimeComp);
+ *output << "** Infinite loops **";
+ for (int i=0; i < infiniteLoops.size(); i++) {
+ runtime* R = &infiniteLoops[i];
+ *output << endl << endl << "The following infinite loop has occurred " << R->count << " time(s).\n";
+ *output << R->text << endl;
+ if(R->proc.length())
+ *output << R->proc << endl;
+ if(R->source.length())
+ *output << R->source << endl;
+ if(R->usr.length())
+ *output << R->usr << endl;
+ if(R->src.length())
+ *output << R->src << endl;
+ if(R->loc.length())
+ *output << R->loc << endl;
+ }
+ *output << endl << endl; //For spacing
+ }
+
+
+ //Do runtimes next
+ *output << "** Runtimes **";
+ vector runtimes;
+ runtimes.reserve(storedRuntime.size());
+ for (unordered_map::iterator it=storedRuntime.begin(); it != storedRuntime.end(); it++)
+ runtimes.push_back(it->second);
+ storedRuntime.clear();
+ sort(runtimes.begin(), runtimes.end(), runtimeComp);
+ for (int i=0; i < runtimes.size(); i++) {
+ runtime* R = &runtimes[i];
+ *output << endl << endl << "The following runtime has occurred " << R->count << " time(s).\n";
+ *output << R->text << endl;
+ if(R->proc.length())
+ *output << R->proc << endl;
+ if(R->source.length())
+ *output << R->source << endl;
+ if(R->usr.length())
+ *output << R->usr << endl;
+ if(R->src.length())
+ *output << R->src << endl;
+ if(R->loc.length())
+ *output << R->loc << endl;
+ }
+ *output << endl << endl; //For spacing
+
+ //and finally, hard deletes
+ if(totalHardDels > 0) {
+ *output << endl << "** Hard deletions **";
+ vector hardDels;
+ hardDels.reserve(storedHardDel.size());
+ for (unordered_map::iterator it=storedHardDel.begin(); it != storedHardDel.end(); it++)
+ hardDels.push_back(it->second);
+ storedHardDel.clear();
+ sort(hardDels.begin(), hardDels.end(), hardDelComp);
+ for(int i=0; i < hardDels.size(); i++) {
+ harddel* D = &hardDels[i];
+ *output << endl << D->type << " - " << D->count << " time(s).\n";
+ }
+ }
+ if (!usestdio) {
+ outputFile->close();
+ delete outputFile;
+ }
+ } else {
+ return false;
+ }
+ return true;
+}
+
+int main(int argc, const char * argv[]) {
+ ios_base::sync_with_stdio(false);
+ ios::sync_with_stdio(false);
+ bool usestdio = false;
+ if (argc >= 2 && !strcmp(argv[1], "-s"))
+ usestdio = true;
+
+ char exit; //Used to stop the program from immediately exiting
+ cerr << "Reading input.\n";
+ if(readFromFile(usestdio)) {
+ cerr << "Input read successfully!\n";
+ } else {
+ cerr << "Input failed to open, shutting down.\n";
+ if (!usestdio) {
+ cerr << "\nEnter any letter to quit.\n";
+ exit = cin.get();
+ }
+ return 1;
+ }
+
+
+ cerr << "Writing output.\n";
+ if(writeToFile(usestdio)) {
+ cerr << "Output was successful!\n";
+ if (!usestdio) {
+ cerr << "\nEnter any letter to quit.\n";
+ exit = cin.get();
+ }
+ return 0;
+ } else {
+ cerr << "The output file could not be opened, shutting down.\n";
+ if (!usestdio) {
+ cerr << "\nEnter any letter to quit.\n";
+ exit = cin.get();
+ }
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/tools/UnstandardnessTestForDM/readme.txt b/tools/UnstandardnessTestForDM/readme.txt
index 3fb04ee4df..8d3c5168dc 100644
--- a/tools/UnstandardnessTestForDM/readme.txt
+++ b/tools/UnstandardnessTestForDM/readme.txt
@@ -1,4 +1,4 @@
-the compiled exe file for the Unstandardness text for DM program is in:
-UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe
-
-You have to move it to the root folder (where the dme file is) and run it from there for it to work.
+the compiled exe file for the Unstandardness text for DM program is in:
+UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe
+
+You have to move it to the root folder (where the dme file is) and run it from there for it to work.
diff --git a/tools/WebhookProcessor/secret.php b/tools/WebhookProcessor/secret.php
index 9b8a27d490..9d1dc5a903 100644
--- a/tools/WebhookProcessor/secret.php
+++ b/tools/WebhookProcessor/secret.php
@@ -1,133 +1,133 @@
-