Merge remote-tracking branch 'refs/remotes/origin/master' into custom_roundstart_items

# Conflicts:
#	code/controllers/configuration.dm
#	code/game/objects/items.dm
This commit is contained in:
kevinz000
2017-05-21 18:17:42 -07:00
571 changed files with 74297 additions and 79090 deletions
+2
View File
@@ -41,3 +41,5 @@ script:
- tools/travis/build_tools.sh
- tools/travis/build_byond.sh
notifications:
email: false
+1
View File
@@ -4,6 +4,7 @@ Based and maintained from /tg/station.<BR>
[![Build Status](https://api.travis-ci.org/Citadel-Station-13/Citadel-Station-13.png)](https://travis-ci.org/Citadel-Station-13/Citadel-Station-13) [![Krihelimeter](http://www.krihelinator.xyz/badge/Citadel-Station-13/Citadel-Station-13)](http://www.krihelinator.xyz)
[![Percentage of issues still open](http://isitmaintained.com/badge/open/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Percentage of issues still open") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/Citadel-Station-13/Citadel-Station-13.svg)](http://isitmaintained.com/project/Citadel-Station-13/Citadel-Station-13 "Average time to resolve an issue")
**Upstream Information** <BR>
**Website:** http://www.tgstation13.org <BR>
+371 -371
View File
@@ -1,373 +1,373 @@
CREATE DATABASE IF NOT EXISTS `feedback` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `feedback`;
/*!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` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`rank` varchar(32) NOT NULL DEFAULT 'Administrator',
`level` int(2) NOT NULL DEFAULT '0',
`flags` int(16) NOT NULL DEFAULT '0',
`email` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) 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,
`adminckey` varchar(32) NOT NULL,
`adminip` varchar(18) NOT NULL,
`log` text 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` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rank` varchar(40) NOT NULL,
`flags` int(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 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,
`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,
`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,
`coord` varchar(32) NOT NULL,
`mapname` varchar(32) NOT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned 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,
`gender` enum('neuter','male','female','plural') NOT 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,
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) NOT NULL AUTO_INCREMENT,
`time` datetime NOT NULL,
`round_id` int(8) NOT NULL,
`var_name` varchar(32) NOT NULL,
`var_value` int(16) DEFAULT NULL,
`details` text,
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,
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,
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,
`secret` tinyint(1) unsigned NOT NULL,
`lasteditor` varchar(32) DEFAULT NULL,
`edits` text,
PRIMARY KEY (`id`),
KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`),
KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`),
KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`)
) 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,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` int(10) unsigned NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
CREATE DATABASE IF NOT EXISTS `feedback` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `feedback`;
/*!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` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`rank` varchar(32) NOT NULL DEFAULT 'Administrator',
`level` int(2) NOT NULL DEFAULT '0',
`flags` int(16) NOT NULL DEFAULT '0',
`email` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) 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,
`adminckey` varchar(32) NOT NULL,
`adminip` varchar(18) NOT NULL,
`log` text 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` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rank` varchar(40) NOT NULL,
`flags` int(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 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,
`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,
`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,
`coord` varchar(32) NOT NULL,
`mapname` varchar(32) NOT NULL,
`server_ip` int(10) unsigned NOT NULL,
`server_port` smallint(5) unsigned 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,
`gender` enum('neuter','male','female','plural') NOT 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,
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) NOT NULL AUTO_INCREMENT,
`time` datetime NOT NULL,
`round_id` int(8) NOT NULL,
`var_name` varchar(32) NOT NULL,
`var_value` int(16) DEFAULT NULL,
`details` text,
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,
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,
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,
`secret` tinyint(1) unsigned NOT NULL,
`lasteditor` varchar(32) DEFAULT NULL,
`edits` text,
PRIMARY KEY (`id`),
KEY `idx_msg_ckey_time` (`targetckey`,`timestamp`),
KEY `idx_msg_type_ckeys_time` (`type`,`targetckey`,`adminckey`,`timestamp`),
KEY `idx_msg_type_ckey_time_odr` (`type`,`targetckey`,`timestamp`)
) 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,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` int(10) unsigned NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
`accountjoindate` DATE DEFAULT 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,
`percentagecalc` tinyint(1) NOT NULL DEFAULT '1',
`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,
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 */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!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 */;
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,
`percentagecalc` tinyint(1) NOT NULL DEFAULT '1',
`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,
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 */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!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 */;
@@ -730,7 +730,7 @@
},
/area/ruin/powered/syndicate_lava_base)
"bN" = (
/obj/machinery/smartfridge/chemistry/virology,
/obj/machinery/smartfridge/chemistry/virology/preloaded,
/turf/open/floor/plasteel/podhatch{
tag = "icon-podhatch (EAST)";
icon_state = "podhatch";
+3 -1
View File
@@ -6,7 +6,9 @@
/turf/open/floor/plating/asteroid/airless,
/area/ruin/unpowered/no_grav)
"c" = (
/turf/closed/mineral/volcanic/lava_land_surface,
/turf/closed/mineral/volcanic/lava_land_surface{
baseturf = /turf/open/floor/plating/asteroid
},
/area/ruin/unpowered/no_grav)
"d" = (
/mob/living/simple_animal/hostile/flan/water,
+2 -2
View File
@@ -198,8 +198,8 @@
/area/awaymission/research/interior/engineering)
"aL" = (
/obj/structure/table,
/obj/item/weapon/c4,
/obj/item/weapon/c4,
/obj/item/weapon/grenade/plastic/c4,
/obj/item/weapon/grenade/plastic/c4,
/obj/item/weapon/storage/toolbox/syndicate,
/turf/open/floor/mineral/plastitanium,
/area/awaymission/research/interior/engineering)
+1 -1
View File
@@ -3948,7 +3948,7 @@
},
/area/awaymission/snowdin)
"kB" = (
/obj/item/weapon/c4{
/obj/item/weapon/grenade/plastic/c4{
pixel_x = 2;
pixel_y = 1
},
+2 -2
View File
@@ -357,7 +357,7 @@
/area/awaymission/spacebattle/syndicate2)
"bl" = (
/obj/structure/table/reinforced,
/obj/item/weapon/c4,
/obj/item/weapon/grenade/plastic/c4,
/turf/open/floor/mineral/plastitanium,
/area/awaymission/spacebattle/syndicate3)
"bm" = (
@@ -366,7 +366,7 @@
/area/awaymission/spacebattle/syndicate1)
"bn" = (
/obj/structure/table/reinforced,
/obj/item/weapon/c4,
/obj/item/weapon/grenade/plastic/c4,
/turf/open/floor/mineral/plastitanium,
/area/awaymission/spacebattle/syndicate1)
"bo" = (
File diff suppressed because it is too large Load Diff
@@ -114,7 +114,7 @@
"acj" = (/obj/machinery/light/small,/obj/structure/table,/turf/open/floor/plasteel,/area/security/processing{name = "Permabrig"})
"ack" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4;name = "regular air scrubber";on = 1;scrub_N2O = 0;scrub_Toxins = 0},/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas.";dir = 4;name = "Prison Monitor";network = list("Prison");pixel_x = -30;pixel_y = 0},/turf/open/floor/plasteel/red/side{dir = 8},/area/security/processing{name = "Permabrig"})
"acl" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4;initialize_directions = 11},/obj/structure/cable{tag = "icon-1-2";icon_state = "1-2"},/turf/open/floor/plasteel/red/side{dir = 4},/area/security/processing{name = "Permabrig"})
"acm" = (/obj/structure/table,/obj/item/weapon/c4{pixel_x = 2;pixel_y = -5},/obj/item/weapon/c4{pixel_x = -3;pixel_y = 3},/obj/item/weapon/c4{pixel_x = 2;pixel_y = -3},/obj/item/weapon/c4{pixel_x = -2;pixel_y = -1},/obj/item/weapon/c4{pixel_x = 3;pixel_y = 3},/obj/machinery/light{dir = 4},/turf/open/floor/mineral/plastitanium,/area/shuttle/syndicate)
"acm" = (/obj/structure/table,/obj/item/weapon/grenade/plastic/c4{pixel_x = 2;pixel_y = -5},/obj/item/weapon/grenade/plastic/c4{pixel_x = -3;pixel_y = 3},/obj/item/weapon/grenade/plastic/c4{pixel_x = 2;pixel_y = -3},/obj/item/weapon/grenade/plastic/c4{pixel_x = -2;pixel_y = -1},/obj/item/weapon/grenade/plastic/c4{pixel_x = 3;pixel_y = 3},/obj/machinery/light{dir = 4},/turf/open/floor/mineral/plastitanium,/area/shuttle/syndicate)
"acn" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/shuttle/syndicate)
"aco" = (/obj/machinery/door/window{name = "Ready Room";req_access_txt = "150"},/turf/open/floor/mineral/plastitanium,/area/shuttle/syndicate)
"acp" = (/obj/machinery/light{dir = 8},/obj/structure/sign/electricshock{pixel_x = -32},/turf/open/floor/plasteel/green,/area/security/processing{name = "Permabrig"})
@@ -241,7 +241,7 @@
"aeG" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4;icon_state = "0-4"},/turf/open/floor/plating,/area/medical/virology)
"aeH" = (/obj/item/weapon/storage/box/beakers{pixel_x = 2;pixel_y = 2},/obj/item/weapon/storage/box/syringes,/obj/machinery/power/apc{cell_type = 5000;dir = 1;name = "Virology APC";pixel_x = 0;pixel_y = 24},/obj/structure/cable/yellow{d2 = 4;icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8;icon_state = "0-8"},/obj/structure/table/glass,/turf/open/floor/plasteel/whitegreen/side{dir = 9},/area/medical/virology)
"aeI" = (/obj/item/weapon/book/manual/wiki/infections{pixel_y = 7},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/cable/yellow{d1 = 2;d2 = 8;icon_state = "2-8"},/obj/structure/table/glass,/turf/open/floor/plasteel/whitegreen/side{dir = 5},/area/medical/virology)
"aeJ" = (/obj/machinery/smartfridge/chemistry/virology,/obj/machinery/airalarm{frequency = 1439;pixel_y = 23},/turf/open/floor/plasteel/whitegreen,/area/medical/virology)
"aeJ" = (/obj/machinery/smartfridge/chemistry/virology/preloaded,/obj/machinery/airalarm{frequency = 1439;pixel_y = 23},/turf/open/floor/plasteel/whitegreen,/area/medical/virology)
"aeK" = (/obj/machinery/reagentgrinder{pixel_y = 8},/obj/structure/table/glass,/turf/open/floor/plasteel/whitegreen/side{dir = 9},/area/medical/virology)
"aeL" = (/obj/item/clothing/gloves/color/latex,/obj/item/device/healthanalyzer,/obj/item/clothing/glasses/hud/health,/obj/structure/reagent_dispensers/virusfood{density = 0;pixel_x = 0;pixel_y = 30},/obj/structure/table/glass,/turf/open/floor/plasteel/whitegreen/side{dir = 5},/area/medical/virology)
"aeM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/open/floor/plasteel/red/side{dir = 8},/area/security/processing{name = "Prisoner Processing"})
@@ -620,7 +620,7 @@
"alV" = (/obj/machinery/camera{c_tag = "Custodial Closet"},/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"alW" = (/obj/machinery/monkey_recycler,/obj/machinery/firealarm{dir = 2;pixel_y = 24},/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"alX" = (/obj/machinery/processor{desc = "A machine used to process slimes and retrieve their extract.";name = "Slime Processor"},/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"alY" = (/obj/machinery/smartfridge/extract,/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"alY" = (/obj/machinery/smartfridge/extract/preloaded,/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"alZ" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/machinery/airalarm{frequency = 1439;pixel_y = 23},/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"ama" = (/obj/structure/closet/l3closet/scientist,/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
"amb" = (/obj/structure/closet/l3closet/scientist,/obj/machinery/light_switch{pixel_x = 0;pixel_y = 28},/turf/open/floor/plasteel/white,/area/toxins/xenobiology)
@@ -2985,7 +2985,7 @@
"bfu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{tag = "icon-1-2";icon_state = "1-2"},/turf/open/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (EAST)";icon_state = "whitebluecorner";dir = 4},/area/medical/medbay{name = "Medbay Central"})
"bfv" = (/obj/machinery/chem_dispenser,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTHWEST)";icon_state = "whiteyellow";dir = 9},/area/medical/chemistry)
"bfw" = (/obj/machinery/chem_master,/obj/item/weapon/book/manual/wiki/chemistry,/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)";icon_state = "whiteyellow";dir = 1},/area/medical/chemistry)
"bfx" = (/obj/machinery/smartfridge/chemistry{name = "chemical component fridge";spawn_meds = null},/obj/machinery/camera/autoname,/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)";icon_state = "whiteyellow";dir = 1},/area/medical/chemistry)
"bfx" = (/obj/machinery/smartfridge/chemistry/preloaded{name = "chemical component fridge"},/obj/machinery/camera/autoname,/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)";icon_state = "whiteyellow";dir = 1},/area/medical/chemistry)
"bfy" = (/obj/structure/table,/obj/machinery/vending/wallmed{pixel_y = 28},/obj/item/weapon/hand_labeler,/obj/item/clothing/glasses/science,/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)";icon_state = "whiteyellow";dir = 1},/area/medical/chemistry)
"bfz" = (/obj/structure/table,/obj/machinery/reagentgrinder,/obj/item/stack/sheet/mineral/plasma{layer = 2.9;pixel_y = 4},/obj/item/stack/sheet/mineral/plasma,/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)";icon_state = "whiteyellow";dir = 1},/area/medical/chemistry)
"bfA" = (/obj/structure/sink{pixel_y = 24},/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (NORTH)";icon_state = "whiteyellow";dir = 1},/area/medical/chemistry)
@@ -3094,7 +3094,7 @@
"bhz" = (/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (WEST)";icon_state = "whiteyellow";dir = 8},/area/medical/chemistry)
"bhA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/open/floor/plasteel/white,/area/medical/chemistry)
"bhB" = (/obj/structure/closet/secure_closet/chemical,/turf/open/floor/plasteel/white,/area/medical/chemistry)
"bhC" = (/obj/machinery/smartfridge/chemistry{name = "chemical component fridge";spawn_meds = null},/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)";icon_state = "whiteyellow";dir = 4},/area/medical/chemistry)
"bhC" = (/obj/machinery/smartfridge/chemistry/preloaded{name = "chemical component fridge"},/turf/open/floor/plasteel/whiteyellow/side{tag = "icon-whiteyellow (EAST)";icon_state = "whiteyellow";dir = 4},/area/medical/chemistry)
"bhD" = (/turf/closed/wall/r_wall,/area/security/checkpoint)
"bhE" = (/obj/machinery/atmospherics/components/unary/vent_pump{name = "regular air vent";on = 1},/obj/machinery/computer/secure_data,/turf/open/floor/plasteel{icon_state = "redfull"},/area/security/checkpoint)
"bhF" = (/obj/structure/chair/office/dark{dir = 8},/obj/machinery/firealarm{dir = 1;pixel_x = 0;pixel_y = -26},/turf/open/floor/plasteel{icon_state = "redfull"},/area/security/checkpoint)
@@ -3205,7 +3205,7 @@
"bjG" = (/obj/machinery/light{icon_state = "tube1";dir = 8},/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)";icon_state = "whiteblue";dir = 8},/area/medical/medbay{name = "Medbay Central"})
"bjH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel/whiteblue/corner,/area/medical/medbay{name = "Medbay Central"})
"bjI" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/open/floor/plating,/area/medical/chemistry)
"bjJ" = (/obj/machinery/smartfridge/chemistry,/turf/closed/wall,/area/medical/chemistry)
"bjJ" = (/obj/machinery/smartfridge/chemistry/preloaded,/turf/closed/wall,/area/medical/chemistry)
"bjK" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southleft{dir = 1;name = "Chemistry Desk";req_access_txt = "33"},/obj/machinery/door/firedoor/border_only,/turf/open/floor/plasteel/orange,/area/medical/chemistry)
"bjL" = (/obj/structure/disposalpipe/segment,/turf/closed/wall,/area/medical/chemistry)
"bjM" = (/obj/machinery/door/airlock/glass_command{name = "Bridge Access";req_access_txt = "0";req_one_access_txt = "19; 1"},/turf/open/floor/plasteel/darkblue,/area/bridge)
+57 -42
View File
@@ -10134,14 +10134,11 @@
/turf/open/space,
/area/space)
"aux" = (
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-21";
layer = 4.1;
pixel_x = -3;
pixel_y = 3
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/bot,
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-22"
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -10777,25 +10774,28 @@
/turf/closed/wall/mineral/titanium,
/area/shuttle/supply)
"avM" = (
/obj/machinery/atmospherics/components/unary/thermomachine/heater{
dir = 4;
on = 1
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/bot,
/obj/item/weapon/twohanded/required/kirbyplants{
icon_state = "plant-21";
layer = 4.1;
pixel_x = -3;
pixel_y = 3
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
})
"avN" = (
/obj/machinery/atmospherics/pipe/manifold/general/visible{
icon_state = "manifold";
dir = 4
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/atmospherics/components/binary/pump{
dir = 1;
icon_state = "pump_map";
name = "Thermo to Gas"
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11296,10 +11296,6 @@
/turf/open/space,
/area/space)
"awR" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
icon_state = "freezer";
dir = 4
},
/obj/structure/sign/securearea{
pixel_x = -32
},
@@ -11311,6 +11307,10 @@
network = list("SS13","Engine")
},
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/components/unary/thermomachine/heater{
dir = 4;
on = 1
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11765,12 +11765,13 @@
name = "Atmospherics Engine"
})
"axM" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
},
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/atmospherics/pipe/manifold/general/visible{
icon_state = "manifold";
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11778,11 +11779,6 @@
"axN" = (
/obj/machinery/atmospherics/pipe/simple/general/visible,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/general/visible{
icon_state = "intact";
dir = 4
},
/obj/machinery/meter,
/turf/open/floor/plasteel/neutral,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
@@ -11794,9 +11790,6 @@
icon_state = "1-2";
pixel_y = 0
},
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 10
},
/obj/machinery/light{
dir = 4;
icon_state = "tube1"
@@ -12429,11 +12422,9 @@
/turf/open/floor/plasteel,
/area/shuttle/supply)
"aza" = (
/obj/machinery/atmospherics/components/trinary/filter{
dir = 1;
/obj/machinery/atmospherics/components/trinary/filter/flipped{
filter_type = "n2";
name = "nitogren filter";
on = 1
name = "nitrogen filter"
},
/turf/open/floor/plasteel/yellow,
/area/engine/gravity_generator{
@@ -63633,6 +63624,7 @@
dir = 8
},
/obj/effect/turf_decal/bot,
/obj/machinery/portable_atmospherics/canister/freon,
/turf/open/floor/plasteel,
/area/engine/engineering)
"cqt" = (
@@ -79542,7 +79534,7 @@
})
"cUh" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/smartfridge/chemistry,
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/closed/wall,
/area/medical/medbay{
name = "Medbay Central"
@@ -81189,7 +81181,7 @@
/turf/open/floor/plating,
/area/toxins/xenobiology)
"cXc" = (
/obj/machinery/smartfridge/extract,
/obj/machinery/smartfridge/extract/preloaded,
/obj/machinery/light_switch{
pixel_x = -26
},
@@ -84274,7 +84266,7 @@
/turf/open/floor/plasteel/whiteyellow/corner,
/area/medical/chemistry)
"ddg" = (
/obj/machinery/smartfridge/chemistry,
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/closed/wall,
/area/medical/chemistry)
"ddh" = (
@@ -104905,7 +104897,7 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/machinery/smartfridge/chemistry/virology,
/obj/machinery/smartfridge/chemistry/virology/preloaded,
/obj/effect/turf_decal/stripes/line{
dir = 4
},
@@ -112327,6 +112319,29 @@
/obj/structure/displaycase/trophy,
/turf/open/floor/wood,
/area/library)
"ehS" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
icon_state = "freezer";
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
})
"ehT" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
},
/obj/machinery/meter,
/turf/open/floor/plasteel,
/area/engine/gravity_generator{
name = "Atmospherics Engine"
})
(1,1,1) = {"
aaa
@@ -136049,11 +136064,11 @@ aiW
apF
aqY
asd
ati
axL
aux
avM
awR
axL
ehS
axL
axL
asd
@@ -136311,7 +136326,7 @@ auy
avN
awS
axM
aqZ
ehT
azZ
aAV
aCc
@@ -136569,7 +136584,7 @@ ato
awT
axN
aza
aAa
ato
aAW
aCd
aDD
@@ -136825,7 +136840,7 @@ ebT
avO
auA
axO
azb
atk
atk
aAX
aCe
+3 -5
View File
@@ -56825,7 +56825,6 @@
icon_state = "4-8"
},
/turf/open/floor/plasteel{
desc = "";
icon_state = "L13";
name = "floor"
},
@@ -57517,7 +57516,6 @@
dir = 4
},
/turf/open/floor/plasteel{
desc = "";
icon_state = "L14"
},
/area/hallway/primary/central)
@@ -63162,7 +63160,7 @@
/turf/open/floor/plating,
/area/medical/chemistry)
"cfY" = (
/obj/machinery/smartfridge/chemistry,
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/closed/wall,
/area/medical/chemistry)
"cfZ" = (
@@ -77230,7 +77228,7 @@
},
/area/medical/virology)
"cDH" = (
/obj/machinery/smartfridge/chemistry/virology,
/obj/machinery/smartfridge/chemistry/virology/preloaded,
/obj/machinery/airalarm{
frequency = 1439;
pixel_y = 23
@@ -91079,7 +91077,7 @@
d2 = 8;
icon_state = "2-8"
},
/obj/machinery/smartfridge/extract,
/obj/machinery/smartfridge/extract/preloaded,
/obj/structure/cable/yellow{
d1 = 4;
d2 = 8;
+40 -53
View File
@@ -14511,14 +14511,6 @@
tag = "icon-4-8";
icon_state = "4-8"
},
/obj/structure/cable/white{
tag = "icon-2-4";
icon_state = "2-4"
},
/obj/structure/cable/white{
tag = "icon-2-8";
icon_state = "2-8"
},
/turf/open/floor/plasteel/vault{
dir = 5
},
@@ -14893,11 +14885,6 @@
/obj/item/stack/cable_coil/random,
/obj/item/stack/cable_coil/random,
/obj/machinery/light,
/obj/machinery/power/apc{
dir = 2;
name = "Bar APC";
pixel_y = -26
},
/obj/structure/cable/white,
/turf/open/floor/plasteel/black,
/area/crew_quarters/bar)
@@ -27034,7 +27021,7 @@
/turf/open/floor/plating,
/area/medical/chemistry)
"aRh" = (
/obj/machinery/smartfridge/chemistry,
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/closed/wall,
/area/medical/chemistry)
"aRi" = (
@@ -37371,7 +37358,7 @@
/turf/open/floor/plasteel,
/area/toxins/xenobiology)
"bjb" = (
/obj/machinery/smartfridge/extract,
/obj/machinery/smartfridge/extract/preloaded,
/obj/machinery/light{
dir = 1
},
@@ -77588,7 +77575,7 @@ aaa
aaa
aaa
aaa
bwn
bwb
aaa
aaa
aaa
@@ -77846,7 +77833,7 @@ aaa
aaa
bwb
bwo
bwA
bwb
aaa
aaa
aaa
@@ -78102,7 +78089,7 @@ aaa
aaa
aaa
bwc
bwp
bwi
bwB
aaa
aaa
@@ -78358,9 +78345,9 @@ aaa
aaa
aaa
aaa
bwd
bvS
bwq
bwC
bvS
aaa
aaa
aaa
@@ -78615,10 +78602,10 @@ aaa
aaa
aaa
bvS
bwe
bvS
bwr
bwD
bwM
bvS
bvS
aaa
aaa
aaa
@@ -78873,9 +78860,9 @@ aaa
aaa
bvT
bwf
bws
bwi
bwE
bwN
bvT
aaa
aaa
aaa
@@ -79128,11 +79115,11 @@ aaa
aaa
aaa
aaa
bvU
bwg
bwt
bwF
bwO
bvS
bwf
bwi
bwE
bvS
aaa
aaa
aaa
@@ -79385,11 +79372,11 @@ aaa
aaa
aaa
aaa
bvV
bvS
bwh
bwu
bwG
bwP
bwi
bwi
bvS
aaa
aaa
aaa
@@ -79645,7 +79632,7 @@ aaa
bvW
bwi
bwv
bwH
bwi
bwQ
aaa
aaa
@@ -79899,11 +79886,11 @@ aaa
aaa
aaa
aaa
bvX
bwj
bww
bvS
bwi
bwi
bwI
bwR
bvS
aaa
aaa
aaa
@@ -80156,11 +80143,11 @@ aaa
aaa
aaa
aaa
bvY
bwk
bwx
bwJ
bwS
bvS
bwf
bwi
bwE
bvS
aaa
aaa
aaa
@@ -80413,11 +80400,11 @@ aaa
aaa
aaa
aaa
bvZ
bwl
bwy
bwK
bwT
bvT
bwf
bwi
bwE
bvT
aaa
aaa
aaa
@@ -80670,11 +80657,11 @@ aaa
aaa
aaa
aaa
bwa
bwm
bvS
bvT
bwz
bwL
bwU
bvT
bvS
aaa
aaa
aaa
+24 -6
View File
@@ -30296,7 +30296,7 @@
},
/area/medical/chemistry)
"bjk" = (
/obj/machinery/smartfridge/chemistry,
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/closed/wall,
/area/medical/chemistry)
"bjl" = (
@@ -30534,7 +30534,7 @@
/turf/open/floor/plasteel/white,
/area/toxins/xenobiology)
"bjH" = (
/obj/machinery/smartfridge/extract,
/obj/machinery/smartfridge/extract/preloaded,
/turf/open/floor/plasteel/whitepurple/side{
dir = 4
},
@@ -40057,9 +40057,8 @@
/turf/open/floor/plasteel/white,
/area/medical/virology)
"bBf" = (
/obj/machinery/smartfridge/chemistry/virology,
/obj/machinery/smartfridge/chemistry/virology/preloaded,
/turf/open/floor/plasteel/whitegreen/side{
tag = "icon-whitegreen (EAST)";
icon_state = "whitegreen";
dir = 4
},
@@ -47063,6 +47062,11 @@
icon_state = "1-2"
},
/obj/effect/turf_decal/stripes/line,
/obj/structure/cable{
d1 = 1;
d2 = 4;
icon_state = "1-4"
},
/turf/open/floor/plasteel,
/area/engine/engineering)
"bPR" = (
@@ -50530,7 +50534,7 @@
/turf/open/floor/plasteel/white,
/area/medical/genetics)
"bXR" = (
/obj/machinery/smartfridge/chemistry,
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/open/floor/plasteel/black,
/area/medical/chemistry)
"bXS" = (
@@ -55915,6 +55919,20 @@
/obj/machinery/light,
/turf/open/floor/pod/light,
/area/shuttle/transport)
"cjQ" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/power/apc{
cell_type = 15000;
dir = 2;
name = "Engineering APC";
pixel_y = -24
},
/obj/structure/cable{
d2 = 8;
icon_state = "0-8"
},
/turf/open/floor/plasteel,
/area/engine/engineering)
(1,1,1) = {"
aaa
@@ -89496,7 +89514,7 @@ bNt
bOE
bNt
bNt
bPE
cjQ
bMb
bQy
bMb
+29 -19
View File
@@ -12384,7 +12384,7 @@
dir = 5
},
/turf/open/floor/plating,
/area/maintenance/fpmaint)
/area/gateway)
"aBj" = (
/obj/structure/rack{
dir = 8;
@@ -22145,7 +22145,7 @@
"aYa" = (
/obj/machinery/power/apc{
dir = 8;
name = "Locker Room Maintenance APC";
name = "Aft Port Maintenance APC";
pixel_x = -27;
pixel_y = 2
},
@@ -25158,7 +25158,7 @@
icon_state = "1-8"
},
/turf/open/floor/plating,
/area/maintenance/port)
/area/quartermaster/storage)
"bfl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
@@ -27089,7 +27089,7 @@
/turf/open/floor/plasteel,
/area/assembly/chargebay)
"bjQ" = (
/obj/machinery/smartfridge/chemistry,
/obj/machinery/smartfridge/chemistry/preloaded,
/turf/open/floor/plating,
/area/medical/chemistry)
"bjR" = (
@@ -27644,11 +27644,6 @@
/area/bridge/meeting_room)
"bkY" = (
/obj/effect/landmark/blobstart,
/obj/structure/cable{
d1 = 1;
d2 = 8;
icon_state = "1-8"
},
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -40912,7 +40907,7 @@
/turf/open/floor/plasteel/white,
/area/toxins/xenobiology)
"bMo" = (
/obj/machinery/smartfridge/extract,
/obj/machinery/smartfridge/extract/preloaded,
/turf/open/floor/plasteel/white,
/area/toxins/xenobiology)
"bMp" = (
@@ -44811,7 +44806,7 @@
/turf/open/floor/plating,
/area/maintenance/asmaint)
"bVa" = (
/obj/machinery/smartfridge/chemistry/virology,
/obj/machinery/smartfridge/chemistry/virology/preloaded,
/turf/open/floor/plasteel/whitegreen/side{
dir = 8
},
@@ -59567,7 +59562,7 @@
},
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/port)
/area/security/detectives_office)
"cCo" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -62012,11 +62007,26 @@
/obj/structure/window/reinforced{
dir = 4
},
/obj/item/weapon/grenade/plastic/c4,
/obj/item/weapon/grenade/plastic/c4,
/obj/item/weapon/grenade/plastic/c4,
/obj/item/weapon/grenade/plastic/c4,
/obj/item/weapon/grenade/plastic/c4,
/obj/item/weapon/grenade/plastic/c4{
pixel_x = 2;
pixel_y = -5
},
/obj/item/weapon/grenade/plastic/c4{
pixel_x = -3;
pixel_y = 3
},
/obj/item/weapon/grenade/plastic/c4{
pixel_x = 2;
pixel_y = -3
},
/obj/item/weapon/grenade/plastic/c4{
pixel_x = -2;
pixel_y = -1
},
/obj/item/weapon/grenade/plastic/c4{
pixel_x = 3;
pixel_y = 3
},
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -88791,7 +88801,7 @@ bda
bca
bgJ
aZP
bjD
bjB
bkY
bmo
bnP
@@ -99639,7 +99649,7 @@ bVu
bVu
bVu
bVu
apQ
bVu
bVu
csw
csw
+2 -2
View File
@@ -8913,10 +8913,10 @@
/area/centcom/ferry)
"vZ" = (
/obj/structure/table/reinforced,
/obj/item/weapon/c4{
/obj/item/weapon/grenade/plastic/c4{
pixel_x = 6
},
/obj/item/weapon/c4{
/obj/item/weapon/grenade/plastic/c4{
pixel_x = -4
},
/obj/machinery/firealarm{
+227
View File
@@ -0,0 +1,227 @@
"aa" = (/turf/open/space/basic,/area/space)
"ab" = (/turf/closed/wall/mineral/titanium,/area/shuttle/escape)
"ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
"ad" = (/turf/closed/wall/mineral/titanium/nodiagonal,/area/shuttle/escape)
"ae" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/crowbar,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/darkpurple,/area/shuttle/escape)
"af" = (/obj/machinery/computer/aifixer,/turf/open/floor/plasteel/darkpurple,/area/shuttle/escape)
"ag" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/open/floor/plasteel/darkpurple,/area/shuttle/escape)
"ah" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/black,/area/shuttle/escape)
"ai" = (/obj/machinery/computer/card,/turf/open/floor/plasteel/black,/area/shuttle/escape)
"aj" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/black,/area/shuttle/escape)
"ak" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/black,/area/shuttle/escape)
"al" = (/obj/structure/table,/turf/open/floor/plasteel/darkyellow,/area/shuttle/escape)
"am" = (/obj/machinery/computer/cargo/request,/turf/open/floor/plasteel/darkyellow,/area/shuttle/escape)
"an" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/firstaid/o2,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/darkyellow,/area/shuttle/escape)
"ao" = (/obj/structure/table,/turf/open/floor/plasteel/darkblue,/area/shuttle/escape)
"ap" = (/turf/open/floor/plasteel/darkblue,/area/shuttle/escape)
"aq" = (/obj/structure/chair/comfy/beige{tag = "icon-comfychair (NORTH)"; icon_state = "comfychair"; dir = 1},/turf/open/floor/plasteel/darkpurple,/area/shuttle/escape)
"ar" = (/turf/open/floor/plasteel/darkpurple,/area/shuttle/escape)
"as" = (/obj/machinery/computer/station_alert,/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/black,/area/shuttle/escape)
"at" = (/obj/structure/chair/office/light{tag = "icon-officechair_white (NORTH)"; icon_state = "officechair_white"; dir = 1},/turf/open/floor/plasteel/black,/area/shuttle/escape)
"au" = (/obj/machinery/computer/communications,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/black,/area/shuttle/escape)
"av" = (/turf/open/floor/plasteel/darkyellow,/area/shuttle/escape)
"aw" = (/obj/structure/chair/comfy/beige{tag = "icon-comfychair (NORTH)"; icon_state = "comfychair"; dir = 1},/turf/open/floor/plasteel/darkyellow,/area/shuttle/escape)
"ax" = (/turf/open/floor/plasteel/darkred,/area/shuttle/escape)
"ay" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/open/floor/plasteel/darkred,/area/shuttle/escape)
"az" = (/obj/machinery/computer/med_data,/turf/open/floor/plasteel/darkblue,/area/shuttle/escape)
"aA" = (/turf/open/floor/plasteel/darkpurple/side{dir = 1},/area/shuttle/escape)
"aB" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/open/floor/plasteel/black,/area/shuttle/escape)
"aC" = (/turf/open/floor/plasteel/black,/area/shuttle/escape)
"aD" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/open/floor/plasteel/black,/area/shuttle/escape)
"aE" = (/turf/open/floor/plasteel/darkyellow/side{tag = "icon-darkyellow (NORTH)"; icon_state = "darkyellow"; dir = 1},/area/shuttle/escape)
"aF" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/darkred,/area/shuttle/escape)
"aG" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/darkblue,/area/shuttle/escape)
"aH" = (/obj/structure/chair/comfy/beige{dir = 8},/turf/open/floor/plasteel/darkblue,/area/shuttle/escape)
"aI" = (/turf/open/floor/plasteel/darkblue/side{tag = "icon-darkblue (NORTH)"; dir = 1},/area/shuttle/escape)
"aJ" = (/turf/open/floor/plasteel/darkred/side{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1},/area/shuttle/escape)
"aK" = (/obj/structure/chair/comfy/beige{dir = 4},/turf/open/floor/plasteel/darkred,/area/shuttle/escape)
"aL" = (/obj/machinery/computer/secure_data,/turf/open/floor/plasteel/darkred,/area/shuttle/escape)
"aM" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-22"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/darkblue/side{tag = "icon-darkblue (NORTH)"; dir = 1},/area/shuttle/escape)
"aN" = (/obj/machinery/light,/turf/open/floor/plasteel/black,/area/shuttle/escape)
"aO" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/black,/area/shuttle/escape)
"aP" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-22"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/darkred/side{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1},/area/shuttle/escape)
"aQ" = (/obj/structure/table,/obj/machinery/recharger,/turf/open/floor/plasteel/darkred,/area/shuttle/escape)
"aR" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/black,/area/shuttle/escape)
"aS" = (/obj/structure/chair,/turf/open/floor/mineral/plastitanium/brig,/area/shuttle/escape)
"aT" = (/obj/structure/chair,/obj/machinery/light{dir = 1},/turf/open/floor/mineral/plastitanium/brig,/area/shuttle/escape)
"aU" = (/obj/structure/table,/obj/machinery/recharger,/obj/structure/reagent_dispensers/peppertank{pixel_x = -32},/turf/open/floor/mineral/plastitanium/brig{dir = 9; floor_tile = /obj/item/stack/tile/plasteel; icon_state = "darkred"},/area/shuttle/escape)
"aV" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"aW" = (/obj/structure/chair,/obj/machinery/light{dir = 1},/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"aX" = (/obj/structure/chair,/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"aY" = (/obj/structure/chair,/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred (NORTHEAST)"; icon_state = "darkred"; dir = 5; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"aZ" = (/turf/open/floor/plasteel/neutral/side{tag = "icon-neutral (WEST)"; icon_state = "neutral"; dir = 8},/area/shuttle/escape)
"ba" = (/turf/open/floor/plasteel/neutral/side{tag = "icon-neutral (EAST)"; icon_state = "neutral"; dir = 4},/area/shuttle/escape)
"bb" = (/obj/machinery/mech_bay_recharge_port{tag = "icon-recharge_port"; icon_state = "recharge_port"; dir = 2},/turf/open/floor/plasteel,/area/shuttle/escape)
"bc" = (/turf/open/floor/plasteel,/area/shuttle/escape)
"bd" = (/obj/structure/chair{dir = 4},/turf/open/floor/mineral/plastitanium/brig,/area/shuttle/escape)
"be" = (/turf/open/floor/mineral/plastitanium/brig,/area/shuttle/escape)
"bf" = (/obj/structure/chair{dir = 8},/obj/machinery/flasher{id = "shuttle_flasher"; pixel_x = 24; pixel_y = 6},/turf/open/floor/mineral/plastitanium/brig,/area/shuttle/escape)
"bg" = (/obj/machinery/button/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = -6},/obj/structure/table,/obj/machinery/recharger,/turf/open/floor/mineral/plastitanium/brig{dir = 8; floor_tile = /obj/item/stack/tile/plasteel; icon_state = "darkred"},/area/shuttle/escape)
"bh" = (/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred (NORTH)"; icon_state = "darkred"; dir = 1; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"bi" = (/turf/open/floor/mineral/plastitanium/brig{dir = 4; floor_tile = /obj/item/stack/tile/plasteel; icon_state = "darkred"},/area/shuttle/escape)
"bj" = (/turf/open/floor/mech_bay_recharge_floor,/area/shuttle/escape)
"bk" = (/obj/structure/chair{dir = 8},/turf/open/floor/mineral/plastitanium/brig,/area/shuttle/escape)
"bl" = (/turf/open/floor/mineral/plastitanium/brig{dir = 8; floor_tile = /obj/item/stack/tile/plasteel; icon_state = "darkred"},/area/shuttle/escape)
"bm" = (/turf/open/floor/mineral/plastitanium/brig{icon_state = "darkredfull"},/area/shuttle/escape)
"bn" = (/obj/machinery/door/airlock/glass_security{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/mineral/plastitanium/brig{icon_state = "darkredfull"},/area/shuttle/escape)
"bo" = (/obj/machinery/computer/mech_bay_power_console,/turf/open/floor/plasteel,/area/shuttle/escape)
"bp" = (/obj/structure/chair{dir = 4},/obj/machinery/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = 6},/turf/open/floor/mineral/plastitanium/brig,/area/shuttle/escape)
"bq" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/mineral/plastitanium/brig{icon_state = "darkredfull"},/area/shuttle/escape)
"br" = (/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred"; icon_state = "darkred"; dir = 2; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"bs" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -28},/turf/open/floor/plasteel/brown{tag = "icon-brown (WEST)"; icon_state = "brown"; dir = 8},/area/shuttle/escape)
"bt" = (/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/turf/open/floor/plasteel,/area/shuttle/escape)
"bu" = (/obj/effect/turf_decal/delivery,/obj/effect/turf_decal/stripes/line{tag = "icon-warningline (NORTH)"; icon_state = "warningline"; dir = 1},/obj/structure/closet,/obj/machinery/light{dir = 4},/turf/open/floor/plasteel/brown{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/shuttle/escape)
"bv" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape)
"bw" = (/obj/structure/chair{dir = 1},/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred (SOUTHWEST)"; icon_state = "darkred"; dir = 10; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"bx" = (/obj/structure/chair{dir = 1},/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred"; icon_state = "darkred"; dir = 2; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"by" = (/obj/structure/table,/obj/item/weapon/storage/box/teargas,/obj/item/weapon/storage/box/zipties,/turf/open/floor/mineral/plastitanium/brig{tag = "icon-darkred"; icon_state = "darkred"; dir = 2; floor_tile = /obj/item/stack/tile/plasteel},/area/shuttle/escape)
"bz" = (/obj/structure/chair{dir = 1},/turf/open/floor/mineral/plastitanium/brig{dir = 6; floor_tile = /obj/item/stack/tile/plasteel; icon_state = "darkred"},/area/shuttle/escape)
"bA" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/open/floor/plasteel/darkyellow,/area/shuttle/escape)
"bB" = (/turf/open/floor/plasteel/brown{tag = "icon-brown (WEST)"; icon_state = "brown"; dir = 8},/area/shuttle/escape)
"bC" = (/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel,/area/shuttle/escape)
"bD" = (/obj/effect/turf_decal/delivery,/obj/structure/closet/crate,/turf/open/floor/plasteel/brown{tag = "icon-brown (EAST)"; icon_state = "brown"; dir = 4},/area/shuttle/escape)
"bE" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dwidth = 15; height = 20; name = "Cere emergency shuttle"; port_angle = 90; preferred_direction = 2; width = 42},/turf/open/floor/plating,/area/shuttle/escape)
"bF" = (/obj/structure/closet/crate/bin,/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bG" = (/obj/structure/table,/obj/item/weapon/storage/box/cups,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bH" = (/obj/structure/reagent_dispensers/water_cooler,/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bI" = (/obj/structure/table,/obj/machinery/microwave,/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bJ" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bK" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bL" = (/obj/structure/sign/nanotrasen{pixel_x = -32; pixel_y = 32},/turf/open/floor/plasteel,/area/shuttle/escape)
"bM" = (/turf/open/floor/plasteel/brown{tag = "icon-brown (SOUTHWEST)"; icon_state = "brown"; dir = 10},/area/shuttle/escape)
"bN" = (/turf/open/floor/plasteel/brown,/area/shuttle/escape)
"bO" = (/obj/effect/turf_decal/delivery,/turf/open/floor/plasteel/brown,/area/shuttle/escape)
"bP" = (/obj/effect/turf_decal/delivery,/obj/structure/closet,/turf/open/floor/plasteel/brown{tag = "icon-brown (SOUTHEAST)"; icon_state = "brown"; dir = 6},/area/shuttle/escape)
"bQ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel,/area/shuttle/escape)
"bR" = (/turf/open/floor/plasteel/neutral/side{tag = "icon-neutral (NORTH)"; icon_state = "neutral"; dir = 1},/area/shuttle/escape)
"bS" = (/turf/open/floor/plasteel/neutral/corner{tag = "icon-neutralcorner (EAST)"; icon_state = "neutralcorner"; dir = 4},/area/shuttle/escape)
"bT" = (/turf/open/floor/plasteel/neutral/side,/area/shuttle/escape)
"bU" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/turf/open/floor/plasteel,/area/shuttle/escape)
"bV" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/machinery/light{dir = 4},/turf/open/floor/plasteel,/area/shuttle/escape)
"bW" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bX" = (/obj/structure/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"bY" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape)
"bZ" = (/obj/structure/extinguisher_cabinet{pixel_x = -28},/turf/open/floor/plasteel,/area/shuttle/escape)
"ca" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-21"; layer = 4.1},/turf/open/floor/plasteel,/area/shuttle/escape)
"cb" = (/obj/structure/sign/bluecross_2{pixel_x = 32; pixel_y = -32},/turf/open/floor/plasteel,/area/shuttle/escape)
"cc" = (/obj/machinery/light,/turf/open/floor/plasteel/neutral/side{tag = "icon-neutral (NORTH)"; icon_state = "neutral"; dir = 1},/area/shuttle/escape)
"cd" = (/obj/machinery/light{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-21"; layer = 4.1},/turf/open/floor/plasteel,/area/shuttle/escape)
"ce" = (/obj/machinery/door/airlock/glass_medical{name = "Emergency Shuttle Medbay"},/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cf" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/neutral/corner{tag = "icon-neutralcorner (WEST)"; icon_state = "neutralcorner"; dir = 8},/area/shuttle/escape)
"cg" = (/obj/machinery/light{dir = 4},/turf/open/floor/plasteel,/area/shuttle/escape)
"ch" = (/mob/living/simple_animal/bot/medbot{name = "Speedy* Recovery"},/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/shuttle/escape)
"ci" = (/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/shuttle/escape)
"cj" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/shuttle/escape)
"ck" = (/obj/machinery/atmospherics/components/unary/cryo_cell,/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/shuttle/escape)
"cl" = (/obj/machinery/atmospherics/components/unary/thermomachine/freezer,/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/shuttle/escape)
"cm" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/obj/item/weapon/wrench,/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/shuttle/escape)
"cn" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"co" = (/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/shuttle/escape)
"cp" = (/turf/open/floor/plasteel/white,/area/shuttle/escape)
"cq" = (/obj/machinery/atmospherics/pipe/simple/general/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/open/floor/plasteel/white,/area/shuttle/escape)
"cr" = (/obj/machinery/atmospherics/pipe/manifold/general/visible,/turf/open/floor/plasteel/white,/area/shuttle/escape)
"cs" = (/obj/machinery/atmospherics/pipe/simple/general/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/open/floor/plasteel/white,/area/shuttle/escape)
"ct" = (/turf/open/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (EAST)"; icon_state = "whitebluecorner"; dir = 4},/area/shuttle/escape)
"cu" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/obj/machinery/light{dir = 4},/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/shuttle/escape)
"cv" = (/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/shuttle/escape)
"cw" = (/turf/open/floor/plasteel/whiteblue/side,/area/shuttle/escape)
"cx" = (/turf/open/floor/plasteel/whiteblue/corner{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/shuttle/escape)
"cy" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/shuttle/escape)
"cz" = (/obj/machinery/computer/arcade,/turf/open/floor/plasteel/neutral,/area/shuttle/escape)
"cA" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cB" = (/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cC" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/obj/machinery/iv_drip,/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cD" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/shuttle/escape)
"cE" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/random,/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cF" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/hemostat,/obj/item/weapon/surgicaldrill,/obj/item/weapon/cautery{pixel_x = 4},/obj/item/weapon/retractor,/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cG" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/crowbar,/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/shuttle/escape)
"cH" = (/obj/machinery/computer/operating,/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cI" = (/obj/structure/table/optable,/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cJ" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/item/clothing/suit/apron/surgical,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/surgical_drapes,/obj/item/weapon/razor,/turf/open/floor/plasteel/whiteblue,/area/shuttle/escape)
"cK" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/shuttle/escape)
"cL" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 1},/turf/open/floor/plasteel/whiteblue/side,/area/shuttle/escape)
"cM" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/whiteblue/side,/area/shuttle/escape)
"cN" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/plasteel/whiteblue/side{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/shuttle/escape)
"cO" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/neutral/side{tag = "icon-neutral (NORTH)"; icon_state = "neutral"; dir = 1},/area/shuttle/escape)
"cP" = (/obj/machinery/door/airlock/glass_engineering{name = "Engine Room"; req_one_access_txt = "10;24"},/turf/open/floor/plasteel/yellow,/area/shuttle/escape)
"cQ" = (/obj/machinery/door/airlock{name = "Bathroom"},/turf/open/floor/plasteel/freezer,/area/shuttle/escape)
"cR" = (/turf/open/floor/plasteel/freezer,/area/shuttle/escape)
"cS" = (/obj/structure/toilet{icon_state = "toilet00"; dir = 8},/obj/machinery/light/small{dir = 4},/turf/open/floor/plasteel/freezer,/area/shuttle/escape)
"cT" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (NORTHWEST)"; icon_state = "yellow"; dir = 9},/area/shuttle/escape)
"cU" = (/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (NORTH)"; icon_state = "yellow"; dir = 1},/area/shuttle/escape)
"cV" = (/obj/machinery/light{dir = 1},/obj/machinery/computer/monitor,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (NORTH)"; icon_state = "yellow"; dir = 1},/area/shuttle/escape)
"cW" = (/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (NORTHEAST)"; icon_state = "yellow"; dir = 5},/area/shuttle/escape)
"cX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/open/floor/plasteel/freezer,/area/shuttle/escape)
"cY" = (/obj/machinery/light{dir = 4},/turf/open/floor/plasteel/freezer,/area/shuttle/escape)
"cZ" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (SOUTHWEST)"; icon_state = "yellow"; dir = 10},/area/shuttle/escape)
"da" = (/turf/open/floor/plasteel/yellow/corner{tag = "icon-yellowcorner (WEST)"; icon_state = "yellowcorner"; dir = 8},/area/shuttle/escape)
"db" = (/turf/open/floor/plasteel/yellow/corner{tag = "icon-yellowcorner (EAST)"; icon_state = "yellowcorner"; dir = 4},/area/shuttle/escape)
"dc" = (/obj/structure/table,/obj/item/weapon/storage/box/metalfoam,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (NORTH)"; icon_state = "yellow"; dir = 1},/area/shuttle/escape)
"dd" = (/obj/structure/table,/obj/item/stack/sheet/metal/fifty,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (NORTH)"; icon_state = "yellow"; dir = 1},/area/shuttle/escape)
"de" = (/obj/structure/table,/obj/item/stack/sheet/glass/fifty,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (NORTHEAST)"; icon_state = "yellow"; dir = 5},/area/shuttle/escape)
"df" = (/obj/structure/urinal{pixel_y = -32},/turf/open/floor/plasteel/freezer,/area/shuttle/escape)
"dg" = (/obj/machinery/light/small{dir = 4},/obj/machinery/recharge_station,/turf/open/floor/plasteel/freezer,/area/shuttle/escape)
"dh" = (/obj/structure/reagent_dispensers/watertank/high,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (SOUTHWEST)"; icon_state = "yellow"; dir = 10},/area/shuttle/escape)
"di" = (/obj/structure/sign/electricshock{pixel_x = 32},/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (EAST)"; icon_state = "yellow"; dir = 4},/area/shuttle/escape)
"dj" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (SOUTHWEST)"; icon_state = "yellow"; dir = 10},/area/shuttle/escape)
"dk" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/electrical,/turf/open/floor/plasteel/yellow/side,/area/shuttle/escape)
"dl" = (/obj/structure/table,/obj/structure/sign/enginesafety{pixel_y = -32},/turf/open/floor/plasteel/yellow/side,/area/shuttle/escape)
"dm" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/yellow/side,/area/shuttle/escape)
"dn" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/yellow/side,/area/shuttle/escape)
"do" = (/obj/machinery/light,/turf/open/floor/plasteel/yellow/side,/area/shuttle/escape)
"dp" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/yellow/side{tag = "icon-yellow (SOUTHEAST)"; icon_state = "yellow"; dir = 6},/area/shuttle/escape)
"dq" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/open/floor/plating,/area/shuttle/escape)
"dr" = (/turf/open/floor/plating,/area/shuttle/escape)
"ds" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/open/floor/plating,/area/shuttle/escape)
"dt" = (/obj/machinery/power/terminal{tag = "icon-term (EAST)"; icon_state = "term"; dir = 4},/turf/open/floor/plating,/area/shuttle/escape)
"du" = (/obj/machinery/power/smes/engineering,/turf/open/floor/plating,/area/shuttle/escape)
"dv" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plating,/area/shuttle/escape)
"dw" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating,/area/shuttle/escape)
"dx" = (/obj/machinery/power/port_gen/pacman,/turf/open/floor/plating,/area/shuttle/escape)
"dy" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
"dz" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
(1,1,1) = {"
aaaaaaaaabaaaaaaaaaaaaaaaaaaaaabaaaaaaaa
aaaaaaababaaaaaaaaaaaaaaaaaaaaababaaaaaa
aaaaababababacacacacacacacacababababaaaa
aaaaababadaeafagahaiajakalamanadababaaaa
aaaaababaoapaqarasatatauavawaxayababaaaa
aaabababazapapaAaBaCaCaDaEaxaxaFabababaa
aaabababaGaHaIaCaCaCaCaCaCaJaKaLabababaa
ababababaoaMaNaCaCaCaOaCaCaNaPaQabababab
abababababababababababaRaRababababababab
abaSaTaSabaUaVaWaXaYabaZbaabbbbcbbbcbbab
abbdbebfabbgbhbhbhbiacaZbaabbjbcbjbcbjab
abbdbebkacblblbmbibibnaZbaabbobcbobcboab
abbpbebebqblbrbrbrbibnaZbaabbsbtbtbtbuab
bvbebebkacbwbxbybxbzacaZbabAbBbcbCbcbDab
ababababababacacacabadaZbabAbBbcbCbcbDab
bEbcbcbabFbGbHbIbJbKaZbLbaabbMbNbObNbPab
abadbQbcbRbRbRbRbRbRbcbcbSadabababababab
aaacbcbcbTbTbTbTbTbcbcbTbTbTbTbTbUbVabaa
aaacbcbabWbXbTbWbXaZbabWbXbTbWbXaZbcacaa
aaacbcbabWbXbTbWbXaZbabWbXbTbWbXaZbcacaa
abadbQbabWbXbTbWbXaZbabWbXbTbWbXaZbcacaa
bYbcbcbabWbXbTbWbXaZbabWbXbTbWbXaZbcacaa
abbZbcbabWbXbTbWbXaZbabWbXbTbWbXaZbcacaa
bYbcbcbabWbXbTbWbXaZbabWbXbTbWbXaZbcacaa
abadbQbabWbXbTbWbXaZbabWbXbTbWbXaZbcacaa
aaabcabcbRbRbRbRbRbccbbRccbRbRbRbccdabaa
aaabcabcbTbTbTbTbTbcbcadabceacabacababaa
abadcfbabWbXbTbWbXaZcgabchcicjckclcmadab
abcnaZbabWbXbTbWbXaZbccecocpcqcrcsctcuab
accnaZbabWbXbTbWbXaZbcabcvcwcwcxcpcpcyac
acczaZbabWbXbTbWbXaZbcabcAcBcCcocpcpcDac
acczaZbabWbXbTbWbXaZbcabcEcBcFcocpcpcGac
accnaZbabWbXbTbWbXaZbcabcHcIcJcKcLcMcNab
accnaZbcccbRbRbRcObccgababababababababab
ababacacabaccPacadcabccQcRcRcRcRcRcQcSab
abcTcUcUcVcUcUcWadabababcXcRcRcRcYababab
abcZdabcbcbcbcdbdcdddeabcXdfdfdfcRcQdgab
abaddhdabcbcbcbcbcbcdiababababababababab
aaabaddjdkdldmdndndodpdqdrdrdsdtduababaa
aaababababababababababaddvdwdxdtduababaa
aaaaabdydydydydydyadaddydydydydydyabaaaa
aaaaabdzdzdzdzdzdzadaddzdzdzdzdzdzabaaaa
"}
+73
View File
@@ -0,0 +1,73 @@
"aa" = (/turf/open/space/basic,/area/space)
"ab" = (/turf/closed/wall/mineral/titanium,/area/shuttle/abandoned)
"ac" = (/obj/machinery/door/airlock/titanium{name = "mech bay external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 8; height = 16; id = "whiteship"; launch_status = 0; name = "NT Recovery White-Ship"; port_angle = -90; preferred_direction = 1; roundstart_move = "whiteship_away"; width = 16},/turf/open/floor/plating,/area/shuttle/abandoned)
"ad" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
"ae" = (/obj/machinery/mech_bay_recharge_port{tag = "icon-recharge_port"; icon_state = "recharge_port"; dir = 2},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"af" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"ag" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"ah" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium,/area/shuttle/abandoned)
"ai" = (/obj/effect/decal/cleanable/cobweb/cobweb2,/obj/structure/frame/machine,/obj/item/stack/cable_coil,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aj" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/open/floor/plating/airless,/area/shuttle/abandoned)
"ak" = (/obj/structure/mecha_wreckage/ripley,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mech_bay_recharge_floor,/area/shuttle/abandoned)
"al" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"am" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium,/area/shuttle/abandoned)
"an" = (/obj/effect/spawner/lootdrop{loot = list(/obj/mecha/working/ripley/mining = 1, /obj/structure/mecha_wreckage/ripley = 5); lootdoubles = 0; name = "25% mech 75% wreckage ripley spawner"},/turf/open/floor/mech_bay_recharge_floor,/area/shuttle/abandoned)
"ao" = (/obj/machinery/computer/mech_bay_power_console,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"ap" = (/obj/machinery/computer/mech_bay_power_console,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aq" = (/obj/machinery/door/airlock/titanium{name = "mech bay"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"ar" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/abandoned)
"as" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/structure/closet/crate{name = "spare equipment crate"},/obj/item/stack/sheet/metal/fifty,/obj/item/stack/sheet/metal/fifty,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"at" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"au" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"av" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/structure/closet/crate{icon_state = "crateopen"; name = "spare equipment crate"; opened = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aw" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"ax" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/structure/closet/crate{icon_state = "crateopen"; name = "spare equipment crate"; opened = 1},/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/storage/toolbox/emergency/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"ay" = (/turf/closed/wall/mineral/titanium/nodiagonal,/area/shuttle/abandoned)
"az" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/machinery/button/door{id = "cerewhiteleft"; name = "Cargo Blast Door Toggle"; pixel_x = -24},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aA" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aB" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/structure/closet/crate{icon_state = "crateopen"; name = "spare equipment crate"; opened = 1},/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aC" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aD" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/structure/closet/crate{name = "spare equipment crate"},/obj/item/stack/sheet/glass/fifty,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aE" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/machinery/button/door{id = "cerewhiteright"; name = "Cargo Blast Door Toggle"; pixel_x = 24},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aF" = (/obj/machinery/door/poddoor{id = "cerewhiteleft"},/turf/open/floor/plating,/area/shuttle/abandoned)
"aG" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium,/area/shuttle/abandoned)
"aH" = (/obj/machinery/door/poddoor{id = "cerewhiteright"},/turf/open/floor/plating,/area/shuttle/abandoned)
"aI" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/structure/closet/crate{name = "spare equipment crate"},/obj/item/weapon/storage/toolbox/mechanical/old,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/item/clothing/glasses/welding,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aJ" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/structure/closet/crate{icon_state = "crateopen"; name = "spare equipment crate"; opened = 1},/obj/machinery/light,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aK" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium,/area/shuttle/abandoned)
"aL" = (/obj/effect/turf_decal/delivery{dir = 1},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/light,/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aM" = (/obj/structure/ore_box,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aN" = (/obj/machinery/door/airlock/titanium{name = "cockpit"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aO" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/structure/tank_dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/open/floor/mineral/titanium/yellow,/area/shuttle/abandoned)
"aP" = (/obj/structure/table,/obj/item/device/gps{gpstag = "NTCONST1"; pixel_x = -1; pixel_y = 2},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aQ" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aR" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aS" = (/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aT" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb/cobweb2,/obj/item/weapon/storage/firstaid/regular,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/machinery/light{dir = 1},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aU" = (/obj/structure/table,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aV" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aW" = (/obj/structure/chair/comfy/black,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aX" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"aY" = (/turf/open/space,/area/space)
"aZ" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"ba" = (/obj/machinery/computer/shuttle/white_ship,/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
"bb" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 6},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/mineral/titanium/blue,/area/shuttle/abandoned)
(1,1,1) = {"
aaaaababababacababababaaaa
aaadabaeafagahagafaiabadaa
aaajabakagalamagaganabajaa
aaababaoagalamagagapababaa
adababababaqaraqababababad
ajababasatauahavawaxababaj
ayayazaAaAaBahauaCaDaEayay
aFahaGamamamamaGamamamaGaH
aFahaGahaGaGaGaGamamaGahaH
ayayaIaAaJaKaGaGaLavauayay
aaabaMababaNaraNababaOabaa
aaabababaPaQaRaSaTabababaa
aaabababaUaRaQaSaUabababaa
aaaaabaVaSaQaWaRaRaXabaaaa
aYaaabababaZbabbabababaaaa
aYaYaaaaabarararabaaaaaaaa
"}
+5 -8
View File
@@ -81,9 +81,6 @@
#define DNA_MUTANTTAIL_BLOCK 17
#define DNA_MUTANTWING_BLOCK 18
#define DNA_WINGCOLOR_BLOCK 19
//#define DNA_SUBSPECIES_BLOCK 20
//#define DNA_TAUR_BLOCK 21 //Taurs will be tails for now, easier - Pooj
#define DNA_STRUC_ENZYMES_BLOCKS 19
#define DNA_UNIQUE_ENZYMES_LEN 32
@@ -128,9 +125,9 @@
#define EASYLIMBATTACHMENT 23
#define TOXINLOVER 24
#define DIGITIGRADE 25 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
#define MUTCOLORS2 26
#define MUTCOLORS3 27
#define NO_UNDERWEAR 26
#define MUTCOLORS2 27
#define MUTCOLORS3 28
//citadel code
#define NOAROUSAL 28//Stops all arousal effects
#define NOGENITALS 29//Cannot create, use, or otherwise have genitals
//#define SUBSPECIES 28
#define NOAROUSAL 29//Stops all arousal effects
#define NOGENITALS 30//Cannot create, use, or otherwise have genitals
+8 -11
View File
@@ -24,39 +24,36 @@
//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier)
//subsystem should fire during pre-game lobby.
#define SS_FIRE_IN_LOBBY 1
//subsystem does not initialize.
#define SS_NO_INIT 2
#define SS_NO_INIT 1
//subsystem does not fire.
// (like can_fire = 0, but keeps it from getting added to the processing subsystems list)
// (Requires a MC restart to change)
#define SS_NO_FIRE 4
#define SS_NO_FIRE 2
//subsystem only runs on spare cpu (after all non-background subsystems have ran that tick)
// SS_BACKGROUND has its own priority bracket
#define SS_BACKGROUND 8
#define SS_BACKGROUND 4
//subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background))
#define SS_NO_TICK_CHECK 16
#define SS_NO_TICK_CHECK 8
//Treat wait as a tick count, not DS, run every wait ticks.
// (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems)
// (implies SS_FIRE_IN_LOBBY because of how it works)
// (implies all runlevels because of how it works)
// (overrides SS_BACKGROUND)
// This is designed for basically anything that works as a mini-mc (like SStimer)
#define SS_TICKER 32
#define SS_TICKER 16
//keep the subsystem's timing on point by firing early if it fired late last fire because of lag
// ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds.
#define SS_KEEP_TIMING 64
#define SS_KEEP_TIMING 32
//Calculate its next fire after its fired.
// (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be)
// This flag overrides SS_KEEP_TIMING
#define SS_POST_FIRE_TIMING 128
#define SS_POST_FIRE_TIMING 64
//SUBSYSTEM STATES
#define SS_IDLE 0 //aint doing shit.
+8 -3
View File
@@ -1,3 +1,8 @@
#define ANTAG_DATUM_CULT /datum/antagonist/cult
#define ANTAG_DATUM_CLOCKCULT /datum/antagonist/clockcult
#define ANTAG_DATUM_CLOCKCULT_SILENT /datum/antagonist/clockcult/silent
#define ANTAG_DATUM_CULT /datum/antagonist/cult
#define ANTAG_DATUM_CULT_MASTER /datum/antagonist/cult/master
#define ANTAG_DATUM_CLOCKCULT /datum/antagonist/clockcult
#define ANTAG_DATUM_CLOCKCULT_SILENT /datum/antagonist/clockcult/silent
#define ANTAG_DATUM_DEVIL /datum/antagonist/devil
#define ANTAG_DATUM_NINJA /datum/antagonist/ninja
#define ANTAG_DATUM_NINJA_FRIENDLY /datum/antagonist/ninja/friendly
#define ANTAG_DATUM_NINJA_RANDOM /datum/antagonist/ninja/randomAllegiance/
+3 -2
View File
@@ -14,8 +14,9 @@
#define GAS_META 3
#define META_GAS_SPECIFIC_HEAT 1
#define META_GAS_NAME 2
#define META_GAS_OVERLAY 4
#define META_GAS_MOLES_VISIBLE 3
#define META_GAS_OVERLAY 4
#define META_GAS_DANGER 5
//stuff you should probably leave well alone!
//ATMOS
@@ -169,4 +170,4 @@
#define ATMOS_PASS_NO 0
#define ATMOS_PASS_PROC -1 //ask CanAtmosPass()
#define ATMOS_PASS_DENSITY -2 //just check density
#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) )
#define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) )
+1
View File
@@ -3,6 +3,7 @@
#define CONTRACT_PRESTIGE "prestige"
#define CONTRACT_MAGIC "magic"
#define CONTRACT_REVIVE "revive"
#define CONTRACT_FRIEND "friend"
#define CONTRACT_KNOWLEDGE "knowledge"
#define CONTRACT_UNWILLING "unwilling"
+9
View File
@@ -0,0 +1,9 @@
//rune colors, for easy reference
#define RUNE_COLOR_TALISMAN "#0000FF"
#define RUNE_COLOR_TELEPORT "#551A8B"
#define RUNE_COLOR_OFFER "#FFFFFF"
#define RUNE_COLOR_DARKRED "#7D1717"
#define RUNE_COLOR_MEDIUMRED "#C80000"
#define RUNE_COLOR_RED "#FF0000"
#define RUNE_COLOR_EMP "#4D94FF"
#define RUNE_COLOR_SUMMON "#00FF00"
+3
View File
@@ -4,6 +4,8 @@
#define ALL ~0 //For convenience.
#define NONE 0
GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768))
//FLAGS BITMASK
#define STOPSPRESSUREDMAGE 1 //This flag is used on the flags variable for SUIT and HEAD items which stop pressure damage. Note that the flag 1 was previous used as ONBACK, so it is possible for some code to use (flags & 1) when checking if something can be put on your back. Replace this code with (inv_flags & SLOT_BACK) if you see it anywhere
//To successfully stop you taking all pressure damage you must have both a suit and head item with this flag.
@@ -25,6 +27,7 @@
#define BLOCK_GAS_SMOKE_EFFECT 4096 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body.
#define DROPDEL 16384 // When dropped, it calls qdel on itself
#define PREVENT_CLICK_UNDER 32768 //Prevent clicking things below it on the same turf eg. doors/ fulltile windows
/* Secondary atom flags, access using the SECONDARY_FLAG macros */
+41 -41
View File
@@ -1,43 +1,43 @@
#define ENGSEC (1<<0)
#define CAPTAIN (1<<0)
#define HOS (1<<1)
#define WARDEN (1<<2)
#define DETECTIVE (1<<3)
#define OFFICER (1<<4)
#define CHIEF (1<<5)
#define ENGINEER (1<<6)
#define ATMOSTECH (1<<7)
#define ROBOTICIST (1<<8)
#define AI_JF (1<<9)
#define CYBORG (1<<10)
#define MEDSCI (1<<1)
#define RD_JF (1<<0)
#define SCIENTIST (1<<1)
#define CHEMIST (1<<2)
#define CMO_JF (1<<3)
#define DOCTOR (1<<4)
#define GENETICIST (1<<5)
#define VIROLOGIST (1<<6)
#define CIVILIAN (1<<2)
#define HOP (1<<0)
#define BARTENDER (1<<1)
#define BOTANIST (1<<2)
#define COOK (1<<3)
#define JANITOR (1<<4)
#define ENGSEC (1<<0)
#define CAPTAIN (1<<0)
#define HOS (1<<1)
#define WARDEN (1<<2)
#define DETECTIVE (1<<3)
#define OFFICER (1<<4)
#define CHIEF (1<<5)
#define ENGINEER (1<<6)
#define ATMOSTECH (1<<7)
#define ROBOTICIST (1<<8)
#define AI_JF (1<<9)
#define CYBORG (1<<10)
#define MEDSCI (1<<1)
#define RD_JF (1<<0)
#define SCIENTIST (1<<1)
#define CHEMIST (1<<2)
#define CMO_JF (1<<3)
#define DOCTOR (1<<4)
#define GENETICIST (1<<5)
#define VIROLOGIST (1<<6)
#define CIVILIAN (1<<2)
#define HOP (1<<0)
#define BARTENDER (1<<1)
#define BOTANIST (1<<2)
#define COOK (1<<3)
#define JANITOR (1<<4)
#define CURATOR (1<<5)
#define QUARTERMASTER (1<<6)
#define CARGOTECH (1<<7)
#define MINER (1<<8)
#define LAWYER (1<<9)
#define CHAPLAIN (1<<10)
#define CLOWN (1<<11)
#define MIME (1<<12)
#define QUARTERMASTER (1<<6)
#define CARGOTECH (1<<7)
#define MINER (1<<8)
#define LAWYER (1<<9)
#define CHAPLAIN (1<<10)
#define CLOWN (1<<11)
#define MIME (1<<12)
#define ASSISTANT (1<<13)
+3
View File
@@ -2,3 +2,6 @@
#define TONGUELESS_SPEECH 2
#define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4
#define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8
#define LANGUAGE_KNOWN "language_known"
#define LANGUAGE_SHADOWED "language_shadowed"
+4
View File
@@ -407,3 +407,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
//Error handler defines
#define ERROR_USEFUL_LEN 2
#define NO_FIELD 0
#define FIELD_TURF 1
#define FIELD_EDGE 2
+2
View File
@@ -38,3 +38,5 @@
#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
-10
View File
@@ -1,10 +0,0 @@
diff a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm (rejected hunks)
@@ -33,4 +33,8 @@
#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run
+#define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor
+#define MAX_MANIA_SEVERITY 100 //how high the mania severity can go
+#define MANIA_DAMAGE_TO_CONVERT 90 //how much damage is required before it'll convert affected targets
+
#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
+11
View File
@@ -46,6 +46,7 @@
#define INIT_ORDER_TICKER 13
#define INIT_ORDER_MAPPING 12
#define INIT_ORDER_ATOMS 11
#define INIT_ORDER_LANGUAGE 10
#define INIT_ORDER_MACHINES 9
#define INIT_ORDER_SHUTTLE 3
#define INIT_ORDER_TIMER 1
@@ -60,3 +61,13 @@
#define INIT_ORDER_LIGHTING -20
#define INIT_ORDER_SQUEAK -40
#define INIT_ORDER_PERSISTENCE -100
// SS runlevels
#define RUNLEVEL_INIT 0
#define RUNLEVEL_LOBBY 1
#define RUNLEVEL_SETUP 2
#define RUNLEVEL_GAME 4
#define RUNLEVEL_POSTGAME 8
#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME)
+490 -490
View File
@@ -1,491 +1,491 @@
/*
* Holds procs to help with list operations
* Contains groups:
* Misc
* Sorting
*/
/*
* Misc
*/
//Returns a list in plain english as a string
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
var/total = input.len
if (!total)
return "[nothing_text]"
else if (total == 1)
return "[input[1]]"
else if (total == 2)
return "[input[1]][and_text][input[2]]"
else
var/output = ""
var/index = 1
while (index < total)
if (index == total - 1)
comma_text = final_comma_text
output += "[input[index]][comma_text]"
index++
return "[output][and_text][input[index]]"
//Returns list element or null. Should prevent "index out of bounds" error.
/proc/listgetindex(list/L, index)
if(istype(L))
if(isnum(index) && IsInteger(index))
if(IsInRange(index,1,L.len))
return L[index]
else if(index in L)
return L[index]
return
//Return either pick(list) or null if list is not of type /list or is empty
/proc/safepick(list/L)
if(istype(L) && L.len)
return pick(L)
//Checks if the list is empty
/proc/isemptylist(list/L)
if(!L.len)
return 1
return 0
//Checks for specific types in a list
/proc/is_type_in_list(atom/A, list/L)
if(!L || !L.len || !A)
return 0
for(var/type in L)
if(istype(A, type))
return 1
return 0
//Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches')
/proc/is_type_in_typecache(atom/A, list/L)
if(!L || !L.len || !A)
return 0
if(ispath(A))
. = L[A]
else
. = L[A.type]
//Checks for a string in a list
/proc/is_string_in_list(string, list/L)
if(!L || !L.len || !string)
return
for(var/V in L)
if(string == V)
return 1
return
//Removes a string from a list
/proc/remove_strings_from_list(string, list/L)
if(!L || !L.len || !string)
return
for(var/V in L)
if(V == string)
L -= V //No return here so that it removes all strings of that type
return
//returns a new list with only atoms that are in typecache L
/proc/typecache_filter_list(list/atoms, list/typecache)
. = list()
for (var/thing in atoms)
var/atom/A = thing
if (typecache[A.type])
. += A
//Like typesof() or subtypesof(), but returns a typecache instead of a list
/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE)
if(ispath(path))
var/list/types = list()
if(only_root_path)
types = list(path)
else
types = ignore_root_path ? subtypesof(path) : typesof(path)
var/list/L = list()
for(var/T in types)
L[T] = TRUE
return L
else if(islist(path))
var/list/pathlist = path
var/list/L = list()
if(ignore_root_path)
for(var/P in pathlist)
for(var/T in subtypesof(P))
L[T] = TRUE
else
for(var/P in pathlist)
if(only_root_path)
L[P] = TRUE
else
for(var/T in typesof(P))
L[T] = TRUE
return L
//Empties the list by setting the length to 0. Hopefully the elements get garbage collected
/proc/clearlist(list/list)
if(istype(list))
list.len = 0
return
//Removes any null entries from the list
/proc/listclearnulls(list/L)
var/list/N = new(L.len)
L -= N
/*
* Returns list containing all the entries from first list that are not present in second.
* If skiprep = 1, repeated elements are treated as one.
* If either of arguments is not a list, returns null
*/
/proc/difflist(list/first, list/second, skiprep=0)
if(!islist(first) || !islist(second))
return
var/list/result = new
if(skiprep)
for(var/e in first)
if(!(e in result) && !(e in second))
result += e
else
result = first - second
return result
/*
* Returns list containing entries that are in either list but not both.
* If skipref = 1, repeated elements are treated as one.
* If either of arguments is not a list, returns null
*/
/proc/uniquemergelist(list/first, list/second, skiprep=0)
if(!islist(first) || !islist(second))
return
var/list/result = new
if(skiprep)
result = difflist(first, second, skiprep)+difflist(second, first, skiprep)
else
result = first ^ second
return result
//Pretends to pick an element based on its weight but really just seems to pick a random element.
/proc/pickweight(list/L)
var/total = 0
var/item
for (item in L)
if (!L[item])
L[item] = 1
total += L[item]
total = rand(1, total)
for (item in L)
total -=L [item]
if (total <= 0)
return item
return null
//Pick a random element from the list and remove it from the list.
/proc/pick_n_take(list/L)
if(L.len)
var/picked = rand(1,L.len)
. = L[picked]
L.Cut(picked,picked+1) //Cut is far more efficient that Remove()
//Returns the top(last) element from the list and removes it from the list (typical stack function)
/proc/pop(list/L)
if(L.len)
. = L[L.len]
L.len--
/proc/popleft(list/L)
if(L.len)
. = L[1]
L.Cut(1,2)
/proc/sorted_insert(list/L, thing, comparator)
var/pos = L.len
while(pos > 0 && call(comparator)(thing, L[pos]) > 0)
pos--
L.Insert(pos+1, thing)
// Returns the next item in a list
/proc/next_list_item(item, list/L)
var/i
i = L.Find(item)
if(i == L.len)
i = 1
else
i++
return L[i]
// Returns the previous item in a list
/proc/previous_list_item(item, list/L)
var/i
i = L.Find(item)
if(i == 1)
i = L.len
else
i--
return L[i]
//Randomize: Return the list in a random order
/proc/shuffle(list/L)
if(!L)
return
L = L.Copy()
for(var/i=1, i<L.len, ++i)
L.Swap(i,rand(i,L.len))
return L
//same, but returns nothing and acts on list in place
/proc/shuffle_inplace(list/L)
if(!L)
return
for(var/i=1, i<L.len, ++i)
L.Swap(i,rand(i,L.len))
//Return a list with no duplicate entries
/proc/uniqueList(list/L)
. = list()
for(var/i in L)
. |= i
//same, but returns nothing and acts on list in place (also handles associated values properly)
/proc/uniqueList_inplace(list/L)
var/temp = L.Copy()
L.len = 0
for(var/key in temp)
if (isnum(key))
L |= key
else
L[key] = temp[key]
//for sorting clients or mobs by ckey
/proc/sortKey(list/L, order=1)
return sortTim(L, order >= 0 ? /proc/cmp_ckey_asc : /proc/cmp_ckey_dsc)
//Specifically for record datums in a list.
/proc/sortRecord(list/L, field = "name", order = 1)
GLOB.cmp_field = field
return sortTim(L, order >= 0 ? /proc/cmp_records_asc : /proc/cmp_records_dsc)
//any value in a list
/proc/sortList(list/L, cmp=/proc/cmp_text_asc)
return sortTim(L.Copy(), cmp)
//uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead
/proc/sortNames(list/L, order=1)
return sortTim(L, order >= 0 ? /proc/cmp_name_asc : /proc/cmp_name_dsc)
//Converts a bitfield to a list of numbers (or words if a wordlist is provided)
/proc/bitfield2list(bitfield = 0, list/wordlist)
var/list/r = list()
if(istype(wordlist,/list))
var/max = min(wordlist.len,16)
var/bit = 1
for(var/i=1, i<=max, i++)
if(bitfield & bit)
r += wordlist[i]
bit = bit << 1
else
for(var/bit=1, bit<=65535, bit = bit << 1)
if(bitfield & bit)
r += bit
return r
// Returns the key based on the index
#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null)
/proc/count_by_type(list/L, type)
var/i = 0
for(var/T in L)
if(istype(T, type))
i++
return i
/proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L)
if(R.fields[field] == value)
return R
//Move a single element from position fromIndex within a list, to position toIndex
//All elements in the range [1,toIndex) before the move will be before the pivot afterwards
//All elements in the range [toIndex, L.len+1) before the move will be after the pivot afterwards
//In other words, it's as if the range [fromIndex,toIndex) have been rotated using a <<< operation common to other languages.
//fromIndex and toIndex must be in the range [1,L.len+1]
//This will preserve associations ~Carnie
/proc/moveElement(list/L, fromIndex, toIndex)
if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move
return
if(fromIndex > toIndex)
++fromIndex //since a null will be inserted before fromIndex, the index needs to be nudged right by one
L.Insert(toIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(fromIndex, fromIndex+1)
//Move elements [fromIndex,fromIndex+len) to [toIndex-len, toIndex)
//Same as moveElement but for ranges of elements
//This will preserve associations ~Carnie
/proc/moveRange(list/L, fromIndex, toIndex, len=1)
var/distance = abs(toIndex - fromIndex)
if(len >= distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going. The result being, our range we are moving is shifted left or right by dist elements
if(fromIndex <= toIndex)
return //no need to move
fromIndex += len //we want to shift left instead of right
for(var/i=0, i<distance, ++i)
L.Insert(fromIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(toIndex, toIndex+1)
else
if(fromIndex > toIndex)
fromIndex += len
for(var/i=0, i<len, ++i)
L.Insert(toIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(fromIndex, fromIndex+1)
//Move elements from [fromIndex, fromIndex+len) to [toIndex, toIndex+len)
//Move any elements being overwritten by the move to the now-empty elements, preserving order
//Note: if the two ranges overlap, only the destination order will be preserved fully, since some elements will be within both ranges ~Carnie
/proc/swapRange(list/L, fromIndex, toIndex, len=1)
var/distance = abs(toIndex - fromIndex)
if(len > distance) //there is an overlap, therefore swapping each element will require more swaps than inserting new elements
if(fromIndex < toIndex)
toIndex += len
else
fromIndex += len
for(var/i=0, i<distance, ++i)
L.Insert(fromIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(toIndex, toIndex+1)
else
if(toIndex > fromIndex)
var/a = toIndex
toIndex = fromIndex
fromIndex = a
for(var/i=0, i<len, ++i)
L.Swap(fromIndex++, toIndex++)
//replaces reverseList ~Carnie
/proc/reverseRange(list/L, start=1, end=0)
if(L.len)
start = start % L.len
end = end % (L.len+1)
if(start <= 0)
start += L.len
if(end <= 0)
end += L.len + 1
--end
while(start < end)
L.Swap(start++,end--)
return L
//return first thing in L which has var/varname == value
//this is typecaste as list/L, but you could actually feed it an atom instead.
//completely safe to use
/proc/getElementByVar(list/L, varname, value)
varname = "[varname]"
for(var/datum/D in L)
if(D.vars.Find(varname))
if(D.vars[varname] == value)
return D
//remove all nulls from a list
/proc/removeNullsFromList(list/L)
while(L.Remove(null))
continue
return L
//Copies a list, and all lists inside it recusively
//Does not copy any other reference type
/proc/deepCopyList(list/l)
if(!islist(l))
return l
. = l.Copy()
for(var/i = 1 to l.len)
if(islist(.[i]))
.[i] = .(.[i])
//takes an input_key, as text, and the list of keys already used, outputting a replacement key in the format of "[input_key] ([number_of_duplicates])" if it finds a duplicate
//use this for lists of things that might have the same name, like mobs or objects, that you plan on giving to a player as input
/proc/avoid_assoc_duplicate_keys(input_key, list/used_key_list)
if(!input_key || !istype(used_key_list))
return
if(used_key_list[input_key])
used_key_list[input_key]++
input_key = "[input_key] ([used_key_list[input_key]])"
else
used_key_list[input_key] = 1
return input_key
#if DM_VERSION > 512
#error Remie said that lummox was adding a way to get a lists
#error contents via list.values, if that is true remove this
#error otherwise, update the version and bug lummox
#elseif
//Flattens a keyed list into a list of it's contents
/proc/flatten_list(list/key_list)
if(!islist(key_list))
return null
. = list()
for(var/key in key_list)
. |= key_list[key]
//Picks from the list, with some safeties, and returns the "default" arg if it fails
#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default)
#define LAZYINITLIST(L) if (!L) L = list()
#define UNSETEMPTY(L) if (L && !L.len) L = null
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } }
#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
#define LAZYLEN(L) length(L)
#define LAZYCLEARLIST(L) if(L) L.Cut()
/*
* Holds procs to help with list operations
* Contains groups:
* Misc
* Sorting
*/
/*
* Misc
*/
//Returns a list in plain english as a string
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
var/total = input.len
if (!total)
return "[nothing_text]"
else if (total == 1)
return "[input[1]]"
else if (total == 2)
return "[input[1]][and_text][input[2]]"
else
var/output = ""
var/index = 1
while (index < total)
if (index == total - 1)
comma_text = final_comma_text
output += "[input[index]][comma_text]"
index++
return "[output][and_text][input[index]]"
//Returns list element or null. Should prevent "index out of bounds" error.
/proc/listgetindex(list/L, index)
if(istype(L))
if(isnum(index) && IsInteger(index))
if(IsInRange(index,1,L.len))
return L[index]
else if(index in L)
return L[index]
return
//Return either pick(list) or null if list is not of type /list or is empty
/proc/safepick(list/L)
if(istype(L) && L.len)
return pick(L)
//Checks if the list is empty
/proc/isemptylist(list/L)
if(!L.len)
return 1
return 0
//Checks for specific types in a list
/proc/is_type_in_list(atom/A, list/L)
if(!L || !L.len || !A)
return 0
for(var/type in L)
if(istype(A, type))
return 1
return 0
//Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches')
/proc/is_type_in_typecache(atom/A, list/L)
if(!L || !L.len || !A)
return 0
if(ispath(A))
. = L[A]
else
. = L[A.type]
//Checks for a string in a list
/proc/is_string_in_list(string, list/L)
if(!L || !L.len || !string)
return
for(var/V in L)
if(string == V)
return 1
return
//Removes a string from a list
/proc/remove_strings_from_list(string, list/L)
if(!L || !L.len || !string)
return
for(var/V in L)
if(V == string)
L -= V //No return here so that it removes all strings of that type
return
//returns a new list with only atoms that are in typecache L
/proc/typecache_filter_list(list/atoms, list/typecache)
. = list()
for (var/thing in atoms)
var/atom/A = thing
if (typecache[A.type])
. += A
//Like typesof() or subtypesof(), but returns a typecache instead of a list
/proc/typecacheof(path, ignore_root_path, only_root_path = FALSE)
if(ispath(path))
var/list/types = list()
if(only_root_path)
types = list(path)
else
types = ignore_root_path ? subtypesof(path) : typesof(path)
var/list/L = list()
for(var/T in types)
L[T] = TRUE
return L
else if(islist(path))
var/list/pathlist = path
var/list/L = list()
if(ignore_root_path)
for(var/P in pathlist)
for(var/T in subtypesof(P))
L[T] = TRUE
else
for(var/P in pathlist)
if(only_root_path)
L[P] = TRUE
else
for(var/T in typesof(P))
L[T] = TRUE
return L
//Empties the list by setting the length to 0. Hopefully the elements get garbage collected
/proc/clearlist(list/list)
if(istype(list))
list.len = 0
return
//Removes any null entries from the list
/proc/listclearnulls(list/L)
var/list/N = new(L.len)
L -= N
/*
* Returns list containing all the entries from first list that are not present in second.
* If skiprep = 1, repeated elements are treated as one.
* If either of arguments is not a list, returns null
*/
/proc/difflist(list/first, list/second, skiprep=0)
if(!islist(first) || !islist(second))
return
var/list/result = new
if(skiprep)
for(var/e in first)
if(!(e in result) && !(e in second))
result += e
else
result = first - second
return result
/*
* Returns list containing entries that are in either list but not both.
* If skipref = 1, repeated elements are treated as one.
* If either of arguments is not a list, returns null
*/
/proc/uniquemergelist(list/first, list/second, skiprep=0)
if(!islist(first) || !islist(second))
return
var/list/result = new
if(skiprep)
result = difflist(first, second, skiprep)+difflist(second, first, skiprep)
else
result = first ^ second
return result
//Pretends to pick an element based on its weight but really just seems to pick a random element.
/proc/pickweight(list/L)
var/total = 0
var/item
for (item in L)
if (!L[item])
L[item] = 1
total += L[item]
total = rand(1, total)
for (item in L)
total -=L [item]
if (total <= 0)
return item
return null
//Pick a random element from the list and remove it from the list.
/proc/pick_n_take(list/L)
if(L.len)
var/picked = rand(1,L.len)
. = L[picked]
L.Cut(picked,picked+1) //Cut is far more efficient that Remove()
//Returns the top(last) element from the list and removes it from the list (typical stack function)
/proc/pop(list/L)
if(L.len)
. = L[L.len]
L.len--
/proc/popleft(list/L)
if(L.len)
. = L[1]
L.Cut(1,2)
/proc/sorted_insert(list/L, thing, comparator)
var/pos = L.len
while(pos > 0 && call(comparator)(thing, L[pos]) > 0)
pos--
L.Insert(pos+1, thing)
// Returns the next item in a list
/proc/next_list_item(item, list/L)
var/i
i = L.Find(item)
if(i == L.len)
i = 1
else
i++
return L[i]
// Returns the previous item in a list
/proc/previous_list_item(item, list/L)
var/i
i = L.Find(item)
if(i == 1)
i = L.len
else
i--
return L[i]
//Randomize: Return the list in a random order
/proc/shuffle(list/L)
if(!L)
return
L = L.Copy()
for(var/i=1, i<L.len, ++i)
L.Swap(i,rand(i,L.len))
return L
//same, but returns nothing and acts on list in place
/proc/shuffle_inplace(list/L)
if(!L)
return
for(var/i=1, i<L.len, ++i)
L.Swap(i,rand(i,L.len))
//Return a list with no duplicate entries
/proc/uniqueList(list/L)
. = list()
for(var/i in L)
. |= i
//same, but returns nothing and acts on list in place (also handles associated values properly)
/proc/uniqueList_inplace(list/L)
var/temp = L.Copy()
L.len = 0
for(var/key in temp)
if (isnum(key))
L |= key
else
L[key] = temp[key]
//for sorting clients or mobs by ckey
/proc/sortKey(list/L, order=1)
return sortTim(L, order >= 0 ? /proc/cmp_ckey_asc : /proc/cmp_ckey_dsc)
//Specifically for record datums in a list.
/proc/sortRecord(list/L, field = "name", order = 1)
GLOB.cmp_field = field
return sortTim(L, order >= 0 ? /proc/cmp_records_asc : /proc/cmp_records_dsc)
//any value in a list
/proc/sortList(list/L, cmp=/proc/cmp_text_asc)
return sortTim(L.Copy(), cmp)
//uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead
/proc/sortNames(list/L, order=1)
return sortTim(L, order >= 0 ? /proc/cmp_name_asc : /proc/cmp_name_dsc)
//Converts a bitfield to a list of numbers (or words if a wordlist is provided)
/proc/bitfield2list(bitfield = 0, list/wordlist)
var/list/r = list()
if(istype(wordlist,/list))
var/max = min(wordlist.len,16)
var/bit = 1
for(var/i=1, i<=max, i++)
if(bitfield & bit)
r += wordlist[i]
bit = bit << 1
else
for(var/bit=1, bit<=65535, bit = bit << 1)
if(bitfield & bit)
r += bit
return r
// Returns the key based on the index
#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null)
/proc/count_by_type(list/L, type)
var/i = 0
for(var/T in L)
if(istype(T, type))
i++
return i
/proc/find_record(field, value, list/L)
for(var/datum/data/record/R in L)
if(R.fields[field] == value)
return R
//Move a single element from position fromIndex within a list, to position toIndex
//All elements in the range [1,toIndex) before the move will be before the pivot afterwards
//All elements in the range [toIndex, L.len+1) before the move will be after the pivot afterwards
//In other words, it's as if the range [fromIndex,toIndex) have been rotated using a <<< operation common to other languages.
//fromIndex and toIndex must be in the range [1,L.len+1]
//This will preserve associations ~Carnie
/proc/moveElement(list/L, fromIndex, toIndex)
if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move
return
if(fromIndex > toIndex)
++fromIndex //since a null will be inserted before fromIndex, the index needs to be nudged right by one
L.Insert(toIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(fromIndex, fromIndex+1)
//Move elements [fromIndex,fromIndex+len) to [toIndex-len, toIndex)
//Same as moveElement but for ranges of elements
//This will preserve associations ~Carnie
/proc/moveRange(list/L, fromIndex, toIndex, len=1)
var/distance = abs(toIndex - fromIndex)
if(len >= distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going. The result being, our range we are moving is shifted left or right by dist elements
if(fromIndex <= toIndex)
return //no need to move
fromIndex += len //we want to shift left instead of right
for(var/i=0, i<distance, ++i)
L.Insert(fromIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(toIndex, toIndex+1)
else
if(fromIndex > toIndex)
fromIndex += len
for(var/i=0, i<len, ++i)
L.Insert(toIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(fromIndex, fromIndex+1)
//Move elements from [fromIndex, fromIndex+len) to [toIndex, toIndex+len)
//Move any elements being overwritten by the move to the now-empty elements, preserving order
//Note: if the two ranges overlap, only the destination order will be preserved fully, since some elements will be within both ranges ~Carnie
/proc/swapRange(list/L, fromIndex, toIndex, len=1)
var/distance = abs(toIndex - fromIndex)
if(len > distance) //there is an overlap, therefore swapping each element will require more swaps than inserting new elements
if(fromIndex < toIndex)
toIndex += len
else
fromIndex += len
for(var/i=0, i<distance, ++i)
L.Insert(fromIndex, null)
L.Swap(fromIndex, toIndex)
L.Cut(toIndex, toIndex+1)
else
if(toIndex > fromIndex)
var/a = toIndex
toIndex = fromIndex
fromIndex = a
for(var/i=0, i<len, ++i)
L.Swap(fromIndex++, toIndex++)
//replaces reverseList ~Carnie
/proc/reverseRange(list/L, start=1, end=0)
if(L.len)
start = start % L.len
end = end % (L.len+1)
if(start <= 0)
start += L.len
if(end <= 0)
end += L.len + 1
--end
while(start < end)
L.Swap(start++,end--)
return L
//return first thing in L which has var/varname == value
//this is typecaste as list/L, but you could actually feed it an atom instead.
//completely safe to use
/proc/getElementByVar(list/L, varname, value)
varname = "[varname]"
for(var/datum/D in L)
if(D.vars.Find(varname))
if(D.vars[varname] == value)
return D
//remove all nulls from a list
/proc/removeNullsFromList(list/L)
while(L.Remove(null))
continue
return L
//Copies a list, and all lists inside it recusively
//Does not copy any other reference type
/proc/deepCopyList(list/l)
if(!islist(l))
return l
. = l.Copy()
for(var/i = 1 to l.len)
if(islist(.[i]))
.[i] = .(.[i])
//takes an input_key, as text, and the list of keys already used, outputting a replacement key in the format of "[input_key] ([number_of_duplicates])" if it finds a duplicate
//use this for lists of things that might have the same name, like mobs or objects, that you plan on giving to a player as input
/proc/avoid_assoc_duplicate_keys(input_key, list/used_key_list)
if(!input_key || !istype(used_key_list))
return
if(used_key_list[input_key])
used_key_list[input_key]++
input_key = "[input_key] ([used_key_list[input_key]])"
else
used_key_list[input_key] = 1
return input_key
#if DM_VERSION > 512
#error Remie said that lummox was adding a way to get a lists
#error contents via list.values, if that is true remove this
#error otherwise, update the version and bug lummox
#elseif
//Flattens a keyed list into a list of it's contents
/proc/flatten_list(list/key_list)
if(!islist(key_list))
return null
. = list()
for(var/key in key_list)
. |= key_list[key]
//Picks from the list, with some safeties, and returns the "default" arg if it fails
#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default)
#define LAZYINITLIST(L) if (!L) L = list()
#define UNSETEMPTY(L) if (L && !L.len) L = null
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } }
#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
#define LAZYLEN(L) length(L)
#define LAZYCLEARLIST(L) if(L) L.Cut()
#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
/* Definining a counter as a series of key -> numeric value entries
* All these procs modify in place.
*/
/proc/counterlist_scale(list/L, scalar)
var/list/out = list()
for(var/key in L)
out[key] = L[key] * scalar
. = out
/proc/counterlist_sum(list/L)
. = 0
for(var/key in L)
. += L[key]
/proc/counterlist_normalise(list/L)
var/avg = counterlist_sum(L)
if(avg != 0)
. = counterlist_scale(L, 1 / avg)
else
. = L
/proc/counterlist_combine(list/L1, list/L2)
for(var/key in L2)
var/other_value = L2[key]
if(key in L1)
L1[key] += other_value
else
L1[key] = other_value
/* Definining a counter as a series of key -> numeric value entries
* All these procs modify in place.
*/
/proc/counterlist_scale(list/L, scalar)
var/list/out = list()
for(var/key in L)
out[key] = L[key] * scalar
. = out
/proc/counterlist_sum(list/L)
. = 0
for(var/key in L)
. += L[key]
/proc/counterlist_normalise(list/L)
var/avg = counterlist_sum(L)
if(avg != 0)
. = counterlist_scale(L, 1 / avg)
else
. = L
/proc/counterlist_combine(list/L1, list/L2)
for(var/key in L2)
var/other_value = L2[key]
if(key in L1)
L1[key] += other_value
else
L1[key] = other_value
+552 -535
View File
File diff suppressed because it is too large Load Diff
-1
View File
@@ -24,7 +24,6 @@
//doesn't have an object argument because this is "Stacking" with the animate call above
//3 billion% intentional
//Dumps the matrix data in format a-f
/matrix/proc/tolist()
. = list()
+14
View File
@@ -340,6 +340,20 @@ Proc for attack log creation, because really why not
qdel(progbar)
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
/mob/proc/break_do_after_checks(list/checked_health, check_clicks)
if(check_clicks && next_move > world.time)
return FALSE
return TRUE
//pass a list in the format list("health" = mob's health var) to check health during this
/mob/living/break_do_after_checks(list/checked_health, check_clicks)
if(islist(checked_health))
if(health < checked_health["health"])
return FALSE
checked_health["health"] = health
return ..()
/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, datum/callback/extra_checks = null)
if(!user)
return 0
+17
View File
@@ -1399,3 +1399,20 @@ GLOBAL_PROTECT(valid_HTTPSGet)
/proc/pass()
return
/proc/get_mob_or_brainmob(occupant)
var/mob/living/mob_occupant
if(isliving(occupant))
mob_occupant = occupant
else if(isbodypart(occupant))
var/obj/item/bodypart/head/head = occupant
mob_occupant = head.brainmob
else if(isorgan(occupant))
var/obj/item/organ/brain/brain = occupant
mob_occupant = brain.brainmob
return mob_occupant
+1
View File
@@ -35,6 +35,7 @@
//MINOR TWEAKS/MISC
#define AGE_MIN 17 //youngest a character can be
#define AGE_MAX 85 //oldest a character can be
#define WIZARD_AGE_MIN 30 //youngest a wizard can be
#define SHOES_SLOWDOWN 0 //How much shoes slow you down by default. Negative values speed you up
#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
+12
View File
@@ -3,3 +3,15 @@ GLOBAL_VAR_INIT(secret_force_mode, "secret") // if this is anything but "secret"
GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name
GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report
// Cult, needs to be global so admin cultists are functional
GLOBAL_VAR_INIT(blood_target, null) // Cult Master's target or Construct's Master
GLOBAL_DATUM(blood_target_image, /image)
GLOBAL_VAR_INIT(blood_target_reset_timer, null)
GLOBAL_DATUM(sac_mind, /datum/mind)
GLOBAL_VAR_INIT(sac_image, null)
GLOBAL_VAR_INIT(cult_vote_called, FALSE)
GLOBAL_VAR_INIT(cult_mastered, FALSE)
GLOBAL_VAR_INIT(reckoning_complete, FALSE)
GLOBAL_VAR_INIT(sac_complete, FALSE)
GLOBAL_DATUM(cult_narsie, /obj/singularity/narsie/large/cult)
+1
View File
@@ -54,3 +54,4 @@ GLOBAL_LIST_EMPTY(awaydestinations) //a list of landmarks that the warpgate can
GLOBAL_LIST_EMPTY(sortedAreas)
GLOBAL_LIST_EMPTY(transit_markers)
GLOBAL_LIST_EMPTY(all_abstract_markers)
+4 -2
View File
@@ -19,5 +19,7 @@ GLOBAL_LIST_EMPTY(silicon_mobs) //all silicon mobs
GLOBAL_LIST_EMPTY(ai_list)
GLOBAL_LIST_EMPTY(pai_list)
GLOBAL_LIST_EMPTY(available_ai_shells)
GLOBAL_LIST_EMPTY(language_datums)
GLOBAL_LIST_EMPTY(simple_animals)
GLOBAL_LIST_EMPTY(simple_animals)
GLOBAL_LIST_EMPTY(language_datum_instances)
GLOBAL_LIST_EMPTY(all_languages)
+101 -80
View File
@@ -92,6 +92,9 @@
if(next_move > world.time) // in the year 2000...
return
if(A.IsObscured())
return
if(istype(loc,/obj/mecha))
var/obj/mecha/M = loc
return M.click_action(A,src,params)
@@ -111,108 +114,126 @@
W.attack_self(src)
update_inv_hands()
return
//These are always reachable.
//User itself, current loc, and user inventory
if(DirectAccess(A))
//These are always reachable.
//User itself, current loc, and user inventory
if(DirectAccess(A))
if(W)
melee_item_attack_chain(src,W,A,params)
melee_item_attack_chain(src,W,A,params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A)
return
//Can't reach anything else in lockers or other weirdness
if(!loc.AllowClick())
//Can't reach anything else in lockers or other weirdness
if(!loc.AllowClick())
return
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
melee_item_attack_chain(src,W,A,params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A,1)
else
if(W)
W.afterattack(A,src,0,params)
else
RangedAttack(A,params)
/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
return TRUE
else
//Things inside storage insde another storage
//Eg Contents of a box in a backpack
var/atom/outer_storage = get_atom_on_turf(target)
if(outer_storage == target) //whatever that is we don't want infinite loop.
return FALSE
if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH))
return TRUE
return FALSE
//Can [target] in this container be reached by [user], can't be more than [depth] levels deep
/atom/proc/CanReachStorage(atom/target,user,depth)
return FALSE
/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
while(target && depth > 0)
target = target.loc
depth--
if(target == src)
return TRUE
return FALSE
/atom/movable/proc/DirectAccess(atom/target)
if(target == src)
return TRUE
if(target == loc)
return TRUE
/mob/DirectAccess(atom/target)
if(..())
return TRUE
if(target in contents) //This could probably use moving down and restricting to inventory only
return TRUE
return FALSE
/mob/living/DirectAccess(atom/target)
if(..()) //Lightweight checks first
return TRUE
if(target in GetAllContents())
return TRUE
/atom/proc/AllowClick()
return FALSE
/turf/AllowClick()
return TRUE
//Standard reach turf to turf or reaching inside storage
if(CanReach(A,W))
if(W)
melee_item_attack_chain(src,W,A,params)
else
if(ismob(A))
changeNext_move(CLICK_CD_MELEE)
UnarmedAttack(A,1)
else
if(W)
W.afterattack(A,src,0,params)
else
RangedAttack(A,params)
/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach)
//Is the atom obscured by a PREVENT_CLICK_UNDER object above it
/atom/proc/IsObscured()
if(!isturf(loc)) //This only makes sense for things directly on turfs for now
return FALSE
var/turf/T = get_turf_pixel(src)
if(!T)
return FALSE
for(var/atom/movable/AM in T)
if(AM.flags & PREVENT_CLICK_UNDER && AM.density && AM.layer > layer)
return TRUE
return FALSE
/turf/IsObscured()
for(var/atom/movable/AM in src)
if(AM.flags & PREVENT_CLICK_UNDER && AM.density)
return TRUE
return FALSE
/atom/movable/proc/CanReach(atom/target,obj/item/tool,view_only = FALSE)
if(isturf(target) || isturf(target.loc) || DirectAccess(target)) //Directly accessible atoms
if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks
return TRUE
else
//Things inside storage insde another storage
//Eg Contents of a box in a backpack
var/atom/outer_storage = get_atom_on_turf(target)
if(outer_storage == target) //whatever that is we don't want infinite loop.
return FALSE
if(outer_storage && CanReach(outer_storage,tool) && outer_storage.CanReachStorage(target,src,view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH))
return TRUE
return FALSE
//Can [target] in this container be reached by [user], can't be more than [depth] levels deep
/atom/proc/CanReachStorage(atom/target,user,depth)
return FALSE
/obj/item/weapon/storage/CanReachStorage(atom/target,user,depth)
while(target && depth > 0)
target = target.loc
depth--
if(target == src)
return TRUE
return FALSE
/atom/movable/proc/DirectAccess(atom/target)
if(target == src)
return TRUE
if(target == loc)
return TRUE
/mob/DirectAccess(atom/target)
if(..())
return TRUE
if(target in contents) //This could probably use moving down and restricting to inventory only
return TRUE
return FALSE
/mob/living/DirectAccess(atom/target)
if(..()) //Lightweight checks first
return TRUE
if(target in GetAllContents())
return TRUE
/atom/proc/AllowClick()
return FALSE
/turf/AllowClick()
return TRUE
/proc/CheckToolReach(atom/movable/here, atom/movable/there, reach)
if(!here || !there)
return
switch(reach)
if(0)
return FALSE
return FALSE
if(1)
return FALSE //here.Adjacent(there)
return FALSE //here.Adjacent(there)
if(2 to INFINITY)
var/obj/dummy = new(get_turf(here))
var/obj/dummy = new(get_turf(here))
dummy.pass_flags |= PASSTABLE
dummy.invisibility = INVISIBILITY_ABSTRACT
dummy.invisibility = INVISIBILITY_ABSTRACT
for(var/i in 1 to reach) //Limit it to that many tries
var/turf/T = get_step(dummy, get_dir(dummy, there))
if(dummy.CanReach(there))
if(dummy.CanReach(there))
qdel(dummy)
return TRUE
return TRUE
if(!dummy.Move(T)) //we're blocked!
qdel(dummy)
return
qdel(dummy)
qdel(dummy)
// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click)
/mob/proc/DblClickOn(atom/A, params)
+98 -1
View File
@@ -42,6 +42,7 @@
thealert.override_alerts = override
if(override)
thealert.timeout = null
thealert.mob_viewer = src
if(new_master)
var/old_layer = new_master.layer
@@ -96,6 +97,7 @@
var/severity = 0
var/alerttooltipstyle = ""
var/override_alerts = FALSE //If it is overriding other alerts of the same type
var/mob/mob_viewer //the mob viewing this alert
/obj/screen/alert/MouseEntered(location,control,params)
@@ -256,6 +258,102 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
icon_state = "blobbernaut_nofactory"
alerttooltipstyle = "blob"
// BLOODCULT
/obj/screen/alert/bloodsense
name = "Blood Sense"
desc = "Allows you to sense blood that is manipulated by dark magicks."
icon_state = "cult_sense"
alerttooltipstyle = "cult"
var/static/image/narnar
var/angle = 0
var/mob/living/simple_animal/hostile/construct/Cviewer = null
/obj/screen/alert/bloodsense/Initialize()
. = ..()
if(!narnar)
narnar = new('icons/mob/screen_alert.dmi', "mini_nar")
START_PROCESSING(SSprocessing, src)
/obj/screen/alert/bloodsense/Destroy()
Cviewer = null
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/screen/alert/bloodsense/process()
var/atom/blood_target
if(GLOB.blood_target)
if(!get_turf(GLOB.blood_target))
GLOB.blood_target = null
else
blood_target = GLOB.blood_target
if(Cviewer && Cviewer.seeking && Cviewer.master)
blood_target = Cviewer.master
desc = "Your blood sense is leading you to [Cviewer.master]"
if(!blood_target)
if(!GLOB.sac_complete)
if(icon_state == "runed_sense0")
return
animate(src, transform = null, time = 1, loop = 0)
angle = 0
cut_overlays()
icon_state = "runed_sense0"
desc = "Nar-Sie demands that [GLOB.sac_mind] be sacrificed before the summoning ritual can begin."
add_overlay(GLOB.sac_image)
else
if(icon_state == "runed_sense1")
return
animate(src, transform = null, time = 1, loop = 0)
angle = 0
cut_overlays()
icon_state = "runed_sense1"
desc = "The sacrifice is complete, bring the wrath of Nar-Sie upon the crew!"
add_overlay(narnar)
return
var/turf/P = get_turf(blood_target)
var/turf/Q = get_turf(mob_viewer)
var/area/A = get_area(P)
if(P.z != Q.z) //The target is on a different Z level, we cannot sense that far.
icon_state = "runed_sense2"
desc = "[blood_target] is no longer in your sector, you cannot sense its presence here."
return
desc = "You are currently tracking [blood_target] in [A.name]."
var/target_angle = Get_Angle(Q, P)
var/target_dist = get_dist(P, Q)
cut_overlays()
switch(target_dist)
if(0 to 1)
icon_state = "runed_sense2"
if(2 to 8)
icon_state = "arrow8"
if(9 to 15)
icon_state = "arrow7"
if(16 to 22)
icon_state = "arrow6"
if(23 to 29)
icon_state = "arrow5"
if(30 to 36)
icon_state = "arrow4"
if(37 to 43)
icon_state = "arrow3"
if(44 to 50)
icon_state = "arrow2"
if(51 to 57)
icon_state = "arrow1"
if(58 to 64)
icon_state = "arrow0"
if(65 to 400)
icon_state = "arrow"
var/difference = target_angle - angle
angle = target_angle
if(!difference)
return
var/matrix/final = matrix(transform)
final.Turn(difference)
animate(src, transform = final, time = 5, loop = 0)
// CLOCKCULT
/obj/screen/alert/clockwork
alerttooltipstyle = "clockcult"
@@ -605,4 +703,3 @@ so as to remain in compliance with the most up-to-date laws."
severity = 0
master = null
screen_loc = ""
+4
View File
@@ -68,6 +68,10 @@
using.screen_loc = ui_ghost_pai
static_inventory += using
using = new /obj/screen/language_menu
using.icon = ui_style
static_inventory += using
/datum/hud/ghost/show_hud(version = 0, mob/viewmob)
..()
if(!mymob.client.prefs.ghost_hud)
+267 -267
View File
@@ -1,270 +1,270 @@
/*
The hud datum
Used to show and hide huds for all the different mob types,
including inventories and item quick actions.
*/
/datum/hud
var/mob/mymob
var/hud_shown = 1 //Used for the HUD toggle (F12)
var/hud_version = 1 //Current displayed version of the HUD
var/inventory_shown = 0 //Equipped item inventory
var/show_intent_icons = 0
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
var/obj/screen/ling/chems/lingchemdisplay
var/obj/screen/ling/sting/lingstingdisplay
var/obj/screen/blobpwrdisplay
var/obj/screen/alien_plasma_display
var/obj/screen/alien_queen_finder
var/obj/screen/devil/soul_counter/devilsouldisplay
var/obj/screen/deity_power_display
var/obj/screen/deity_follower_display
var/obj/screen/nightvisionicon
var/obj/screen/action_intent
var/obj/screen/zone_select
var/obj/screen/pull_icon
var/obj/screen/throw_icon
var/obj/screen/module_store_icon
var/list/static_inventory = list() //the screen objects which are static
var/list/toggleable_inventory = list() //the screen objects which can be hidden
var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys
var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...)
var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...)
var/list/inv_slots[slots_amt] // /obj/screen/inventory objects, ordered by their slot ID.
var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object
var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object
var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle
var/action_buttons_hidden = 0
var/obj/screen/healths
var/obj/screen/healthdoll
var/obj/screen/internals
var/ui_style_icon = 'icons/mob/screen_midnight.dmi'
/datum/hud/New(mob/owner , ui_style = 'icons/mob/screen_midnight.dmi')
mymob = owner
ui_style_icon = ui_style
hide_actions_toggle = new
hide_actions_toggle.InitialiseIcon(src)
hand_slots = list()
for(var/mytype in subtypesof(/obj/screen/plane_master))
var/obj/screen/plane_master/instance = new mytype()
plane_masters["[instance.plane]"] = instance
instance.backdrop(mymob)
/datum/hud/Destroy()
if(mymob.hud_used == src)
mymob.hud_used = null
qdel(hide_actions_toggle)
hide_actions_toggle = null
qdel(module_store_icon)
module_store_icon = null
if(static_inventory.len)
for(var/thing in static_inventory)
qdel(thing)
static_inventory.Cut()
inv_slots.Cut()
action_intent = null
zone_select = null
pull_icon = null
if(toggleable_inventory.len)
for(var/thing in toggleable_inventory)
qdel(thing)
toggleable_inventory.Cut()
if(hotkeybuttons.len)
for(var/thing in hotkeybuttons)
qdel(thing)
hotkeybuttons.Cut()
throw_icon = null
if(infodisplay.len)
for(var/thing in infodisplay)
qdel(thing)
infodisplay.Cut()
healths = null
healthdoll = null
internals = null
lingchemdisplay = null
devilsouldisplay = null
lingstingdisplay = null
blobpwrdisplay = null
alien_plasma_display = null
alien_queen_finder = null
deity_power_display = null
deity_follower_display = null
nightvisionicon = null
if(plane_masters.len)
for(var/thing in plane_masters)
qdel(plane_masters[thing])
plane_masters.Cut()
if(screenoverlays.len)
for(var/thing in screenoverlays)
qdel(thing)
screenoverlays.Cut()
mymob = null
return ..()
/mob/proc/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud(src)
update_sight()
//Version denotes which style should be displayed. blank or 0 means "next version"
/datum/hud/proc/show_hud(version = 0,mob/viewmob)
if(!ismob(mymob))
return 0
var/mob/screenmob = viewmob || mymob
if(!screenmob.client)
return 0
screenmob.client.screen = list()
var/display_hud_version = version
if(!display_hud_version) //If 0 or blank, display the next hud version
display_hud_version = hud_version + 1
if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
display_hud_version = 1
switch(display_hud_version)
if(HUD_STYLE_STANDARD) //Default HUD
hud_shown = 1 //Governs behavior of other procs
if(static_inventory.len)
screenmob.client.screen += static_inventory
if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown)
screenmob.client.screen += toggleable_inventory
if(hotkeybuttons.len && !hotkey_ui_hidden)
screenmob.client.screen += hotkeybuttons
if(infodisplay.len)
screenmob.client.screen += infodisplay
screenmob.client.screen += hide_actions_toggle
if(action_intent)
action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
if(HUD_STYLE_REDUCED) //Reduced HUD
hud_shown = 0 //Governs behavior of other procs
if(static_inventory.len)
screenmob.client.screen -= static_inventory
if(toggleable_inventory.len)
screenmob.client.screen -= toggleable_inventory
if(hotkeybuttons.len)
screenmob.client.screen -= hotkeybuttons
if(infodisplay.len)
screenmob.client.screen += infodisplay
//These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay
for(var/h in hand_slots)
var/obj/screen/hand = hand_slots[h]
if(hand)
screenmob.client.screen += hand
if(action_intent)
screenmob.client.screen += action_intent //we want the intent switcher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
if(HUD_STYLE_NOHUD) //No HUD
hud_shown = 0 //Governs behavior of other procs
if(static_inventory.len)
screenmob.client.screen -= static_inventory
if(toggleable_inventory.len)
screenmob.client.screen -= toggleable_inventory
if(hotkeybuttons.len)
screenmob.client.screen -= hotkeybuttons
if(infodisplay.len)
screenmob.client.screen -= infodisplay
for(var/thing in plane_masters)
screenmob.client.screen += plane_masters[thing]
hud_version = display_hud_version
persistent_inventory_update(screenmob)
mymob.update_action_buttons(1)
reorganize_alerts()
mymob.reload_fullscreen()
update_parallax_pref(screenmob)
/datum/hud/human/show_hud(version = 0,mob/viewmob)
..()
hidden_inventory_update(viewmob)
/datum/hud/robot/show_hud(version = 0, mob/viewmob)
..()
update_robot_modules_display()
/datum/hud/proc/hidden_inventory_update()
return
/datum/hud/proc/persistent_inventory_update(mob/viewer)
if(!mymob)
return
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12()
set name = "F12"
set hidden = 1
if(hud_used && client)
hud_used.show_hud() //Shows the next hud preset
to_chat(usr, "<span class ='info'>Switched HUD mode. Press F12 to toggle.</span>")
else
to_chat(usr, "<span class ='warning'>This mob type does not use a HUD.</span>")
//(re)builds the hand ui slots, throwing away old ones
//not really worth jugglying existing ones so we just scrap+rebuild
//9/10 this is only called once per mob and only for 2 hands
/datum/hud/proc/build_hand_slots(ui_style = 'icons/mob/screen_midnight.dmi')
for(var/h in hand_slots)
var/obj/screen/inventory/hand/H = hand_slots[h]
if(H)
static_inventory -= H
hand_slots = list()
var/obj/screen/inventory/hand/hand_box
for(var/i in 1 to mymob.held_items.len)
hand_box = new /obj/screen/inventory/hand()
hand_box.name = mymob.get_held_index_name(i)
hand_box.icon = ui_style
hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]"
hand_box.screen_loc = ui_hand_position(i)
hand_box.held_index = i
hand_slots["[i]"] = hand_box
hand_box.hud = src
static_inventory += hand_box
hand_box.update_icon()
var/i = 1
for(var/obj/screen/swap_hand/SH in static_inventory)
SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1)
i++
for(var/obj/screen/human/equip/E in static_inventory)
E.screen_loc = ui_equip_position(mymob)
if(mymob.hud_used)
show_hud(HUD_STYLE_STANDARD,mymob)
/*
The hud datum
Used to show and hide huds for all the different mob types,
including inventories and item quick actions.
*/
/datum/hud
var/mob/mymob
var/hud_shown = 1 //Used for the HUD toggle (F12)
var/hud_version = 1 //Current displayed version of the HUD
var/inventory_shown = 0 //Equipped item inventory
var/show_intent_icons = 0
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
var/obj/screen/ling/chems/lingchemdisplay
var/obj/screen/ling/sting/lingstingdisplay
var/obj/screen/blobpwrdisplay
var/obj/screen/alien_plasma_display
var/obj/screen/alien_queen_finder
var/obj/screen/devil/soul_counter/devilsouldisplay
var/obj/screen/deity_power_display
var/obj/screen/deity_follower_display
var/obj/screen/nightvisionicon
var/obj/screen/action_intent
var/obj/screen/zone_select
var/obj/screen/pull_icon
var/obj/screen/throw_icon
var/obj/screen/module_store_icon
var/list/static_inventory = list() //the screen objects which are static
var/list/toggleable_inventory = list() //the screen objects which can be hidden
var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys
var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...)
var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...)
var/list/inv_slots[slots_amt] // /obj/screen/inventory objects, ordered by their slot ID.
var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object
var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object
var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle
var/action_buttons_hidden = 0
var/obj/screen/healths
var/obj/screen/healthdoll
var/obj/screen/internals
var/ui_style_icon = 'icons/mob/screen_midnight.dmi'
/datum/hud/New(mob/owner , ui_style = 'icons/mob/screen_midnight.dmi')
mymob = owner
ui_style_icon = ui_style
hide_actions_toggle = new
hide_actions_toggle.InitialiseIcon(src)
hand_slots = list()
for(var/mytype in subtypesof(/obj/screen/plane_master))
var/obj/screen/plane_master/instance = new mytype()
plane_masters["[instance.plane]"] = instance
instance.backdrop(mymob)
/datum/hud/Destroy()
if(mymob.hud_used == src)
mymob.hud_used = null
qdel(hide_actions_toggle)
hide_actions_toggle = null
qdel(module_store_icon)
module_store_icon = null
if(static_inventory.len)
for(var/thing in static_inventory)
qdel(thing)
static_inventory.Cut()
inv_slots.Cut()
action_intent = null
zone_select = null
pull_icon = null
if(toggleable_inventory.len)
for(var/thing in toggleable_inventory)
qdel(thing)
toggleable_inventory.Cut()
if(hotkeybuttons.len)
for(var/thing in hotkeybuttons)
qdel(thing)
hotkeybuttons.Cut()
throw_icon = null
if(infodisplay.len)
for(var/thing in infodisplay)
qdel(thing)
infodisplay.Cut()
healths = null
healthdoll = null
internals = null
lingchemdisplay = null
devilsouldisplay = null
lingstingdisplay = null
blobpwrdisplay = null
alien_plasma_display = null
alien_queen_finder = null
deity_power_display = null
deity_follower_display = null
nightvisionicon = null
if(plane_masters.len)
for(var/thing in plane_masters)
qdel(plane_masters[thing])
plane_masters.Cut()
if(screenoverlays.len)
for(var/thing in screenoverlays)
qdel(thing)
screenoverlays.Cut()
mymob = null
return ..()
/mob/proc/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud(src)
update_sight()
//Version denotes which style should be displayed. blank or 0 means "next version"
/datum/hud/proc/show_hud(version = 0,mob/viewmob)
if(!ismob(mymob))
return 0
var/mob/screenmob = viewmob || mymob
if(!screenmob.client)
return 0
screenmob.client.screen = list()
var/display_hud_version = version
if(!display_hud_version) //If 0 or blank, display the next hud version
display_hud_version = hud_version + 1
if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
display_hud_version = 1
switch(display_hud_version)
if(HUD_STYLE_STANDARD) //Default HUD
hud_shown = 1 //Governs behavior of other procs
if(static_inventory.len)
screenmob.client.screen += static_inventory
if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown)
screenmob.client.screen += toggleable_inventory
if(hotkeybuttons.len && !hotkey_ui_hidden)
screenmob.client.screen += hotkeybuttons
if(infodisplay.len)
screenmob.client.screen += infodisplay
screenmob.client.screen += hide_actions_toggle
if(action_intent)
action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
if(HUD_STYLE_REDUCED) //Reduced HUD
hud_shown = 0 //Governs behavior of other procs
if(static_inventory.len)
screenmob.client.screen -= static_inventory
if(toggleable_inventory.len)
screenmob.client.screen -= toggleable_inventory
if(hotkeybuttons.len)
screenmob.client.screen -= hotkeybuttons
if(infodisplay.len)
screenmob.client.screen += infodisplay
//These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay
for(var/h in hand_slots)
var/obj/screen/hand = hand_slots[h]
if(hand)
screenmob.client.screen += hand
if(action_intent)
screenmob.client.screen += action_intent //we want the intent switcher visible
action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
if(HUD_STYLE_NOHUD) //No HUD
hud_shown = 0 //Governs behavior of other procs
if(static_inventory.len)
screenmob.client.screen -= static_inventory
if(toggleable_inventory.len)
screenmob.client.screen -= toggleable_inventory
if(hotkeybuttons.len)
screenmob.client.screen -= hotkeybuttons
if(infodisplay.len)
screenmob.client.screen -= infodisplay
for(var/thing in plane_masters)
screenmob.client.screen += plane_masters[thing]
hud_version = display_hud_version
persistent_inventory_update(screenmob)
mymob.update_action_buttons(1)
reorganize_alerts()
mymob.reload_fullscreen()
update_parallax_pref(screenmob)
/datum/hud/human/show_hud(version = 0,mob/viewmob)
..()
hidden_inventory_update(viewmob)
/datum/hud/robot/show_hud(version = 0, mob/viewmob)
..()
update_robot_modules_display()
/datum/hud/proc/hidden_inventory_update()
return
/datum/hud/proc/persistent_inventory_update(mob/viewer)
if(!mymob)
return
//Triggered when F12 is pressed (Unless someone changed something in the DMF)
/mob/verb/button_pressed_F12()
set name = "F12"
set hidden = 1
if(hud_used && client)
hud_used.show_hud() //Shows the next hud preset
to_chat(usr, "<span class ='info'>Switched HUD mode. Press F12 to toggle.</span>")
else
to_chat(usr, "<span class ='warning'>This mob type does not use a HUD.</span>")
//(re)builds the hand ui slots, throwing away old ones
//not really worth jugglying existing ones so we just scrap+rebuild
//9/10 this is only called once per mob and only for 2 hands
/datum/hud/proc/build_hand_slots(ui_style = 'icons/mob/screen_midnight.dmi')
for(var/h in hand_slots)
var/obj/screen/inventory/hand/H = hand_slots[h]
if(H)
static_inventory -= H
hand_slots = list()
var/obj/screen/inventory/hand/hand_box
for(var/i in 1 to mymob.held_items.len)
hand_box = new /obj/screen/inventory/hand()
hand_box.name = mymob.get_held_index_name(i)
hand_box.icon = ui_style
hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]"
hand_box.screen_loc = ui_hand_position(i)
hand_box.held_index = i
hand_slots["[i]"] = hand_box
hand_box.hud = src
static_inventory += hand_box
hand_box.update_icon()
var/i = 1
for(var/obj/screen/swap_hand/SH in static_inventory)
SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1)
i++
for(var/obj/screen/human/equip/E in static_inventory)
E.screen_loc = ui_equip_position(mymob)
if(mymob.hud_used)
show_hud(HUD_STYLE_STANDARD,mymob)
/datum/hud/proc/update_locked_slots()
return
+426 -426
View File
@@ -1,318 +1,318 @@
/obj/screen/human
icon = 'icons/mob/screen_midnight.dmi'
/obj/screen/human/toggle
name = "toggle"
icon_state = "toggle"
/obj/screen/human/toggle/Click()
var/mob/targetmob = usr
if(isobserver(usr))
if(ishuman(usr.client.eye) && (usr.client.eye != usr))
var/mob/M = usr.client.eye
targetmob = M
if(usr.hud_used.inventory_shown && targetmob.hud_used)
usr.hud_used.inventory_shown = 0
usr.client.screen -= targetmob.hud_used.toggleable_inventory
else
usr.hud_used.inventory_shown = 1
usr.client.screen += targetmob.hud_used.toggleable_inventory
targetmob.hud_used.hidden_inventory_update(usr)
/obj/screen/human/equip
name = "equip"
icon_state = "act_equip"
/obj/screen/human/equip/Click()
if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
var/mob/living/carbon/human/H = usr
H.quick_equip()
/obj/screen/devil
invisibility = INVISIBILITY_ABSTRACT
/obj/screen/devil/soul_counter
icon = 'icons/mob/screen_gen.dmi'
name = "souls owned"
icon_state = "Devil-6"
screen_loc = ui_devilsouldisplay
/obj/screen/devil/soul_counter/proc/update_counter(souls = 0)
invisibility = 0
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#FF0000'>[souls]</font></div>"
switch(souls)
if(0,null)
icon_state = "Devil-1"
if(1,2)
icon_state = "Devil-2"
if(3 to 5)
icon_state = "Devil-3"
if(6 to 8)
icon_state = "Devil-4"
if(9 to INFINITY)
icon_state = "Devil-5"
else
icon_state = "Devil-6"
/obj/screen/devil/soul_counter/proc/clear()
invisibility = INVISIBILITY_ABSTRACT
/obj/screen/ling
invisibility = INVISIBILITY_ABSTRACT
/obj/screen/ling/sting
name = "current sting"
screen_loc = ui_lingstingdisplay
/obj/screen/ling/sting/Click()
if(isobserver(usr))
return
var/mob/living/carbon/U = usr
U.unset_sting()
/obj/screen/ling/chems
name = "chemical storage"
icon_state = "power_display"
screen_loc = ui_lingchemdisplay
/mob/living/carbon/human/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/human(src, ui_style2icon(client.prefs.UI_style))
/datum/hud/human/New(mob/living/carbon/human/owner, ui_style = 'icons/mob/screen_midnight.dmi')
..()
owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
var/obj/screen/using
var/obj/screen/inventory/inv_box
using = new /obj/screen/craft
using.icon = ui_style
static_inventory += using
using = new/obj/screen/language_menu
using.icon = ui_style
static_inventory += using
using = new /obj/screen/area_creator
using.icon = ui_style
static_inventory += using
action_intent = new /obj/screen/act_intent/segmented
action_intent.icon_state = mymob.a_intent
static_inventory += action_intent
using = new /obj/screen/mov_intent
using.icon = ui_style
using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
using.screen_loc = ui_movi
static_inventory += using
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drop_throw
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "i_clothing"
inv_box.icon = ui_style
inv_box.slot_id = slot_w_uniform
inv_box.icon_state = "uniform"
inv_box.screen_loc = ui_iclothing
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "o_clothing"
inv_box.icon = ui_style
inv_box.slot_id = slot_wear_suit
inv_box.icon_state = "suit"
inv_box.screen_loc = ui_oclothing
toggleable_inventory += inv_box
build_hand_slots(ui_style)
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_1"
using.screen_loc = ui_swaphand_position(owner,1)
static_inventory += using
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "id"
inv_box.icon = ui_style
inv_box.icon_state = "id"
inv_box.screen_loc = ui_id
inv_box.slot_id = slot_wear_id
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
inv_box.screen_loc = ui_mask
inv_box.slot_id = slot_wear_mask
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "neck"
inv_box.icon = ui_style
inv_box.icon_state = "neck"
inv_box.screen_loc = ui_neck
inv_box.slot_id = slot_neck
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
inv_box.screen_loc = ui_back
inv_box.slot_id = slot_back
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "storage1"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
inv_box.screen_loc = ui_storage1
inv_box.slot_id = slot_l_store
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "storage2"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
inv_box.screen_loc = ui_storage2
inv_box.slot_id = slot_r_store
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "suit storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
inv_box.screen_loc = ui_sstore1
inv_box.slot_id = slot_s_store
static_inventory += inv_box
using = new /obj/screen/resist()
using.icon = ui_style
using.screen_loc = ui_pull_resist
hotkeybuttons += using
using = new /obj/screen/human/toggle()
using.icon = ui_style
using.screen_loc = ui_inventory
static_inventory += using
using = new /obj/screen/human/equip()
using.icon = ui_style
using.screen_loc = ui_equip_position(mymob)
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "gloves"
inv_box.icon = ui_style
inv_box.icon_state = "gloves"
inv_box.screen_loc = ui_gloves
inv_box.slot_id = slot_gloves
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "eyes"
inv_box.icon = ui_style
inv_box.icon_state = "glasses"
inv_box.screen_loc = ui_glasses
inv_box.slot_id = slot_glasses
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "ears"
inv_box.icon = ui_style
inv_box.icon_state = "ears"
inv_box.screen_loc = ui_ears
inv_box.slot_id = slot_ears
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
inv_box.screen_loc = ui_head
inv_box.slot_id = slot_head
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "shoes"
inv_box.icon = ui_style
inv_box.icon_state = "shoes"
inv_box.screen_loc = ui_shoes
inv_box.slot_id = slot_shoes
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "belt"
inv_box.icon = ui_style
inv_box.icon_state = "belt"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_belt
inv_box.slot_id = slot_belt
static_inventory += inv_box
throw_icon = new /obj/screen/throw_catch()
throw_icon.icon = ui_style
throw_icon.screen_loc = ui_drop_throw
hotkeybuttons += throw_icon
internals = new /obj/screen/internals()
infodisplay += internals
healths = new /obj/screen/healths()
infodisplay += healths
//citadel code
arousal = new /obj/screen/arousal()
infodisplay += arousal
healthdoll = new /obj/screen/healthdoll()
infodisplay += healthdoll
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
pull_icon.update_icon(mymob)
pull_icon.screen_loc = ui_pull_resist
static_inventory += pull_icon
lingchemdisplay = new /obj/screen/ling/chems()
infodisplay += lingchemdisplay
lingstingdisplay = new /obj/screen/ling/sting()
infodisplay += lingstingdisplay
devilsouldisplay = new /obj/screen/devil/soul_counter
infodisplay += devilsouldisplay
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
zone_select.update_icon(mymob)
static_inventory += zone_select
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[inv.slot_id] = inv
inv.update_icon()
/obj/screen/human
icon = 'icons/mob/screen_midnight.dmi'
/obj/screen/human/toggle
name = "toggle"
icon_state = "toggle"
/obj/screen/human/toggle/Click()
var/mob/targetmob = usr
if(isobserver(usr))
if(ishuman(usr.client.eye) && (usr.client.eye != usr))
var/mob/M = usr.client.eye
targetmob = M
if(usr.hud_used.inventory_shown && targetmob.hud_used)
usr.hud_used.inventory_shown = 0
usr.client.screen -= targetmob.hud_used.toggleable_inventory
else
usr.hud_used.inventory_shown = 1
usr.client.screen += targetmob.hud_used.toggleable_inventory
targetmob.hud_used.hidden_inventory_update(usr)
/obj/screen/human/equip
name = "equip"
icon_state = "act_equip"
/obj/screen/human/equip/Click()
if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
var/mob/living/carbon/human/H = usr
H.quick_equip()
/obj/screen/devil
invisibility = INVISIBILITY_ABSTRACT
/obj/screen/devil/soul_counter
icon = 'icons/mob/screen_gen.dmi'
name = "souls owned"
icon_state = "Devil-6"
screen_loc = ui_devilsouldisplay
/obj/screen/devil/soul_counter/proc/update_counter(souls = 0)
invisibility = 0
maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#FF0000'>[souls]</font></div>"
switch(souls)
if(0,null)
icon_state = "Devil-1"
if(1,2)
icon_state = "Devil-2"
if(3 to 5)
icon_state = "Devil-3"
if(6 to 8)
icon_state = "Devil-4"
if(9 to INFINITY)
icon_state = "Devil-5"
else
icon_state = "Devil-6"
/obj/screen/devil/soul_counter/proc/clear()
invisibility = INVISIBILITY_ABSTRACT
/obj/screen/ling
invisibility = INVISIBILITY_ABSTRACT
/obj/screen/ling/sting
name = "current sting"
screen_loc = ui_lingstingdisplay
/obj/screen/ling/sting/Click()
if(isobserver(usr))
return
var/mob/living/carbon/U = usr
U.unset_sting()
/obj/screen/ling/chems
name = "chemical storage"
icon_state = "power_display"
screen_loc = ui_lingchemdisplay
/mob/living/carbon/human/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud/human(src, ui_style2icon(client.prefs.UI_style))
/datum/hud/human/New(mob/living/carbon/human/owner, ui_style = 'icons/mob/screen_midnight.dmi')
..()
owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
var/obj/screen/using
var/obj/screen/inventory/inv_box
using = new /obj/screen/craft
using.icon = ui_style
static_inventory += using
using = new/obj/screen/language_menu
using.icon = ui_style
static_inventory += using
using = new /obj/screen/area_creator
using.icon = ui_style
static_inventory += using
action_intent = new /obj/screen/act_intent/segmented
action_intent.icon_state = mymob.a_intent
static_inventory += action_intent
using = new /obj/screen/mov_intent
using.icon = ui_style
using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
using.screen_loc = ui_movi
static_inventory += using
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drop_throw
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "i_clothing"
inv_box.icon = ui_style
inv_box.slot_id = slot_w_uniform
inv_box.icon_state = "uniform"
inv_box.screen_loc = ui_iclothing
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "o_clothing"
inv_box.icon = ui_style
inv_box.slot_id = slot_wear_suit
inv_box.icon_state = "suit"
inv_box.screen_loc = ui_oclothing
toggleable_inventory += inv_box
build_hand_slots(ui_style)
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_1"
using.screen_loc = ui_swaphand_position(owner,1)
static_inventory += using
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "id"
inv_box.icon = ui_style
inv_box.icon_state = "id"
inv_box.screen_loc = ui_id
inv_box.slot_id = slot_wear_id
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
inv_box.screen_loc = ui_mask
inv_box.slot_id = slot_wear_mask
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "neck"
inv_box.icon = ui_style
inv_box.icon_state = "neck"
inv_box.screen_loc = ui_neck
inv_box.slot_id = slot_neck
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
inv_box.screen_loc = ui_back
inv_box.slot_id = slot_back
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "storage1"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
inv_box.screen_loc = ui_storage1
inv_box.slot_id = slot_l_store
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "storage2"
inv_box.icon = ui_style
inv_box.icon_state = "pocket"
inv_box.screen_loc = ui_storage2
inv_box.slot_id = slot_r_store
static_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "suit storage"
inv_box.icon = ui_style
inv_box.icon_state = "suit_storage"
inv_box.screen_loc = ui_sstore1
inv_box.slot_id = slot_s_store
static_inventory += inv_box
using = new /obj/screen/resist()
using.icon = ui_style
using.screen_loc = ui_pull_resist
hotkeybuttons += using
using = new /obj/screen/human/toggle()
using.icon = ui_style
using.screen_loc = ui_inventory
static_inventory += using
using = new /obj/screen/human/equip()
using.icon = ui_style
using.screen_loc = ui_equip_position(mymob)
static_inventory += using
inv_box = new /obj/screen/inventory()
inv_box.name = "gloves"
inv_box.icon = ui_style
inv_box.icon_state = "gloves"
inv_box.screen_loc = ui_gloves
inv_box.slot_id = slot_gloves
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "eyes"
inv_box.icon = ui_style
inv_box.icon_state = "glasses"
inv_box.screen_loc = ui_glasses
inv_box.slot_id = slot_glasses
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "ears"
inv_box.icon = ui_style
inv_box.icon_state = "ears"
inv_box.screen_loc = ui_ears
inv_box.slot_id = slot_ears
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
inv_box.screen_loc = ui_head
inv_box.slot_id = slot_head
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "shoes"
inv_box.icon = ui_style
inv_box.icon_state = "shoes"
inv_box.screen_loc = ui_shoes
inv_box.slot_id = slot_shoes
toggleable_inventory += inv_box
inv_box = new /obj/screen/inventory()
inv_box.name = "belt"
inv_box.icon = ui_style
inv_box.icon_state = "belt"
// inv_box.icon_full = "template_small"
inv_box.screen_loc = ui_belt
inv_box.slot_id = slot_belt
static_inventory += inv_box
throw_icon = new /obj/screen/throw_catch()
throw_icon.icon = ui_style
throw_icon.screen_loc = ui_drop_throw
hotkeybuttons += throw_icon
internals = new /obj/screen/internals()
infodisplay += internals
healths = new /obj/screen/healths()
infodisplay += healths
//citadel code
arousal = new /obj/screen/arousal()
infodisplay += arousal
healthdoll = new /obj/screen/healthdoll()
infodisplay += healthdoll
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
pull_icon.update_icon(mymob)
pull_icon.screen_loc = ui_pull_resist
static_inventory += pull_icon
lingchemdisplay = new /obj/screen/ling/chems()
infodisplay += lingchemdisplay
lingstingdisplay = new /obj/screen/ling/sting()
infodisplay += lingstingdisplay
devilsouldisplay = new /obj/screen/devil/soul_counter
infodisplay += devilsouldisplay
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
zone_select.update_icon(mymob)
static_inventory += zone_select
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[inv.slot_id] = inv
inv.update_icon()
/datum/hud/human/update_locked_slots()
if(!mymob)
return
@@ -325,114 +325,114 @@
else
inv.alpha = initial(inv.alpha)
/datum/hud/human/hidden_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/carbon/human/H = mymob
var/mob/screenmob = viewer || H
if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown)
if(H.shoes)
H.shoes.screen_loc = ui_shoes
screenmob.client.screen += H.shoes
if(H.gloves)
H.gloves.screen_loc = ui_gloves
screenmob.client.screen += H.gloves
if(H.ears)
H.ears.screen_loc = ui_ears
screenmob.client.screen += H.ears
if(H.glasses)
H.glasses.screen_loc = ui_glasses
screenmob.client.screen += H.glasses
if(H.w_uniform)
H.w_uniform.screen_loc = ui_iclothing
screenmob.client.screen += H.w_uniform
if(H.wear_suit)
H.wear_suit.screen_loc = ui_oclothing
screenmob.client.screen += H.wear_suit
if(H.wear_mask)
H.wear_mask.screen_loc = ui_mask
screenmob.client.screen += H.wear_mask
if(H.wear_neck)
H.wear_neck.screen_loc = ui_neck
screenmob.client.screen += H.wear_neck
if(H.head)
H.head.screen_loc = ui_head
screenmob.client.screen += H.head
else
if(H.shoes) screenmob.client.screen -= H.shoes
if(H.gloves) screenmob.client.screen -= H.gloves
if(H.ears) screenmob.client.screen -= H.ears
if(H.glasses) screenmob.client.screen -= H.glasses
if(H.w_uniform) screenmob.client.screen -= H.w_uniform
if(H.wear_suit) screenmob.client.screen -= H.wear_suit
if(H.wear_mask) screenmob.client.screen -= H.wear_mask
if(H.wear_neck) screenmob.client.screen -= H.wear_neck
if(H.head) screenmob.client.screen -= H.head
/datum/hud/human/persistent_inventory_update(mob/viewer)
if(!mymob)
return
..()
var/mob/living/carbon/human/H = mymob
var/mob/screenmob = viewer || H
if(screenmob.hud_used)
if(screenmob.hud_used.hud_shown)
if(H.s_store)
H.s_store.screen_loc = ui_sstore1
screenmob.client.screen += H.s_store
if(H.wear_id)
H.wear_id.screen_loc = ui_id
screenmob.client.screen += H.wear_id
if(H.belt)
H.belt.screen_loc = ui_belt
screenmob.client.screen += H.belt
if(H.back)
H.back.screen_loc = ui_back
screenmob.client.screen += H.back
if(H.l_store)
H.l_store.screen_loc = ui_storage1
screenmob.client.screen += H.l_store
if(H.r_store)
H.r_store.screen_loc = ui_storage2
screenmob.client.screen += H.r_store
else
if(H.s_store)
screenmob.client.screen -= H.s_store
if(H.wear_id)
screenmob.client.screen -= H.wear_id
if(H.belt)
screenmob.client.screen -= H.belt
if(H.back)
screenmob.client.screen -= H.back
if(H.l_store)
screenmob.client.screen -= H.l_store
if(H.r_store)
screenmob.client.screen -= H.r_store
if(hud_version != HUD_STYLE_NOHUD)
for(var/obj/item/I in H.held_items)
I.screen_loc = ui_hand_position(H.get_held_index_of_item(I))
screenmob.client.screen += I
else
for(var/obj/item/I in H.held_items)
I.screen_loc = null
screenmob.client.screen -= I
/mob/living/carbon/human/verb/toggle_hotkey_verbs()
set category = "OOC"
set name = "Toggle hotkey buttons"
set desc = "This disables or enables the user interface buttons which can be used with hotkeys."
if(hud_used.hotkey_ui_hidden)
client.screen += hud_used.hotkeybuttons
hud_used.hotkey_ui_hidden = 0
else
client.screen -= hud_used.hotkeybuttons
hud_used.hotkey_ui_hidden = 1
/datum/hud/human/hidden_inventory_update(mob/viewer)
if(!mymob)
return
var/mob/living/carbon/human/H = mymob
var/mob/screenmob = viewer || H
if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown)
if(H.shoes)
H.shoes.screen_loc = ui_shoes
screenmob.client.screen += H.shoes
if(H.gloves)
H.gloves.screen_loc = ui_gloves
screenmob.client.screen += H.gloves
if(H.ears)
H.ears.screen_loc = ui_ears
screenmob.client.screen += H.ears
if(H.glasses)
H.glasses.screen_loc = ui_glasses
screenmob.client.screen += H.glasses
if(H.w_uniform)
H.w_uniform.screen_loc = ui_iclothing
screenmob.client.screen += H.w_uniform
if(H.wear_suit)
H.wear_suit.screen_loc = ui_oclothing
screenmob.client.screen += H.wear_suit
if(H.wear_mask)
H.wear_mask.screen_loc = ui_mask
screenmob.client.screen += H.wear_mask
if(H.wear_neck)
H.wear_neck.screen_loc = ui_neck
screenmob.client.screen += H.wear_neck
if(H.head)
H.head.screen_loc = ui_head
screenmob.client.screen += H.head
else
if(H.shoes) screenmob.client.screen -= H.shoes
if(H.gloves) screenmob.client.screen -= H.gloves
if(H.ears) screenmob.client.screen -= H.ears
if(H.glasses) screenmob.client.screen -= H.glasses
if(H.w_uniform) screenmob.client.screen -= H.w_uniform
if(H.wear_suit) screenmob.client.screen -= H.wear_suit
if(H.wear_mask) screenmob.client.screen -= H.wear_mask
if(H.wear_neck) screenmob.client.screen -= H.wear_neck
if(H.head) screenmob.client.screen -= H.head
/datum/hud/human/persistent_inventory_update(mob/viewer)
if(!mymob)
return
..()
var/mob/living/carbon/human/H = mymob
var/mob/screenmob = viewer || H
if(screenmob.hud_used)
if(screenmob.hud_used.hud_shown)
if(H.s_store)
H.s_store.screen_loc = ui_sstore1
screenmob.client.screen += H.s_store
if(H.wear_id)
H.wear_id.screen_loc = ui_id
screenmob.client.screen += H.wear_id
if(H.belt)
H.belt.screen_loc = ui_belt
screenmob.client.screen += H.belt
if(H.back)
H.back.screen_loc = ui_back
screenmob.client.screen += H.back
if(H.l_store)
H.l_store.screen_loc = ui_storage1
screenmob.client.screen += H.l_store
if(H.r_store)
H.r_store.screen_loc = ui_storage2
screenmob.client.screen += H.r_store
else
if(H.s_store)
screenmob.client.screen -= H.s_store
if(H.wear_id)
screenmob.client.screen -= H.wear_id
if(H.belt)
screenmob.client.screen -= H.belt
if(H.back)
screenmob.client.screen -= H.back
if(H.l_store)
screenmob.client.screen -= H.l_store
if(H.r_store)
screenmob.client.screen -= H.r_store
if(hud_version != HUD_STYLE_NOHUD)
for(var/obj/item/I in H.held_items)
I.screen_loc = ui_hand_position(H.get_held_index_of_item(I))
screenmob.client.screen += I
else
for(var/obj/item/I in H.held_items)
I.screen_loc = null
screenmob.client.screen -= I
/mob/living/carbon/human/verb/toggle_hotkey_verbs()
set category = "OOC"
set name = "Toggle hotkey buttons"
set desc = "This disables or enables the user interface buttons which can be used with hotkeys."
if(hud_used.hotkey_ui_hidden)
client.screen += hud_used.hotkeybuttons
hud_used.hotkey_ui_hidden = 0
else
client.screen -= hud_used.hotkeybuttons
hud_used.hotkey_ui_hidden = 1
+3 -4
View File
@@ -91,10 +91,9 @@
screen_loc = ui_language_menu
/obj/screen/language_menu/Click()
var/mob/living/L = usr
if(!istype(L))
return
L.open_language_menu(usr)
var/mob/M = usr
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
/obj/screen/inventory
var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
+1 -1
View File
@@ -28,7 +28,7 @@
if(sharpness)
to_chat(user, "<span class='notice'>You begin to butcher [src]...</span>")
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
if(do_mob(user, src, 80/sharpness))
if(do_mob(user, src, 80/sharpness) && Adjacent(I))
harvest(user)
return 1
return I.attack(src, user)
+2 -2
View File
@@ -25,7 +25,7 @@
var/arousal_gain_rate = 1 //Rate at which this species becomes aroused
var/arousal_lose_rate = 1 //Multiplier for how easily arousal can be relieved
var/list/cum_fluids = list("semen")
var/list/milk_fludis = list("milk")
var/list/milk_fluids = list("milk")
var/list/femcum_fluids = list("femcum")
//Mob procs
@@ -285,4 +285,4 @@
/mob/living/carbon/proc/force_orgasm(intensity)
if(canbearoused && has_dna() && (has_penis() || has_vagina()))
return 1
return 0
return 0
+1 -1
View File
@@ -6,7 +6,7 @@
INITIALIZE_IMMEDIATE(/obj/effect/statclick)
/obj/effect/statclick/Initialize(mapload, text, target) //Don't port this to Initialize it's too critical
..()
. = ..()
name = text
src.target = target
+11 -8
View File
@@ -162,8 +162,8 @@
var/alert_desc_red_downto = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
var/alert_desc_delta = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
var/revival_pod_plants = 1
var/revival_cloning = 1
var/revival_pod_plants = FALSE
var/revival_cloning = FALSE
var/revival_brain_life = -1
var/rename_cyborg = 0
@@ -259,6 +259,8 @@
var/arrivals_shuttle_dock_window = 55 //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station
var/arrivals_shuttle_require_safe_latejoin = FALSE //Require the arrivals shuttle to be operational in order for latejoiners to join
var/mice_roundstart = 10 // how many wire chewing rodents spawn at roundstart.
/datum/configuration/New()
gamemode_cache = typecacheof(/datum/game_mode,TRUE)
for(var/T in gamemode_cache)
@@ -278,7 +280,6 @@
votable_modes += "secret"
Reload()
reload_custom_roundstart_items_list()
/datum/configuration/proc/Reload()
load("config/config.txt")
@@ -543,9 +544,9 @@
if("damage_multiplier")
damage_multiplier = text2num(value)
if("revival_pod_plants")
revival_pod_plants = text2num(value)
revival_pod_plants = TRUE
if("revival_cloning")
revival_cloning = text2num(value)
revival_cloning = TRUE
if("revival_brain_life")
revival_brain_life = text2num(value)
if("rename_cyborg")
@@ -765,13 +766,15 @@
if("arrivals_shuttle_dock_window")
arrivals_shuttle_dock_window = max(PARALLAX_LOOP_TIME, text2num(value))
if("arrivals_shuttle_require_safe_latejoin")
arrivals_shuttle_require_safe_latejoin = text2num(value)
arrivals_shuttle_require_safe_latejoin = TRUE
if("mice_roundstart")
mice_roundstart = text2num(value)
if ("mentor_mobname_only")
mentors_mobname_only = 1
if ("mentor_legacy_system")
mentor_legacy_system = 1
// else
// GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration."
else
GLOB.config_error_log << "Unknown setting in configuration: '[name]'"
fps = round(fps)
if(fps <= 0)
+54 -41
View File
@@ -47,8 +47,6 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
var/make_runtime = 0
var/initializations_finished_with_no_players_logged_in //I wonder what this could be?
// Has round started? (So we know what subsystems to run)
var/local_round_started = FALSE //Don't read this var, use SSticker.HasRoundStarted() instead
// The type of the last subsystem to be process()'d.
var/last_type_processed
@@ -59,6 +57,8 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
var/queue_priority_count_bg = 0 //Same, but for background subsystems
var/map_loading = FALSE //Are we loading in a new map?
var/current_runlevel //for scheduling different subsystems for different stages of the round
/datum/controller/master/New()
// Highlander-style: there can only be one! Kill off the old and replace it with the new.
subsystems = list()
@@ -132,7 +132,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined."
BadBoy.flags |= SS_NO_FIRE
if(msg)
to_chat(GLOB.admins, "<span class='boldannounce'>[msg]</span>")
to_chat(GLOB.admins, "<span class='boldannounce'>[msg]</span>")
log_world(msg)
if (istype(Master.subsystems))
@@ -176,6 +176,8 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
to_chat(world, "<span class='boldannounce'>[msg]</span>")
log_world(msg)
SetRunLevel(1)
// Sort subsystems by display setting for easy access.
sortTim(subsystems, /proc/cmp_subsystem_display)
// Set world options.
@@ -187,16 +189,15 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
// Loop.
Master.StartProcessing(0)
// Notify the MC that the round has started.
/datum/controller/master/proc/RoundStart()
local_round_started = TRUE
var/timer = world.time
for (var/datum/controller/subsystem/SS in subsystems)
if (SS.flags & SS_FIRE_IN_LOBBY || SS.flags & SS_TICKER)
continue //already firing
// Stagger subsystems.
timer += world.tick_lag * rand(1, 5)
SS.next_fire = timer
/datum/controller/master/proc/SetRunLevel(new_runlevel)
var/old_runlevel = current_runlevel
if(isnull(old_runlevel))
old_runlevel = "NULL"
testing("MC: Runlevel changed from [old_runlevel] to [new_runlevel]")
current_runlevel = log(2, new_runlevel) + 1
if(current_runlevel < 1)
CRASH("Attempted to set invalid runlevel: [new_runlevel]")
// Starts the mc, and sticks around to restart it if the loop ever ends.
/datum/controller/master/proc/StartProcessing(delay)
@@ -221,12 +222,9 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
//Prep the loop (most of this is because we want MC restarts to reset as much state as we can, and because
// local vars rock
// Schedule the first run of the Subsystems.
local_round_started = world.has_round_started()
//all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed)
var/list/tickersubsystems = list()
var/list/normalsubsystems = list()
var/list/lobbysubsystems = list()
var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel
var/timer = world.time
for (var/thing in subsystems)
var/datum/controller/subsystem/SS = thing
@@ -241,25 +239,29 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
timer += world.tick_lag * rand(1, 5)
SS.next_fire = timer
continue
if (SS.flags & SS_FIRE_IN_LOBBY)
lobbysubsystems += SS
timer += world.tick_lag * rand(1, 5)
SS.next_fire = timer
else if (local_round_started)
timer += world.tick_lag * rand(1, 5)
SS.next_fire = timer
normalsubsystems += SS
var/ss_runlevels = SS.runlevels
var/added_to_any = FALSE
for(var/I in 1 to GLOB.bitflags.len)
if(ss_runlevels & GLOB.bitflags[I])
while(runlevel_sorted_subsystems.len < I)
runlevel_sorted_subsystems += list(list())
runlevel_sorted_subsystems[I] += SS
added_to_any = TRUE
if(!added_to_any)
WARNING("[SS.name] subsystem is not SS_NO_FIRE but also does not have any runlevels set!")
queue_head = null
queue_tail = null
//these sort by lower priorities first to reduce the number of loops needed to add subsequent SS's to the queue
//(higher subsystems will be sooner in the queue, adding them later in the loop means we don't have to loop thru them next queue add)
sortTim(tickersubsystems, /proc/cmp_subsystem_priority)
sortTim(normalsubsystems, /proc/cmp_subsystem_priority)
sortTim(lobbysubsystems, /proc/cmp_subsystem_priority)
for(var/I in runlevel_sorted_subsystems)
sortTim(runlevel_sorted_subsystems, /proc/cmp_subsystem_priority)
I += tickersubsystems
normalsubsystems += tickersubsystems
lobbysubsystems += tickersubsystems
var/cached_runlevel = current_runlevel
var/list/current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel]
init_timeofday = REALTIMEOFDAY
init_time = world.time
@@ -296,14 +298,23 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
if (!Failsafe || (Failsafe.processing_interval > 0 && (Failsafe.lasttick+(Failsafe.processing_interval*5)) < world.time))
new/datum/controller/failsafe() // (re)Start the failsafe.
if (!queue_head || !(iteration % 3))
if (local_round_started)
subsystems_to_check = normalsubsystems
else
subsystems_to_check = lobbysubsystems
var/checking_runlevel = current_runlevel
if(cached_runlevel != checking_runlevel)
//resechedule subsystems
cached_runlevel = checking_runlevel
current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel]
var/stagger = world.time
for(var/I in current_runlevel_subsystems)
var/datum/controller/subsystem/SS = I
if(SS.next_fire <= world.time)
stagger += world.tick_lag * rand(1, 5)
SS.next_fire = stagger
subsystems_to_check = current_runlevel_subsystems
else
subsystems_to_check = tickersubsystems
if (CheckQueue(subsystems_to_check) <= 0)
if (!SoftReset(tickersubsystems, normalsubsystems, lobbysubsystems))
if (!SoftReset(tickersubsystems, runlevel_sorted_subsystems))
log_world("MC: SoftReset() failed, crashing")
return
if (!error_level)
@@ -315,7 +326,7 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
if (queue_head)
if (RunQueue() <= 0)
if (!SoftReset(tickersubsystems, normalsubsystems, lobbysubsystems))
if (!SoftReset(tickersubsystems, runlevel_sorted_subsystems))
log_world("MC: SoftReset() failed, crashing")
return
if (!error_level)
@@ -491,13 +502,15 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
//resets the queue, and all subsystems, while filtering out the subsystem lists
// called if any mc's queue procs runtime or exit improperly.
/datum/controller/master/proc/SoftReset(list/ticker_SS, list/normal_SS, list/lobby_SS)
/datum/controller/master/proc/SoftReset(list/ticker_SS, list/runlevel_SS)
. = 0
log_world("MC: SoftReset called, resetting MC queue state.")
if (!istype(subsystems) || !istype(ticker_SS) || !istype(normal_SS) || !istype(lobby_SS))
log_world("MC: SoftReset: Bad list contents: '[subsystems]' '[ticker_SS]' '[normal_SS]' '[lobby_SS]' Crashing!")
if (!istype(subsystems) || !istype(ticker_SS) || !istype(runlevel_SS))
log_world("MC: SoftReset: Bad list contents: '[subsystems]' '[ticker_SS]' '[runlevel_SS]'")
return
var/subsystemstocheck = subsystems + ticker_SS + normal_SS + lobby_SS
var/subsystemstocheck = subsystems + ticker_SS
for(var/I in runlevel_SS)
subsystemstocheck |= I
for (var/thing in subsystemstocheck)
var/datum/controller/subsystem/SS = thing
@@ -505,8 +518,8 @@ GLOBAL_VAR_INIT(CURRENT_TICKLIMIT, TICK_LIMIT_RUNNING)
//list(SS) is so if a list makes it in the subsystem list, we remove the list, not the contents
subsystems -= list(SS)
ticker_SS -= list(SS)
normal_SS -= list(SS)
lobby_SS -= list(SS)
for(var/I in runlevel_SS)
I -= list(SS)
log_world("MC: SoftReset: Found bad entry in subsystem list, '[SS]'")
continue
if (SS.queue_next && !istype(SS.queue_next))
+2
View File
@@ -29,6 +29,8 @@
var/datum/controller/subsystem/queue_next
var/datum/controller/subsystem/queue_prev
var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire
var/static/failure_strikes = 0 //How many times we suspect this subsystem has crashed the MC, 3 strikes and you're out!
//Do not override
+1
View File
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(acid)
name = "Acid"
priority = 40
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun = list()
var/list/processing = list()
+2 -1
View File
@@ -12,6 +12,7 @@ SUBSYSTEM_DEF(air)
priority = 20
wait = 5
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/cost_turfs = 0
var/cost_groups = 0
@@ -299,7 +300,7 @@ SUBSYSTEM_DEF(air)
var/timer = world.timeofday
warning("There are [starting_ats] active turfs at roundstart, this is a mapping error caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required)")
for(var/turf/T in active_turfs)
GLOB.active_turfs_startlist += text("[T.x], [T.y], [T.z]\n")
GLOB.active_turfs_startlist += T
//now lets clear out these active turfs
var/list/turfs_to_check = active_turfs.Copy()
+1 -1
View File
@@ -150,7 +150,7 @@ SUBSYSTEM_DEF(atoms)
/datum/controller/subsystem/atoms/Shutdown()
var/initlog = InitLog()
if(initlog)
log_world(initlog)
text2file("[GLOB.log_directory]/initialize.log", initlog)
#undef BAD_INIT_QDEL_BEFORE
#undef BAD_INIT_DIDNT_INIT
+1
View File
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(augury)
name = "Augury"
flags = SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/watchers = list()
var/list/doombringers = list()
+3 -3
View File
@@ -2,7 +2,7 @@ SUBSYSTEM_DEF(blackbox)
name = "Blackbox"
wait = 6000
flags = SS_NO_TICK_CHECK
var/list/msg_common = list()
var/list/msg_science = list()
var/list/msg_command = list()
@@ -91,7 +91,7 @@ SUBSYSTEM_DEF(blackbox)
if (sqlrowlist != "")
sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
sqlrowlist += "(null, Now(), [GLOB.round_id], \"[sanitizeSQL(FV.get_variable())]\", [FV.get_value()], \"[sanitizeSQL(FV.get_details())]\")"
sqlrowlist += list(list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'"))
if (sqlrowlist == "")
return
@@ -243,4 +243,4 @@ SUBSYSTEM_DEF(blackbox)
return details
/datum/feedback_variable/proc/get_parsed()
return list(variable,value,details)
return list(variable,value,details)
+74 -2
View File
@@ -77,15 +77,87 @@ SUBSYSTEM_DEF(dbcore)
return FALSE
return _dm_db_is_connected(_db_con)
/datum/controller/subsystem/dbcore/proc/Quote(str)
/datum/controller/subsystem/dbcore/proc/Quote(str)
return _dm_db_quote(_db_con, str)
/datum/controller/subsystem/dbcore/proc/ErrorMsg()
/datum/controller/subsystem/dbcore/proc/ErrorMsg()
if(!config.sql_enabled)
return "Database disabled by configuration"
return _dm_db_error_msg(_db_con)
/datum/controller/subsystem/dbcore/proc/NewQuery(sql_query, cursor_handler = Default_Cursor)
if(IsAdminAdvancedProcCall())
log_admin_private("ERROR: Advanced admin proc call led to sql query: [sql_query]. Query has been blocked")
message_admins("ERROR: Advanced admin proc call led to sql query. Query has been blocked")
return FALSE
return new /datum/DBQuery(sql_query, src, cursor_handler)
/*
Takes a list of rows (each row being an associated list of column => value) and inserts them via a single mass query.
Rows missing columns present in other rows will resolve to SQL NULL
You are expected to do your own escaping of the data, and expected to provide your own quotes for strings.
The duplicate_key arg can be true to automatically generate this part of the query
or set to a string that is appended to the end of the query
Ignore_errors instructes mysql to continue inserting rows if some of them have errors.
the erroneous row(s) aren't inserted and there isn't really any way to know why or why errored
Delayed insert mode was removed in mysql 7 and only works with MyISAM type tables,
It was included because it is still supported in mariadb.
It does not work with duplicate_key and the mysql server ignores it in those cases
*/
/datum/controller/subsystem/dbcore/proc/MassInsert(table, list/rows, duplicate_key = FALSE, ignore_errors = FALSE, delayed = FALSE, warn = FALSE)
if (!table || !rows || !istype(rows))
return
var/list/columns = list()
var/list/sorted_rows = list()
for (var/list/row in rows)
var/list/sorted_row = list()
sorted_row.len = columns.len
for (var/column in row)
var/idx = columns[column]
if (!idx)
idx = columns.len + 1
columns[column] = idx
sorted_row.len = columns.len
sorted_row[idx] = row[column]
sorted_rows[++sorted_rows.len] = sorted_row
if (duplicate_key == TRUE)
var/list/column_list = list()
for (var/column in columns)
column_list += "[column] = VALUES([column])"
duplicate_key = "ON DUPLICATE KEY UPDATE [column_list.Join(", ")]\n"
else if (duplicate_key == FALSE)
duplicate_key = null
if (ignore_errors)
ignore_errors = " IGNORE"
else
ignore_errors = null
if (delayed)
delayed = " DELAYED"
else
delayed = null
var/list/sqlrowlist = list()
var/len = columns.len
for (var/list/row in sorted_rows)
if (length(row) != len)
row.len = len
for (var/value in row)
if (value == null)
value = "NULL"
sqlrowlist += "([row.Join(", ")])"
sqlrowlist = " [sqlrowlist.Join(",\n ")]"
var/datum/DBQuery/Query = NewQuery("INSERT[delayed][ignore_errors] INTO [table]\n([columns.Join(", ")])\nVALUES\n[sqlrowlist]\n[duplicate_key]")
if (warn)
return Query.warn_execute()
else
return Query.Execute()
/datum/DBQuery
var/sql // The sql query being executed.
+1
View File
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(disease)
name = "Disease"
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun = list()
var/list/processing = list()
+1
View File
@@ -1,6 +1,7 @@
SUBSYSTEM_DEF(events)
name = "Events"
init_order = INIT_ORDER_EVENTS
runlevels = RUNLEVEL_GAME
var/list/control = list() //list of all datum/round_event_control. Used for selecting events based on weight and occurrences.
var/list/running = list() //list of all existing /datum/round_event
+27
View File
@@ -0,0 +1,27 @@
SUBSYSTEM_DEF(fields)
name = "Fields"
wait = 2
priority = 40
flags = SS_KEEP_TIMING
var/list/datum/proximity_monitor/advanced/running = list()
var/list/datum/proximity_monitor/advanced/currentrun = list()
/datum/controller/subsystem/fields/fire(resumed = 0)
if(!resumed)
src.currentrun = running.Copy()
var/list/currentrun = src.currentrun
while(currentrun.len)
var/datum/proximity_monitor/advanced/F = currentrun[currentrun.len]
currentrun.len--
if(!F.requires_processing)
continue
F.process()
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/fields/proc/register_new_field(datum/proximity_monitor/advanced/F)
running += F
/datum/controller/subsystem/fields/proc/unregister_field(datum/proximity_monitor/advanced/F)
running -= F
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(fire_burning)
name = "Fire Burning"
priority = 40
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun = list()
var/list/processing = list()
+3 -2
View File
@@ -2,7 +2,8 @@ SUBSYSTEM_DEF(garbage)
name = "Garbage"
priority = 15
wait = 5
flags = SS_FIRE_IN_LOBBY|SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
var/collection_timeout = 3000// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
var/delslasttick = 0 // number of del()'s we've done this tick
@@ -60,7 +61,7 @@ SUBSYSTEM_DEF(garbage)
for(var/path in sleptDestroy)
dellog += "Path : [path] \n"
dellog += "Sleeps : [sleptDestroy[path]] \n"
log_world(dellog.Join())
text2file("[GLOB.log_directory]/qdel.log", dellog.Join())
/datum/controller/subsystem/garbage/fire()
HandleToBeQueued()
+1
View File
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(inbounds)
name = "Inbounds"
priority = 40
flags = SS_NO_INIT
runlevels = RUNLEVEL_GAME
var/list/processing = list()
var/list/currentrun = list()
+4 -14
View File
@@ -287,8 +287,6 @@ SUBSYSTEM_DEF(job)
if(PopcapReached())
RejectPlayer(player)
var/datum/job/validjob
// Loop through all jobs
for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
if(!job)
@@ -315,19 +313,11 @@ SUBSYSTEM_DEF(job)
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
AssignRole(player, job.title)
unassigned -= player
break
validjob = job
//Is the Job empty? Stop Looking Then!
if (!job.current_positions)
break
//Assign us the last job we found
if (validjob)
Debug("DO pass, Player: [player], Level:[level], Job:[validjob.title]")
AssignRole(player, validjob.title)
unassigned -= player
break
// Hand out random jobs to the people who didn't get any in the last check
// Also makes sure that they got their preference correct
+18
View File
@@ -0,0 +1,18 @@
SUBSYSTEM_DEF(language)
name = "Language"
init_order = INIT_ORDER_LANGUAGE
flags = SS_NO_FIRE
/datum/controller/subsystem/language/Initialize(timeofday)
for(var/L in subtypesof(/datum/language))
var/datum/language/language = L
if(!initial(language.key))
continue
GLOB.all_languages += language
var/datum/language/instance = new language
GLOB.language_datum_instances[language] = instance
return ..()
+1
View File
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(mobs)
name = "Mobs"
priority = 100
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun = list()
+1
View File
@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(npcpool)
name = "NPC Pool"
flags = SS_POST_FIRE_TIMING|SS_NO_INIT|SS_BACKGROUND
priority = 20
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/canBeUsed = list()
var/list/needsDelegate = list()
+2 -1
View File
@@ -1,8 +1,9 @@
SUBSYSTEM_DEF(parallax)
name = "Parallax"
wait = 2
flags = SS_POST_FIRE_TIMING | SS_FIRE_IN_LOBBY | SS_BACKGROUND | SS_NO_INIT
flags = SS_POST_FIRE_TIMING | SS_BACKGROUND | SS_NO_INIT
priority = 65
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/list/currentrun
/datum/controller/subsystem/parallax/fire(resumed = 0)
@@ -1,9 +1,10 @@
PROCESSING_SUBSYSTEM_DEF(overlays)
name = "Overlay"
flags = SS_TICKER|SS_FIRE_IN_LOBBY
flags = SS_TICKER
wait = 1
priority = 500
init_order = INIT_ORDER_OVERLAY
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_SETUP
stat_tag = "Ov"
currentrun = null
+2 -1
View File
@@ -3,8 +3,9 @@
SUBSYSTEM_DEF(server_maint)
name = "Server Tasks"
wait = 6
flags = SS_POST_FIRE_TIMING|SS_FIRE_IN_LOBBY
flags = SS_POST_FIRE_TIMING
priority = 10
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/list/currentrun
/datum/controller/subsystem/server_maint/Initialize(timeofday)
+12 -1
View File
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(shuttle)
wait = 10
init_order = INIT_ORDER_SHUTTLE
flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK
runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME
var/list/mobile = list()
var/list/stationary = list()
@@ -48,7 +49,7 @@ SUBSYSTEM_DEF(shuttle)
var/auto_call = 72000 //time before in deciseconds in which the shuttle is auto called. Default is 2 hours.
/datum/controller/subsystem/shuttle/Initialize(timeofday)
if(!emergency)
if(!arrivals)
WARNING("No /obj/docking_port/mobile/arrivals placed on the map!")
if(!emergency)
WARNING("No /obj/docking_port/mobile/emergency placed on the map!")
@@ -513,3 +514,13 @@ SUBSYSTEM_DEF(shuttle)
centcom_message = SSshuttle.centcom_message
ordernum = SSshuttle.ordernum
points = SSshuttle.points
/datum/controller/subsystem/shuttle/proc/is_in_shuttle_bounds(atom/A)
var/area/current = get_area(A)
if(istype(current, /area/shuttle) && !istype(current,/area/shuttle/transit))
return TRUE
for(var/obj/docking_port/mobile/M in mobile)
if(M.is_in_shuttle_bounds(A))
return TRUE
+1
View File
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(spacedrift)
priority = 30
wait = 5
flags = SS_NO_INIT|SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun = list()
var/list/processing = list()
+2 -1
View File
@@ -1,8 +1,9 @@
SUBSYSTEM_DEF(tgui)
name = "tgui"
wait = 9
flags = SS_NO_INIT|SS_FIRE_IN_LOBBY
flags = SS_NO_INIT
priority = 110
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/list/currentrun = list()
var/list/open_uis = list() // A list of open UIs, grouped by src_object and ui_key.
+1
View File
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(throwing)
priority = 25
wait = 1
flags = SS_NO_INIT|SS_KEEP_TIMING|SS_TICKER
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
var/list/currentrun
var/list/processing = list()
+25 -4
View File
@@ -5,7 +5,8 @@ SUBSYSTEM_DEF(ticker)
init_order = INIT_ORDER_TICKER
priority = 200
flags = SS_FIRE_IN_LOBBY|SS_KEEP_TIMING
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME
var/current_state = GAME_STATE_STARTUP //state of current round (used by process()) Use the defines GAME_STATE_* !
var/force_ending = 0 //Round was ended by admin intervention
@@ -109,6 +110,7 @@ SUBSYSTEM_DEF(ticker)
if(timeLeft <= 0)
current_state = GAME_STATE_SETTING_UP
Master.SetRunLevel(RUNLEVEL_SETUP)
if(start_immediately)
fire()
@@ -116,6 +118,7 @@ SUBSYSTEM_DEF(ticker)
if(!setup())
//setup failed
current_state = GAME_STATE_STARTUP
Master.SetRunLevel(RUNLEVEL_LOBBY)
if(GAME_STATE_PLAYING)
mode.process(wait * 0.1)
@@ -128,6 +131,7 @@ SUBSYSTEM_DEF(ticker)
current_state = GAME_STATE_FINISHED
toggle_ooc(1) // Turn it on
declare_completion(force_ending)
Master.SetRunLevel(RUNLEVEL_POSTGAME)
/datum/controller/subsystem/ticker/proc/setup()
to_chat(world, "<span class='boldannounce'>Starting game...</span>")
@@ -204,8 +208,6 @@ SUBSYSTEM_DEF(ticker)
transfer_characters() //transfer keys to the new mobs
Master.RoundStart() //let the party begin...
for(var/I in round_start_events)
var/datum/callback/cb = I
cb.InvokeAsync()
@@ -218,6 +220,7 @@ SUBSYSTEM_DEF(ticker)
world << sound('sound/AI/welcome.ogg')
current_state = GAME_STATE_PLAYING
Master.SetRunLevel(RUNLEVEL_GAME)
if(SSevents.holidays)
to_chat(world, "<font color='blue'>and...</font>")
@@ -281,7 +284,7 @@ SUBSYSTEM_DEF(ticker)
//Now animate the cinematic
switch(station_missed)
if(NUKE_NEAR_MISS) //nuke was nearby but (mostly) missed
if( mode && !override )
if(mode && !override )
override = mode.name
switch( override )
if("nuclear emergency") //Nuke wasn't on station when it blew up
@@ -291,6 +294,17 @@ SUBSYSTEM_DEF(ticker)
station_explosion_detonation(bomb)
flick("station_intact_fade_red",cinematic)
cinematic.icon_state = "summary_nukefail"
if("cult")
cinematic.icon_state = null
flick("intro_cult",cinematic)
sleep(25)
world << sound('sound/magic/enter_blood.ogg')
sleep(28)
world << sound('sound/machines/terminal_off.ogg')
sleep(20)
flick("station_corrupted",cinematic)
world << sound('sound/effects/ghost.ogg')
actually_blew_up = FALSE
if("gang war") //Gang Domination (just show the override screen)
cinematic.icon_state = "intro_malf_still"
flick("intro_malf",cinematic)
@@ -339,6 +353,13 @@ SUBSYSTEM_DEF(ticker)
world << sound('sound/effects/explosionfar.ogg')
station_explosion_detonation(bomb) //TODO: no idea what this case could be
cinematic.icon_state = "summary_selfdes"
if("cult") //Station nuked (nuke,explosion,summary)
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
world << sound('sound/effects/explosionfar.ogg')
station_explosion_detonation(bomb) //TODO: no idea what this case could be
cinematic.icon_state = "summary_cult"
if("no_core") //Nuke failed to detonate as it had no core
flick("intro_nuke",cinematic)
sleep(35)
+2 -1
View File
@@ -1,7 +1,8 @@
SUBSYSTEM_DEF(time_track)
name = "Time Tracking"
wait = 600
flags = SS_NO_INIT|SS_FIRE_IN_LOBBY|SS_NO_TICK_CHECK
flags = SS_NO_INIT|SS_NO_TICK_CHECK
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/time_dilation_current = 0
+1 -1
View File
@@ -6,7 +6,7 @@ SUBSYSTEM_DEF(timer)
wait = 1 //SS_TICKER subsystem, so wait is in ticks
init_order = INIT_ORDER_TIMER
flags = SS_FIRE_IN_LOBBY|SS_TICKER|SS_NO_INIT
flags = SS_TICKER|SS_NO_INIT
var/list/datum/timedevent/processing = list()
var/list/hashes = list()
+3 -1
View File
@@ -2,7 +2,9 @@ SUBSYSTEM_DEF(vote)
name = "Vote"
wait = 10
flags = SS_FIRE_IN_LOBBY|SS_KEEP_TIMING|SS_NO_INIT
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
var/initiator = null
var/started_time = null
+1
View File
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(weather)
name = "Weather"
flags = SS_BACKGROUND
wait = 10
runlevels = RUNLEVEL_GAME
var/list/processing = list()
var/list/existing_weather = list()
var/list/eligible_zlevels = list(ZLEVEL_LAVALAND)
+57 -3
View File
@@ -358,6 +358,59 @@
active = FALSE
..()
/datum/action/item_action/initialize_ninja_suit
name = "Toggle ninja suit"
/datum/action/item_action/ninjajaunt
name = "Phase Jaunt (10E)"
desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
button_icon_state = "ninja_phase"
/datum/action/item_action/ninjasmoke
name = "Smoke Bomb"
desc = "Blind your enemies momentarily with a well-placed smoke bomb."
button_icon_state = "smoke"
/datum/action/item_action/ninjaboost
name = "Adrenaline Boost"
desc = "Inject a secret chemical that will counteract all movement-impairing effect."
button_icon_state = "repulse"
/datum/action/item_action/ninjapulse
name = "EM Burst (25E)"
desc = "Disable any nearby technology with a electro-magnetic pulse."
button_icon_state = "emp"
/datum/action/item_action/ninjastar
name = "Create Throwing Stars (1E)"
desc = "Creates some throwing stars"
button_icon_state = "throwingstar"
icon_icon = 'icons/obj/weapons.dmi'
/datum/action/item_action/ninjanet
name = "Energy Net (20E)"
desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
button_icon_state = "energynet"
icon_icon = 'icons/effects/effects.dmi'
/datum/action/item_action/ninja_sword_recall
name = "Recall Energy Katana (Variable Cost)"
desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
button_icon_state = "energy_katana"
icon_icon = 'icons/obj/weapons.dmi'
/datum/action/item_action/ninja_stealth
name = "Toggle Stealth"
desc = "Toggles stealth mode on and off."
button_icon_state = "ninja_cloak"
/datum/action/item_action/toggle_glove
name = "Toggle interaction"
desc = "Switch between normal interaction and drain mode."
button_icon_state = "s-ninjan"
icon_icon = 'icons/obj/clothing/gloves.dmi'
/datum/action/item_action/organ_action
check_flags = AB_CHECK_CONSCIOUS
@@ -482,6 +535,7 @@
/datum/action/language_menu/Trigger()
if(!..())
return FALSE
if(isliving(owner))
var/mob/living/L = owner
L.open_language_menu(usr)
if(ismob(owner))
var/mob/M = owner
var/datum/language_holder/H = M.get_language_holder()
H.open_language_menu(usr)
+1 -1
View File
@@ -420,7 +420,7 @@
return
/datum/ai_laws/proc/clear_law_sixsixsix(force)
if(force || !(owner && owner.mind.devilinfo))
if(force || !is_devil(owner))
devillaws = null
/datum/ai_laws/proc/associate(mob/living/silicon/M)
+2 -1
View File
@@ -7,6 +7,7 @@
var/can_coexist_with_others = TRUE //Whether or not the person will be able to have more than one datum
var/list/typecache_datum_blacklist = list() //List of datums this type can't coexist with
var/delete_on_death = TRUE
/datum/antagonist/New(datum/mind/new_owner)
typecache_datum_blacklist = typecacheof(typecache_datum_blacklist)
@@ -59,4 +60,4 @@
return
/datum/antagonist/proc/farewell()
return
return
+112 -12
View File
@@ -1,10 +1,58 @@
/datum/antagonist/cult
var/datum/action/innate/cultcomm/communion = new
var/datum/action/innate/cult/comm/communion = new
var/datum/action/innate/cult/mastervote/vote = new
/datum/antagonist/cult/Destroy()
qdel(communion)
QDEL_NULL(communion)
QDEL_NULL(vote)
return ..()
/datum/antagonist/cult/proc/add_objectives()
var/list/target_candidates = list()
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && !is_convertable_to_cult(player) && (player != owner) && player.stat != DEAD)
target_candidates += player.mind
if(target_candidates.len == 0)
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(ANTAG_DATUM_CULT) && (player != owner) && player.stat != DEAD)
target_candidates += player.mind
listclearnulls(target_candidates)
if(LAZYLEN(target_candidates))
GLOB.sac_mind = pick(target_candidates)
if(!GLOB.sac_mind)
message_admins("Cult Sacrifice: ERROR - Null target chosen!")
else
var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role)
var/datum/preferences/sacface = GLOB.sac_mind.current.client.prefs
var/icon/reshape = get_flat_human_icon(null, sacjob, sacface)
reshape.Shift(SOUTH, 4)
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
GLOB.sac_image = reshape
else
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
GLOB.sac_complete = TRUE
SSticker.mode.cult_objectives += "sacrifice"
SSticker.mode.cult_objectives += "eldergod"
/datum/antagonist/cult/proc/cult_memorization(datum/mind/cult_mind)
var/mob/living/current = cult_mind.current
for(var/obj_count = 1,obj_count <= SSticker.mode.cult_objectives.len,obj_count++)
var/explanation
switch(SSticker.mode.cult_objectives[obj_count])
if("sacrifice")
if(GLOB.sac_mind)
explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it."
else
explanation = "The veil has already been weakened here, proceed to the final objective."
if("eldergod")
explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie' with nine acolytes on it. You must do this after sacrificing your target."
if(!silent)
to_chat(current, "<B>Objective #[obj_count]</B>: [explanation]")
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
/datum/antagonist/cult/can_be_owned(datum/mind/new_owner)
. = ..()
if(.)
@@ -12,14 +60,17 @@
/datum/antagonist/cult/on_gain()
. = ..()
SSticker.mode.cult += owner
var/mob/living/current = owner.current
if(!LAZYLEN(SSticker.mode.cult_objectives))
add_objectives()
SSticker.mode.cult += owner // Only add after they've been given objectives
cult_memorization(owner)
if(jobban_isbanned(current, ROLE_CULTIST))
addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, current, ROLE_CULTIST, ROLE_CULTIST), 0)
SSticker.mode.update_cult_icons_added(owner)
if(istype(SSticker.mode, /datum/game_mode/cult))
var/datum/game_mode/cult/C = SSticker.mode
C.memorize_cult_objectives(owner)
if(jobban_isbanned(owner.current, ROLE_CULTIST))
addtimer(CALLBACK(SSticker.mode, /datum/game_mode.proc/replace_jobbaned_player, owner.current, ROLE_CULTIST, ROLE_CULTIST), 0)
owner.current.log_message("<font color=#960000>Has been converted to the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
current.log_message("<font color=#960000>Has been converted to the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
if(GLOB.blood_target && GLOB.blood_target_image && current.client)
current.client.images += GLOB.blood_target_image
/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override)
. = ..()
@@ -27,8 +78,12 @@
if(mob_override)
current = mob_override
current.faction |= "cult"
current.grant_language(/datum/language/narsie)
current.verbs += /mob/living/proc/cult_help
if(!GLOB.cult_mastered)
vote.Grant(current)
communion.Grant(current)
current.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override)
. = ..()
@@ -36,15 +91,60 @@
if(mob_override)
current = mob_override
current.faction -= "cult"
current.remove_language(/datum/language/narsie)
current.verbs -= /mob/living/proc/cult_help
vote.Remove(current)
communion.Remove(current)
current.clear_alert("bloodsense")
/datum/antagonist/cult/on_removal()
owner.wipe_memory()
SSticker.mode.cult -= owner
SSticker.mode.update_cult_icons_removed(owner)
to_chat(owner, "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant.</span>")
owner.current.log_message("<font color=#960000>Has renounced the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
if(!silent)
owner.current.visible_message("<span class='big'>[owner] looks like [owner.current.p_they()] just reverted to their old faith!</span>")
to_chat(owner.current, "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.</span>")
owner.current.log_message("<font color=#960000>Has renounced the cult of Nar'Sie!</font>", INDIVIDUAL_ATTACK_LOG)
owner.current.visible_message("<span class='big'>[owner.current] looks like [owner.current.p_they()] just reverted to their old faith!</span>")
if(GLOB.blood_target && GLOB.blood_target_image && owner.current.client)
owner.current.client.images -= GLOB.blood_target_image
. = ..()
/datum/antagonist/cult/master
var/datum/action/innate/cult/master/finalreck/reckoning = new
var/datum/action/innate/cult/master/cultmark/bloodmark = new
/datum/antagonist/cult/master/Destroy()
QDEL_NULL(reckoning)
QDEL_NULL(bloodmark)
return ..()
/datum/antagonist/cult/master/on_gain()
. = ..()
var/mob/living/current = owner.current
SSticker.mode.set_antag_hud(current, "cultmaster")
/datum/antagonist/cult/master/greet()
to_chat(owner.current, "<span class='cultlarge'>You are the cult's Master</span>. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \
targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of summoning the entire living cult to your location <b><i>once</i></b>.")
to_chat(owner.current, "Use these abilities to direct the cult to victory at any cost.")
/datum/antagonist/cult/master/apply_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
if(mob_override)
current = mob_override
if(!GLOB.reckoning_complete)
reckoning.Grant(current)
bloodmark.Grant(current)
current.update_action_buttons_icon()
current.apply_status_effect(/datum/status_effect/cult_master)
/datum/antagonist/cult/master/remove_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
if(mob_override)
current = mob_override
reckoning.Remove(current)
bloodmark.Remove(current)
current.update_action_buttons_icon()
current.remove_status_effect(/datum/status_effect/cult_master)
+153
View File
@@ -0,0 +1,153 @@
/datum/antagonist/ninja
name = "Ninja"
var/team
var/helping_station = 0
var/give_objectives = TRUE
/datum/antagonist/ninja/friendly
helping_station = 1
/datum/antagonist/ninja/friendly/noobjective
give_objectives = FALSE
/datum/antagonist/ninja/New(datum/mind/new_owner)
if(new_owner && !ishuman(new_owner.current))//It's fine if we aren't passed a mind, but if we are, they have to be human.
throw EXCEPTION("Only humans and/or humanoids may be ninja'ed")
..(new_owner)
/datum/antagonist/ninja/randomAllegiance/New(datum/mind/new_owner)
..(new_owner)
helping_station = rand(0,1)
/datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current, safety=0)//Safety in case you need to unequip stuff for existing characters.
if(safety)
qdel(H.w_uniform)
qdel(H.wear_suit)
qdel(H.wear_mask)
qdel(H.head)
qdel(H.shoes)
qdel(H.gloves)
var/obj/item/clothing/suit/space/space_ninja/theSuit = new(H)
var/obj/item/weapon/katana/energy/EK = new(H)
theSuit.energyKatana = EK
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(H), slot_shoes)
H.equip_to_slot_or_del(theSuit, slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/space_ninja(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night(H), slot_glasses)
H.equip_to_slot_or_del(EK, slot_belt)
H.equip_to_slot_or_del(new /obj/item/device/flashlight(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(H), slot_back)
theSuit.randomize_param()
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(H)
E.implant(H)
return 1
/datum/antagonist/ninja/proc/addMemories()
owner.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A <font color='red'><B>SPACE NINJA</B></font>!")
owner.store_memory("Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
owner.store_memory("Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
/datum/antagonist/ninja/proc/addObjectives(quantity = 6)
var/list/possible_targets = list()
for(var/datum/mind/M in SSticker.minds)
if(M.current && M.current.stat != DEAD)
if(ishuman(M.current))
if(M.special_role)
possible_targets[M] = 0 //bad-guy
else if(M.assigned_role in GLOB.command_positions)
possible_targets[M] = 1 //good-guy
var/list/objectives = list(1,2,3,4)
while(owner.objectives.len < quantity)
switch(pick_n_take(objectives))
if(1) //research
var/datum/objective/download/O = new /datum/objective/download()
O.owner = owner
O.gen_amount_goal()
owner.objectives += O
if(2) //steal
var/datum/objective/steal/special/O = new /datum/objective/steal/special()
O.owner = owner
owner.objectives += O
if(3) //protect/kill
if(!possible_targets.len) continue
var/index = rand(1,possible_targets.len)
var/datum/mind/M = possible_targets[index]
var/is_bad_guy = possible_targets[M]
possible_targets.Cut(index,index+1)
if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
var/datum/objective/assassinate/O = new /datum/objective/assassinate()
O.owner = owner
O.target = M
O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
owner.objectives += O
else //protect
var/datum/objective/protect/O = new /datum/objective/protect()
O.owner = owner
O.target = M
O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
owner.objectives += O
if(4) //debrain/capture
if(!possible_targets.len) continue
var/selected = rand(1,possible_targets.len)
var/datum/mind/M = possible_targets[selected]
var/is_bad_guy = possible_targets[M]
possible_targets.Cut(selected,selected+1)
if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
var/datum/objective/debrain/O = new /datum/objective/debrain()
O.owner = owner
O.target = M
O.explanation_text = "Steal the brain of [M.current.real_name]."
owner.objectives += O
else //capture
var/datum/objective/capture/O = new /datum/objective/capture()
O.owner = owner
O.gen_amount_goal()
owner.objectives += O
else
break
var/datum/objective/O = new /datum/objective/survive()
O.owner = owner
owner.objectives += O
/proc/remove_ninja(mob/living/L)
if(!L || !L.mind)
return FALSE
var/datum/antagonist/datum = L.mind.has_antag_datum(ANTAG_DATUM_NINJA)
datum.on_removal()
return TRUE
/proc/add_ninja(mob/living/carbon/human/H, type = ANTAG_DATUM_NINJA_RANDOM)
if(!H || !H.mind)
return FALSE
return H.mind.add_antag_datum(type)
/proc/is_ninja(mob/living/M)
return M && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_NINJA)
/datum/antagonist/ninja/greet()
owner.current << sound('sound/effects/ninja_greeting.ogg')
to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A <font color='red'><B>SPACE NINJA</B></font>!")
to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
return
/datum/antagonist/ninja/on_gain()
if(give_objectives)
addObjectives()
addMemories()
+1 -1
View File
@@ -169,7 +169,7 @@
opentime = 0
/datum/browser/alert/proc/wait()
while (opentime && selectedbutton <= 0 && (!timeout || opentime+timeout >= world.time))
while (opentime && selectedbutton <= 0 && (!timeout || opentime+timeout > world.time))
stoplag()
/datum/browser/alert/Topic(href,href_list)
-12
View File
@@ -737,18 +737,6 @@
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["ninja"])
if(!check_rights(R_FUN))
return
var/mob/M = locate(href_list["ninja"])
if(!istype(M))
to_chat(usr, "This can only be used on instances of type /mob")
return
src.cmd_admin_ninjafy(M)
href_list["datumrefresh"] = href_list["ninja"]
else if(href_list["gib"])
if(!check_rights(R_FUN))
return
+9 -3
View File
@@ -1,3 +1,4 @@
#define HOLOPAD_MAX_DIAL_TIME 200
/mob/camera/aiEye/remote/holo/setLoc()
@@ -30,6 +31,7 @@
var/obj/machinery/holopad/H = I
if(!QDELETED(H) && H.is_operational())
dialed_holopads += H
H.say("Incoming call.")
LAZYADD(H.holo_calls, src)
if(!dialed_holopads.len)
@@ -41,12 +43,16 @@
//cleans up ALL references :)
/datum/holocall/Destroy()
QDEL_NULL(eye)
user.reset_perspective()
if(user.client)
for(var/datum/camerachunk/chunk in eye.visibleCameraChunks)
user.client.images -= chunk.obscured
user.remote_control = null
QDEL_NULL(eye)
user = null
hologram.HC = null
if(hologram)
hologram.HC = null
hologram = null
calling_holopad.outgoing_call = null
+1600 -1578
View File
File diff suppressed because it is too large Load Diff
+10
View File
@@ -161,6 +161,12 @@
description = "A small, but feature complete shuttle. It boasts a card table to keep crew members occupied on the long flight home."
credit_cost = 1000
/datum/map_template/shuttle/emergency/cere
suffix = "cere"
name = "Cere Station Emergency Shuttle"
description = "The large, beefed-up version of the box-standard shuttle. Includes an expanded brig, fully stocked medbay, enhanced cargo storage with mech chargers, \
an engine room stocked with various supplies, and a crew capacity of 80+ to top it all off. Live large, live Cere."
/datum/map_template/shuttle/emergency/supermatter
suffix = "supermatter"
name = "Hyperfractal Gigashuttle"
@@ -230,6 +236,10 @@
suffix = "pubby"
name = "NT White UFO"
/datum/map_template/shuttle/whiteship/cere
suffix = "cere"
name = "NT Construction Vessel"
/datum/map_template/shuttle/cargo/box
suffix = "box"
name = "supply shuttle (Box)"
+9
View File
@@ -108,6 +108,15 @@
if(soulowner)
soulowner.death(gibbed)
/////////////////
// Demon Bind //
/////////////////
//When the soulowner dies, the soulsharer dies, but NOT vice versa
//This is intended for two players(or AI) and two mobs
/datum/soullink/oneway/ownerDies(gibbed, mob/living/owner)
if(soulsharer)
soulsharer.dust(FALSE)
/////////////////
+29
View File
@@ -228,3 +228,32 @@
name = "Wish Granter's Immortality"
desc = "You are being resurrected!"
icon_state = "wish_granter"
/datum/status_effect/cult_master
id = "The Cult Master"
duration = -1
tick_interval = 100
alert_type = null
var/alive = TRUE
/datum/status_effect/cult_master/proc/deathrattle()
var/area/A = get_area(owner)
for(var/datum/mind/B in SSticker.mode.cult)
if(isliving(B.current))
var/mob/living/M = B.current
M << 'sound/hallucinations/veryfar_noise.ogg'
to_chat(M, "<span class='cultlarge'>The Cult's Master, [owner], has fallen in the [A]!")
/datum/status_effect/cult_master/tick()
if(owner.stat != DEAD && !alive)
alive = TRUE
return
if(owner.stat == DEAD && alive)
alive = FALSE
deathrattle()
/datum/status_effect/cult_master/on_remove()
deathrattle()
. = ..()
+5
View File
@@ -162,3 +162,8 @@
owner.confused = min(owner.confused + round(severity * 0.025, 1), 25) //2.5% of severity per second above 20 severity
owner.adjustToxLoss(severity * 0.02, TRUE, TRUE) //2% of severity per second
severity--
/datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
id = "cult_ghost"
duration = -1
alert_type = null
-75
View File
@@ -1,75 +0,0 @@
diff a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm (rejected hunks)
@@ -108,20 +108,6 @@
to_chat(owner, "<span class='sevtug[span_part]'>You feel a frustrated voice quietly fade from your mind...</span>")
qdel(src)
return
- if(!(owner in viewers(7, motor))) //not being in range makes it fall off much faster
- if(!is_servant && !warned_outofsight)
- to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar(pick(flee_messages))]\"</span>")
- warned_outofsight = TRUE
- if(severity)
- severity--
- if(!severity)
- qdel(src)
- return
- else
- qdel(src)
- return
- else if(prob(severity * 2))
- warned_outofsight = FALSE
if(!motor.active) //it being off makes it fall off much faster
if(!is_servant && !warned_turnoff)
if(motor.total_accessable_power() > motor.mania_cost)
@@ -129,20 +115,24 @@
else
to_chat(owner, "<span class='sevtug[span_part]'>[text2ratvar(pick(powerloss_messages))]</span>")
warned_turnoff = TRUE
- if(severity)
- severity--
+ severity = max(severity - 2, 0)
+ if(!severity)
+ qdel(src)
+ return
+ else
+ if(prob(severity * 2))
+ warned_turnoff = FALSE
+ if(!(owner in viewers(7, motor))) //not being in range makes it fall off slightly faster
+ if(!is_servant && !warned_outofsight)
+ to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar(pick(flee_messages))]\"</span>")
+ warned_outofsight = TRUE
+ severity = max(severity - 1, 0)
if(!severity)
qdel(src)
return
- else
- qdel(src)
- return
- else if(prob(severity * 2))
- warned_turnoff = FALSE
+ else if(prob(severity * 2))
+ warned_outofsight = FALSE
if(is_servant) //heals servants of braindamage, hallucination, druggy, dizziness, and confusion
- var/brainloss = owner.getBrainLoss()
- if(brainloss)
- owner.adjustBrainLoss(-brainloss)
if(owner.hallucination)
owner.hallucination = 0
if(owner.druggy)
@@ -163,14 +153,12 @@
if(prob(severity * 0.15))
to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar(pick(mania_messages))]\"</span>")
owner.playsound_local(get_turf(motor), hum, severity, 1)
- if(owner.getBrainLoss() <= 50)
- owner.adjustBrainLoss(severity * 0.025) //2.5% of severity per second
owner.adjust_drugginess(Clamp(max(severity * 0.075, 1), 0, max(0, 50 - owner.druggy))) //7.5% of severity per second, minimum 1
if(owner.hallucination < 50)
owner.hallucination = min(owner.hallucination + max(severity * 0.075, 1), 50) //7.5% of severity per second, minimum 1
- if(owner.dizziness < 25)
- owner.dizziness = min(owner.dizziness + Floor(severity * 0.025), 25) //2.5% of severity per second above 20 severity
+ if(owner.dizziness < 50)
+ owner.dizziness = min(owner.dizziness + round(severity * 0.05, 1), 50) //5% of severity per second above 10 severity
if(owner.confused < 25)
- owner.confused = min(owner.confused + Floor(severity * 0.025), 25) //2.5% of severity per second above 20 severity
+ owner.confused = min(owner.confused + round(severity * 0.025, 1), 25) //2.5% of severity per second above 20 severity
owner.adjustToxLoss(severity * 0.02, TRUE, TRUE) //2% of severity per second
severity--
+3 -3
View File
@@ -13,16 +13,16 @@
/datum/wires/explosive/c4
holder_type = /obj/item/weapon/c4
holder_type = /obj/item/weapon/grenade/plastic/c4
randomize = TRUE //Same behaviour since no wire actually disarms it
/datum/wires/explosive/c4/interactable(mob/user)
var/obj/item/weapon/c4/P = holder
var/obj/item/weapon/grenade/plastic/c4/P = holder
if(P.open_panel)
return TRUE
/datum/wires/explosive/c4/explode()
var/obj/item/weapon/c4/P = holder
var/obj/item/weapon/grenade/plastic/c4/P = holder
P.explode()
+1 -1
View File
@@ -43,7 +43,7 @@
if(SSatoms.InitAtom(src, args))
//we were deleted
return
var/list/created = SSatoms.created_atoms
if(created)
created += src
+79 -28
View File
@@ -1,3 +1,4 @@
#ifndef PIXEL_SCALE
#define PIXEL_SCALE 0
#if DM_VERSION >= 512
@@ -13,9 +14,8 @@
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported
var/throw_range = 7
var/mob/pulledby = null
var/list/languages
var/list/initial_languages = list(/datum/language/common)
var/only_speaks_language = null
var/initial_language_holder = /datum/language_holder
var/datum/language_holder/language_holder
var/verb_say = "says"
var/verb_ask = "asks"
var/verb_exclaim = "exclaims"
@@ -42,13 +42,32 @@
return FALSE //PLEASE no.
if((var_name in careful_edits) && (var_value % world.icon_size) != 0)
return FALSE
switch(var_name)
if("x")
var/turf/T = locate(var_value, y, z)
if(T)
forceMove(T)
return TRUE
return FALSE
if("y")
var/turf/T = locate(x, var_value, z)
if(T)
forceMove(T)
return TRUE
return FALSE
if("z")
var/turf/T = locate(x, y, var_value)
if(T)
forceMove(T)
return TRUE
return FALSE
if("loc")
if(var_value == null || istype(var_value, /atom))
forceMove(var_value)
return TRUE
return FALSE
return ..()
/atom/movable/Initialize(mapload)
. = ..()
for(var/L in initial_languages)
grant_language(L)
/atom/movable/Move(atom/newloc, direct = 0)
if(!loc || !newloc) return 0
var/atom/oldloc = loc
@@ -177,6 +196,7 @@
STOP_PROCESSING(SSinbounds, src)
QDEL_NULL(proximity_monitor)
QDEL_NULL(language_holder)
. = ..()
if(loc)
@@ -435,8 +455,7 @@
pixel_x_diff = -8
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
//animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = final_pixel_y, time = 2) //Putting back my non offset breaking method
animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
/atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item)
var/image/I
@@ -576,44 +595,73 @@
/* Language procs */
/atom/movable/proc/get_language_holder(shadow=TRUE)
if(language_holder)
return language_holder
else
language_holder = new initial_language_holder(src)
return language_holder
/atom/movable/proc/grant_language(datum/language/dt)
LAZYINITLIST(languages)
languages[dt] = TRUE
var/datum/language_holder/H = get_language_holder()
H.grant_language(dt)
/atom/movable/proc/grant_all_languages(omnitongue=FALSE)
for(var/la in subtypesof(/datum/language))
grant_language(la)
if(omnitongue)
SET_SECONDARY_FLAG(src, OMNITONGUE)
var/datum/language_holder/H = get_language_holder()
H.grant_all_languages(omnitongue)
/atom/movable/proc/get_random_understood_language()
var/list/possible = list()
for(var/dt in languages)
possible += dt
. = safepick(possible)
var/datum/language_holder/H = get_language_holder()
. = H.get_random_understood_language()
/atom/movable/proc/remove_language(datum/language/dt)
LAZYREMOVE(languages, dt)
var/datum/language_holder/H = get_language_holder()
H.remove_language(dt)
/atom/movable/proc/remove_all_languages()
LAZYCLEARLIST(languages)
var/datum/language_holder/H = get_language_holder()
H.remove_all_languages()
/atom/movable/proc/has_language(datum/language/dt)
. = is_type_in_typecache(dt, languages)
var/datum/language_holder/H = get_language_holder()
. = H.has_language(dt)
/atom/movable/proc/copy_known_languages_from(thing, replace=FALSE)
var/datum/language_holder/H = get_language_holder()
. = H.copy_known_languages_from(thing, replace)
// Whether an AM can speak in a language or not, independent of whether
// it KNOWS the language
/atom/movable/proc/could_speak_in_language(datum/language/dt)
. = TRUE
/atom/movable/proc/can_speak_in_language(datum/language/dt)
. = has_language(dt)
if(only_speaks_language && !HAS_SECONDARY_FLAG(src, OMNITONGUE))
. = . && ispath(only_speaks_language, dt)
var/datum/language_holder/H = get_language_holder()
if(!H.has_language(dt))
return FALSE
else if(H.omnitongue)
return TRUE
else if(could_speak_in_language(dt) && (!H.only_speaks_language || H.only_speaks_language == dt))
return TRUE
else
return FALSE
/atom/movable/proc/get_default_language()
// if no language is specified, and we want to say() something, which
// language do we use?
var/datum/language_holder/H = get_language_holder()
if(H.selected_default_language)
if(can_speak_in_language(H.selected_default_language))
return H.selected_default_language
else
H.selected_default_language = null
var/datum/language/chosen_langtype
var/highest_priority
for(var/lt in languages)
for(var/lt in H.languages)
var/datum/language/langtype = lt
if(!can_speak_in_language(langtype))
continue
@@ -623,7 +671,10 @@
chosen_langtype = langtype
highest_priority = pri
H.selected_default_language = .
. = chosen_langtype
/* End language procs */
/atom/movable/proc/ConveyorMove(movedir)
set waitfor = FALSE
if(!anchored && has_gravity())
+293 -293
View File
@@ -1,295 +1,295 @@
/obj/item/weapon/antag_spawner
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/used = 0
/obj/item/weapon/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
return
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target)
return
///////////WIZARD
/obj/item/weapon/antag_spawner/contract
name = "contract"
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
/obj/item/weapon/antag_spawner/contract/attack_self(mob/user)
user.set_machine(src)
var/dat
if(used)
dat = "<B>You have already summoned your apprentice.</B><BR>"
else
dat = "<B>Contract of Apprenticeship:</B><BR>"
dat += "<I>Using this contract, you may summon an apprentice to aid you on your mission.</I><BR>"
dat += "<I>If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.</I><BR>"
dat += "<B>Which school of magic is your apprentice studying?:</B><BR>"
dat += "<A href='byond://?src=\ref[src];school=destruction'>Destruction</A><BR>"
dat += "<I>Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=bluespace'>Bluespace Manipulation</A><BR>"
dat += "<I>Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=healing'>Healing</A><BR>"
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=robeless'>Robeless</A><BR>"
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
/obj/item/weapon/antag_spawner/contract/Topic(href, href_list)
..()
var/mob/living/carbon/human/H = usr
if(H.stat || H.restrained())
return
if(!ishuman(H))
return 1
if(loc == H || (in_range(src, H) && isturf(loc)))
H.set_machine(src)
if(href_list["school"])
if(used)
to_chat(H, "You already used this contract!")
return
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
if(candidates.len)
if(used)
to_chat(H, "You already used this contract!")
return
used = 1
var/mob/dead/observer/theghost = pick(candidates)
spawn_antag(theghost.client, get_turf(src), href_list["school"])
if(H && H.mind)
SSticker.mode.update_wiz_icons_added(H.mind)
else
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/weapon/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
new /obj/effect/particle_effect/smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/wizard_name = "the wizard"
if(usr)
wizard_name = usr.real_name
to_chat(M, "<B>You are [wizard_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
switch(type)
if("destruction")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if("bluespace")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if("healing")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
M.put_in_hands_or_del(new /obj/item/weapon/gun/magic/staff/healing(M))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
if("robeless")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
equip_antag(M)
var/wizard_name_first = pick(GLOB.wizard_first)
var/wizard_name_second = pick(GLOB.wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
if(usr)
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = M.mind
new_objective.target = usr.mind
new_objective.explanation_text = "Protect [usr.real_name], the wizard."
M.mind.objectives += new_objective
SSticker.mode.apprentices += M.mind
M.mind.special_role = "apprentice"
SSticker.mode.update_wiz_icons_added(M.mind)
M << sound('sound/effects/magic.ogg')
var/newname = copytext(sanitize(input(M, "You are [wizard_name]'s apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN)
if (!newname)
newname = randomname
M.mind.name = newname
M.real_name = newname
M.name = newname
M.dna.update_dna_identity()
/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target)
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears)
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit)
target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(target), slot_back)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/box(target), slot_in_backpack)
target.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll/apprentice(target), slot_r_store)
///////////BORGS AND OPERATIVES
/obj/item/weapon/antag_spawner/nuke_ops
name = "syndicate operative teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/borg_to_spawn
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return 0
if(!(user.mind in SSticker.mode.syndicates))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return 0
if(user.z != ZLEVEL_CENTCOM)
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
return 0
return 1
/obj/item/weapon/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user)))
return
/obj/item/weapon/antag_spawner
throw_speed = 1
throw_range = 5
w_class = WEIGHT_CLASS_TINY
var/used = 0
/obj/item/weapon/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
return
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target)
return
///////////WIZARD
/obj/item/weapon/antag_spawner/contract
name = "contract"
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
/obj/item/weapon/antag_spawner/contract/attack_self(mob/user)
user.set_machine(src)
var/dat
if(used)
dat = "<B>You have already summoned your apprentice.</B><BR>"
else
dat = "<B>Contract of Apprenticeship:</B><BR>"
dat += "<I>Using this contract, you may summon an apprentice to aid you on your mission.</I><BR>"
dat += "<I>If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.</I><BR>"
dat += "<B>Which school of magic is your apprentice studying?:</B><BR>"
dat += "<A href='byond://?src=\ref[src];school=destruction'>Destruction</A><BR>"
dat += "<I>Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=bluespace'>Bluespace Manipulation</A><BR>"
dat += "<I>Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=healing'>Healing</A><BR>"
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
dat += "<A href='byond://?src=\ref[src];school=robeless'>Robeless</A><BR>"
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
user << browse(dat, "window=radio")
onclose(user, "radio")
return
/obj/item/weapon/antag_spawner/contract/Topic(href, href_list)
..()
var/mob/living/carbon/human/H = usr
if(H.stat || H.restrained())
return
if(!ishuman(H))
return 1
if(loc == H || (in_range(src, H) && isturf(loc)))
H.set_machine(src)
if(href_list["school"])
if(used)
to_chat(H, "You already used this contract!")
return
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
if(candidates.len)
if(used)
to_chat(H, "You already used this contract!")
return
used = 1
var/mob/dead/observer/theghost = pick(candidates)
spawn_antag(theghost.client, get_turf(src), href_list["school"])
if(H && H.mind)
SSticker.mode.update_wiz_icons_added(H.mind)
else
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/weapon/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
new /obj/effect/particle_effect/smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/wizard_name = "the wizard"
if(usr)
wizard_name = usr.real_name
to_chat(M, "<B>You are [wizard_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
switch(type)
if("destruction")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if("bluespace")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if("healing")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
M.put_in_hands_or_del(new /obj/item/weapon/gun/magic/staff/healing(M))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
if("robeless")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
equip_antag(M)
var/wizard_name_first = pick(GLOB.wizard_first)
var/wizard_name_second = pick(GLOB.wizard_second)
var/randomname = "[wizard_name_first] [wizard_name_second]"
if(usr)
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = M.mind
new_objective.target = usr.mind
new_objective.explanation_text = "Protect [usr.real_name], the wizard."
M.mind.objectives += new_objective
SSticker.mode.apprentices += M.mind
M.mind.special_role = "apprentice"
SSticker.mode.update_wiz_icons_added(M.mind)
M << sound('sound/effects/magic.ogg')
var/newname = copytext(sanitize(input(M, "You are [wizard_name]'s apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN)
if (!newname)
newname = randomname
M.mind.name = newname
M.real_name = newname
M.name = newname
M.age = rand(AGE_MIN, WIZARD_AGE_MIN - 1)
M.dna.update_dna_identity()
/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target)
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears)
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(target), slot_w_uniform)
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(target), slot_shoes)
target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit)
target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(target), slot_back)
target.equip_to_slot_or_del(new /obj/item/weapon/storage/box(target), slot_in_backpack)
target.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll/apprentice(target), slot_r_store)
///////////BORGS AND OPERATIVES
/obj/item/weapon/antag_spawner/nuke_ops
name = "syndicate operative teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/borg_to_spawn
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return 0
if(!(user.mind in SSticker.mode.syndicates))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return 0
if(user.z != ZLEVEL_CENTCOM)
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
return 0
return 1
/obj/item/weapon/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user)))
return
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollCandidatesForMob("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE, src)
if(nuke_candidates.len)
if(!(check_usability(user)))
return
used = 1
var/mob/dead/observer/theghost = pick(nuke_candidates)
spawn_antag(theghost.client, get_turf(src), "syndieborg")
do_sparks(4, TRUE, src)
qdel(src)
else
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/code = "BOMB-NOT-FOUND"
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
if(nuke)
code = nuke.r_code
M.mind.make_Nuke(null, code, 0, FALSE)
var/newname = M.dna.species.random_name(M.gender,0,SSticker.mode.nukeops_lastname)
M.mind.name = newname
M.real_name = newname
M.name = newname
//////SYNDICATE BORG
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
var/mob/living/silicon/robot/R
switch(borg_to_spawn)
if("Medical")
R = new /mob/living/silicon/robot/syndicate/medical(T)
else
R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default
var/brainfirstname = pick(GLOB.first_names_male)
if(prob(50))
brainfirstname = pick(GLOB.first_names_female)
var/brainopslastname = pick(GLOB.last_names)
if(SSticker.mode.nukeops_lastname) //the brain inside the syndiborg has the same last name as the other ops.
brainopslastname = SSticker.mode.nukeops_lastname
var/brainopsname = "[brainfirstname] [brainopslastname]"
R.mmi.name = "Man-Machine Interface: [brainopsname]"
R.mmi.brain.name = "[brainopsname]'s brain"
R.mmi.brainmob.real_name = brainopsname
R.mmi.brainmob.name = brainopsname
R.key = C.key
R.mind.make_Nuke(null, nuke_code = null,leader=0, telecrystals = TRUE)
///////////SLAUGHTER DEMON
/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood"
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>"
var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>"
var/objective_verb = "Kill"
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user)
if(user.z != 1)
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
if(used)
return
var/list/demon_candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", null, null, ROLE_ALIEN, 50, src)
if(demon_candidates.len)
if(used)
return
used = 1
var/mob/dead/observer/theghost = pick(demon_candidates)
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name))
to_chat(user, shatter_msg)
to_chat(user, veil_msg)
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
qdel(src)
else
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
S.holder = holder
S.key = C.key
S.mind.assigned_role = S.name
S.mind.special_role = S.name
SSticker.mode.traitors += S.mind
var/datum/objective/assassinate/new_objective
if(usr)
new_objective = new /datum/objective/assassinate
new_objective.owner = S.mind
new_objective.target = usr.mind
new_objective.explanation_text = "[objective_verb] [usr.real_name], the one who summoned you."
S.mind.objectives += new_objective
var/datum/objective/new_objective2 = new /datum/objective
new_objective2.owner = S.mind
new_objective2.explanation_text = "[objective_verb] everyone[usr ? " else while you're at it":""]."
S.mind.objectives += new_objective2
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
Ctrl+Click a blood pool to manifest.</B>")
if(new_objective)
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
/obj/item/weapon/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
color = "#FF69B4" // HOT PINK
veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
if(nuke_candidates.len)
if(!(check_usability(user)))
return
used = 1
var/mob/dead/observer/theghost = pick(nuke_candidates)
spawn_antag(theghost.client, get_turf(src), "syndieborg")
do_sparks(4, TRUE, src)
qdel(src)
else
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
var/code = "BOMB-NOT-FOUND"
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
if(nuke)
code = nuke.r_code
M.mind.make_Nuke(null, code, 0, FALSE)
var/newname = M.dna.species.random_name(M.gender,0,SSticker.mode.nukeops_lastname)
M.mind.name = newname
M.real_name = newname
M.name = newname
//////SYNDICATE BORG
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
var/mob/living/silicon/robot/R
switch(borg_to_spawn)
if("Medical")
R = new /mob/living/silicon/robot/syndicate/medical(T)
else
R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default
var/brainfirstname = pick(GLOB.first_names_male)
if(prob(50))
brainfirstname = pick(GLOB.first_names_female)
var/brainopslastname = pick(GLOB.last_names)
if(SSticker.mode.nukeops_lastname) //the brain inside the syndiborg has the same last name as the other ops.
brainopslastname = SSticker.mode.nukeops_lastname
var/brainopsname = "[brainfirstname] [brainopslastname]"
R.mmi.name = "Man-Machine Interface: [brainopsname]"
R.mmi.brain.name = "[brainopsname]'s brain"
R.mmi.brainmob.real_name = brainopsname
R.mmi.brainmob.name = brainopsname
R.key = C.key
R.mind.make_Nuke(null, nuke_code = null,leader=0, telecrystals = TRUE)
///////////SLAUGHTER DEMON
/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood"
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>"
var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>"
var/objective_verb = "Kill"
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user)
if(user.z != 1)
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
if(used)
return
var/list/demon_candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", null, null, ROLE_ALIEN, 50, src)
if(demon_candidates.len)
if(used)
return
used = 1
var/mob/dead/observer/theghost = pick(demon_candidates)
spawn_antag(theghost.client, get_turf(src), initial(demon_type.name))
to_chat(user, shatter_msg)
to_chat(user, veil_msg)
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
qdel(src)
else
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
S.holder = holder
S.key = C.key
S.mind.assigned_role = S.name
S.mind.special_role = S.name
SSticker.mode.traitors += S.mind
var/datum/objective/assassinate/new_objective
if(usr)
new_objective = new /datum/objective/assassinate
new_objective.owner = S.mind
new_objective.target = usr.mind
new_objective.explanation_text = "[objective_verb] [usr.real_name], the one who summoned you."
S.mind.objectives += new_objective
var/datum/objective/new_objective2 = new /datum/objective
new_objective2.owner = S.mind
new_objective2.explanation_text = "[objective_verb] everyone[usr ? " else while you're at it":""]."
S.mind.objectives += new_objective2
to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
Ctrl+Click a blood pool to manifest.</B>")
if(new_objective)
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
/obj/item/weapon/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
color = "#FF69B4" // HOT PINK
veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
@@ -200,6 +200,7 @@ GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "w
to_chat(changeling.current, "<span class='boldannounce'>You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human.</span>")
to_chat(changeling.current, "<span class='boldannounce'>Use say \":g message\" to communicate with your fellow changelings.</span>")
to_chat(changeling.current, "<b>You must complete the following tasks:</b>")
changeling.current.playsound_local('sound/ambience/antag/ling_aler.ogg',100,0)
if (changeling.current.mind)
var/mob/living/carbon/human/H = changeling.current
+2 -1
View File
@@ -75,7 +75,7 @@ Credit where due:
/proc/remove_servant_of_ratvar(mob/living/L, silent = FALSE)
if(!L || !L.mind)
return
var/datum/antagonist/clockcult/clock_datum = L.mind.has_antag_datum(/datum/antagonist/clockcult)
var/datum/antagonist/clockcult/clock_datum = L.mind.has_antag_datum(ANTAG_DATUM_CLOCKCULT)
if(!clock_datum)
return FALSE
clock_datum.silent = silent
@@ -146,6 +146,7 @@ Credit where due:
Rusting eternally in the Celestial Derelict, Ratvar has formed a covenant of mortals, with you as one of its members. As one of the Justiciar's servants, you are to work to the best of your \
ability to assist in completion of His agenda. You may not know the specifics of how to do so, but luckily you have a vessel to help you learn.</b>"
to_chat(M, greeting_text)
M.playsound_local('sound/ambience/antag/ClockCultAlr.ogg',100,0)
return 1
/datum/game_mode/proc/equip_servant(mob/living/L) //Grants a clockwork slab to the mob, with one of each component

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