This commit is contained in:
silicons
2020-12-20 18:55:45 -07:00
parent 8a3ac13be2
commit ea21151462
36 changed files with 7087 additions and 7087 deletions

350
README.md
View File

@@ -1,175 +1,175 @@
## Citadel Station 13
Based and maintained from /tg/station.
[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13)
[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open")
[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue")
[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
**Upstream Information**
* **Website:** <https://www.tgstation13.org>
* **Code:** <https://github.com/tgstation/tgstation>
* **Wiki:** <https://tgstation13.org/wiki/Main_Page>
* **Codedocs:** <https://codedocs.tgstation13.org>
* **/tg/station Discord:** <https://tgstation13.org/phpBB/viewforum.php?f=60>
* **Coderbus Discord:** <https://discord.gg/Vh8TJp9>
* ~~**IRC:** <irc://irc.rizon.net/coderbus>~~ (dead)
**Citadel Station Information**
* **Website:** <http://citadel-station.net>
* **Code:** <https://github.com/Citadel-Station-13/Citadel-Station-13>
* **Wiki:** <https://citadel-station.net/wiki/index.php?title=Main_Page>
* **Forums:** <http://citadel-station.net/forum>
* **Ban Appeals:** <http://citadel-station.net/forum/forumdisplay.php?fid=8>
* **Discord:** <https://discord.gg/E6SQuhz>
## DOWNLOADING
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code
Option 1:
Follow this: http://www.tgstation13.org/wiki/Setting_up_git
Option 2: Download the source code as a zip by clicking the ZIP button in the
code tab of https://github.com/tgstation/tgstation
(note: this will use a lot of bandwidth if you wish to update and is a lot of
hassle if you want to make any changes at all, so it's not recommended.)
Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2)
## INSTALLATION
First-time installation should be fairly straightforward. First, you'll need
BYOND installed. You can get it from https://www.byond.com/download. Once you've done
that, extract the game files to wherever you want to keep them. This is a
sourcecode-only release, so the next step is to compile the server files.
Open tgstation.dme by double-clicking it, open the Build menu, and click
compile. This'll take a little while, and if everything's done right you'll get
a message like this:
```
saving tgstation.dmb (DEBUG mode)
tgstation.dmb - 0 errors, 0 warnings
```
If you see any errors or warnings, something has gone wrong - possibly a corrupt
download or the files extracted wrong. If problems persist, ask for assistance
in irc://irc.rizon.net/coderbus
Once that's done, open up the config folder. You'll want to edit config.txt to
set the probabilities for different gamemodes in Secret and to set your server
location so that all your players don't get disconnected at the end of each
round. It's recommended you don't turn on the gamemodes with probability 0,
except Extended, as they have various issues and aren't currently being tested,
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
isn't in the Secret rotation by default as it's just not very fun.
You'll also want to edit config/admins.txt to remove the default admins and add
your own. "Game Master" is the highest level of access, and probably the one
you'll want to use for now. You can set up your own ranks and find out more in
config/admin_ranks.txt
The format is
```
byondkey = Rank
```
where the admin rank must be properly capitalised.
This codebase also depends on a native library called rust-g. A precompiled
Windows DLL is included in this repository, but Linux users will need to build
and install it themselves. Directions can be found at the [rust-g
repo](https://github.com/tgstation13/rust-g).
Finally, to start the server, run Dream Daemon and enter the path to your
compiled tgstation.dmb file. Make sure to set the port to the one you
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
and the server should start up and be ready to join. It is also recommended that
you set up the SQL backend (see below).
## UPDATING
To update an existing installation, first back up your /config and /data folders
as these store your server configuration, player preferences and banlist.
Then, extract the new files (preferably into a clean directory, but updating in
place should work fine), copy your /config and /data folders back into the new
install, overwriting when prompted except if we've specified otherwise, and
recompile the game. Once you start the server up again, you should be running
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
https://github.com/tgstation/tgstation-server
## MAPS
/tg/station currently comes equipped with five maps.
* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation)
* [MetaStation](https://tgstation13.org/wiki/MetaStation)
* [DeltaStation](https://tgstation13.org/wiki/DeltaStation)
* [OmegaStation](https://tgstation13.org/wiki/OmegaStation)
* [PubbyStation](https://tgstation13.org/wiki/PubbyStation)
All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility.
The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round.
If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file.
Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger)
## AWAY MISSIONS
/tg/station supports loading away missions however they are disabled by default.
Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code.
To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load.
## SQL SETUP
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 delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server.
1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0`
1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc.
* If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers.
* Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files.
## IRC BOT SETUP
Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified
IRC channel/server, see the /tools/minibot folder for more
## CONTRIBUTING
Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md)
## LICENSE
All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html).
All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
(Including tools unless their readme specifies otherwise.)
See LICENSE and GPLv3.txt for more details.
The TGS3 API is licensed as a subproject under the MIT license.
See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license.
tgui clientside is licensed as a subproject under the MIT license.
Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1
tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
## Citadel Station 13
Based and maintained from /tg/station.
[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13)
[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open")
[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue")
[![forthebadge](http://forthebadge.com/images/badges/60-percent-of-the-time-works-every-time.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/pretty-risque.svg)](https://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/you-didnt-ask-for-this.svg)](http://forthebadge.com) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
**Upstream Information**
* **Website:** <https://www.tgstation13.org>
* **Code:** <https://github.com/tgstation/tgstation>
* **Wiki:** <https://tgstation13.org/wiki/Main_Page>
* **Codedocs:** <https://codedocs.tgstation13.org>
* **/tg/station Discord:** <https://tgstation13.org/phpBB/viewforum.php?f=60>
* **Coderbus Discord:** <https://discord.gg/Vh8TJp9>
* ~~**IRC:** <irc://irc.rizon.net/coderbus>~~ (dead)
**Citadel Station Information**
* **Website:** <http://citadel-station.net>
* **Code:** <https://github.com/Citadel-Station-13/Citadel-Station-13>
* **Wiki:** <https://citadel-station.net/wiki/index.php?title=Main_Page>
* **Forums:** <http://citadel-station.net/forum>
* **Ban Appeals:** <http://citadel-station.net/forum/forumdisplay.php?fid=8>
* **Discord:** <https://discord.gg/E6SQuhz>
## DOWNLOADING
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code
Option 1:
Follow this: http://www.tgstation13.org/wiki/Setting_up_git
Option 2: Download the source code as a zip by clicking the ZIP button in the
code tab of https://github.com/tgstation/tgstation
(note: this will use a lot of bandwidth if you wish to update and is a lot of
hassle if you want to make any changes at all, so it's not recommended.)
Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2)
## INSTALLATION
First-time installation should be fairly straightforward. First, you'll need
BYOND installed. You can get it from https://www.byond.com/download. Once you've done
that, extract the game files to wherever you want to keep them. This is a
sourcecode-only release, so the next step is to compile the server files.
Open tgstation.dme by double-clicking it, open the Build menu, and click
compile. This'll take a little while, and if everything's done right you'll get
a message like this:
```
saving tgstation.dmb (DEBUG mode)
tgstation.dmb - 0 errors, 0 warnings
```
If you see any errors or warnings, something has gone wrong - possibly a corrupt
download or the files extracted wrong. If problems persist, ask for assistance
in irc://irc.rizon.net/coderbus
Once that's done, open up the config folder. You'll want to edit config.txt to
set the probabilities for different gamemodes in Secret and to set your server
location so that all your players don't get disconnected at the end of each
round. It's recommended you don't turn on the gamemodes with probability 0,
except Extended, as they have various issues and aren't currently being tested,
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
isn't in the Secret rotation by default as it's just not very fun.
You'll also want to edit config/admins.txt to remove the default admins and add
your own. "Game Master" is the highest level of access, and probably the one
you'll want to use for now. You can set up your own ranks and find out more in
config/admin_ranks.txt
The format is
```
byondkey = Rank
```
where the admin rank must be properly capitalised.
This codebase also depends on a native library called rust-g. A precompiled
Windows DLL is included in this repository, but Linux users will need to build
and install it themselves. Directions can be found at the [rust-g
repo](https://github.com/tgstation13/rust-g).
Finally, to start the server, run Dream Daemon and enter the path to your
compiled tgstation.dmb file. Make sure to set the port to the one you
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
and the server should start up and be ready to join. It is also recommended that
you set up the SQL backend (see below).
## UPDATING
To update an existing installation, first back up your /config and /data folders
as these store your server configuration, player preferences and banlist.
Then, extract the new files (preferably into a clean directory, but updating in
place should work fine), copy your /config and /data folders back into the new
install, overwriting when prompted except if we've specified otherwise, and
recompile the game. Once you start the server up again, you should be running
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
https://github.com/tgstation/tgstation-server
## MAPS
/tg/station currently comes equipped with five maps.
* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation)
* [MetaStation](https://tgstation13.org/wiki/MetaStation)
* [DeltaStation](https://tgstation13.org/wiki/DeltaStation)
* [OmegaStation](https://tgstation13.org/wiki/OmegaStation)
* [PubbyStation](https://tgstation13.org/wiki/PubbyStation)
All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility.
The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round.
If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file.
Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger)
## AWAY MISSIONS
/tg/station supports loading away missions however they are disabled by default.
Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code.
To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load.
## SQL SETUP
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 delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server.
1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0`
1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc.
* If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers.
* Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files.
## IRC BOT SETUP
Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified
IRC channel/server, see the /tools/minibot folder for more
## CONTRIBUTING
Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md)
## LICENSE
All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html).
All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
(Including tools unless their readme specifies otherwise.)
See LICENSE and GPLv3.txt for more details.
The TGS3 API is licensed as a subproject under the MIT license.
See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license.
tgui clientside is licensed as a subproject under the MIT license.
Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1
tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.

View File

@@ -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 */;

View File

@@ -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"
]
}

View File

@@ -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"
}
}

View File

@@ -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"
}
}

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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;}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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

View File

@@ -1,20 +1,20 @@
# To make your name something other than your github name type it in the format "<github name> <credited name>
# e.g.
# Cyberboss Jordan Brown
# To suppress your name from appearing in the credits do "<github name> __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 "<github name> <credited name>
# e.g.
# Cyberboss Jordan Brown
# To suppress your name from appearing in the credits do "<github name> __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

View File

@@ -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 <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <sstream>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <ctime>
#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<string,runtime> storedRuntime;
unordered_map<string,runtime> storedInfiniteLoop;
unordered_map<string,harddel> 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<string,runtime> * 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<runtime> infiniteLoops;
infiniteLoops.reserve(storedInfiniteLoop.size());
for (unordered_map<string,runtime>::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<runtime> runtimes;
runtimes.reserve(storedRuntime.size());
for (unordered_map<string,runtime>::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<harddel> hardDels;
hardDels.reserve(storedHardDel.size());
for (unordered_map<string,harddel>::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 <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <sstream>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <ctime>
#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<string,runtime> storedRuntime;
unordered_map<string,runtime> storedInfiniteLoop;
unordered_map<string,harddel> 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<string,runtime> * 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<runtime> infiniteLoops;
infiniteLoops.reserve(storedInfiniteLoop.size());
for (unordered_map<string,runtime>::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<runtime> runtimes;
runtimes.reserve(storedRuntime.size());
for (unordered_map<string,runtime>::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<harddel> hardDels;
hardDels.reserve(storedHardDel.size());
for (unordered_map<string,harddel>::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;
}

View File

@@ -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.

View File

@@ -1,133 +1,133 @@
<?php
//This file contains things that should not be touched by the automatic live tracker
//Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events.
//This var should match the secret you configured for this webhook on github.
//This is required as otherwise somebody could trick the script into leaking the api key.
$hookSecret = '08ajh0qj93209qj90jfq932j32r';
//Api key for pushing changelogs.
//This requires the public_repo (or repo for private repositories) and read:org permissions
$apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c';
//Used to prevent potential RCEs
$repoOwnerAndName = "tgstation/tgstation";
//Auto update settings
$enable_live_tracking = true; //auto update this file from the repository
$path_to_script = 'tools/WebhookProcessor/github_webhook_processor.php';
$tracked_branch = "master";
//PR balance settings.
$trackPRBalance = true; //set this to false to disable PR balance tracking
$prBalanceJson = ''; //Set this to the path you'd like the writable pr balance file to be stored, not setting it writes it to the working directory
$startingPRBalance = 5; //Starting balance for never before seen users
//team 133041: tgstation/commit-access
$maintainer_team_id = 133041; //org team id that is exempt from PR balance system, setting this to null will use anyone with write access to the repo. Get from https://api.github.com/orgs/:org/teams
//anti-spam measures. Don't announce PRs in game to people unless they've gotten a pr merged before
//options are:
// "repo" - user has to have a pr merged in the repo before.
// "org" - user has to have a pr merged in any repo in the organization (for repos owned directly by users, this applies to any repo directly owned by the same user.)
// "disable" - disables.
//defaults to org if left blank or given invalid values.
//This can also be ignored on a per webhook or per game server bases.
$validation = "org";
//how many merged prs must they have under the rules above to have their pr announced to the game servers.
$validation_count = 1;
//enforce changelogs on PRs
$require_changelogs = false;
/*
* Announcement Settings.
* Allows you to announce prs to discord webhooks or the game servers
*/
/* Common configs:
The following config items can be added to both game server and discord announcement endpoints. Simply replace the $servers part with $discordWebHooks:
include_repos - List of repos in owner/repo format to send to this endpoint. (defaults to all repos if not defined)
* can be given in place of repo to match all repos under an organization
$servers[$configitem]['include_repos'][] = "tgstation/*";
exclude_repos - List of repos in owner/repo format to not send to this endpoint.
* can be given in place of repo to match all repos under an organization
$servers[$configitem]['exclude_repos'][] = 'tgstation/TerraGov-Marine-Corps';
$servers[$configitem]['exclude_repos'][] = 'tgstation/tgstation13.org';
exclude_events - List of events to not announce, values: opened, closed, reopened, or merged
$servers[$configitem]['exclude_events'][] = 'closed';
$servers[$configitem]['exclude_events'][] = 'reopened';
announce_secret - Announce secret/security prs that have a [s] in front of the title? Defaults to no.
Can also be set to 'only' to only announce secret prs.
$servers[$configitem]['announce_secret'] = false;
$servers[$configitem]['announce_secret'] = 'only';
announce_unvalidated - Announce prs by unvalidated users (see the validation setting above)? Defaults to no.
Can also be set to 'only' to only announce prs by unvalidated users.
$servers[$configitem]['announce_unvalidated'] = false;
//Note: the same webhook or game server can be given in mutiple announce endpoints with different settings, allowing you to say, have embeds only show on prs to certain repos by excluding the repo in a endpoint with embed = false, and including the repo in a endpoint with embed = true true. This could also be used to only block closed and reopened events on prs by unvalidated users.
//Game servers to announce PRs to.
/*
$configitem = -1;//ignore me
//Game Server Start
$servers[++$configitem] = array();
$servers[$configitem]['address'] = 'game.tgstation13.org';
$servers[$configitem]['port'] = '1337';
$servers[$configitem]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
//Game Server End
//Game Server Start
$servers[++$configitem] = array();
$servers[$configitem]['address'] = 'game.tgstation13.org';
$servers[$configitem]['port'] = '2337';
$servers[$configitem]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
//Game Server End
unset($configitem);//ignore
*/
//discord webhooks to announce PRs to.
/*
$configitem = -1;//ignore me
//Discord Webhook Start
$discordWebHooks[++$configitem] = array();
// Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.)
$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933489920245771/xaoYtVuype-P1rb_uthQLkh_C4iVL3sjtIvFEp7rsfhbBs8tDsSJgE0a9MNWJaoSPBPK';
// show an embed with more info?
$discordWebHooks[$configitem]['embed'] = true;
// if the above is true, don't include the text portion before the embed.
// (This option is not advised as it's not compatible with users who disable embeds).
$discordWebHooks[$configitem]['no_text'] = false;
//Discord Webhook End
//Discord Webhook Start
$discordWebHooks[++$configitem] = array();
// Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.)
$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933686956064769/q0uDel7S6eutvRIyEwsuZo_ppzAoxqUNeU2PRChYVsYoJmmn2f2YYSDoMjy9FhhXKqpI';
// show an embed with more info?
$discordWebHooks[$configitem]['embed'] = true;
// if the above is true, don't include the text portion before the embed.
// (This option is not advised as it's not compatible with users who disable embeds).
$discordWebHooks[$configitem]['no_text'] = false;
//Discord Webhook End
*/
unset($configitem); //ignore
<?php
//This file contains things that should not be touched by the automatic live tracker
//Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events.
//This var should match the secret you configured for this webhook on github.
//This is required as otherwise somebody could trick the script into leaking the api key.
$hookSecret = '08ajh0qj93209qj90jfq932j32r';
//Api key for pushing changelogs.
//This requires the public_repo (or repo for private repositories) and read:org permissions
$apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c';
//Used to prevent potential RCEs
$repoOwnerAndName = "tgstation/tgstation";
//Auto update settings
$enable_live_tracking = true; //auto update this file from the repository
$path_to_script = 'tools/WebhookProcessor/github_webhook_processor.php';
$tracked_branch = "master";
//PR balance settings.
$trackPRBalance = true; //set this to false to disable PR balance tracking
$prBalanceJson = ''; //Set this to the path you'd like the writable pr balance file to be stored, not setting it writes it to the working directory
$startingPRBalance = 5; //Starting balance for never before seen users
//team 133041: tgstation/commit-access
$maintainer_team_id = 133041; //org team id that is exempt from PR balance system, setting this to null will use anyone with write access to the repo. Get from https://api.github.com/orgs/:org/teams
//anti-spam measures. Don't announce PRs in game to people unless they've gotten a pr merged before
//options are:
// "repo" - user has to have a pr merged in the repo before.
// "org" - user has to have a pr merged in any repo in the organization (for repos owned directly by users, this applies to any repo directly owned by the same user.)
// "disable" - disables.
//defaults to org if left blank or given invalid values.
//This can also be ignored on a per webhook or per game server bases.
$validation = "org";
//how many merged prs must they have under the rules above to have their pr announced to the game servers.
$validation_count = 1;
//enforce changelogs on PRs
$require_changelogs = false;
/*
* Announcement Settings.
* Allows you to announce prs to discord webhooks or the game servers
*/
/* Common configs:
The following config items can be added to both game server and discord announcement endpoints. Simply replace the $servers part with $discordWebHooks:
include_repos - List of repos in owner/repo format to send to this endpoint. (defaults to all repos if not defined)
* can be given in place of repo to match all repos under an organization
$servers[$configitem]['include_repos'][] = "tgstation/*";
exclude_repos - List of repos in owner/repo format to not send to this endpoint.
* can be given in place of repo to match all repos under an organization
$servers[$configitem]['exclude_repos'][] = 'tgstation/TerraGov-Marine-Corps';
$servers[$configitem]['exclude_repos'][] = 'tgstation/tgstation13.org';
exclude_events - List of events to not announce, values: opened, closed, reopened, or merged
$servers[$configitem]['exclude_events'][] = 'closed';
$servers[$configitem]['exclude_events'][] = 'reopened';
announce_secret - Announce secret/security prs that have a [s] in front of the title? Defaults to no.
Can also be set to 'only' to only announce secret prs.
$servers[$configitem]['announce_secret'] = false;
$servers[$configitem]['announce_secret'] = 'only';
announce_unvalidated - Announce prs by unvalidated users (see the validation setting above)? Defaults to no.
Can also be set to 'only' to only announce prs by unvalidated users.
$servers[$configitem]['announce_unvalidated'] = false;
//Note: the same webhook or game server can be given in mutiple announce endpoints with different settings, allowing you to say, have embeds only show on prs to certain repos by excluding the repo in a endpoint with embed = false, and including the repo in a endpoint with embed = true true. This could also be used to only block closed and reopened events on prs by unvalidated users.
//Game servers to announce PRs to.
/*
$configitem = -1;//ignore me
//Game Server Start
$servers[++$configitem] = array();
$servers[$configitem]['address'] = 'game.tgstation13.org';
$servers[$configitem]['port'] = '1337';
$servers[$configitem]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
//Game Server End
//Game Server Start
$servers[++$configitem] = array();
$servers[$configitem]['address'] = 'game.tgstation13.org';
$servers[$configitem]['port'] = '2337';
$servers[$configitem]['comskey'] = '89aj90cq2fm0amc90832mn9rm90';
//Game Server End
unset($configitem);//ignore
*/
//discord webhooks to announce PRs to.
/*
$configitem = -1;//ignore me
//Discord Webhook Start
$discordWebHooks[++$configitem] = array();
// Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.)
$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933489920245771/xaoYtVuype-P1rb_uthQLkh_C4iVL3sjtIvFEp7rsfhbBs8tDsSJgE0a9MNWJaoSPBPK';
// show an embed with more info?
$discordWebHooks[$configitem]['embed'] = true;
// if the above is true, don't include the text portion before the embed.
// (This option is not advised as it's not compatible with users who disable embeds).
$discordWebHooks[$configitem]['no_text'] = false;
//Discord Webhook End
//Discord Webhook Start
$discordWebHooks[++$configitem] = array();
// Webhook Url (you can get this from discord via the webhook setting menu of the server or a channel.)
$discordWebHooks[$configitem]['url'] = 'https://discordapp.com/api/webhooks/538933686956064769/q0uDel7S6eutvRIyEwsuZo_ppzAoxqUNeU2PRChYVsYoJmmn2f2YYSDoMjy9FhhXKqpI';
// show an embed with more info?
$discordWebHooks[$configitem]['embed'] = true;
// if the above is true, don't include the text portion before the embed.
// (This option is not advised as it's not compatible with users who disable embeds).
$discordWebHooks[$configitem]['no_text'] = false;
//Discord Webhook End
*/
unset($configitem); //ignore

View File

@@ -1,9 +1,9 @@
SQL_ENABLED
ADDRESS 127.0.0.1
PORT 3306
FEEDBACK_DATABASE tg_travis
FEEDBACK_TABLEPREFIX
FEEDBACK_LOGIN root
FEEDBACK_PASSWORD
LAVALAND_BUDGET 0
SPACE_BUDGET 0
SQL_ENABLED
ADDRESS 127.0.0.1
PORT 3306
FEEDBACK_DATABASE tg_travis
FEEDBACK_TABLEPREFIX
FEEDBACK_LOGIN root
FEEDBACK_PASSWORD
LAVALAND_BUDGET 0
SPACE_BUDGET 0