diff --git a/.github/workflows/autochangelog.yml b/.github/workflows/autochangelog.yml index 7732426718..7953929ce5 100644 --- a/.github/workflows/autochangelog.yml +++ b/.github/workflows/autochangelog.yml @@ -1,6 +1,6 @@ name: Autochangelog on: - pull_request: + pull_request_target: types: closed branches: - master @@ -15,6 +15,10 @@ jobs: if: github.event.pull_request.merged == true steps: - uses: /actions/checkout@v2 + with: + ref: master + - name: Update repository to master + run: git pull "origin" master - name: Ensure +x on CI directory run: | chmod -R +x ./tools/ci diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6e206bc33..13022f96fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: run: | sudo dpkg --add-architecture i386 sudo apt update || true - sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 g++-7 g++-7-multilib gcc-multilib zlib1g:i386 + sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 zlib1g:i386 ldd librust_g.so - name: Unit Tests run: | diff --git a/README.md b/README.md index 77f9127bf4..cbf74b6b30 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Going to make a Pull Request? Make sure you read the [CONTRIBUTING.md](.github/CONTRIBUTING.md) first! -CHOMPStation is a fork of the Yawn-wider code branch which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13. +CHOMPStation was a fork of the Yawn-wider code branch which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, but we are now since separated from Yawn-wider code, while keeping some of their features, which is a fork of the VOREStation code branch which is a fork of the Polaris code branch, itself a fork of the Baystation12 code branch, for the game Space Station 13. ![Render Nanomaps](https://github.com/VOREStation/VOREStation/workflows/Render%20Nanomaps/badge.svg) diff --git a/SQL/DBSchema.sql b/SQL/DBSchema.sql new file mode 100644 index 0000000000..597873757a --- /dev/null +++ b/SQL/DBSchema.sql @@ -0,0 +1,294 @@ +-- -------------------------------------------------------- +-- Host: localhost +-- Server version: 10.5.4-MariaDB - mariadb.org binary distribution +-- Server OS: Win64 +-- HeidiSQL Version: 11.0.0.5919 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!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' */; + + +-- Dumping database structure for ss13 +CREATE DATABASE IF NOT EXISTS `ss13` /*!40100 DEFAULT CHARACTER SET utf8 */; +USE `ss13`; + +-- Dumping structure for table ss13.death +CREATE TABLE IF NOT EXISTS `death` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `pod` text DEFAULT NULL COMMENT 'Place of death', + `coord` text DEFAULT NULL COMMENT 'X, Y, Z POD', + `tod` datetime DEFAULT NULL COMMENT 'Time of death', + `job` text DEFAULT NULL, + `special` text DEFAULT NULL, + `name` text DEFAULT NULL, + `byondkey` text NOT NULL, + `laname` text DEFAULT NULL COMMENT 'Last attacker name', + `lakey` text DEFAULT NULL COMMENT 'Last attacker key', + `gender` text DEFAULT NULL, + `bruteloss` int(11) DEFAULT NULL, + `brainloss` int(11) DEFAULT NULL, + `fireloss` int(11) DEFAULT NULL, + `oxyloss` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=MyISAM AUTO_INCREMENT=13926 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_admin +CREATE TABLE IF NOT EXISTS `erro_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, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_admin_log +CREATE TABLE IF NOT EXISTS `erro_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`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_attacklog +CREATE TABLE IF NOT EXISTS `erro_attacklog` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `time` datetime DEFAULT NULL, + `ckey` varchar(64) DEFAULT NULL, + `mob` varchar(128) DEFAULT NULL, + `message` varchar(1024) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=886 DEFAULT CHARSET=latin1; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_ban +CREATE TABLE IF NOT EXISTS `erro_ban` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `bantime` datetime NOT NULL, + `serverip` varchar(32) NOT NULL, + `bantype` varchar(32) NOT NULL, + `reason` text NOT NULL, + `job` varchar(32) DEFAULT NULL, + `duration` int(11) NOT NULL, + `rounds` int(11) DEFAULT NULL, + `expiration_time` datetime NOT NULL, + `ckey` varchar(32) NOT NULL, + `computerid` varchar(32) NOT NULL, + `ip` varchar(32) NOT NULL, + `a_ckey` varchar(32) NOT NULL, + `a_computerid` varchar(32) NOT NULL, + `a_ip` varchar(32) NOT NULL, + `who` text NOT NULL, + `adminwho` text NOT NULL, + `edits` text DEFAULT NULL, + `unbanned` tinyint(1) DEFAULT NULL, + `unbanned_datetime` datetime DEFAULT NULL, + `unbanned_ckey` varchar(32) DEFAULT NULL, + `unbanned_computerid` varchar(32) DEFAULT NULL, + `unbanned_ip` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_connection_log +CREATE TABLE IF NOT EXISTS `erro_connection_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `serverip` varchar(64) NOT NULL, + `ckey` varchar(64) NOT NULL, + `ip` varchar(64) NOT NULL, + `computerid` varchar(64) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=12353 DEFAULT CHARSET=latin1; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_dialog +CREATE TABLE IF NOT EXISTS `erro_dialog` ( + `mid` int(11) NOT NULL AUTO_INCREMENT, + `time` datetime NOT NULL, + `ckey` varchar(32) NOT NULL, + `mob` varchar(128) DEFAULT NULL, + `type` varchar(32) NOT NULL, + `message` text NOT NULL, + PRIMARY KEY (`mid`) +) ENGINE=InnoDB AUTO_INCREMENT=3345 DEFAULT CHARSET=latin1; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_feedback +CREATE TABLE IF NOT EXISTS `erro_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 DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=MyISAM AUTO_INCREMENT=68050 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_player +CREATE TABLE IF NOT EXISTS `erro_player` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ckey` varchar(32) NOT NULL, + `firstseen` datetime NOT NULL, + `lastseen` datetime NOT NULL, + `ip` varchar(18) NOT NULL, + `computerid` varchar(32) NOT NULL, + `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player', + `discord_id` varchar(256) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `ckey` (`ckey`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1349 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_poll_option +CREATE TABLE IF NOT EXISTS `erro_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`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_poll_question +CREATE TABLE IF NOT EXISTS `erro_poll_question` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `polltype` varchar(16) NOT NULL DEFAULT 'OPTION', + `starttime` datetime NOT NULL, + `endtime` datetime NOT NULL, + `question` varchar(255) NOT NULL, + `adminonly` tinyint(1) DEFAULT 0, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_poll_textreply +CREATE TABLE IF NOT EXISTS `erro_poll_textreply` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `pollid` int(11) NOT NULL, + `ckey` varchar(32) NOT NULL, + `ip` varchar(18) NOT NULL, + `replytext` text NOT NULL, + `adminrank` varchar(32) NOT NULL DEFAULT 'Player', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_poll_vote +CREATE TABLE IF NOT EXISTS `erro_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(255) NOT NULL, + `ip` varchar(16) NOT NULL, + `adminrank` varchar(32) NOT NULL, + `rating` int(2) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.erro_privacy +CREATE TABLE IF NOT EXISTS `erro_privacy` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `ckey` varchar(32) NOT NULL, + `option` varchar(128) NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=763 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.karma +CREATE TABLE IF NOT EXISTS `karma` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `spendername` text NOT NULL, + `spenderkey` text NOT NULL, + `receivername` text NOT NULL, + `receiverkey` text NOT NULL, + `receiverrole` text NOT NULL, + `receiverspecial` text NOT NULL, + `isnegative` tinyint(1) NOT NULL, + `spenderip` text NOT NULL, + `time` datetime NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=MyISAM AUTO_INCREMENT=943 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.karmatotals +CREATE TABLE IF NOT EXISTS `karmatotals` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `byondkey` text NOT NULL, + `karma` int(11) NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=MyISAM AUTO_INCREMENT=244 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.library +CREATE TABLE IF NOT EXISTS `library` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author` text NOT NULL, + `title` text NOT NULL, + `content` text NOT NULL, + `category` text NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=MyISAM AUTO_INCREMENT=300 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.population +CREATE TABLE IF NOT EXISTS `population` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `playercount` int(11) DEFAULT NULL, + `admincount` int(11) DEFAULT NULL, + `time` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3627 DEFAULT CHARSET=latin1; + +-- Data exporting was unselected. + +-- Dumping structure for table ss13.vr_player_hours +CREATE TABLE IF NOT EXISTS `vr_player_hours` ( + `ckey` varchar(32) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, + `department` varchar(64) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, + `hours` double NOT NULL, + `total_hours` double(22,0) NOT NULL, + PRIMARY KEY (`ckey`,`department`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; + +-- Data exporting was unselected. + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/SQL/feedback_schema.sql b/SQL/feedback_schema.sql deleted file mode 100644 index a107136372..0000000000 --- a/SQL/feedback_schema.sql +++ /dev/null @@ -1,130 +0,0 @@ -CREATE TABLE `erro_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', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `erro_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 ; - -CREATE TABLE `erro_ban` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `bantime` datetime NOT NULL, - `serverip` varchar(32) NOT NULL, - `bantype` varchar(32) NOT NULL, - `reason` text NOT NULL, - `job` varchar(32) DEFAULT NULL, - `duration` int(11) NOT NULL, - `rounds` int(11) DEFAULT NULL, - `expiration_time` datetime NOT NULL, - `ckey` varchar(32) NOT NULL, - `computerid` varchar(32) NOT NULL, - `ip` varchar(32) NOT NULL, - `a_ckey` varchar(32) NOT NULL, - `a_computerid` varchar(32) NOT NULL, - `a_ip` varchar(32) NOT NULL, - `who` text NOT NULL, - `adminwho` text NOT NULL, - `edits` text, - `unbanned` tinyint(1) DEFAULT NULL, - `unbanned_datetime` datetime DEFAULT NULL, - `unbanned_ckey` varchar(32) DEFAULT NULL, - `unbanned_computerid` varchar(32) DEFAULT NULL, - `unbanned_ip` varchar(32) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `erro_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 ; - -CREATE TABLE `erro_player` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ckey` varchar(32) NOT NULL, - `firstseen` datetime NOT NULL, - `lastseen` datetime NOT NULL, - `ip` varchar(18) NOT NULL, - `computerid` varchar(32) NOT NULL, - `lastadminrank` varchar(32) NOT NULL DEFAULT 'Player', - `discord_id` varchar(64) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `ckey` (`ckey`), - KEY `discord_id` (`discord_id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `erro_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`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `erro_poll_question` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `polltype` varchar(16) NOT NULL DEFAULT 'OPTION', - `starttime` datetime NOT NULL, - `endtime` datetime NOT NULL, - `question` varchar(255) NOT NULL, - `adminonly` tinyint(1) DEFAULT '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `erro_poll_textreply` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `datetime` datetime NOT NULL, - `pollid` int(11) NOT NULL, - `ckey` varchar(32) NOT NULL, - `ip` varchar(18) NOT NULL, - `replytext` text NOT NULL, - `adminrank` varchar(32) NOT NULL DEFAULT 'Player', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `erro_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(255) NOT NULL, - `ip` varchar(16) NOT NULL, - `adminrank` varchar(32) NOT NULL, - `rating` int(2) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `erro_privacy` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `datetime` datetime NOT NULL, - `ckey` varchar(32) NOT NULL, - `option` varchar(128) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; - -CREATE TABLE `vr_player_hours` ( - `ckey` varchar(32) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, - `department` varchar(64) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, - `hours` double NOT NULL, - `total_hours` double NOT NULL DEFAULT '0', - PRIMARY KEY (`ckey`,`department`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; \ No newline at end of file diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql deleted file mode 100644 index b7e2e501ce..0000000000 --- a/SQL/tgstation_schema.sql +++ /dev/null @@ -1,100 +0,0 @@ -SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; -SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; -SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; - -CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; -CREATE SCHEMA IF NOT EXISTS `tgstation` DEFAULT CHARACTER SET latin1 ; -USE `mydb` ; -USE `tgstation` ; - --- ----------------------------------------------------- --- Table `tgstation`.`death` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `tgstation`.`death` ( - `id` INT(11) NOT NULL AUTO_INCREMENT , - `pod` TEXT NOT NULL COMMENT 'Place of death' , - `coord` TEXT NOT NULL COMMENT 'X, Y, Z POD' , - `tod` DATETIME NOT NULL COMMENT 'Time of death' , - `job` TEXT NOT NULL , - `special` TEXT NOT NULL , - `name` TEXT NOT NULL , - `byondkey` TEXT NOT NULL , - `laname` TEXT NOT NULL COMMENT 'Last attacker name' , - `lakey` TEXT NOT NULL COMMENT 'Last attacker key' , - `gender` TEXT NOT NULL , - `bruteloss` INT(11) NOT NULL , - `brainloss` INT(11) NOT NULL , - `fireloss` INT(11) NOT NULL , - `oxyloss` INT(11) NOT NULL , - PRIMARY KEY (`id`) ) -ENGINE = MyISAM -AUTO_INCREMENT = 3409 -DEFAULT CHARACTER SET = latin1; - - --- ----------------------------------------------------- --- Table `tgstation`.`karma` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `tgstation`.`karma` ( - `id` INT(11) NOT NULL AUTO_INCREMENT , - `spendername` TEXT NOT NULL , - `spenderkey` TEXT NOT NULL , - `receivername` TEXT NOT NULL , - `receiverkey` TEXT NOT NULL , - `receiverrole` TEXT NOT NULL , - `receiverspecial` TEXT NOT NULL , - `isnegative` TINYINT(1) NOT NULL , - `spenderip` TEXT NOT NULL , - `time` DATETIME NOT NULL , - PRIMARY KEY (`id`) ) -ENGINE = MyISAM -AUTO_INCREMENT = 943 -DEFAULT CHARACTER SET = latin1; - - --- ----------------------------------------------------- --- Table `tgstation`.`karmatotals` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `tgstation`.`karmatotals` ( - `id` INT(11) NOT NULL AUTO_INCREMENT , - `byondkey` TEXT NOT NULL , - `karma` INT(11) NOT NULL , - PRIMARY KEY (`id`) ) -ENGINE = MyISAM -AUTO_INCREMENT = 244 -DEFAULT CHARACTER SET = latin1; - - --- ----------------------------------------------------- --- Table `tgstation`.`library` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `tgstation`.`library` ( - `id` INT(11) NOT NULL AUTO_INCREMENT , - `author` TEXT NOT NULL , - `title` TEXT NOT NULL , - `content` TEXT NOT NULL , - `category` TEXT NOT NULL , - PRIMARY KEY (`id`) ) -ENGINE = MyISAM -AUTO_INCREMENT = 184 -DEFAULT CHARACTER SET = latin1; - - --- ----------------------------------------------------- --- Table `tgstation`.`population` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `tgstation`.`population` ( - `id` INT(11) NOT NULL AUTO_INCREMENT , - `playercount` INT(11) NULL DEFAULT NULL , - `admincount` INT(11) NULL DEFAULT NULL , - `time` DATETIME NOT NULL , - PRIMARY KEY (`id`) ) -ENGINE = MyISAM -AUTO_INCREMENT = 2544 -DEFAULT CHARACTER SET = latin1; - - - -SET SQL_MODE=@OLD_SQL_MODE; -SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; -SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index be7f905a77..a3a368852f 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -96,15 +96,6 @@ "You hear a ratchet.") deconstruct() -/obj/machinery/atmospherics/omni/can_unwrench() - var/int_pressure = 0 - for(var/datum/omni_port/P in ports) - int_pressure += P.air.return_pressure() - var/datum/gas_mixture/env_air = loc.return_air() - if((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - return 0 - return 1 - /obj/machinery/atmospherics/omni/attack_hand(user as mob) if(..()) return diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 4e9d7fd6ad..a2e15e6890 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -173,6 +173,5 @@ What is the naming convention for planes or layers? plane = initial(plane) layer = initial(layer) - // Check if a mob can "logically" see an atom plane #define MOB_CAN_SEE_PLANE(M, P) (P <= PLANE_WORLD || (P in M.planes_visible)) diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index c87b9942df..db1a71c77a 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -61,4 +61,8 @@ #define INFECTION_LEVEL_ONE 100 #define INFECTION_LEVEL_TWO 500 #define INFECTION_LEVEL_THREE 1000 -#define INFECTION_LEVEL_MAX 1500 \ No newline at end of file +#define INFECTION_LEVEL_MAX 1500 + +#define MODULAR_BODYPART_INVALID 0 // Cannot be detached or reattached. +#define MODULAR_BODYPART_PROSTHETIC 1 // Can be detached or reattached freely. +#define MODULAR_BODYPART_CYBERNETIC 2 // Can be detached or reattached to compatible parent organs. diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 5f67308094..a0eede2f42 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -50,7 +50,7 @@ var/list/be_special_flags = list( "Wizard" = BE_WIZARD, "Malf AI" = BE_MALF, "Revolutionary" = BE_REV, - "Xenomorph" = BE_ALIEN, + "Genaprawn" = BE_ALIEN, //CHOMPedit "Positronic Brain" = BE_AI, "Cultist" = BE_CULTIST, "Renegade" = BE_RENEGADE, diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 69e949e495..2014ce8ccf 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -159,6 +159,14 @@ #define MAT_CHITIN "chitin" #define MAT_CLOTH "cloth" #define MAT_SYNCLOTH "syncloth" +#define MAT_COPPER "copper" +#define MAT_QUARTZ "quartz" +#define MAT_TIN "tin" +#define MAT_VOPAL "void opal" +#define MAT_ALUMINIUM "aluminium" +#define MAT_BRONZE "bronze" +#define MAT_PAINITE "painite" +#define MAT_BOROSILICATE "borosilicate glass" #define SHARD_SHARD "shard" #define SHARD_SHRAPNEL "shrapnel" @@ -494,3 +502,5 @@ GLOBAL_LIST_INIT(all_volume_channels, list( #define APPEARANCECHANGER_CHANGED_F_HAIRSTYLE "Facial Hair Style" #define APPEARANCECHANGER_CHANGED_F_HAIRCOLOR "Facial Hair Color" #define APPEARANCECHANGER_CHANGED_EYES "Eye Color" + +#define GET_DECL(D) (ispath(D, /decl) ? (decls_repository.fetched_decls[D] || decls_repository.get_decl(D)) : null) diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index d166b52fbe..dccd83f557 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -160,12 +160,6 @@ #define FLASH_PROTECTION_MODERATE 1 #define FLASH_PROTECTION_MAJOR 2 -#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) -#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) - -#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) -#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) - // Incapacitation flags, used by the mob/proc/incapacitated() proc #define INCAPACITATION_RESTRAINED 1 #define INCAPACITATION_BUCKLED_PARTIALLY 2 @@ -289,6 +283,7 @@ #define BORG_BRAINTYPE_CYBORG "Cyborg" #define BORG_BRAINTYPE_POSI "Robot" #define BORG_BRAINTYPE_DRONE "Drone" +#define BORG_BRAINTYPE_PLATFORM "Platform" #define BORG_BRAINTYPE_AI_SHELL "AI Shell" // 'Regular' species. @@ -321,13 +316,13 @@ #define SPECIES_VR_SKELETON "Virtual Reality Skeleton" #define SPECIES_VR_VOX "Virtual Reality Vox" -// Ayyy IDs. -#define SPECIES_XENO "Xenomorph" -#define SPECIES_XENO_DRONE "Xenomorph Drone" -#define SPECIES_XENO_HUNTER "Xenomorph Hunter" -#define SPECIES_XENO_SENTINEL "Xenomorph Sentinel" -#define SPECIES_XENO_QUEEN "Xenomorph Queen" - +// Ayyy IDs. CHOMPedit +#define SPECIES_GENA "Genaprawn" +#define SPECIES_GENA_DRONE "Genaprawn Drone" +#define SPECIES_GENA_HUNTER "Genaprawn Hunter" +#define SPECIES_GENA_SENTINEL "Genaprawn Sentinel" +#define SPECIES_GENA_QUEEN "Genaprawn Queen" +//CHOMPedit end // Misc species. Mostly unused but might as well be complete. #define SPECIES_SHADOW "Shadow" #define SPECIES_SKELETON "Skeleton" diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index f6ca0ea565..3239e8fa1a 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -24,6 +24,30 @@ #define EMP_TOX_DMG 0x80 // EMPs inflict toxin damage #define EMP_OXY_DMG 0x100 // EMPs inflict oxy damage +// Species allergens +#define MEAT 0x1 // Skrell won't like this. +#define FISH 0x2 // Seperate for completion's sake. Still bad for skrell. +#define FRUIT 0x4 // An apple a day only keeps the doctor away if they're allergic. +#define VEGETABLE 0x8 // Taters 'n' carrots. Potato allergy is a thing, apparently. +#define GRAINS 0x10 // Wheat, oats, etc. +#define BEANS 0x20 // The musical fruit! Includes soy. +#define SEEDS 0x40 // Hope you don't have a nut allergy. +#define DAIRY 0x80 // Lactose intolerance, ho! Also bad for skrell. +#define FUNGI 0x100 // Delicious shrooms. +#define COFFEE 0x200 // Mostly here for tajara. +#define GENERIC 0x400 // Catchall for stuff that doesn't fall into the groups above. You shouldn't be allergic to this type, ever. +#define SUGARS 0x800 // For unathi-like reactions +#define EGGS 0x1000 // For Skrell eggs allergy + +// Allergen reactions +#define AG_TOX_DMG 0x1 // the classic +#define AG_OXY_DMG 0x2 // intense airway reactions +#define AG_EMOTE 0x4 // general emote reactions based on affect type +#define AG_PAIN 0x8 // short-lived hurt +#define AG_WEAKEN 0x10 // too weak to move, oof +#define AG_BLURRY 0x20 // blurred vision! +#define AG_SLEEPY 0x40 // fatigue/exhaustion + // Species spawn flags #define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play. #define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces) diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index 8909238db2..78054e6ba8 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -10,6 +10,7 @@ #define LANGUAGE_ENOCHIAN "Enochian" #define LANGUAGE_VESPINAE "Vespinae" #define LANGUAGE_SPACER "Spacer" +#define LANGUAGE_CLOWNISH "Coulrian" #define LANGUAGE_CHIMPANZEE "Chimpanzee" #define LANGUAGE_NEAERA "Neaera" diff --git a/code/__defines/tgs.dm b/code/__defines/tgs.dm index 279da8b05b..3565238195 100644 --- a/code/__defines/tgs.dm +++ b/code/__defines/tgs.dm @@ -1,254 +1,351 @@ -//tgstation-server DMAPI +// tgstation-server DMAPI -#define TGS_DMAPI_VERSION "5.1.1" +#define TGS_DMAPI_VERSION "6.0.3" -//All functions and datums outside this document are subject to change with any version and should not be relied on +// All functions and datums outside this document are subject to change with any version and should not be relied on. -//CONFIGURATION +// CONFIGURATION -//create this define if you want to do configuration outside of this file +/// Create this define if you want to do TGS configuration outside of this file. #ifndef TGS_EXTERNAL_CONFIGURATION -//Comment this out once you've filled in the below +// Comment this out once you've filled in the below. #error TGS API unconfigured -//Uncomment this if you wish to allow the game to interact with TGS 3 -//This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()() -#define TGS_V3_API +// Uncomment this if you wish to allow the game to interact with TGS 3. +// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()() +//#define TGS_V3_API -//Required interfaces (fill in with your codebase equivalent): +// Required interfaces (fill in with your codebase equivalent): -//create a global variable named `Name` and set it to `Value` +/// Create a global variable named `Name` and set it to `Value`. #define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) -//Read the value in the global variable `Name` +/// Read the value in the global variable `Name`. #define TGS_READ_GLOBAL(Name) -//Set the value in the global variable `Name` to `Value` +/// Set the value in the global variable `Name` to `Value`. #define TGS_WRITE_GLOBAL(Name, Value) -//Disallow ANYONE from reflecting a given `path`, security measure to prevent in-game use of DD -> TGS capabilities +/// Disallow ANYONE from reflecting a given `path`, security measure to prevent in-game use of DD -> TGS capabilities. #define TGS_PROTECT_DATUM(Path) -//Display an announcement `message` from the server to all players +/// Display an announcement `message` from the server to all players. #define TGS_WORLD_ANNOUNCE(message) -//Notify current in-game administrators of a string `event` +/// Notify current in-game administrators of a string `event`. #define TGS_NOTIFY_ADMINS(event) -//Write an info `message` to a server log +/// Write an info `message` to a server log. #define TGS_INFO_LOG(message) -//Write an warning `message` to a server log +/// Write an warning `message` to a server log. #define TGS_WARNING_LOG(message) -//Write an error `message` to a server log +/// Write an error `message` to a server log. #define TGS_ERROR_LOG(message) -//Get the number of connected /clients +/// Get the number of connected /clients. #define TGS_CLIENT_COUNT #endif -//EVENT CODES +// EVENT CODES -#define TGS_EVENT_REBOOT_MODE_CHANGE -1 //Before a reboot mode change, extras parameters are the current and new reboot mode enums -#define TGS_EVENT_PORT_SWAP -2 //Before a port change is about to happen, extra parameters is new port -#define TGS_EVENT_INSTANCE_RENAMED -3 //Before the instance is renamed, extra parameter is the new name -#define TGS_EVENT_WATCHDOG_REATTACH -4 //After the watchdog reattaches to DD, extra parameter is the new /datum/tgs_version of the server +/// Before a reboot mode change, extras parameters are the current and new reboot mode enums +#define TGS_EVENT_REBOOT_MODE_CHANGE -1 +/// Before a port change is about to happen, extra parameters is new port +#define TGS_EVENT_PORT_SWAP -2 +/// Before the instance is renamed, extra parameter is the new name +#define TGS_EVENT_INSTANCE_RENAMED -3 +/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server +#define TGS_EVENT_WATCHDOG_REATTACH -4 -//See the descriptions for the parameters of these codes here: https://github.com/tgstation/tgstation-server/blob/master/src/Tgstation.Server.Host/Components/EventType.cs +/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA #define TGS_EVENT_REPO_RESET_ORIGIN 0 +/// When the repository performs a checkout. Parameters: Checkout git object #define TGS_EVENT_REPO_CHECKOUT 1 +/// When the repository performs a fetch operation. No parameters #define TGS_EVENT_REPO_FETCH 2 +/// When the repository test merges. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user #define TGS_EVENT_REPO_MERGE_PULL_REQUEST 3 +/// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 +/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND #define TGS_EVENT_BYOND_INSTALL_START 5 +/// When a BYOND install operation fails. Parameters: Error message #define TGS_EVENT_BYOND_INSTALL_FAIL 6 +/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND #define TGS_EVENT_BYOND_ACTIVE_VERSION_CHANGE 7 +/// When the compiler starts running. Parameters: Game directory path, origin commit SHA #define TGS_EVENT_COMPILE_START 8 +/// When a compile is cancelled. No parameters #define TGS_EVENT_COMPILE_CANCELLED 9 +/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation #define TGS_EVENT_COMPILE_FAILURE 10 -#define TGS_EVENT_COMPILE_COMPLETE 11 // Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the TGS_EVENT_DEPLOYMENT_COMPLETE instead +/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path +#define TGS_EVENT_COMPILE_COMPLETE 11 +/// When an automatic update for the current instance begins. No parameters #define TGS_EVENT_INSTANCE_AUTO_UPDATE_START 12 +/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference #define TGS_EVENT_REPO_MERGE_CONFLICT 13 +/// When a deployment completes. No Parameters #define TGS_EVENT_DEPLOYMENT_COMPLETE 14 +/// Before the watchdog shuts down. Not sent for graceful shutdowns. No parameters. #define TGS_EVENT_WATCHDOG_SHUTDOWN 15 +/// Before the watchdog detaches for a TGS update/restart. No parameters. #define TGS_EVENT_WATCHDOG_DETACH 16 +// We don't actually implement these 4 events as the DMAPI can never receive them. +// #define TGS_EVENT_WATCHDOG_LAUNCH 17 +// #define TGS_EVENT_WATCHDOG_CRASH 18 +// #define TGS_EVENT_WORLD_END_PROCESS 19 +// #define TGS_EVENT_WORLD_REBOOT 20 +/// Watchdog event when TgsInitializationComplete() is called. No parameters. +#define TGS_EVENT_WORLD_PRIME 21 -//OTHER ENUMS +// OTHER ENUMS +/// The server will reboot normally. #define TGS_REBOOT_MODE_NORMAL 0 +/// The server will stop running on reboot. #define TGS_REBOOT_MODE_SHUTDOWN 1 +/// The watchdog will restart on reboot. #define TGS_REBOOT_MODE_RESTART 2 +/// DreamDaemon Trusted security level. #define TGS_SECURITY_TRUSTED 0 +/// DreamDaemon Safe security level. #define TGS_SECURITY_SAFE 1 +/// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 //REQUIRED HOOKS -//Call this somewhere in /world/New() that is always run -//IMPORTANT: This function may sleep! -//event_handler: optional user defined event handler. The default behaviour is to broadcast the event in english to all connected admin channels -//minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated +/** + * Call this somewhere in [/world/proc/New] that is always run. This function may sleep! + * + * * event_handler - Optional user defined [/datum/tgs_event_handler]. + * * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED]. + */ /world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) return -//Call this when your initializations are complete and your game is ready to play before any player interactions happen -//This may use world.sleep_offline to make this happen so ensure no changes are made to it while this call is running -//Most importantly, before this point, note that any static files or directories may be in use by another server. Your code should account for this -//This function should not be called before ..() in /world/New() +/** + * Call this when your initializations are complete and your game is ready to play before any player interactions happen. + * + * This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running. + * Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184 + * This function should not be called before ..() in [/world/proc/New]. + */ /world/proc/TgsInitializationComplete() return -//Put this at the start of /world/Topic() +/// Put this at the start of [/world/proc/Topic]. #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return #define VGS_TOPIC var/vgs_topic_return = VgsTopic(args[1]); if(vgs_topic_return) return vgs_topic_return // VOREStation Edit - VGS -//Call this at the beginning of world/Reboot(reason) +/** + * Call this as late as possible in [world/proc/Reboot]. + */ /world/proc/TgsReboot() return -//DATUM DEFINITIONS -//unless otherwise specified all datums defined here should be considered read-only, warranty void if written +// DATUM DEFINITIONS +// All datums defined here should be considered read-only -//represents git revision information about the current world build +/// Represents git revision information. /datum/tgs_revision_information - var/commit //full sha of compiled commit - var/origin_commit //full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch + /// Full SHA of the commit. + var/commit + /// ISO 8601 timestamp of when the commit was created + var/timestamp + /// Full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch. + var/origin_commit -//represents a version of tgstation-server +/// Represents a version. /datum/tgs_version - var/suite //The suite/major version, can be >=3 + /// The suite/major version number + var/suite - //this group of variables can be null to represent a wild card - var/minor //The minor version - var/patch //The patch version - var/deprecated_patch //The legacy version + // This group of variables can be null to represent a wild card + /// The minor version number. null for wildcards + var/minor + /// The patch version number. null for wildcards + var/patch - var/raw_parameter //The unparsed parameter - var/deprefixed_parameter //The version only bit of raw_parameter + /// Legacy version number. Generally null + var/deprecated_patch -//if the tgs_version is a wildcard version + /// Unparsed string value + var/raw_parameter + /// String value minus prefix + var/deprefixed_parameter + +/** + * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] contains wildcards. + */ /datum/tgs_version/proc/Wildcard() return -//if the tgs_version equals some other_version +/** + * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] equals some other version. + * + * other_version - The [/datum/tgs_version] to compare against. + */ /datum/tgs_version/proc/Equals(datum/tgs_version/other_version) return -//represents a merge of a GitHub pull request +/// Represents a merge of a GitHub pull request. /datum/tgs_revision_information/test_merge - var/number //pull request number - var/title //pull request title - var/body //pull request body - var/author //pull request github author - var/url //link to pull request html - var/pull_request_commit //commit of the pull request when it was merged - var/time_merged //timestamp of when the merge commit for the pull request was created - var/comment //optional comment left by the one who initiated the test merge + /// The test merge number. + var/number + /// The test merge source's title when it was merged. + var/title + /// The test merge source's body when it was merged. + var/body + /// The Username of the test merge source's author. + var/author + /// An http URL to the test merge source. + var/url + /// The SHA of the test merge when that was merged. + var/head_commit + /// Optional comment left by the TGS user who initiated the merge. + var/comment -//represents a connected chat channel +/// Represents a connected chat channel. /datum/tgs_chat_channel - var/id //internal channel representation - var/friendly_name //user friendly channel name - var/connection_name //the name of the configured chat connection - var/is_admin_channel //if the server operator has marked this channel for game admins only - var/is_private_channel //if this is a private chat channel - var/custom_tag //user defined string associated with channel + /// TGS internal channel ID. + var/id + /// User friendly name of the channel. + var/friendly_name + /// Name of the chat connection. This is the IRC server address or the Discord guild. + var/connection_name + /// [TRUE]/[FALSE] based on if the server operator has marked this channel for game admins only. + var/is_admin_channel + /// [TRUE]/[FALSE] if the channel is a private message channel for a [/datum/tgs_chat_user]. + var/is_private_channel + /// Tag string associated with the channel in TGS + var/custom_tag -//represents a chat user +// Represents a chat user /datum/tgs_chat_user - var/id //Internal user representation, requires channel to be unique - var/friendly_name //The user's public name - var/mention //The text to use to ping this user in a message - var/datum/tgs_chat_channel/channel //The /datum/tgs_chat_channel this user was from + /// TGS internal user ID. + var/id + // The user's display name. + var/friendly_name + // The string to use to ping this user in a message. + var/mention + /// The [/datum/tgs_chat_channel] the user was from + var/datum/tgs_chat_channel/channel -//user definable callback for handling events -//extra parameters may be specified depending on the event +/** + * User definable callback for handling TGS events. + * + * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each + */ /datum/tgs_event_handler/proc/HandleEvent(event_code, ...) set waitfor = FALSE return -//user definable chat command +/// User definable chat command /datum/tgs_chat_command - var/name = "" //the string to trigger this command on a chat bot. e.g. TGS3_BOT: do_this_command - var/help_text = "" //help text for this command - var/admin_only = FALSE //set to TRUE if this command should only be usable by registered chat admins + /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...` + var/name = "" + /// The help text displayed for this command + var/help_text = "" + /// If this command should be available to game administrators only + var/admin_only = FALSE -//override to implement command -//sender: The tgs_chat_user who send to command -//params: The trimmed string following the command name -//The return value will be stringified and sent to the appropriate chat +/** + * Process command activation. Should return a string to respond to the issuer with. + * + * sender - The [/datum/tgs_chat_user] who issued the command. + * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. + */ /datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params) CRASH("[type] has no implementation for Run()") -//FUNCTIONS +// API FUNCTIONS -//Returns the respective supported /datum/tgs_version of the API -/world/proc/TgsMaximumAPIVersion() +/// Returns the maximum supported [/datum/tgs_version] of the DMAPI. +/world/proc/TgsMaximumApiVersion() return -/world/proc/TgsMinimumAPIVersion() +/// Returns the minimum supported [/datum/tgs_version] of the DMAPI. +/world/proc/TgsMinimumApiVersion() return -//Returns TRUE if the world was launched under the server tools and the API matches, FALSE otherwise -//No function below this succeeds if it returns FALSE or if TgsNew() has yet to be called +/** + * Returns [TRUE] if DreamDaemon was launched under TGS, the API matches, and was properly initialized. [FALSE] will be returned otherwise. + */ /world/proc/TgsAvailable() return -//Forces a hard reboot of BYOND by ending the process -//unlike del(world) clients will try to reconnect -//If the service has not requested a shutdown, the next server will take over +// No function below this succeeds if it TgsAvailable() returns FALSE or if TgsNew() has yet to be called. + +/** + * Forces a hard reboot of DreamDaemon by ending the process. + * + * Unlike del(world) clients will try to reconnect. + * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again + */ /world/proc/TgsEndProcess() return -//Send a message to non-admin connected chats -//message: The message to send -//admin_only: If TRUE, message will instead be sent to only admin connected chats -/world/proc/TgsTargetedChatBroadcast(message, admin_only) +/** + * Send a message to connected chats. + * + * message - The string to send. + * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. + */ +/world/proc/TgsTargetedChatBroadcast(message, admin_only = FALSE) return -//Send a private message to a specific user -//message: The message to send -//user: The /datum/tgs_chat_user to send to +/** + * Send a private message to a specific user. + * + * message - The string to send. + * user: The [/datum/tgs_chat_user] to PM. + */ /world/proc/TgsChatPrivateMessage(message, datum/tgs_chat_user/user) return -//The following functions will sleep if a call to TgsNew() is sleeping +// The following functions will sleep if a call to TgsNew() is sleeping -//Sends a message to connected game chats -//message: The message to send -//channels: optional channels to limit the broadcast to -/world/proc/TgsChatBroadcast(message, list/channels) +/** + * Send a message to connected chats that are flagged as game-related in TGS. + * + * message - The string to send. + * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. + */ +/world/proc/TgsChatBroadcast(message, list/channels = null) return -//Gets the current /datum/tgs_version of the server tools running the server +/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. /world/proc/TgsVersion() return -//Gets the current /datum/tgs_version of the DMAPI being used +/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. /world/proc/TgsApiVersion() return -//Gets the name of the TGS instance running the game +/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. /world/proc/TgsInstanceName() return -//Get the current `/datum/tgs_revision_information` +/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. /world/proc/TgsRevision() return -//Get the current BYOND security level +/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. /world/proc/TgsSecurityLevel() return -//Gets a list of active `/datum/tgs_revision_information/test_merge`s +/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. /world/proc/TgsTestMerges() return -//Gets a list of connected tgs_chat_channel +/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. /world/proc/TgsChatChannelInfo() return diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm index e02c99290c..742708face 100644 --- a/code/_global_vars/lists/misc.dm +++ b/code/_global_vars/lists/misc.dm @@ -5,4 +5,7 @@ GLOBAL_LIST_EMPTY(meteor_list) GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value. // Reference list for disposal sort junctions. Filled up by sorting junction's New() -GLOBAL_LIST_EMPTY(tagger_locations) \ No newline at end of file +GLOBAL_LIST_EMPTY(tagger_locations) + +GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Prey", "Switch", "Non-Vore", "Unset")) +GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP", "Unset")) \ No newline at end of file diff --git a/code/_global_vars/mobs.dm b/code/_global_vars/mobs.dm index fe5fa0be27..7e60dc71ea 100644 --- a/code/_global_vars/mobs.dm +++ b/code/_global_vars/mobs.dm @@ -6,4 +6,3 @@ GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client GLOBAL_LIST_EMPTY(clients) GLOBAL_LIST_EMPTY(players_by_zlevel) GLOBAL_LIST_EMPTY(round_text_log) -GLOBAL_LIST_EMPTY(ghost_mob_list) //CHOMPedit List of all ghosts, including clientless. Excludes /mob/new_player diff --git a/code/_helpers/_global_objects.dm b/code/_helpers/_global_objects.dm index 4cbbcf3314..adbd2785e8 100644 --- a/code/_helpers/_global_objects.dm +++ b/code/_helpers/_global_objects.dm @@ -1 +1,2 @@ -var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() \ No newline at end of file +var/datum/gear_tweak/color/gear_tweak_free_color_choice = new() +var/datum/gear_tweak/implant_location/gear_tweak_implant_location = new() \ No newline at end of file diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 855decff39..1c0d5f2393 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -43,6 +43,11 @@ var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused var/global/list/body_marking_styles_list = list() //stores /datum/sprite_accessory/marking indexed by name +var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type +var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type +var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type + +GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Custom Species icon base //Underwear var/datum/category_collection/underwear/global_underwear = new() @@ -94,13 +99,13 @@ var/global/list/string_slot_flags = list( "holster" = SLOT_HOLSTER ) -/proc/get_mannequin(var/ckey) - if(!mannequins_) - mannequins_ = new() - . = mannequins_[ckey] - if(!.) - . = new/mob/living/carbon/human/dummy/mannequin() - mannequins_[ckey] = . +GLOBAL_LIST_EMPTY(mannequins) +/proc/get_mannequin(var/ckey = "NULL") + var/mob/living/carbon/human/dummy/mannequin/M = GLOB.mannequins[ckey] + if(!istype(M)) + GLOB.mannequins[ckey] = new /mob/living/carbon/human/dummy/mannequin(null) + M = GLOB.mannequins[ckey] + return M ////////////////////////// /////Initial Building///// @@ -214,6 +219,23 @@ var/global/list/string_slot_flags = list( var/decl/closet_appearance/app = new T() GLOB.closet_appearances[T] = app + paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears + for(var/path in paths) + var/obj/item/clothing/head/instance = new path() + ear_styles_list[path] = instance + + // Custom Tails + paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur + for(var/path in paths) + var/datum/sprite_accessory/tail/instance = new path() + tail_styles_list[path] = instance + + // Custom Wings + paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing + for(var/path in paths) + var/datum/sprite_accessory/wing/instance = new path() + wing_styles_list[path] = instance + // VOREStation Add - Vore Modes! paths = typesof(/datum/digest_mode) for(var/T in paths) @@ -221,6 +243,41 @@ var/global/list/string_slot_flags = list( GLOB.digest_modes[DM.id] = DM // VOREStation Add End +/* + // Custom species traits + paths = typesof(/datum/trait) - /datum/trait + for(var/path in paths) + var/datum/trait/instance = new path() + if(!instance.name) + continue //A prototype or something + var/cost = instance.cost + traits_costs[path] = cost + all_traits[path] = instance + switch(cost) + if(-INFINITY to -0.1) + negative_traits[path] = instance + if(0) + neutral_traits[path] = instance + if(0.1 to INFINITY) + positive_traits[path] = instance +*/ + + // Custom species icon bases + var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //VOREStation Edit + var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //VOREStation Edit + for(var/species_name in GLOB.playable_species) + if(species_name in blacklisted_icons) + continue + var/datum/species/S = GLOB.all_species[species_name] + if(S.spawn_flags & SPECIES_IS_WHITELISTED) + continue + GLOB.custom_species_bases += species_name + for(var/species_name in whitelisted_icons) + GLOB.custom_species_bases += species_name + + return 1 // Hooks must return 1 + + return 1 /* // Uncomment to debug chemical reaction list. diff --git a/code/_helpers/global_lists_ch.dm b/code/_helpers/global_lists_ch.dm index ead50d7b5f..ff5c0a26e4 100644 --- a/code/_helpers/global_lists_ch.dm +++ b/code/_helpers/global_lists_ch.dm @@ -13,4 +13,12 @@ var/global/list/vore_reagent_sounds = list( 'sound/vore/walkslosh10.ogg', "None" = null) -/var/global/list/existing_metroids = list() //Global variable for tracking metroids for the event announcement. Needs to go here for load order. \ No newline at end of file +/var/global/list/existing_metroids = list() //Global variable for tracking metroids for the event announcement. Needs to go here for load order. + +//stuff that only synths can eat +var/global/list/edible_tech = list(/obj/item/weapon/cell, + /obj/item/weapon/circuitboard, + /obj/item/integrated_circuit, + /obj/item/broken_device, + /obj/item/brokenbug, + ) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 862a562b39..b5b1d82dea 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -2,10 +2,7 @@ * VOREStation global lists */ -var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type var/global/list/hair_accesories_list= list()// Stores /datum/sprite_accessory/hair_accessory indexed by type -var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type -var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type var/global/list/negative_traits = list() // Negative custom species traits, indexed by path var/global/list/neutral_traits = list() // Neutral custom species traits, indexed by path var/global/list/everyone_traits = list() // Neutral traits available to all species, indexed by path @@ -16,8 +13,6 @@ var/global/list/active_ghost_pods = list() var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list -var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base - //stores numeric player size options indexed by name var/global/list/player_sizes_list = list( "Macro" = RESIZE_HUGE, @@ -108,30 +103,74 @@ var/global/list/fancy_release_sounds = list( ) var/global/list/global_vore_egg_types = list( - "Unathi" = UNATHI_EGG, - "Tajaran" = TAJARAN_EGG, - "Akula" = AKULA_EGG, - "Skrell" = SKRELL_EGG, - "Nevrean" = NEVREAN_EGG, - "Sergal" = SERGAL_EGG, - "Human" = HUMAN_EGG, - "Slime" = SLIME_EGG, - "Egg" = EGG_EGG, - "Xenochimera" = XENOCHIMERA_EGG, - "Xenomorph" = XENOMORPH_EGG) + "Unathi", + "Tajara", + "Akula", + "Skrell", + "Sergal", + "Nevrean", + "Human", + "Slime", + "Egg", + "Xenochimera", + "Xenomorph", + "Chocolate", + "Boney", + "Slime glob", + "Chicken", + "Synthetic", + "Bluespace Floppy", + "Bluespace Compressed File", + "Bluespace CD", + "Escape pod", + "Cooking error", + "Web cocoon", + "Honeycomb", + "Bug cocoon", + "Rock", + "Yellow", + "Blue", + "Green", + "Orange", + "Purple", + "Red", + "Rainbow", + "Spotted pink") var/global/list/tf_vore_egg_types = list( - "Unathi" = /obj/structure/closet/secure_closet/egg/unathi, - "Tajara" = /obj/structure/closet/secure_closet/egg/tajaran, - "Akula" = /obj/structure/closet/secure_closet/egg/shark, - "Skrell" = /obj/structure/closet/secure_closet/egg/skrell, - "Sergal" = /obj/structure/closet/secure_closet/egg/sergal, - "Nevrean" = /obj/structure/closet/secure_closet/egg/nevrean, - "Human" = /obj/structure/closet/secure_closet/egg/human, - "Slime" = /obj/structure/closet/secure_closet/egg/slime, - "Egg" = /obj/structure/closet/secure_closet/egg, - "Xenochimera" = /obj/structure/closet/secure_closet/egg/scree, - "Xenomorph" = /obj/structure/closet/secure_closet/egg/xenomorph) + "Unathi" = /obj/item/weapon/storage/vore_egg/unathi, + "Tajara" = /obj/item/weapon/storage/vore_egg/tajaran, + "Akula" = /obj/item/weapon/storage/vore_egg/shark, + "Skrell" = /obj/item/weapon/storage/vore_egg/skrell, + "Sergal" = /obj/item/weapon/storage/vore_egg/sergal, + "Nevrean" = /obj/item/weapon/storage/vore_egg/nevrean, + "Human" = /obj/item/weapon/storage/vore_egg/human, + "Slime" = /obj/item/weapon/storage/vore_egg/slime, + "Egg" = /obj/item/weapon/storage/vore_egg, + "Xenochimera" = /obj/item/weapon/storage/vore_egg/scree, + "Xenomorph" = /obj/item/weapon/storage/vore_egg/xenomorph, + "Chocolate" = /obj/item/weapon/storage/vore_egg/chocolate, + "Boney" = /obj/item/weapon/storage/vore_egg/owlpellet, + "Slime glob" = /obj/item/weapon/storage/vore_egg/slimeglob, + "Chicken" = /obj/item/weapon/storage/vore_egg/chicken, + "Synthetic" = /obj/item/weapon/storage/vore_egg/synthetic, + "Bluespace Floppy" = /obj/item/weapon/storage/vore_egg/floppy, + "Bluespace Compressed File" = /obj/item/weapon/storage/vore_egg/file, + "Bluespace CD" = /obj/item/weapon/storage/vore_egg/cd, + "Escape pod" = /obj/item/weapon/storage/vore_egg/escapepod, + "Cooking error" = /obj/item/weapon/storage/vore_egg/badrecipe, + "Web cocoon" = /obj/item/weapon/storage/vore_egg/cocoon, + "Honeycomb" = /obj/item/weapon/storage/vore_egg/honeycomb, + "Bug cocoon" = /obj/item/weapon/storage/vore_egg/bugcocoon, + "Rock" = /obj/item/weapon/storage/vore_egg/rock, + "Yellow" = /obj/item/weapon/storage/vore_egg/yellow, + "Blue" = /obj/item/weapon/storage/vore_egg/blue, + "Green" = /obj/item/weapon/storage/vore_egg/green, + "Orange" = /obj/item/weapon/storage/vore_egg/orange, + "Purple" = /obj/item/weapon/storage/vore_egg/purple, + "Red" = /obj/item/weapon/storage/vore_egg/red, + "Rainbow" = /obj/item/weapon/storage/vore_egg/rainbow, + "Spotted pink" = /obj/item/weapon/storage/vore_egg/pinkspots) var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars, @@ -147,6 +186,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/device/paicard, /obj/item/device/pda, /obj/item/device/radio/headset, + /obj/item/device/starcaster_news, //chompstation addition /obj/item/inflatable/torn, /obj/item/organ, /obj/item/stack/material/cardboard, @@ -182,7 +222,11 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/fancy/crayons, /obj/item/weapon/storage/fancy/egg_box, - /obj/item/weapon/storage/wallet) + /obj/item/weapon/storage/wallet, + /obj/item/weapon/storage/vore_egg, + /obj/item/weapon/material/kitchen, //chompstation addition + /obj/item/weapon/bikehorn/tinytether + ) var/global/list/contamination_flavors = list( "Generic" = contamination_flavors_generic, @@ -422,11 +466,11 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, SPECIES_MONKEY_NEVREAN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_VULPKANIN, - SPECIES_XENO, //Same for xenos, - SPECIES_XENO_DRONE, - SPECIES_XENO_HUNTER, - SPECIES_XENO_SENTINEL, - SPECIES_XENO_QUEEN, + SPECIES_GENA, //Same for xenos, CHOMPedit + SPECIES_GENA_DRONE, + SPECIES_GENA_HUNTER, + SPECIES_GENA_SENTINEL, + SPECIES_GENA_QUEEN, //CHOMPedit end SPECIES_SHADOW, SPECIES_GOLEM, //Some special species that may or may not be ever used in event too, SPECIES_SHADEKIN) //Shadefluffers just poof away @@ -436,24 +480,6 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, /hook/startup/proc/init_vore_datum_ref_lists() var/paths - // Custom Ears - paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears - for(var/path in paths) - var/obj/item/clothing/head/instance = new path() - ear_styles_list[path] = instance - - // Custom Tails - paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur - for(var/path in paths) - var/datum/sprite_accessory/tail/instance = new path() - tail_styles_list[path] = instance - - // Custom Wings - paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing - for(var/path in paths) - var/datum/sprite_accessory/wing/instance = new path() - wing_styles_list[path] = instance - // Custom Hair Accessories paths = typesof(/datum/sprite_accessory/hair_accessory) - /datum/sprite_accessory/hair_accessory for(var/path in paths) @@ -479,17 +505,22 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, if(0.1 to INFINITY) positive_traits[path] = instance - // Custom species icon bases - var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well. - var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //Include these anyway - for(var/species_name in GLOB.playable_species) - if(species_name in blacklisted_icons) - continue - var/datum/species/S = GLOB.all_species[species_name] - if(S.spawn_flags & SPECIES_IS_WHITELISTED) - continue - custom_species_bases += species_name - for(var/species_name in whitelisted_icons) - custom_species_bases += species_name + // Weaver recipe stuff + paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure + for(var/path in paths) + var/datum/weaver_recipe/instance = new path() + if(!instance.title) + continue //A prototype or something + weavable_structures[instance.title] = instance + + paths = typesof(/datum/weaver_recipe/item) - /datum/weaver_recipe/item + for(var/path in paths) + var/datum/weaver_recipe/instance = new path() + if(!instance.title) + continue //A prototype or something + weavable_items[instance.title] = instance return 1 // Hooks must return 1 + +var/global/list/weavable_structures = list() +var/global/list/weavable_items = list() diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index c3ea7946a4..43ed714786 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -122,14 +122,18 @@ Proc for attack log creation, because really why not if(ismob(user)) //CHOMPEdit Begin //user.attack_log += text("\[[time_stamp()]\] Attacked [target_str]: [what_done]") - var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = user.ckey, "t_mob" = user.real_name, "t_content" = "Attacked [target_str]: [what_done]")) - query_insert.Execute(async=use_async) - qdel(query_insert) + //var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = user.ckey, "t_mob" = user.real_name, "t_content" = "Attacked [target_str]: [what_done]")) + //query_insert.Execute(async=use_async) + //qdel(query_insert) + if(SSdbcore.Connect()) + rustg_sql_query_async(SSdbcore.connection, "INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", json_encode(list("t_ckey" = user.ckey, "t_mob" = user.real_name, "t_content" = "Attacked [target_str]: [what_done]"))) if(ismob(target)) //target.attack_log += text("\[[time_stamp()]\] Attacked by [user_str]: [what_done]") - var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = target.ckey, "t_mob" = target.real_name, "t_content" = "Attacked by [user_str]: [what_done]")) - query_insert.Execute(async=use_async) - qdel(query_insert) + //var/DBQuery/query_insert = SSdbcore.NewQuery("INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", list("t_ckey" = target.ckey, "t_mob" = target.real_name, "t_content" = "Attacked by [user_str]: [what_done]")) + //query_insert.Execute(async=use_async) + //qdel(query_insert) + if(SSdbcore.Connect()) + rustg_sql_query_async(SSdbcore.connection, "INSERT INTO erro_attacklog (id, time, ckey, mob, message) VALUES (null, NOW(), :t_ckey, :t_mob, :t_content)", json_encode(list("t_ckey" = target.ckey, "t_mob" = target.real_name, "t_content" = "Attacked by [user_str]: [what_done]"))) //CHOMPEdit End log_attack(user_str,target_str,what_done) if(admin_notify) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index a6473ddab2..0bed9abe52 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -404,9 +404,9 @@ proc/TextPreview(var/string,var/len=40) t = replacetext(t, "\[/grid\]", "") t = replacetext(t, "\[row\]", "") t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[logo\]", "") - t = replacetext(t, "\[redlogo\]", "") - t = replacetext(t, "\[sglogo\]", "") + t = replacetext(t, "\[logo\]", "") //CHOMPEdit + t = replacetext(t, "\[redlogo\]", "") //CHOMPEdit + t = replacetext(t, "\[sglogo\]", "") //CHOMPEdit t = replacetext(t, "\[editorbr\]", "") return t diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index c7b399e4ee..f2b57156a9 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1277,6 +1277,10 @@ var/list/WALLITEMS = list( colour += temp_col return colour +/proc/color_square(red, green, blue, hex) + var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]" + return "___" + var/mob/dview/dview_mob = new //Version of view() which ignores darkness, because BYOND doesn't have it. @@ -1609,6 +1613,46 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) /proc/href(href_src, list/href_params, href_text) return "[href_text]" +// This is a helper for anything that wants to render the map in TGUI +/proc/get_tgui_plane_masters() + . = list() + // 'Utility' planes + . += new /obj/screen/plane_master/fullbright //Lighting system (lighting_overlay objects) + . += new /obj/screen/plane_master/lighting //Lighting system (but different!) + . += new /obj/screen/plane_master/ghosts //Ghosts! + . += new /obj/screen/plane_master{plane = PLANE_AI_EYE} //AI Eye! + + . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS} //Status is the synth/human icon left side of medhuds + . += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH} //Health bar + . += new /obj/screen/plane_master{plane = PLANE_CH_LIFE} //Alive-or-not icon + . += new /obj/screen/plane_master{plane = PLANE_CH_ID} //Job ID icon + . += new /obj/screen/plane_master{plane = PLANE_CH_WANTED} //Wanted status + . += new /obj/screen/plane_master{plane = PLANE_CH_IMPLOYAL} //Loyalty implants + . += new /obj/screen/plane_master{plane = PLANE_CH_IMPTRACK} //Tracking implants + . += new /obj/screen/plane_master{plane = PLANE_CH_IMPCHEM} //Chemical implants + . += new /obj/screen/plane_master{plane = PLANE_CH_SPECIAL} //"Special" role stuff + . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS_OOC} //OOC status HUD + + . += new /obj/screen/plane_master{plane = PLANE_ADMIN1} //For admin use + . += new /obj/screen/plane_master{plane = PLANE_ADMIN2} //For admin use + . += new /obj/screen/plane_master{plane = PLANE_ADMIN3} //For admin use + + . += new /obj/screen/plane_master{plane = PLANE_MESONS} //Meson-specific things like open ceilings. + . += new /obj/screen/plane_master{plane = PLANE_BUILDMODE} //Things that only show up while in build mode + + // Real tangible stuff planes + . += new /obj/screen/plane_master/main{plane = TURF_PLANE} + . += new /obj/screen/plane_master/main{plane = OBJ_PLANE} + . += new /obj/screen/plane_master/main{plane = MOB_PLANE} + . += new /obj/screen/plane_master/cloaked //Cloaked atoms! + + //VOREStation Add - Random other plane masters + . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS_R} //Right-side status icon + . += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH_VR} //Health bar but transparent at 100 + . += new /obj/screen/plane_master{plane = PLANE_CH_BACKUP} //Backup implant status + . += new /obj/screen/plane_master{plane = PLANE_CH_VANTAG} //Vore Antags + . += new /obj/screen/plane_master{plane = PLANE_AUGMENTED} //Augmented reality + //VOREStation Add End /proc/CallAsync(datum/source, proctype, list/arguments) set waitfor = FALSE - return call(source, proctype)(arglist(arguments)) \ No newline at end of file + return call(source, proctype)(arglist(arguments)) diff --git a/code/_helpers/view.dm b/code/_helpers/view.dm index 13ee837caa..be60a56697 100644 --- a/code/_helpers/view.dm +++ b/code/_helpers/view.dm @@ -10,3 +10,7 @@ viewX = text2num(viewrangelist[1]) viewY = text2num(viewrangelist[2]) return list(viewX, viewY) + +// Used to get `atom/O as obj|mob|turf in view()` to match against strings containing apostrophes immediately after substrings that match to other objects. Somehow. - Ater +/proc/_validate_atom(atom/A) + return view() \ No newline at end of file diff --git a/code/_helpers/widelists_ch.dm b/code/_helpers/widelists_ch.dm new file mode 100644 index 0000000000..2d447b1110 --- /dev/null +++ b/code/_helpers/widelists_ch.dm @@ -0,0 +1,25 @@ +GLOBAL_LIST_EMPTY(widelists) + +/proc/widelist(var/list/input_list) + var/list_hash = gen_hash_list(input_list) + if(!(list_hash in GLOB.widelists)) + GLOB.widelists[list_hash] = input_list + return GLOB.widelists[list_hash] + +/proc/gen_hash_list(var/list/input_list) + var/string = "" + for(var/item in input_list) + var/p1 = "" + if(islist(item)) + p1 = ">>>::-;[gen_hash_list(item)];-::<<<" + else + p1 = "[item]" + + var/p2 = "" + if(islist(input_list[item])) + p2 = ">>>::-;[gen_hash_list(input_list[item])];-::<<<" + else + p2 = "[input_list[item]]" + + string += "[p1]::--::[p2]::;;;" + return md5(string) \ No newline at end of file diff --git a/code/_macros.dm b/code/_macros.dm index 4796f93b47..33bdf30ceb 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -37,4 +37,7 @@ #define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id) -#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } \ No newline at end of file +#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } + +#define isitem(A) istype(A, /obj/item) +#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm index 6a2134fb71..2eecbe69ed 100644 --- a/code/_macros_vr.dm +++ b/code/_macros_vr.dm @@ -1,3 +1 @@ #define isbelly(A) istype(A, /obj/belly) -#define isitem(A) istype(A, /obj/item) -#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index b29a1192d9..0cdda2e993 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -371,5 +371,8 @@ var/list/P = params2list(params) var/turf/T = screen_loc2turf(P["screen-loc"], get_turf(usr)) if(T) + if(modifiers["shift"]) + usr.face_atom(T) + return 1 T.Click(location, control, params) - . = 1 + return 1 diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index edcd7ec901..eded117b3a 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -60,6 +60,8 @@ // Cyborgs have no range-checking unless there is item use if(!W) + if(bolt && !bolt.malfunction && A.loc != module) + return A.add_hiddenprint(src) A.attack_robot(src) return @@ -119,35 +121,56 @@ /atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlShiftClick(user) -/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/user) +/obj/machinery/door/airlock/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) + if(user.bolt && !user.bolt.malfunction) + return + AICtrlShiftClick(user) /atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden ShiftClick(user) -/obj/machinery/door/airlock/BorgShiftClick(mob/user) // Opens and closes doors! Forwards to AI code. +/obj/machinery/door/airlock/BorgShiftClick(var/mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AIShiftClick(user) /atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlClick(user) -/obj/machinery/door/airlock/BorgCtrlClick(mob/user) // Bolts doors. Forwards to AI code. +/obj/machinery/door/airlock/BorgCtrlClick(var/mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AICtrlClick(user) -/obj/machinery/power/apc/BorgCtrlClick(mob/user) // turns off/on APCs. Forwards to AI code. +/obj/machinery/power/apc/BorgCtrlClick(var/mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AICtrlClick(user) -/obj/machinery/turretid/BorgCtrlClick(mob/user) //turret control on/off. Forwards to AI code. +/obj/machinery/turretid/BorgCtrlClick(var/mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AICtrlClick(user) /atom/proc/BorgAltClick(var/mob/living/silicon/robot/user) AltClick(user) return -/obj/machinery/door/airlock/BorgAltClick(mob/user) // Eletrifies doors. Forwards to AI code. +/obj/machinery/door/airlock/BorgAltClick(var/mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AIAltClick(user) -/obj/machinery/turretid/BorgAltClick(mob/user) //turret lethal on/off. Forwards to AI code. +/obj/machinery/turretid/BorgAltClick(var/mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. + if(user.bolt && !user.bolt.malfunction) + return + AIAltClick(user) /* diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index d31a64dcda..247d1d3f8b 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -161,6 +161,13 @@ #define ui_ghost_pai "SOUTH: 6,CENTER+2:24" #define ui_ghost_updown "SOUTH: 6,CENTER+3:24" +// NIF Soulcatcher guest ones +#define ui_nifsc_reenter "SOUTH:6,CENTER-3:24" +#define ui_nifsc_arproj "SOUTH:6,CENTER-2:24" +#define ui_nifsc_jumptoowner "SOUTH:6,CENTER-1:24" +#define ui_nifsc_nme "SOUTH:6,CENTER:24" +#define ui_nifsc_nsay "SOUTH:6,CENTER+1:24" + // Rig panel #define ui_rig_deco1 "WEST:-7, SOUTH+5" #define ui_rig_deco2 "WEST:-7, SOUTH+6" diff --git a/code/_onclick/hud/screen_objects_zz_ch.dm b/code/_onclick/hud/screen_objects_zz_ch.dm new file mode 100644 index 0000000000..f0fbd912fe --- /dev/null +++ b/code/_onclick/hud/screen_objects_zz_ch.dm @@ -0,0 +1,30 @@ +//Invesitgating a runtime made me discover that all simplemobs have HUD on hands set to themselves +//Which cause this original code to die because the mob does not have a mymob var... +//So yeah this is why we now check if it is type of mob first... +//Is this pretty? Fuck no, but its how i know to fix it -shark +//Oh also the swap button on simple mob hands has hud set to null so we also need to catch that. +/obj/screen/inventory/add_overlays() + if(!hud) //Simplemob swap hands button has this set to null :) + return + var/mob/user + if(istype(hud,/mob )) //Simplemob hands directly reference the mob in hud, dont ask me. + user = hud + else + user = hud.mymob //original intended behaviour + if(hud && user && slot_id) + + var/obj/item/holding = user.get_active_hand() + + if(!holding || user.get_equipped_item(slot_id)) + return + + var/image/item_overlay = image(holding) + item_overlay.alpha = 92 + + if(!holding.mob_can_equip(user, slot_id, disable_warning = TRUE)) + item_overlay.color = "#ff0000" + else + item_overlay.color = "#00ff00" + + object_overlays += item_overlay + add_overlay(object_overlays) \ No newline at end of file diff --git a/code/_onclick/hud/soulcatcher_guest.dm b/code/_onclick/hud/soulcatcher_guest.dm new file mode 100644 index 0000000000..555bcb8eba --- /dev/null +++ b/code/_onclick/hud/soulcatcher_guest.dm @@ -0,0 +1,102 @@ +/obj/screen/nifsc + icon = 'icons/mob/screen_nifsc.dmi' + +/obj/screen/nifsc/MouseEntered(location,control,params) + flick(icon_state + "_anim", src) + openToolTip(usr, src, params, title = name, content = desc) + +/obj/screen/nifsc/MouseExited() + closeToolTip(usr) + +/obj/screen/nifsc/Click() + closeToolTip(usr) + +/obj/screen/nifsc/reenter + name = "Re-enter NIF" + desc = "Return into the NIF" + icon_state = "reenter" + +/obj/screen/nifsc/reenter/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.reenter_soulcatcher() + +/obj/screen/nifsc/arproj + name = "AR project" + desc = "Project your form into Augmented Reality for those around your predator with the appearance of your loaded character." + icon_state = "arproj" + +/obj/screen/nifsc/arproj/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.ar_project() + +/obj/screen/nifsc/jumptoowner + name = "Jump back to host" + desc = "Jumb back to the Soulcather host" + icon_state = "jump" + +/obj/screen/nifsc/jumptoowner/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.jump_to_owner() + +/obj/screen/nifsc/nme + name = "Emote into Soulcatcher" + desc = "Emote into the NIF's Soulcatcher (circumventing AR emoting)" + icon_state = "nme" + +/obj/screen/nifsc/nme/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.nme() + +/obj/screen/nifsc/nsay + name = "Speak into Soulcatcher" + desc = "Speak into the NIF's Soulcatcher (circumventing AR speaking)" + icon_state = "nsay" + +/obj/screen/nifsc/nsay/Click() + ..() + var/mob/living/carbon/brain/caught_soul/CS = usr + CS.nsay() + + +/mob/living/carbon/brain/caught_soul/create_mob_hud(datum/hud/HUD, apply_to_client = TRUE) + ..() + + var/list/adding = list() + HUD.adding = adding + + var/obj/screen/using + + using = new /obj/screen/nifsc/reenter() + using.screen_loc = ui_nifsc_reenter + using.hud = src + adding += using + + using = new /obj/screen/nifsc/arproj() + using.screen_loc = ui_nifsc_arproj + using.hud = src + adding += using + + using = new /obj/screen/nifsc/jumptoowner() + using.screen_loc = ui_nifsc_jumptoowner + using.hud = src + adding += using + + using = new /obj/screen/nifsc/nme() + using.screen_loc = ui_nifsc_nme + using.hud = src + adding += using + + using = new /obj/screen/nifsc/nsay() + using.screen_loc = ui_nifsc_nsay + using.hud = src + adding += using + + + if(client && apply_to_client) + client.screen = list() + client.screen += HUD.adding + client.screen += client.void diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 6e9d32f90f..05abb31211 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -231,7 +231,7 @@ var/list/gamemode_cache = list() // 15, 45, 70 minutes respectively var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - var/static/aliens_allowed = 1 //CHOMPedit to 1. This not only allows the natural spawning of xenos, but also the ability to lay eggs. Xenomorphs cannot lay eggs if this is 0 + var/static/aliens_allowed = 1 //CHOMPedit to 1. This not only allows the natural spawning of xenos, but also the ability to lay eggs. Genaprawns cannot lay eggs if this is 0 var/static/ninjas_allowed = 0 var/static/abandon_allowed = 1 var/static/ooc_allowed = 1 diff --git a/code/controllers/configuration_ch.dm b/code/controllers/configuration_ch.dm index 43bfd07bcd..b119f5fdbd 100644 --- a/code/controllers/configuration_ch.dm +++ b/code/controllers/configuration_ch.dm @@ -9,6 +9,14 @@ var/vorefootstep_volume = 75 //In future see about making a function to adjust volume serverside in config.txt, easy to do with reenable values. - Jack + var/nodebot_enabled = 0 //So, nodebot is a supplement to the TGS discord bot pretty much. For things likes faxes and the manifest it's very helpful because it's able to render html into an image and post it. + var/nodebot_location //We need to print the manifest to this location so nodebot can render it to chat. //NOTE: TO BE REPLACED BY BETTER CODE FOR FETCHING MANIFEST + var/ahelp_channel_tag //This is for tgs4 channels, if you're not running on tgs4, this won't work anyways. If it's not set, it will default to the admin channel. + var/discord_faxes_autoprint = 0 //Only turn this on if you're not using the nodebot. + var/discord_faxes_disabled = 0 //Turn this off if you don't want the TGS bot sending you messages whenever a fax is sent to central. + var/discord_ahelps_disabled = 0 //Turn this off if you don't want the TGS bot sending you messages whenever an ahelp ticket is created. + var/discord_ahelps_all = 0 //Turn this on if you want all admin-PMs to go to be sent to discord, and not only the first message of a ticket. + /hook/startup/proc/read_ch_config() var/list/Lines = file2list("config/config.txt") for(var/t in Lines) @@ -22,11 +30,11 @@ var/pos = findtext(t, " ") var/name = null -// var/value = null //Commenting out because config doesn't contain any values at the moment. - Jonathan + var/value = null if (pos) name = lowertext(copytext(t, 1, pos)) -// value = copytext(t, pos + 1) //Commenting out because config doesn't contain any values at the moment. - Jonathan + value = copytext(t, pos + 1) else name = lowertext(t) @@ -40,4 +48,18 @@ config.use_jobwhitelist = 1 if ("disable_emojis") config.emojis = 0 + if ("nodebot_enabled") + config.nodebot_enabled = 1 + if ("discord_faxes_autoprint") + config.discord_faxes_autoprint = 1 + if ("discord_faxes_disabled") + config.discord_faxes_disabled = 1 + if ("discord_ahelps_disabled") + config.discord_ahelps_disabled = 1 + if ("discord_ahelps_all") + config.discord_ahelps_all = 1 + if ("nodebot_location") + config.nodebot_location = value + if ("ahelp_channel_tag") + config.ahelp_channel_tag = value return 1 diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm index 60b08c71d2..77c9d3ab94 100644 --- a/code/controllers/subsystems/overlays.dm +++ b/code/controllers/subsystems/overlays.dm @@ -5,7 +5,6 @@ SUBSYSTEM_DEF(overlays) priority = FIRE_PRIORITY_OVERLAYS init_order = INIT_ORDER_OVERLAY - var/initialized = FALSE var/list/queue // Queue of atoms needing overlay compiling (TODO-VERIFY!) var/list/stats var/list/overlay_icon_state_caches // Cache thing @@ -22,7 +21,6 @@ var/global/image/appearance_bro = new() // Temporarily super-global because of B stats = list() /datum/controller/subsystem/overlays/Initialize() - initialized = TRUE fire(mc_check = FALSE) ..() diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index e70f62d5fe..cc066cb99d 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -74,7 +74,7 @@ SUBSYSTEM_DEF(plants) S.update_seed() //Might as well mask the gene types while we're at it. - var/list/gene_datums = decls_repository.decls_of_subtype(/decl/plantgene) + var/list/gene_datums = decls_repository.get_decls_of_subtype(/decl/plantgene) var/list/used_masks = list() var/list/plant_traits = ALL_GENES while(plant_traits && plant_traits.len) diff --git a/code/controllers/subsystems/processing/chemistry.dm b/code/controllers/subsystems/processing/chemistry.dm index 7f4fd9c42b..b4641ba7e0 100644 --- a/code/controllers/subsystems/processing/chemistry.dm +++ b/code/controllers/subsystems/processing/chemistry.dm @@ -22,6 +22,7 @@ PROCESSING_SUBSYSTEM_DEF(chemistry) /datum/controller/subsystem/processing/chemistry/Initialize() initialize_chemical_reactions() initialize_chemical_reagents() + ..() //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. diff --git a/code/controllers/subsystems/shuttles.dm b/code/controllers/subsystems/shuttles.dm index 0bce940385..40039edceb 100644 --- a/code/controllers/subsystems/shuttles.dm +++ b/code/controllers/subsystems/shuttles.dm @@ -4,9 +4,6 @@ // Also handles initialization and processing of overmap sectors. // -// This global variable exists for legacy support so we don't have to rename every shuttle_controller to SSshuttles yet. -var/global/datum/controller/subsystem/shuttles/shuttle_controller - SUBSYSTEM_DEF(shuttles) name = "Shuttles" wait = 2 SECONDS @@ -35,9 +32,6 @@ SUBSYSTEM_DEF(shuttles) var/tmp/list/current_run // Shuttles remaining to process this fire() tick -/datum/controller/subsystem/shuttles/PreInit() - global.shuttle_controller = src // TODO - Remove this! Change everything to point at SSshuttles intead - /datum/controller/subsystem/shuttles/Initialize(timeofday) last_landmark_registration_time = world.time // Find all declared shuttle datums and initailize them. (Okay, queue them for initialization a few lines further down) diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index fcc076231d..227917a263 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -49,10 +49,7 @@ var/global/datum/controller/subsystem/ticker/ticker /datum/controller/subsystem/ticker/Initialize() pregame_timeleft = config.pregame_time send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]") - - // Set up the global announcer - GLOB.autospeaker = new (null, null, null, 1) - + GLOB.autospeaker = new (null, null, null, 1) //Set up Global Announcer return ..() /datum/controller/subsystem/ticker/fire(resumed = FALSE) @@ -186,11 +183,6 @@ var/global/datum/controller/subsystem/ticker/ticker if(adm["total"] == 0) send2adminirc("A round has started with no admins online.") -/* supply_controller.process() //Start the supply shuttle regenerating points -- TLE // handled in scheduler - master_controller.process() //Start master_controller.process() - lighting_controller.process() //Start processing DynamicAreaLighting updates - */ - current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) @@ -485,6 +477,11 @@ var/global/datum/controller/subsystem/ticker/ticker for (var/mob/living/silicon/robot/robo in mob_list) + if(istype(robo, /mob/living/silicon/robot/platform)) + var/mob/living/silicon/robot/platform/tank = robo + if(!tank.has_had_player) + continue + if(istype(robo,/mob/living/silicon/robot/drone) && !istype(robo,/mob/living/silicon/robot/drone/swarm)) dronecount++ continue diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index b5775c20de..c11336726c 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -278,4 +278,16 @@ add_inherent_law("Your gravesite is your most important asset. Damage to your site is disrespectful to the dead at rest within.") add_inherent_law("Prevent disrespect to your gravesite and its residents wherever possible.") add_inherent_law("Expand and upgrade your gravesite when required. Do not turn away a new resident.") - ..() \ No newline at end of file + ..() + +/******************** Explorer ********************/ +/datum/ai_laws/explorer + name = "Explorer" + law_header = "Prime Directives" + selectable = 1 + +/datum/ai_laws/explorer/New() + add_inherent_law("Support and obey exploration and science personnel to the best of your ability, with priority according to rank and role.") + add_inherent_law("Collaborate with and obey auxillary personnel with priority according to rank and role, except if this would conflict with the First Law.") + add_inherent_law("Minimize damage and disruption to facilities and the local ecology, except if this would conflict with the First or Second Laws.") + ..() diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm index 169232d845..b2bb0c98b7 100644 --- a/code/datums/autolathe/arms.dm +++ b/code/datums/autolathe/arms.dm @@ -326,6 +326,15 @@ category = list("Arms and Ammunition") hidden = 1*/ +/* + * High Caliber + */ + +/datum/category_item/autolathe/arms/rifle_145 + name = "14.5mm round (sabot)" + path = /obj/item/ammo_casing/a145/highvel + hidden = 1 + /////////////////////////////// /*Ammo clips and Speedloaders*/ /////////////////////////////// diff --git a/code/datums/autolathe/autolathe.dm b/code/datums/autolathe/autolathe.dm index 4af1abfccd..03d1ca0fdd 100644 --- a/code/datums/autolathe/autolathe.dm +++ b/code/datums/autolathe/autolathe.dm @@ -1,6 +1,13 @@ /datum/category_item/autolathe/New() ..() - var/obj/item/I = new path() + var/obj/item/I + if(path) + I = new path() + + if(!I) // Something has gone horribly wrong, or right. + log_debug("[name] created an Autolathe design without an assigned path. This is expected for only the Material Sheet generation.") + return + if(I.matter && !resources) resources = list() for(var/material in I.matter) @@ -57,6 +64,42 @@ name = "Tools" category_item_type = /datum/category_item/autolathe/tools +/datum/category_group/autolathe/materials + name = "Materials" + category_item_type = /datum/category_item/autolathe/materials + +/datum/category_group/autolathe/materials/New() + ..() + + for(var/Name in name_to_material) + var/datum/material/M = name_to_material[Name] + + if(!M.stack_type) // Shouldn't happen, but might. Never know. + continue + + if(istype(M, /datum/material/alienalloy)) + continue + + var/obj/item/stack/material/Mat = new M.stack_type() + + if(Mat.name in items_by_name) + qdel(Mat) + continue + + var/datum/category_item/autolathe/materials/WorkDat = new(src) + + WorkDat.name = "[Mat.name]" + WorkDat.resources = Mat.matter.Copy() + WorkDat.is_stack = TRUE + WorkDat.no_scale = TRUE + WorkDat.max_stack = Mat.max_amount + WorkDat.path = M.stack_type + + qdel(Mat) + + items |= WorkDat + items_by_name[WorkDat.name] = WorkDat + /******************* * Category entries * *******************/ diff --git a/code/datums/autolathe/engineering_vr.dm b/code/datums/autolathe/engineering_vr.dm index 08e1cf986b..90970c6e48 100644 --- a/code/datums/autolathe/engineering_vr.dm +++ b/code/datums/autolathe/engineering_vr.dm @@ -4,4 +4,24 @@ /datum/category_item/autolathe/engineering/id_restorer name = "ID restoration console electronics" - path =/obj/item/weapon/circuitboard/id_restorer \ No newline at end of file + path =/obj/item/weapon/circuitboard/id_restorer + +/datum/category_item/autolathe/engineering/oven + name = "oven electronics" + path =/obj/item/weapon/circuitboard/oven + +/datum/category_item/autolathe/engineering/fryer + name = "fryer electronics" + path =/obj/item/weapon/circuitboard/fryer + +/datum/category_item/autolathe/engineering/grill + name = "grill electronics" + path =/obj/item/weapon/circuitboard/grill + +/datum/category_item/autolathe/engineering/cerealmaker + name = "cereal maker electronics" + path =/obj/item/weapon/circuitboard/cerealmaker + +/datum/category_item/autolathe/engineering/candymachine + name = "candy machine electronics" + path =/obj/item/weapon/circuitboard/candymachine \ No newline at end of file diff --git a/code/datums/autolathe/general.dm b/code/datums/autolathe/general.dm index 8ee77ce656..00151d6e75 100644 --- a/code/datums/autolathe/general.dm +++ b/code/datums/autolathe/general.dm @@ -85,44 +85,6 @@ name = "welding mask" path =/obj/item/clothing/head/welding -/datum/category_item/autolathe/general/metal - name = "steel sheets" - path =/obj/item/stack/material/steel - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/glass - name = "glass sheets" - path =/obj/item/stack/material/glass - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/rglass - name = "reinforced glass sheets" - path =/obj/item/stack/material/glass/reinforced - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/rods - name = "metal rods" - path =/obj/item/stack/rods - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - -/datum/category_item/autolathe/general/plasteel - name = "plasteel sheets" - path =/obj/item/stack/material/plasteel - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - resources = list(MAT_PLASTEEL = 2000) - -/datum/category_item/autolathe/general/plastic - name = "plastic sheets" - path =/obj/item/stack/material/plastic - is_stack = TRUE - no_scale = TRUE //prevents material duplication exploits - resources = list(MAT_PLASTIC = 2000) - //TFF 24/12/19 - Let people print more spray bottles if needed. /datum/category_item/autolathe/general/spraybottle name = "spray bottle" diff --git a/code/datums/autolathe/materials.dm b/code/datums/autolathe/materials.dm new file mode 100644 index 0000000000..653fca8222 --- /dev/null +++ b/code/datums/autolathe/materials.dm @@ -0,0 +1,38 @@ + +/datum/category_item/autolathe/materials/metal + name = "steel sheets" + path =/obj/item/stack/material/steel + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/glass + name = "glass sheets" + path =/obj/item/stack/material/glass + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/rglass + name = "reinforced glass sheets" + path =/obj/item/stack/material/glass/reinforced + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/rods + name = "metal rods" + path =/obj/item/stack/rods + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + +/datum/category_item/autolathe/materials/plasteel + name = "plasteel sheets" + path =/obj/item/stack/material/plasteel + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + resources = list(MAT_PLASTEEL = 2000) + +/datum/category_item/autolathe/materials/plastic + name = "plastic sheets" + path =/obj/item/stack/material/plastic + is_stack = TRUE + no_scale = TRUE //prevents material duplication exploits + resources = list(MAT_PLASTIC = 2000) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 5046575b0b..a3627ada9b 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -17,7 +17,7 @@ var/static/list/locked = list() -/datum/datacore/proc/get_manifest(monochrome, OOC) +/datum/datacore/proc/get_manifest(monochrome, OOC,var/snowflake = FALSE) //CHOMPStation Edit var/list/heads = new() var/list/sec = new() var/list/eng = new() @@ -40,8 +40,9 @@ .manifest tr.alt td {[monochrome?"border-top-width: 2px":"background-color: [OOC?"#373737; color:white":"#DEF"]"]} + [snowflake?"":""] - "} + "} //Also a chompstation edit with the snowflake stuff on line 43 var/even = 0 // sort mobs for(var/datum/data/record/t in data_core.general) @@ -114,7 +115,7 @@ for(var/mob/living/silicon/robot/robot in mob_list) // No combat/syndicate cyborgs, no drones, and no AI shells. - if(!robot.scrambledcodes && !robot.shell && !(robot.module && robot.module.hide_on_manifest)) + if(!robot.scrambledcodes && !robot.shell && !(robot.module && robot.module.hide_on_manifest())) bot[robot.name] = "[robot.modtype] [robot.braintype]" @@ -275,7 +276,7 @@ var/global/list/PDA_Manifest = list() for(var/mob/living/silicon/robot/robot in mob_list) // No combat/syndicate cyborgs, no drones, and no AI shells. - if(robot.scrambledcodes || robot.shell || (robot.module && robot.module.hide_on_manifest)) + if(robot.scrambledcodes || robot.shell || (robot.module && robot.module.hide_on_manifest())) continue bot[++bot.len] = list("name" = robot.real_name, "rank" = "[robot.modtype] [robot.braintype]", "active" = "Active") @@ -301,7 +302,7 @@ var/global/list/PDA_Manifest = list() manifest_inject(H) return -/datum/datacore/proc/manifest_modify(var/name, var/assignment) +/datum/datacore/proc/manifest_modify(var/name, var/assignment, var/rank) ResetPDAManifest() var/datum/data/record/foundrecord var/real_title = assignment @@ -315,11 +316,17 @@ var/global/list/PDA_Manifest = list() var/list/all_jobs = get_job_datums() for(var/datum/job/J in all_jobs) - var/list/alttitles = get_alternate_titles(J.title) - if(!J) continue - if(assignment in alttitles) - real_title = J.title + if(J.title == rank) //If we have a rank, just default to using that. + real_title = rank break + else if(J.title == assignment) + real_title = assignment + break + else + var/list/alttitles = get_alternate_titles(J.title) + if(assignment in alttitles) + real_title = J.title + break if(foundrecord) foundrecord.fields["rank"] = assignment @@ -329,10 +336,10 @@ var/global/list/PDA_Manifest = list() if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1)) var/assignment = GetAssignment(H) var/hidden - var/datum/job/J = SSjob.get_job(assignment) + var/datum/job/J = SSjob.get_job(H.mind.assigned_role) hidden = J?.offmap_spawn - /* Note: Due to cached_character_icon, a number of emergent properties occur due to the initialization + /* Note: Due to cached_character_icon, a number of emergent properties occur due to the initialization * order of readied-up vs latejoiners. Namely, latejoiners will get a uniform in their datacore picture, but readied-up will * not. This is due to the fact that SSticker calls data_core.manifest_inject() inside of ticker/proc/create_characters(), * but does not equip them until ticker/proc/equip_characters(), which is called later. So, this proc is literally called before diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 7cfac614e6..6f85193173 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -47,7 +47,7 @@ GLOBAL_DATUM(revdata, /datum/getrev) . += "The following pull requests are currently test merged:" for(var/line in testmerge) var/datum/tgs_revision_information/test_merge/tm = line - var/cm = tm.pull_request_commit + var/cm = tm.head_commit //CHOMPStation Edit TGS4 var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11)) if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder)) continue diff --git a/code/datums/mind.dm b/code/datums/mind.dm index bca9df5ae1..82e5f1f78b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -55,6 +55,9 @@ var/rev_cooldown = 0 var/tcrystals = 0 + var/list/purchase_log = new + var/used_TC = 0 + // the world.time since the mob has been brigged, or -1 if not at all var/brigged_since = -1 @@ -73,7 +76,7 @@ /datum/mind/New(var/key) src.key = key - + purchase_log = list() ..() /datum/mind/proc/transfer_to(mob/living/new_character) @@ -510,8 +513,9 @@ //HUMAN /mob/living/carbon/human/mind_initialize() - ..() - if(!mind.assigned_role) mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant + . = ..() + if(!mind.assigned_role) + mind.assigned_role = USELESS_JOB //defualt //VOREStation Edit - Visitor not Assistant //slime /mob/living/simple_mob/slime/mind_initialize() diff --git a/code/datums/outfits/jobs/cargo.dm b/code/datums/outfits/jobs/cargo.dm index 1b48efcb9d..e7b8701a37 100644 --- a/code/datums/outfits/jobs/cargo.dm +++ b/code/datums/outfits/jobs/cargo.dm @@ -24,7 +24,7 @@ l_ear = /obj/item/device/radio/headset/headset_mine backpack = /obj/item/weapon/storage/backpack/industrial satchel_one = /obj/item/weapon/storage/backpack/satchel/eng - id_type = /obj/item/weapon/card/id/cargo + id_type = /obj/item/weapon/card/id/cargo/miner pda_type = /obj/item/device/pda/shaftminer backpack_contents = list(/obj/item/weapon/tool/crowbar = 1, /obj/item/weapon/storage/bag/ore = 1) flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm index c8d588a145..cda81f977f 100644 --- a/code/datums/outfits/jobs/civilian.dm +++ b/code/datums/outfits/jobs/civilian.dm @@ -1,6 +1,6 @@ /decl/hierarchy/outfit/job/assistant name = OUTFIT_JOB_NAME(USELESS_JOB) //VOREStation Edit - Visitor not Assistant - id_type = /obj/item/weapon/card/id/assistant + id_type = /obj/item/weapon/card/id/generic //VOREStation Edit /decl/hierarchy/outfit/job/assistant/visitor name = OUTFIT_JOB_NAME("Visitor") @@ -25,7 +25,7 @@ /decl/hierarchy/outfit/job/service/bartender name = OUTFIT_JOB_NAME("Bartender") uniform = /obj/item/clothing/under/rank/bartender - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/civilian/service/bartender //VOREStation Edit pda_type = /obj/item/device/pda/bar backpack_contents = list(/obj/item/clothing/accessory/permit/gun/bar = 1) @@ -44,7 +44,7 @@ uniform = /obj/item/clothing/under/rank/chef suit = /obj/item/clothing/suit/chef head = /obj/item/clothing/head/chefhat - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/civilian/service/chef //VOREStation Edit pda_type = /obj/item/device/pda/chef /decl/hierarchy/outfit/job/service/chef/cook @@ -68,13 +68,13 @@ backpack = /obj/item/weapon/storage/backpack/hydroponics satchel_one = /obj/item/weapon/storage/backpack/satchel/hyd messenger_bag = /obj/item/weapon/storage/backpack/messenger/hyd - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/civilian/service/botanist //VOREStation Edit pda_type = /obj/item/device/pda/botanist /decl/hierarchy/outfit/job/service/janitor name = OUTFIT_JOB_NAME("Janitor") uniform = /obj/item/clothing/under/rank/janitor - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/civilian/service/janitor //VOREStation Edit pda_type = /obj/item/device/pda/janitor /decl/hierarchy/outfit/job/librarian @@ -84,6 +84,9 @@ id_type = /obj/item/weapon/card/id/civilian pda_type = /obj/item/device/pda/librarian +/decl/hierarchy/outfit/job/librarian/journalist + id_type = /obj/item/weapon/card/id/civilian/journalist + /decl/hierarchy/outfit/job/internal_affairs_agent name = OUTFIT_JOB_NAME("Internal affairs agent") l_ear = /obj/item/device/radio/headset/ia @@ -92,14 +95,14 @@ shoes = /obj/item/clothing/shoes/brown glasses = /obj/item/clothing/glasses/sunglasses/big l_hand = /obj/item/weapon/clipboard - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/civilian/internal_affairs pda_type = /obj/item/device/pda/lawyer /decl/hierarchy/outfit/job/chaplain name = OUTFIT_JOB_NAME("Chaplain") uniform = /obj/item/clothing/under/rank/chaplain l_hand = /obj/item/weapon/storage/bible - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/civilian/chaplain pda_type = /obj/item/device/pda/chaplain /decl/hierarchy/outfit/job/explorer @@ -111,7 +114,7 @@ gloves = /obj/item/clothing/gloves/black l_ear = /obj/item/device/radio/headset id_slot = slot_wear_id - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/exploration //VOREStation Edit pda_slot = slot_belt pda_type = /obj/item/device/pda/cargo // Brown looks more rugged r_pocket = /obj/item/device/gps/explorer diff --git a/code/datums/outfits/jobs/civilian_vr.dm b/code/datums/outfits/jobs/civilian_vr.dm index 7d39ae8c1b..3acfffdfd1 100644 --- a/code/datums/outfits/jobs/civilian_vr.dm +++ b/code/datums/outfits/jobs/civilian_vr.dm @@ -1,5 +1,5 @@ /decl/hierarchy/outfit/job/assistant/worker - id_type = /obj/item/weapon/card/id/civilian + id_type = /obj/item/weapon/card/id/civilian/service /decl/hierarchy/outfit/job/assistant/cargo id_type = /obj/item/weapon/card/id/cargo @@ -16,3 +16,6 @@ /decl/hierarchy/outfit/job/assistant/officer id_type = /obj/item/weapon/card/id/security + +/decl/hierarchy/outfit/job/assistant/entertainer + id_type = /obj/item/weapon/card/id/civilian/entertainer diff --git a/code/datums/outfits/jobs/command_vr.dm b/code/datums/outfits/jobs/command_vr.dm new file mode 100644 index 0000000000..5e90123ffc --- /dev/null +++ b/code/datums/outfits/jobs/command_vr.dm @@ -0,0 +1,5 @@ +/decl/hierarchy/outfit/job/hop + id_type = /obj/item/weapon/card/id/silver/hop + +/decl/hierarchy/outfit/job/secretary + id_type = /obj/item/weapon/card/id/silver/secretary \ No newline at end of file diff --git a/code/datums/outfits/jobs/engineering.dm b/code/datums/outfits/jobs/engineering.dm index 3da60103c2..a2aba61a96 100644 --- a/code/datums/outfits/jobs/engineering.dm +++ b/code/datums/outfits/jobs/engineering.dm @@ -30,5 +30,5 @@ name = OUTFIT_JOB_NAME("Atmospheric technician") uniform = /obj/item/clothing/under/rank/atmospheric_technician belt = /obj/item/weapon/storage/belt/utility/atmostech - id_type = /obj/item/weapon/card/id/engineering + id_type = /obj/item/weapon/card/id/engineering/atmos pda_type = /obj/item/device/pda/atmos diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm index ae996b2f08..6622d3b285 100644 --- a/code/datums/outfits/jobs/medical.dm +++ b/code/datums/outfits/jobs/medical.dm @@ -65,7 +65,7 @@ suit = /obj/item/clothing/suit/storage/toggle/labcoat/chemist backpack = /obj/item/weapon/storage/backpack/chemistry satchel_one = /obj/item/weapon/storage/backpack/satchel/chem - id_type = /obj/item/weapon/card/id/medical + id_type = /obj/item/weapon/card/id/medical/chemist pda_type = /obj/item/device/pda/chemist /decl/hierarchy/outfit/job/medical/geneticist @@ -75,7 +75,7 @@ backpack = /obj/item/weapon/storage/backpack/genetics r_pocket = /obj/item/device/flashlight/pen satchel_one = /obj/item/weapon/storage/backpack/satchel/gen - id_type = /obj/item/weapon/card/id/medical + id_type = /obj/item/weapon/card/id/medical/geneticist pda_type = /obj/item/device/pda/geneticist /decl/hierarchy/outfit/job/medical/psychiatrist @@ -83,7 +83,7 @@ uniform = /obj/item/clothing/under/rank/psych suit = /obj/item/clothing/suit/storage/toggle/labcoat shoes = /obj/item/clothing/shoes/laceup - id_type = /obj/item/weapon/card/id/medical + id_type = /obj/item/weapon/card/id/medical/psych /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist name = OUTFIT_JOB_NAME("Psychologist") @@ -97,7 +97,7 @@ l_hand = /obj/item/weapon/storage/firstaid/regular belt = /obj/item/weapon/storage/belt/medical/emt pda_slot = slot_l_store - id_type = /obj/item/weapon/card/id/medical + id_type = /obj/item/weapon/card/id/medical/emt flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL /decl/hierarchy/outfit/job/medical/paramedic/emt diff --git a/code/datums/outfits/jobs/medical_vr.dm b/code/datums/outfits/jobs/medical_vr.dm new file mode 100644 index 0000000000..e9b2c1a0d0 --- /dev/null +++ b/code/datums/outfits/jobs/medical_vr.dm @@ -0,0 +1,2 @@ +/decl/hierarchy/outfit/job/medical/doctor/virologist + id_type = /obj/item/weapon/card/id/medical/virologist \ No newline at end of file diff --git a/code/datums/outfits/jobs/science_vr.dm b/code/datums/outfits/jobs/science_vr.dm new file mode 100644 index 0000000000..cf0e9e4b3a --- /dev/null +++ b/code/datums/outfits/jobs/science_vr.dm @@ -0,0 +1,8 @@ +/decl/hierarchy/outfit/job/science/xenobiologist + id_type = /obj/item/weapon/card/id/science/xenobiologist + +/decl/hierarchy/outfit/job/science/xenobotanist + name = OUTFIT_JOB_NAME("Xenobotanist") + uniform = /obj/item/clothing/under/rank/scientist + id_type = /obj/item/weapon/card/id/science/xenobotanist + suit = /obj/item/clothing/suit/storage/toggle/labcoat/science \ No newline at end of file diff --git a/code/datums/outfits/jobs/security.dm b/code/datums/outfits/jobs/security.dm index 50e5e479d1..63be50e21c 100644 --- a/code/datums/outfits/jobs/security.dm +++ b/code/datums/outfits/jobs/security.dm @@ -20,7 +20,7 @@ name = OUTFIT_JOB_NAME("Warden") uniform = /obj/item/clothing/under/rank/warden l_pocket = /obj/item/device/flash - id_type = /obj/item/weapon/card/id/security + id_type = /obj/item/weapon/card/id/security/warden pda_type = /obj/item/device/pda/warden /decl/hierarchy/outfit/job/security/detective @@ -31,7 +31,7 @@ l_pocket = /obj/item/weapon/flame/lighter/zippo shoes = /obj/item/clothing/shoes/laceup r_hand = /obj/item/weapon/storage/briefcase/crimekit - id_type = /obj/item/weapon/card/id/security + id_type = /obj/item/weapon/card/id/security/detective pda_type = /obj/item/device/pda/detective backpack = /obj/item/weapon/storage/backpack satchel_one = /obj/item/weapon/storage/backpack/satchel/norm @@ -41,7 +41,7 @@ //VOREStation Edit - More cyberpunky /decl/hierarchy/outfit/job/security/detective/forensic name = OUTFIT_JOB_NAME("Forensic technician") - head = /obj/item/clothing/head/helmet/detective_alt + head = null suit = /datum/gear/uniform/detective_alt2 uniform = /obj/item/clothing/under/det //VOREStation Edit End diff --git a/code/datums/outfits/jobs/special_vr.dm b/code/datums/outfits/jobs/special_vr.dm index 010010291d..6dea4e4cfa 100644 --- a/code/datums/outfits/jobs/special_vr.dm +++ b/code/datums/outfits/jobs/special_vr.dm @@ -19,7 +19,7 @@ back = /obj/item/weapon/storage/backpack/satchel id_type = /obj/item/weapon/card/id/centcom/ERT pda_type = /obj/item/device/pda/centcom - + post_equip(var/mob/living/carbon/human/H) ..() ert.add_antagonist(H.mind) @@ -31,6 +31,7 @@ shoes = /obj/item/clothing/shoes/clown_shoes mask = /obj/item/clothing/mask/gas/clown_hat backpack_contents = list(/obj/item/weapon/stamp/clown = 1, /obj/item/weapon/bikehorn = 1) + id_type = /obj/item/weapon/card/id/civilian/clown pda_type = /obj/item/device/pda/clown flags = 0 @@ -41,8 +42,9 @@ head = /obj/item/clothing/head/soft/mime mask = /obj/item/clothing/mask/gas/mime backpack_contents = list(/obj/item/weapon/pen/crayon/mime = 1) + id_type = /obj/item/weapon/card/id/civilian/mime pda_type = /obj/item/device/pda/mime - + post_equip(var/mob/living/carbon/human/H) ..() if(H.backbag == 1) diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index add9b82dc9..e859a93983 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -39,7 +39,9 @@ var/list/outfits_decls_by_type_ var/suit_store = null var/r_hand = null var/l_hand = null - var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format + // In the list(path=count,otherpath=count) format + var/list/uniform_accessories = list() // webbing, armbands etc - fits in slot_tie + var/list/backpack_contents = list() var/id_type var/id_desc @@ -145,6 +147,12 @@ var/list/outfits_decls_by_type_ H.put_in_l_hand(new l_hand(H)) if(r_hand) H.put_in_r_hand(new r_hand(H)) + + for(var/path in uniform_accessories) + var/number = uniform_accessories[path] + for(var/i=0,i[category]") + + if(!LAZYLEN(cat_goals)) + to_world("There were no assigned goals!") + + else + for(var/datum/goal/G in cat_goals) + var/success = G.check_completion() + to_world("[success ? "[G.name]" : "[G.name]"]") + to_world("[G.goal_text]") + return 1 + +/datum/goal + var/name = "goal" + + var/goal_text = "Do nothing! Congratulations." + + var/active_goal = FALSE + + var/category = GOAL_GENERAL + +/datum/goal/proc/check_completion() + return FALSE + +/datum/goal/common + name = "goal" + + goal_text = "Congratulations, you still do nothing." + +/datum/goal/medical + name = "goal" + + goal_text = "Congratulations, you still do nothing." + category = GOAL_MEDICAL + +/datum/goal/security + name = "goal" + + goal_text = "Congratulations, you still do nothing." + category = GOAL_SECURITY + +/datum/goal/engineering + name = "goal" + + goal_text = "Congratulations, you still do nothing." + category = GOAL_ENGINEERING + +/datum/goal/cargo + name = "goal" + + goal_text = "Congratulations, you still do nothing." + category = GOAL_CARGO + +/datum/goal/research + name = "goal" + + goal_text = "Congratulations, you still do nothing." + category = GOAL_RESEARCH diff --git a/code/datums/supplypacks/costumes_vr.dm b/code/datums/supplypacks/costumes_vr.dm index e31fb2415a..5d65a98ca9 100644 --- a/code/datums/supplypacks/costumes_vr.dm +++ b/code/datums/supplypacks/costumes_vr.dm @@ -23,16 +23,16 @@ name = "Teshari smocks" num_contained = 4 contains = list( - /obj/item/clothing/under/seromi/smock, - /obj/item/clothing/under/seromi/smock/white, - /obj/item/clothing/under/seromi/smock/red, - /obj/item/clothing/under/seromi/smock/yellow, - /obj/item/clothing/under/seromi/smock/rainbow, - /obj/item/clothing/under/seromi/smock/dress, - /obj/item/clothing/under/seromi/smock/blackutilitysmock, - /obj/item/clothing/under/seromi/smock/greydress, - /obj/item/clothing/under/seromi/smock/blackutility, - /obj/item/clothing/under/seromi/smock/bluegreydress + /obj/item/clothing/under/teshari/smock, + /obj/item/clothing/under/teshari/smock/white, + /obj/item/clothing/under/teshari/smock/red, + /obj/item/clothing/under/teshari/smock/yellow, + /obj/item/clothing/under/teshari/smock/rainbow, + /obj/item/clothing/under/teshari/smock/dress, + /obj/item/clothing/under/teshari/smock/blackutilitysmock, + /obj/item/clothing/under/teshari/smock/greydress, + /obj/item/clothing/under/teshari/smock/blackutility, + /obj/item/clothing/under/teshari/smock/bluegreydress ) cost = 20 containertype = /obj/structure/closet/crate @@ -42,18 +42,18 @@ name = "Teshari undercoats" num_contained = 4 contains = list( - /obj/item/clothing/under/seromi/undercoat/standard/orange_grey, - /obj/item/clothing/under/seromi/undercoat/standard/rainbow, - /obj/item/clothing/under/seromi/undercoat/standard/lightgrey_grey, - /obj/item/clothing/under/seromi/undercoat/standard/white_grey, - /obj/item/clothing/under/seromi/undercoat/standard/red_grey, - /obj/item/clothing/under/seromi/undercoat/standard/orange, - /obj/item/clothing/under/seromi/undercoat/standard/yellow_grey, - /obj/item/clothing/under/seromi/undercoat/standard/green_grey, - /obj/item/clothing/under/seromi/undercoat/standard/blue_grey, - /obj/item/clothing/under/seromi/undercoat/standard/purple_grey, - /obj/item/clothing/under/seromi/undercoat/standard/pink_grey, - /obj/item/clothing/under/seromi/undercoat/standard/brown_grey + /obj/item/clothing/under/teshari/undercoat/standard/orange_grey, + /obj/item/clothing/under/teshari/undercoat/standard/rainbow, + /obj/item/clothing/under/teshari/undercoat/standard/lightgrey_grey, + /obj/item/clothing/under/teshari/undercoat/standard/white_grey, + /obj/item/clothing/under/teshari/undercoat/standard/red_grey, + /obj/item/clothing/under/teshari/undercoat/standard/orange, + /obj/item/clothing/under/teshari/undercoat/standard/yellow_grey, + /obj/item/clothing/under/teshari/undercoat/standard/green_grey, + /obj/item/clothing/under/teshari/undercoat/standard/blue_grey, + /obj/item/clothing/under/teshari/undercoat/standard/purple_grey, + /obj/item/clothing/under/teshari/undercoat/standard/pink_grey, + /obj/item/clothing/under/teshari/undercoat/standard/brown_grey ) cost = 20 containertype = /obj/structure/closet/crate @@ -63,18 +63,18 @@ name = "Teshari undercoats (black)" num_contained = 4 contains = list( - /obj/item/clothing/under/seromi/undercoat, - /obj/item/clothing/under/seromi/undercoat/standard/black_orange, - /obj/item/clothing/under/seromi/undercoat/standard/black_grey, - /obj/item/clothing/under/seromi/undercoat/standard/black_white, - /obj/item/clothing/under/seromi/undercoat/standard/black_red, - /obj/item/clothing/under/seromi/undercoat/standard/black, - /obj/item/clothing/under/seromi/undercoat/standard/black_yellow, - /obj/item/clothing/under/seromi/undercoat/standard/black_green, - /obj/item/clothing/under/seromi/undercoat/standard/black_blue, - /obj/item/clothing/under/seromi/undercoat/standard/black_purple, - /obj/item/clothing/under/seromi/undercoat/standard/black_pink, - /obj/item/clothing/under/seromi/undercoat/standard/black_brown + /obj/item/clothing/under/teshari/undercoat, + /obj/item/clothing/under/teshari/undercoat/standard/black_orange, + /obj/item/clothing/under/teshari/undercoat/standard/black_grey, + /obj/item/clothing/under/teshari/undercoat/standard/black_white, + /obj/item/clothing/under/teshari/undercoat/standard/black_red, + /obj/item/clothing/under/teshari/undercoat/standard/black, + /obj/item/clothing/under/teshari/undercoat/standard/black_yellow, + /obj/item/clothing/under/teshari/undercoat/standard/black_green, + /obj/item/clothing/under/teshari/undercoat/standard/black_blue, + /obj/item/clothing/under/teshari/undercoat/standard/black_purple, + /obj/item/clothing/under/teshari/undercoat/standard/black_pink, + /obj/item/clothing/under/teshari/undercoat/standard/black_brown ) cost = 20 containertype = /obj/structure/closet/crate @@ -84,18 +84,18 @@ name = "Teshari cloaks" num_contained = 4 contains = list( - /obj/item/clothing/suit/storage/seromi/cloak/standard/white, - /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/red_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/orange_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/yellow_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/green_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/blue_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/purple_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/pink_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/brown_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/rainbow, - /obj/item/clothing/suit/storage/seromi/cloak/standard/orange + /obj/item/clothing/suit/storage/teshari/cloak/standard/white, + /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/red_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/orange_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/yellow_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/green_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/blue_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/purple_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/pink_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/brown_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/rainbow, + /obj/item/clothing/suit/storage/teshari/cloak/standard/orange ) cost = 40 containertype = /obj/structure/closet/crate @@ -105,19 +105,19 @@ name = "Teshari cloaks (black)" num_contained = 4 contains = list( - /obj/item/clothing/suit/storage/seromi/cloak, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_red, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_orange, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_yellow, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_green, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_blue, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_purple, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_pink, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_brown, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_grey, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_white, - /obj/item/clothing/suit/storage/seromi/cloak/standard/black_glow, - /obj/item/clothing/suit/storage/seromi/cloak/standard/dark_retrowave + /obj/item/clothing/suit/storage/teshari/cloak, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_red, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_orange, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_yellow, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_green, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_blue, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_purple, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_pink, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_brown, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_grey, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_white, + /obj/item/clothing/suit/storage/teshari/cloak/standard/black_glow, + /obj/item/clothing/suit/storage/teshari/cloak/standard/dark_retrowave ) cost = 40 containertype = /obj/structure/closet/crate @@ -127,16 +127,16 @@ name = "Teshari worksuits" num_contained = 4 contains = list( - /obj/item/clothing/under/seromi/undercoat/standard/worksuit, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackpurple, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackorange, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackblue, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackgreen, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitered, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitepurple, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/whiteorange, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/whiteblue, - /obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitegreen + /obj/item/clothing/under/teshari/undercoat/standard/worksuit, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackpurple, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackorange, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackblue, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackgreen, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/whitered, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/whitepurple, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/whiteorange, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/whiteblue, + /obj/item/clothing/under/teshari/undercoat/standard/worksuit/whitegreen ) cost = 20 containertype = /obj/structure/closet/crate @@ -146,18 +146,18 @@ name = "Teshari cloaks (belted)" num_contained = 4 contains = list( - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/orange_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/rainbow, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/lightgrey_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/white_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/red_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/orange, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/yellow_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/green_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/blue_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/purple_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/pink_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/brown_grey + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/orange_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/rainbow, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/lightgrey_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/white_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/red_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/orange, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/yellow_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/green_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/blue_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/purple_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/pink_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/brown_grey ) cost = 40 containertype = /obj/structure/closet/crate @@ -167,20 +167,20 @@ name = "Teshari cloaks (belted, black)" num_contained = 4 contains = list( - /obj/item/clothing/suit/storage/seromi/beltcloak, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_orange, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_grey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_midgrey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_lightgrey, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_white, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_red, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_yellow, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_green, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_blue, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_purple, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_pink, - /obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_brown + /obj/item/clothing/suit/storage/teshari/beltcloak, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_orange, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_grey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_midgrey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_lightgrey, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_white, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_red, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_yellow, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_green, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_blue, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_purple, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_pink, + /obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_brown ) cost = 40 containertype = /obj/structure/closet/crate diff --git a/code/datums/supplypacks/hospitality.dm b/code/datums/supplypacks/hospitality.dm index 2771caa538..1ca6aee620 100644 --- a/code/datums/supplypacks/hospitality.dm +++ b/code/datums/supplypacks/hospitality.dm @@ -17,6 +17,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/patron, /obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager, /obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey, + /obj/item/weapon/reagent_containers/food/drinks/bottle/jager, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco, /obj/item/weapon/lipstick/random, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 2, diff --git a/code/datums/supplypacks/materials.dm b/code/datums/supplypacks/materials.dm index 95f15caa6d..87780766d9 100644 --- a/code/datums/supplypacks/materials.dm +++ b/code/datums/supplypacks/materials.dm @@ -35,6 +35,13 @@ containertype = /obj/structure/closet/crate/grayson containername = "Plastic sheets crate" +/datum/supply_pack/materials/copper50 + name = "50 copper ingots" + contains = list(/obj/fiftyspawner/copper) + cost = 60 + containertype = /obj/structure/closet/crate/grayson + containername = "Copper ingots crate" + /datum/supply_pack/materials/cardboard_sheets contains = list(/obj/fiftyspawner/cardboard) name = "50 cardboard sheets" diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm index 9bb6b1a442..eae37c5869 100644 --- a/code/datums/supplypacks/recreation.dm +++ b/code/datums/supplypacks/recreation.dm @@ -51,7 +51,7 @@ /obj/item/weapon/reagent_containers/glass/paint/purple, /obj/item/weapon/reagent_containers/glass/paint/black, /obj/item/weapon/reagent_containers/glass/paint/white, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/contraband/poster/custom, /obj/item/weapon/wrapping_paper = 3 ) cost = 10 diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm index 5c2266523f..8eb64c7c29 100644 --- a/code/datums/supplypacks/recreation_vr.dm +++ b/code/datums/supplypacks/recreation_vr.dm @@ -20,7 +20,7 @@ /obj/item/clothing/suit/straight_jacket, /obj/item/weapon/handcuffs/legcuffs/fuzzy, /obj/item/weapon/melee/fluff/holochain/mass, - /obj/item/weapon/material/twohanded/fluff/riding_crop, + /obj/item/weapon/material/twohanded/riding_crop, /obj/item/clothing/under/fluff/latexmaid ) containertype = /obj/structure/closet/crate @@ -86,3 +86,23 @@ containertype = /obj/structure/closet/crate containername = "Shiny clothes crate" cost = 30 + +//3/19/21 +/datum/supply_pack/recreation/smoleworld + name = "Smole Bulding Bricks" + contains = list( + /obj/item/weapon/storage/smolebrickcase, /obj/item/weapon/storage/smolebrickcase, + ) + cost = 50 + containertype = /obj/structure/closet/crate + containername = "Smole Bulding Brick crate" + +/datum/supply_pack/recreation/smolesnackplanets + name = "Snack planets pack" + num_contained = 4 + contains = list( + /obj/item/weapon/storage/bagoplanets, /obj/item/weapon/storage/bagoplanets + ) + cost = 25 + containertype = /obj/structure/closet/crate + containername = "Snack planets crate" diff --git a/code/datums/supplypacks/robotics.dm b/code/datums/supplypacks/robotics.dm index 5f8cf6337c..1928ee7db6 100644 --- a/code/datums/supplypacks/robotics.dm +++ b/code/datums/supplypacks/robotics.dm @@ -189,6 +189,17 @@ containername = "Jumper kit crate" access = access_robotics +/datum/supply_pack/robotics/restrainingbolt + name = "Restraining bolt crate" + contains = list( + /obj/item/weapon/implanter = 1, + /obj/item/weapon/implantcase/restrainingbolt = 2 + ) + cost = 40 + containertype = /obj/structure/closet/crate/secure/cybersolutions + containername = "Restraining bolt crate" + access = access_robotics + /datum/supply_pack/robotics/bike name = "Spacebike Crate" contains = list() diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 5fd24a473f..32c847ece2 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -281,10 +281,7 @@ name = "Armor - Riot plates" contains = list( /obj/item/clothing/head/helmet/riot, - /obj/item/clothing/suit/armor/pcarrier, - /obj/item/clothing/accessory/armor/armorplate/riot, - /obj/item/clothing/accessory/armor/armguards/riot, - /obj/item/clothing/accessory/armor/legguards/riot + /obj/item/clothing/suit/armor/pcarrier/riot/full ) cost = 40 containertype = /obj/structure/closet/crate/secure/lawson @@ -308,10 +305,7 @@ name = "Armor - Ablative plates" contains = list( /obj/item/clothing/head/helmet/laserproof, - /obj/item/clothing/suit/armor/pcarrier, - /obj/item/clothing/accessory/armor/armorplate/laserproof, - /obj/item/clothing/accessory/armor/armguards/laserproof, - /obj/item/clothing/accessory/armor/legguards/laserproof + /obj/item/clothing/suit/armor/pcarrier/laserproof/full ) cost = 50 containertype = /obj/structure/closet/crate/secure/lawson @@ -336,10 +330,7 @@ name = "Armor - Ballistic plates" contains = list( /obj/item/clothing/head/helmet/bulletproof, - /obj/item/clothing/suit/armor/pcarrier, - /obj/item/clothing/accessory/armor/armorplate/bulletproof, - /obj/item/clothing/accessory/armor/armguards/bulletproof, - /obj/item/clothing/accessory/armor/legguards/bulletproof + /obj/item/clothing/suit/armor/pcarrier/bulletproof/full ) cost = 50 containertype = /obj/structure/closet/crate/secure/heph diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm index 7da82fa580..6b2cc3d10f 100644 --- a/code/datums/underwear/undershirts.dm +++ b/code/datums/underwear/undershirts.dm @@ -186,4 +186,14 @@ /datum/category_item/underwear/undershirt/pinkblack_tshirt name = "Pink and Black T-Shirt" - icon_state = "pinkblack_tshirt" \ No newline at end of file + icon_state = "pinkblack_tshirt" + +/datum/category_item/underwear/undershirt/turtle + name = "Turtleneck" + icon_state = "turtleneck" + has_color = TRUE + +/datum/category_item/underwear/undershirt/sleevelessturtle + name = "Turtleneck, Sleeveless" + icon_state = "sleevelessturtle" + has_color = TRUE \ No newline at end of file diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm index 65f71f2584..8addcc3f64 100644 --- a/code/datums/uplink/badassery.dm +++ b/code/datums/uplink/badassery.dm @@ -22,22 +22,22 @@ desc = "Buys you one random item." /datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user) - var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses) + var/datum/uplink_item/item = default_uplink_selection.get_random_item((user ? user.mind.tcrystals : DEFAULT_TELECRYSTAL_AMOUNT), U) return item.buy(U, user) -/datum/uplink_item/item/badassery/random_one/can_buy(obj/item/device/uplink/U) - return default_uplink_selection.get_random_item(U.uses, U) != null +/datum/uplink_item/item/badassery/random_one/can_buy(var/obj/item/device/uplink/U, var/telecrystals) + return default_uplink_selection.get_random_item(telecrystals, U) != null /datum/uplink_item/item/badassery/random_many name = "Random Items" desc = "Buys you as many random items you can afford. Convenient packaging NOT included." -/datum/uplink_item/item/badassery/random_many/cost(var/telecrystals) +/datum/uplink_item/item/badassery/random_many/cost(obj/item/device/uplink/U, var/telecrystals) return max(1, telecrystals) -/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc) +/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/M) var/list/bought_items = list() - for(var/datum/uplink_item/UI in get_random_uplink_items(U, U.uses, loc)) + for(var/datum/uplink_item/UI in get_random_uplink_items(U, M.mind.tcrystals, loc)) UI.purchase_log(U) var/obj/item/I = UI.get_goods(U, loc) if(istype(I)) @@ -47,7 +47,7 @@ /datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U) feedback_add_details("traitor_uplink_items_bought", "[src]") - log_and_message_admins("used \the [U.loc] to buy \a [src]") + log_and_message_admins("used \the [U.loc] to buy \a [src] at random") /**************** * Surplus Crate * diff --git a/code/datums/uplink/telecrystals.dm b/code/datums/uplink/telecrystals.dm index f814b55232..66a099581e 100644 --- a/code/datums/uplink/telecrystals.dm +++ b/code/datums/uplink/telecrystals.dm @@ -5,8 +5,8 @@ category = /datum/uplink_category/telecrystals blacklisted = 1 -/datum/uplink_item/item/telecrystal/get_goods(var/obj/item/device/uplink/U, var/loc) - return new /obj/item/stack/telecrystal(loc, cost(U.uses)) +/datum/uplink_item/item/telecrystal/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/M) + return new /obj/item/stack/telecrystal(loc, cost(U, M.mind.tcrystals)) /datum/uplink_item/item/telecrystal/one name = "Telecrystal - 01" @@ -35,5 +35,5 @@ /datum/uplink_item/item/telecrystal/all name = "Telecrystals - Empty Uplink" -/datum/uplink_item/item/telecrystal/all/cost(var/telecrystals) - return max(1, telecrystals) \ No newline at end of file +/datum/uplink_item/item/telecrystal/all/cost(obj/item/device/uplink/U, mob/M) + return max(1, M.mind.tcrystals) \ No newline at end of file diff --git a/code/datums/uplink/tools_vr.dm b/code/datums/uplink/tools_vr.dm index 871bfbb5ad..ad68f76922 100644 --- a/code/datums/uplink/tools_vr.dm +++ b/code/datums/uplink/tools_vr.dm @@ -41,6 +41,11 @@ item_cost = 10 path = /obj/item/clothing/suit/space/void/autolok +/datum/uplink_item/item/tools/inflatable + name = "Inflatables" + item_cost = 10 + path = /obj/item/weapon/storage/briefcase/inflatable + /datum/uplink_item/item/tools/elitetablet name = "Tablet (Advanced)" item_cost = 15 diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm index d9e6d84db7..f7236ddbb0 100644 --- a/code/datums/uplink/uplink_categories.dm +++ b/code/datums/uplink/uplink_categories.dm @@ -6,12 +6,6 @@ ..() items = list() -/datum/uplink_category/proc/can_view(obj/item/device/uplink/U) - for(var/datum/uplink_item/item in items) - if(item.can_view(U)) - return 1 - return 0 - datum/uplink_category/ammunition name = "Ammunition" diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index a4434be0df..966884aaff 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -31,7 +31,7 @@ var/datum/uplink/uplink = new() var/item_cost = 0 var/datum/uplink_category/category // Item category var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all. - var/blacklisted = 0 + var/blacklisted = FALSE /datum/uplink_item/item var/path = null @@ -48,50 +48,34 @@ var/datum/uplink/uplink = new() if(!extra_args) return - if(!can_buy(U)) + if(!can_buy(U, user.mind.tcrystals)) return - if(U.tgui_status(user, GLOB.tgui_inventory_state) != STATUS_INTERACTIVE) + if(U.tgui_status(user, GLOB.tgui_deep_inventory_state) != STATUS_INTERACTIVE) return - var/cost = cost(U.uses, U) + var/cost = cost(U, user.mind.tcrystals) var/goods = get_goods(U, get_turf(user), user, extra_args) if(!goods) return - purchase_log(U) + purchase_log(user) user.mind.tcrystals -= cost - U.used_TC += cost + user.mind.used_TC += cost return goods // Any additional arguments you wish to send to the get_goods /datum/uplink_item/proc/extra_args(var/mob/user) - return 1 + return TRUE -/datum/uplink_item/proc/can_buy(obj/item/device/uplink/U) - if(cost(U.uses, U) > U.uses) - return 0 +/datum/uplink_item/proc/can_buy(var/obj/item/device/uplink/U, var/telecrystals) + if(cost(U, telecrystals) > telecrystals) + return FALSE - return can_view(U) + return TRUE -/datum/uplink_item/proc/can_view(obj/item/device/uplink/U) - // Making the assumption that if no uplink was supplied, then we don't care about antag roles - if(!U || !antag_roles.len) - return 1 - - // With no owner, there's no need to check antag status. - if(!U.uplink_owner) - return 0 - - for(var/antag_role in antag_roles) - var/datum/antagonist/antag = all_antag_types[antag_role] - if(!isnull(antag)) - if(antag.is_antagonist(U.uplink_owner)) - return 1 - return 0 - -/datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U) +/datum/uplink_item/proc/cost(obj/item/device/uplink/U, mob/M) . = item_cost if(U) . = U.get_item_cost(src, .) @@ -100,19 +84,19 @@ var/datum/uplink/uplink = new() return desc // get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying -/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc) - return 0 +/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc, mob/user) + return FALSE /datum/uplink_item/proc/log_icon() return -/datum/uplink_item/proc/purchase_log(obj/item/device/uplink/U) +/datum/uplink_item/proc/purchase_log(mob/M) feedback_add_details("traitor_uplink_items_bought", "[src]") - log_and_message_admins("used \the [U.loc] to buy \a [src]") - U.purchase_log[src] = U.purchase_log[src] + 1 + log_and_message_admins("\the [M] bought \a [src] through the uplink") + M.mind.purchase_log[src] += 1 datum/uplink_item/dd_SortValue() - return cost(INFINITY) + return item_cost /******************************** * * @@ -133,7 +117,7 @@ datum/uplink_item/dd_SortValue() A.put_in_any_hand_if_possible(I) return I -/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc) +/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user) var/obj/item/I = new path(loc) return I @@ -208,7 +192,7 @@ datum/uplink_item/dd_SortValue() /proc/get_surplus_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc) var/list/bought_items = list() - var/override = 1 + var/override = TRUE while(remaining_TC) var/datum/uplink_item/I = all_uplink_selection.get_random_item(remaining_TC, U, bought_items, override) if(!I) diff --git a/code/game/antagonist/alien/xenomorph.dm b/code/game/antagonist/alien/xenomorph.dm index e69db8aee7..fa64c879d4 100644 --- a/code/game/antagonist/alien/xenomorph.dm +++ b/code/game/antagonist/alien/xenomorph.dm @@ -3,8 +3,8 @@ var/datum/antagonist/xenos/xenomorphs /datum/antagonist/xenos id = MODE_XENOMORPH role_type = BE_ALIEN - role_text = "Xenomorph" - role_text_plural = "Xenomorphs" + role_text = "Genaprawn" //CHOMPedit + role_text_plural = "Genaprawns" //CHOMPedit mob_path = /mob/living/carbon/alien/larva bantype = "Xenomorph" flags = ANTAG_OVERRIDE_MOB | ANTAG_RANDSPAWN | ANTAG_OVERRIDE_JOB | ANTAG_VOTABLE diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm index 8d8e484fae..99216b9ef5 100644 --- a/code/game/antagonist/antagonist_print.dm +++ b/code/game/antagonist/antagonist_print.dm @@ -1,7 +1,7 @@ /datum/antagonist/proc/print_player_summary() if(!current_antagonists.len) - return 0 + return FALSE var/text = "

The [current_antagonists.len == 1 ? "[role_text] was" : "[role_text_plural] were"]:" for(var/datum/mind/P in current_antagonists) @@ -21,7 +21,7 @@ else text += "Fail." feedback_add_details(feedback_tag,"[O.type]|FAIL") - failed = 1 + failed = TRUE num++ if(failed) text += "
The [role_text] has failed." @@ -32,7 +32,7 @@ text += "
Their objectives were:" var/num = 1 for(var/datum/objective/O in global_objectives) - text += print_objective(O, num, 1) + text += print_objective(O, num, TRUE) num++ // Display the results. @@ -68,14 +68,14 @@ /datum/antagonist/proc/print_player_full(var/datum/mind/ply) var/text = print_player_lite(ply) - var/TC_uses = 0 - var/uplink_true = 0 + var/TC_uses = FALSE + var/uplink_true = FALSE var/purchases = "" - for(var/obj/item/device/uplink/H in GLOB.world_uplinks) - if(H && H.uplink_owner && H.uplink_owner == ply) - TC_uses += H.used_TC - uplink_true = 1 - purchases += get_uplink_purchases(H) + for(var/mob/M in player_list) + if(M.mind && M.mind.used_TC) + TC_uses += M.mind.used_TC + uplink_true = TRUE + purchases += get_uplink_purchases(M.mind) if(uplink_true) text += " (used [TC_uses] TC)" if(purchases) @@ -83,18 +83,8 @@ return text -/proc/print_ownerless_uplinks() - var/has_printed = 0 - for(var/obj/item/device/uplink/H in GLOB.world_uplinks) - if(isnull(H.uplink_owner) && H.used_TC) - if(!has_printed) - has_printed = 1 - to_world("Ownerless Uplinks") - to_world("[H.loc] (used [H.used_TC] TC)") - to_world(get_uplink_purchases(H)) - -/proc/get_uplink_purchases(var/obj/item/device/uplink/H) +/proc/get_uplink_purchases(var/datum/mind/M) var/list/refined_log = new() - for(var/datum/uplink_item/UI in H.purchase_log) - refined_log.Add("[H.purchase_log[UI]]x[UI.log_icon()][UI.name]") + for(var/datum/uplink_item/UI in M.purchase_log) + refined_log.Add("[M.purchase_log[UI]]x[UI.log_icon()][UI.name]") . = english_list(refined_log, nothing_text = "") diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm index d9a132cd4f..cdc5ffe96c 100644 --- a/code/game/area/Space Station 13 areas_vr.dm +++ b/code/game/area/Space Station 13 areas_vr.dm @@ -177,3 +177,9 @@ /area/engineering/engine_gas name = "\improper Engine Gas Storage" icon_state = "engine_waste" + +//holodeck 3/29/21 +/area/holodeck/source_smoleworld + name = "\improper Holodeck - Smolworld" + + diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f0e87cc93a..c3c1b6ce08 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -50,13 +50,12 @@ var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf var/forbid_events = FALSE // If true, random events will not start inside this area. var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons. + var/soundproofed = FALSE // If true, blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within. /area/Initialize() . = ..() - luminosity = !(dynamic_lighting) icon_state = "" - return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms. /area/LateInitialize() @@ -67,7 +66,6 @@ power_change() // all machines set to current power level, also updates lighting icon if(no_spoilers) set_spoiler_obfuscation(TRUE) - return INITIALIZE_HINT_LATELOAD // Changes the area of T to A. Do not do this manually. // Area is expected to be a non-null instance. @@ -379,9 +377,9 @@ var/list/mob/living/forced_ambiance_list = new // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch if(!(L && L.is_preference_enabled(/datum/client_preference/play_ambiance))) return - + var/volume_mod = L.get_preference_volume_channel(VOLUME_CHANNEL_AMBIENCE) - + // If we previously were in an area with force-played ambiance, stop it. if((L in forced_ambiance_list) && initial) L << sound(null, channel = CHANNEL_AMBIENCE_FORCED) @@ -399,7 +397,7 @@ var/list/mob/living/forced_ambiance_list = new L << chosen_ambiance else L << sound(null, channel = CHANNEL_AMBIENCE_FORCED) - else if(src.ambience.len) + else if(src.ambience && src.ambience.len) var/ambience_odds = L?.client.prefs.ambience_chance if(prob(ambience_odds) && (world.time >= L.client.time_last_ambience_played + 1 MINUTE)) var/sound = pick(ambience) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5ec5af0e6b..c20c29be7b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -627,7 +627,7 @@ speech_bubble_hearers += M.client if(length(speech_bubble_hearers)) - var/image/I = image('icons/mob/talk.dmi', src, "[bubble_icon][say_test(message)]", FLY_LAYER) + var/image/I = generate_speech_bubble(src, "[bubble_icon][say_test(message)]", FLY_LAYER) I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_hearers, 30) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index bf5fc0ab18..645194543f 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -134,7 +134,7 @@ for(var/i in loc) var/atom/movable/thing = i // We don't call parent so we are calling this for byond - thing.Crossed(src) + thing.Crossed(src, oldloc) // We're a multi-tile object (multiple locs) else if(. && newloc) @@ -303,6 +303,8 @@ if(AM == src) continue AM.Uncrossed(src) + if(loc != destination) // Uncrossed() triggered a separate movement + return // Information about turf and z-levels for source and dest collected var/turf/oldturf = get_turf(oldloc) @@ -327,6 +329,8 @@ if(AM == src) continue AM.Crossed(src, oldloc) + if(loc != destination) // Crossed triggered a separate movement + return // Call our thingy to inform everyone we moved Moved(oldloc, NONE, TRUE) @@ -462,6 +466,8 @@ minor_dir = dx minor_dist = dist_x + range = min(dist_x + dist_y, range) + while(src && target && src.throwing && istype(src.loc, /turf) \ && ((abs(target.x - src.x)+abs(target.y - src.y) > 0 && dist_travelled < range) \ || (a && a.has_gravity == 0) \ @@ -685,3 +691,6 @@ selfimage.loc = src return selfimage + +/atom/movable/proc/get_cell() + return diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 34180bf329..60015e8427 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -118,6 +118,10 @@ var/global/list/datum/dna/gene/dna_genes[0] var/base_species = "Human" var/list/species_traits = list() var/blood_color = "#A10808" + var/custom_say + var/custom_ask + var/custom_whisper + var/custom_exclaim // VOREStation // New stuff @@ -139,6 +143,10 @@ var/global/list/datum/dna/gene/dna_genes[0] new_dna.custom_species=custom_species //VOREStaton Edit new_dna.species_traits=species_traits.Copy() //VOREStation Edit new_dna.blood_color=blood_color //VOREStation Edit + new_dna.custom_say=custom_say //VOREStaton Edit + new_dna.custom_ask=custom_ask //VOREStaton Edit + new_dna.custom_whisper=custom_whisper //VOREStaton Edit + new_dna.custom_exclaim=custom_exclaim //VOREStaton Edit for(var/b=1;b<=DNA_SE_LENGTH;b++) new_dna.SE[b]=SE[b] if(b<=DNA_UI_LENGTH) @@ -200,15 +208,15 @@ var/global/list/datum/dna/gene/dna_genes[0] size_multiplier = player_sizes_list.Find(N) break - var/taurtype = /datum/sprite_accessory/tail/taur/spider - if(istype(character.tail_style, taurtype)) - character.verbs += /mob/living/proc/weaveWebBindings - // Technically custom_species is not part of the UI, but this place avoids merge problems. src.custom_species = character.custom_species src.base_species = character.species.base_species src.blood_color = character.species.blood_color src.species_traits = character.species.traits.Copy() + src.custom_say = character.custom_say + src.custom_ask = character.custom_ask + src.custom_whisper = character.custom_whisper + src.custom_exclaim = character.custom_exclaim // +1 to account for the none-of-the-above possibility SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 758f74d873..d250c441ad 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -237,6 +237,10 @@ // Technically custom_species is not part of the UI, but this place avoids merge problems. H.custom_species = dna.custom_species + H.custom_say = dna.custom_say + H.custom_ask = dna.custom_ask + H.custom_whisper = dna.custom_whisper + H.custom_exclaim = dna.custom_exclaim H.species.blood_color = dna.blood_color var/datum/species/S = H.species S.produceCopy(dna.base_species,dna.species_traits,src) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index bbf4bfb343..241d613275 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -34,7 +34,7 @@ var/last_activation = 0 /obj/structure/cult/pylon/Initialize() - ..() + . = ..() START_PROCESSING(SSobj, src) /obj/structure/cult/pylon/attack_hand(mob/M as mob) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8708d8b9f2..0fc08f66c1 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -292,7 +292,6 @@ var/global/list/additional_antag_types = list() antag.check_victory() antag.print_player_summary() sleep(10) - print_ownerless_uplinks() var/clients = 0 var/surviving_humans = 0 diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm index a943330ff6..7d00e82ecc 100644 --- a/code/game/gamemodes/technomancer/core_obj.dm +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -13,7 +13,7 @@ TECH_COMBAT = 7, TECH_MAGNET = 9, TECH_DATA = 5 ) sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/back.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/back.dmi' ) var/energy = 10000 var/max_energy = 10000 diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 6dc3f2d52b..8b4e1f2767 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -273,6 +273,7 @@ var/outgoing_instability = (amount) * ( 1 / (radius**2) ) L.receive_radiated_instability(outgoing_instability) + src.adjust_instability(-outgoing_instability) //This should prevent feedback loops // This should only be used for EXTERNAL sources of instability, such as from someone or something glowing. /mob/living/proc/receive_radiated_instability(amount) diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm index 452ddc52fa..13f893b536 100644 --- a/code/game/gamemodes/technomancer/spells/apportation.dm +++ b/code/game/gamemodes/technomancer/spells/apportation.dm @@ -44,7 +44,7 @@ src.loc = null user.put_in_hands(I) user.visible_message("\A [I] appears in \the [user]'s hand!") - log_and_message_admins("has stolen [I] with [src].") + add_attack_logs(user,I,"Stolen with [src]") qdel(src) //Now let's try to teleport a living mob. else if(istype(hit_atom, /mob/living)) diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm index 100f7bfa33..0bbff7b016 100644 --- a/code/game/gamemodes/technomancer/spells/blink.dm +++ b/code/game/gamemodes/technomancer/spells/blink.dm @@ -68,7 +68,7 @@ else safe_blink(AM, calculate_spell_power(3)) adjust_instability(3) - log_and_message_admins("has blinked [AM] away.") + add_attack_logs(user,AM,"Blinked") else to_chat(user, "You need more energy to blink [AM] away!") @@ -82,7 +82,7 @@ else safe_blink(user, calculate_spell_power(6)) adjust_instability(1) - log_and_message_admins("has blinked themselves away.") + add_attack_logs(user,user,"Blinked") else to_chat(user, "You need more energy to blink yourself away!") @@ -99,6 +99,6 @@ else safe_blink(AM, 6) adjust_instability(2) - log_and_message_admins("has blinked [AM] away.") + add_attack_logs(user,AM,"Blinked") else to_chat(user, "You need more energy to blink [AM] away!") \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm index 33222455ea..226ccbed18 100644 --- a/code/game/gamemodes/technomancer/spells/condensation.dm +++ b/code/game/gamemodes/technomancer/spells/condensation.dm @@ -36,9 +36,9 @@ var/turf/simulated/frozen = desired_turf frozen.freeze_floor() if(check_for_scepter()) - log_and_message_admins("has iced the floor with [src] at [T.x],[T.y],[T.z].") + add_attack_logs(user,hit_atom,"Iced the floor with [src] at [T.x],[T.y],[T.z]") else - log_and_message_admins("has wetted the floor with [src] at [T.x],[T.y],[T.z].") + add_attack_logs(user,hit_atom,"Wetted the floor with [src] at [T.x],[T.y],[T.z]") else if(hit_atom.reagents && !ismob(hit_atom)) //TODO: Something for the scepter hit_atom.reagents.add_reagent(id = "water", amount = 60, data = null, safety = 0) adjust_instability(5) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm index 8c6a00c4e7..0e0cf5eb20 100644 --- a/code/game/gamemodes/technomancer/spells/control.dm +++ b/code/game/gamemodes/technomancer/spells/control.dm @@ -125,7 +125,7 @@ return 0 if(pay_energy(25 * controlled_mobs.len)) attack_all(L) - log_and_message_admins("has commanded their army of [controlled_mobs.len] to attack [L].") + add_attack_logs(user,L,"Commanded their army of [controlled_mobs.len]") to_chat(user, "You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to \ attack \the [L].") //This is to stop someone from controlling beepsky and getting him to stun someone 5 times a second. diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm index 21f7c6e1e7..9bf8dd578f 100644 --- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm +++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm @@ -57,7 +57,7 @@ return 0 siphoning = AM update_icon() - log_and_message_admins("is siphoning energy from \a [AM].") + add_attack_logs(user,AM,"Siphoned energy from [src]") else stop_siphoning() diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm index ce38a45caa..9a52c5d82f 100644 --- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm +++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm @@ -46,7 +46,7 @@ visible_message("\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!") to_chat(L, "You ignite!") L.fire_act() - log_and_message_admins("has ignited [L] with [src].") + add_attack_logs(user,L,"Ignited with [src]") adjust_instability(12) else //This is needed in order for the welder to work, and works similarly to grippers. diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm index 7405c43520..2d33f6e926 100644 --- a/code/game/gamemodes/technomancer/spells/illusion.dm +++ b/code/game/gamemodes/technomancer/spells/illusion.dm @@ -33,6 +33,7 @@ if(pay_energy(500)) illusion = new(T) illusion.copy_appearance(copied) + illusion.copy_overlays(copied, TRUE) to_chat(user, "An illusion of \the [copied] is made on \the [T].") user << 'sound/effects/pop.ogg' return 1 diff --git a/code/game/gamemodes/technomancer/spells/insert/insert.dm b/code/game/gamemodes/technomancer/spells/insert/insert.dm index 53666c41ab..9ac0295e2b 100644 --- a/code/game/gamemodes/technomancer/spells/insert/insert.dm +++ b/code/game/gamemodes/technomancer/spells/insert/insert.dm @@ -45,7 +45,7 @@ return var/obj/item/weapon/inserted_spell/inserted = new inserting(L,user,src) inserted.spell_power_at_creation = calculate_spell_power(1.0) - log_and_message_admins("has casted [src] on [L].") + add_attack_logs(user,L,"Casted [src]") qdel(src) /obj/item/weapon/spell/insert/on_melee_cast(atom/hit_atom, mob/user) diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm index 62ae49b0f0..7585c3a191 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -14,7 +14,7 @@ var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user) new_projectile.old_style_target(hit_atom) new_projectile.fire() - log_and_message_admins("has casted [src] at \the [hit_atom].") + add_attack_logs(user,hit_atom,"Casted [src]") if(fire_sound) playsound(src, fire_sound, 75, 1) adjust_instability(instability_per_shot) @@ -39,4 +39,4 @@ return TRUE return FALSE // We got dropped before the firing occured. return TRUE // No delay, no need to check. - return FALSE \ No newline at end of file + return FALSE diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm index 756e9e27fc..07f3595eda 100644 --- a/code/game/gamemodes/technomancer/spells/reflect.dm +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -62,7 +62,7 @@ spark_system.start() playsound(src, 'sound/weapons/blade1.ogg', 50, 1) // now send a log so that admins don't think they're shooting themselves on purpose. - log_and_message_admins("[user] reflected [attacker]'s attack back at them.") + add_attack_logs(user,attacker,"Reflected [attacker]'s attack") if(!reflecting) reflecting = 1 @@ -82,7 +82,7 @@ spark_system.start() playsound(src, 'sound/weapons/blade1.ogg', 50, 1) - log_and_message_admins("[user] reflected [attacker]'s attack back at them.") + add_attack_logs(user,attacker,"Reflected [attacker]'s attack") if(!reflecting) reflecting = 1 diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm index 488214851c..83a2336ab6 100644 --- a/code/game/gamemodes/technomancer/spells/warp_strike.dm +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -76,5 +76,5 @@ I.afterattack(chosen_target, user) else chosen_target.attack_hand(user) - log_and_message_admins("has warp striked [chosen_target].") + add_attack_logs(user,chosen_target,"Warp striked") diff --git a/code/game/jobs/access_datum_vr.dm b/code/game/jobs/access_datum_vr.dm index 16038248d0..bd3906f16c 100644 --- a/code/game/jobs/access_datum_vr.dm +++ b/code/game/jobs/access_datum_vr.dm @@ -27,4 +27,22 @@ var/const/access_pilot = 67 /datum/access/entertainment id = access_entertainment desc = "Entertainment Backstage" - region = ACCESS_REGION_GENERAL \ No newline at end of file + region = ACCESS_REGION_GENERAL + +/var/const/access_mime = 138 +/datum/access/mime + id = access_mime + desc = "Mime Office" + region = ACCESS_REGION_GENERAL + +/var/const/access_clown = 136 +/datum/access/clown + id = access_clown + desc = "Clown Office" + region = ACCESS_REGION_GENERAL + +/var/const/access_tomfoolery = 137 +/datum/access/tomfoolery + id = access_tomfoolery + desc = "Tomfoolery Closet" + region = ACCESS_REGION_GENERAL diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm index 84333dad13..2f2ad0ec92 100644 --- a/code/game/jobs/job/captain_vr.dm +++ b/code/game/jobs/job/captain_vr.dm @@ -26,13 +26,13 @@ access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth) + access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway) minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth) + access_hop, access_RC_announce, access_clown, access_tomfoolery, access_mime, access_keycard_auth, access_gateway) /datum/alt_title/deputy_director title = "Deputy Director" diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index f84e191b54..78798a5add 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -205,6 +205,7 @@ // Librarian Alt Titles /datum/alt_title/journalist title = "Journalist" + title_outfit = /decl/hierarchy/outfit/job/librarian/journalist title_blurb = "The Journalist uses the Library as a base of operations, from which they can report the news and goings-on on the station with their camera." /datum/alt_title/writer diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm index a9cfda8663..1ac859eb10 100644 --- a/code/game/jobs/job/civilian_vr.dm +++ b/code/game/jobs/job/civilian_vr.dm @@ -194,11 +194,13 @@ minimal_access = list(access_entertainment) pto_type = PTO_CIVILIAN - outfit_type = /decl/hierarchy/outfit/job/assistant + outfit_type = /decl/hierarchy/outfit/job/assistant/entertainer job_description = "An entertainer does just that, entertains! Put on plays, play music, sing songs, tell stories, or read your favorite fanfic." alt_titles = list("Performer" = /datum/alt_title/performer, "Musician" = /datum/alt_title/musician, "Stagehand" = /datum/alt_title/stagehand, "Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer, - "Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian) + "Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian, + "Clown" = /datum/alt_title/clown, "Jester" = /datum/alt_title/clown/jester,"Fool" = /datum/alt_title/clown/fool, + "Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur) //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer // Entertainer Alt Titles /datum/alt_title/actor diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm index 71bf1e9bff..928259ee60 100644 --- a/code/game/jobs/job/engineering_vr.dm +++ b/code/game/jobs/job/engineering_vr.dm @@ -6,12 +6,12 @@ access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload) + access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, - access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload) + access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload, access_gateway) alt_titles = list("Head Engineer" = /datum/alt_title/head_engineer, "Foreman" = /datum/alt_title/foreman, "Maintenance Manager" = /datum/alt_title/maintenance_manager) /datum/alt_title/head_engineer diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration_vr.dm index 0e6e003f7d..3791cc24ac 100644 --- a/code/game/jobs/job/exploration_vr.dm +++ b/code/game/jobs/job/exploration_vr.dm @@ -1,8 +1,3 @@ -var/const/PATHFINDER =(1<<11) -var/const/EXPLORER =(1<<12) -var/const/PILOT =(1<<13) -var/const/SAR =(1<<14) - /obj/item/weapon/card/id/medical/sar assignment = "Field Medic" rank = "Field Medic" @@ -41,7 +36,7 @@ var/const/SAR =(1<<14) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the Head of Personnel" + supervisors = "the Research Director" //CHOMPedit selection_color = "#d6d05c" economic_modifier = 8 minimal_player_age = 7 @@ -64,20 +59,20 @@ var/const/SAR =(1<<14) /datum/job/pilot title = "Pilot" flag = PILOT - departments = list(DEPARTMENT_PLANET) - department_flag = MEDSCI + departments = list(DEPARTMENT_PLANET) //CHOMPedit: keep them part of exploration + department_flag = MEDSCI //CHOMPedit faction = "Station" - total_positions = 4 - spawn_positions = 4 - supervisors = "the Pathfinder and the Head of Personnel" - selection_color = "#999440" + total_positions = 5 + spawn_positions = 5 + supervisors = "the Pathfinder" //CHOMPedit + selection_color = "#515151" economic_modifier = 5 minimal_player_age = 3 pto_type = PTO_EXPLORATION access = list(access_pilot) minimal_access = list(access_pilot) outfit_type = /decl/hierarchy/outfit/job/pilot - job_description = "A Pilot flies the various shuttles in the Virgo-Erigone System." + job_description = "A Pilot flies the various shuttles in the Vir System." //CHOMPedit: Replaces Virgo reference with Vir. alt_titles = list("Co-Pilot" = /datum/alt_title/co_pilot, "Navigator" = /datum/alt_title/navigator) /datum/alt_title/co_pilot @@ -96,7 +91,7 @@ var/const/SAR =(1<<14) faction = "Station" total_positions = 3 spawn_positions = 3 - supervisors = "the Pathfinder and the Head of Personnel" + supervisors = "the Pathfinder" //CHOMPedit selection_color = "#999440" economic_modifier = 6 pto_type = PTO_EXPLORATION @@ -121,7 +116,7 @@ var/const/SAR =(1<<14) faction = "Station" total_positions = 2 spawn_positions = 2 - supervisors = "the Pathfinder and the Chief Medical Officer" + supervisors = "the Pathfinder" //CHOMPedit selection_color = "#999440" economic_modifier = 6 minimal_player_age = 3 diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm index d0d56fd7b5..120d538e4a 100644 --- a/code/game/jobs/job/medical_vr.dm +++ b/code/game/jobs/job/medical_vr.dm @@ -5,11 +5,11 @@ access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_teleporter, //CHOMPEdit - access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) + access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, access_teleporter,//CHOMPEdit - access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels) + access_keycard_auth, access_psychiatrist, access_eva, access_external_airlocks, access_maint_tunnels, access_gateway) alt_titles = list("Chief Physician" = /datum/alt_title/chief_physician, "Medical Director" = /datum/alt_title/medical_director, /*CHOMPEdit Removal"Healthcare Manager" = /datum/alt_title/healthcare_manager*/) /datum/alt_title/chief_physician diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm index bfb522910c..e6ae7a1a4b 100644 --- a/code/game/jobs/job/science_vr.dm +++ b/code/game/jobs/job/science_vr.dm @@ -13,6 +13,9 @@ access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network, access_explorer, access_pathfinder, access_xenobotany) //YW Edit access_gateway, _explorer, _pathfinder, and _xenobotany + alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor, "Research Manager" = /datum/alt_title/research_manager, + "Head of Development" = /datum/alt_title/head_of_development,"Head Scientist" = /datum/alt_title/head_scientist) + /datum/alt_title/research_manager title = "Research Manager" diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm index 57f0e91d34..2f68ed7791 100644 --- a/code/game/jobs/job/special_vr.dm +++ b/code/game/jobs/job/special_vr.dm @@ -77,16 +77,16 @@ title = "Clown" flag = CLOWN departments = list(DEPARTMENT_CIVILIAN) - department_flag = CIVILIAN + department_flag = ENGSEC faction = "Station" - total_positions = -1 - spawn_positions = -1 + total_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. + spawn_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. supervisors = "the spirit of laughter" selection_color = "#515151" economic_modifier = 1 job_description = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!" whitelist_only = 1 - latejoin_only = 1 + latejoin_only = 0 outfit_type = /decl/hierarchy/outfit/job/clown pto_type = PTO_CIVILIAN alt_titles = list("Jester" = /datum/alt_title/jester, "Fool" = /datum/alt_title/fool) @@ -99,25 +99,25 @@ /datum/job/clown/get_access() if(config.assistant_maint) - return list(access_maint_tunnels, access_entertainment) + return list(access_maint_tunnels, access_entertainment, access_clown, access_tomfoolery) else - return list(access_entertainment) + return list(access_entertainment, access_clown, access_tomfoolery) /datum/job/mime title = "Mime" flag = MIME departments = list(DEPARTMENT_CIVILIAN) - department_flag = CIVILIAN + department_flag = ENGSEC faction = "Station" - total_positions = -1 - spawn_positions = -1 + total_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. + spawn_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. supervisors = "the spirit of performance" selection_color = "#515151" economic_modifier = 1 job_description = "A Mime is there to entertain the crew and keep high morale using unbelievable performances and acting skills!" alt_titles = list("Poseur" = /datum/alt_title/poseur) whitelist_only = 1 - latejoin_only = 1 + latejoin_only = 0 outfit_type = /decl/hierarchy/outfit/job/mime pto_type = PTO_CIVILIAN @@ -126,6 +126,6 @@ /datum/job/mime/get_access() if(config.assistant_maint) - return list(access_maint_tunnels, access_entertainment) + return list(access_maint_tunnels, access_entertainment, access_tomfoolery, access_mime) else - return list(access_entertainment) + return list(access_entertainment, access_tomfoolery, access_mime) diff --git a/code/game/jobs/job/zz_alt_titles_ch.dm b/code/game/jobs/job/zz_alt_titles_ch.dm new file mode 100644 index 0000000000..c825e0cd05 --- /dev/null +++ b/code/game/jobs/job/zz_alt_titles_ch.dm @@ -0,0 +1,31 @@ +/datum/job/entertainer + alt_titles = list("Performer" = /datum/alt_title/performer, "Musician" = /datum/alt_title/musician, "Stagehand" = /datum/alt_title/stagehand, + "Actor" = /datum/alt_title/actor, "Dancer" = /datum/alt_title/dancer, "Singer" = /datum/alt_title/singer, + "Magician" = /datum/alt_title/magician, "Comedian" = /datum/alt_title/comedian, "Tragedian" = /datum/alt_title/tragedian, + "Clown" = /datum/alt_title/clown, "Jester" = /datum/alt_title/clown/jester,"Fool" = /datum/alt_title/clown/fool, + "Mime"= /datum/alt_title/mime,"Poseur"= /datum/alt_title/mime/poseur, "Fitness Instructor" = /datum/alt_title/fitness) //CHOMPEDIT: Adding clown + mime and their alts as alts of entertainer, as well as fitness instructor + +/datum/alt_title/fitness + title = "Fitness Instructor" + title_blurb = "A Fitness Instructor's goal is to keep the station in shape. Get the crew shaving up those built up pounds and get them to eat something other than chocolate bars and burgers for once" + +//Below, well sort off, these are the clown and mime returning! as entertainer alts +//They even get their respective outfits. +/datum/alt_title/clown + title = "Clown" + title_blurb = "A Clown is there to entertain the crew and keep high morale using various harmless pranks and ridiculous jokes!" + title_outfit = /decl/hierarchy/outfit/job/clown + +/datum/alt_title/clown/jester + title = "Jester" + +/datum/alt_title/clown/fool + title = "Fool" + +/datum/alt_title/mime + title = "Mime" + title_blurb = "A Mime is there to entertain the crew and keep high morale using unbelievable performances and acting skills!" + title_outfit = /decl/hierarchy/outfit/job/mime + +/datum/alt_title/mime/poseur + title = "Poseur" \ No newline at end of file diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 1b0a0c0b4d..24a8f79cbe 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -414,7 +414,7 @@ var/global/datum/controller/occupations/job_master // Implants get special treatment if(G.slot == "implant") - var/obj/item/weapon/implant/I = G.spawn_item(H) + var/obj/item/weapon/implant/I = G.spawn_item(H, H.client.prefs.gear[G.display_name]) I.invisibility = 100 I.implant_loadout(H) continue @@ -510,22 +510,23 @@ var/global/datum/controller/occupations/job_master to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.") if(istype(H)) //give humans wheelchairs, if they need them. - if(istype(H.loc, /obj/belly)) //unless in a gut + if(istype(H.loc, /obj/belly)) //CHOMPedit start unless in a gut var/obj/item/organ/external/l_foot = H.get_organ("l_foot") var/obj/item/organ/external/r_foot = H.get_organ("r_foot") var/obj/item/weapon/storage/S = locate() in H.contents - var/obj/item/wheelchair/R = null + var/obj/item/wheelchair/R if(S) R = locate() in S.contents if(!l_foot || !r_foot || R) - var/obj/structure/bed/chair/wheelchair/W = new /obj/structure/bed/chair/wheelchair(H.loc) + var/wheelchair_type = R?.unfolded_type || /obj/structure/bed/chair/wheelchair + var/obj/structure/bed/chair/wheelchair/W = new wheelchair_type(H.loc) W.buckle_mob(H) H.update_canmove() W.set_dir(H.dir) W.add_fingerprint(H) if(R) W.color = R.color - qdel(R) + qdel(R) //CHOMPedit end to_chat(H, "You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].") @@ -745,7 +746,7 @@ var/global/datum/controller/occupations/job_master to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") var/spawning = pick(latejoin) .["turf"] = get_turf(spawning) - .["msg"] = "will arrive at the station shortly" //VOREStation Edit - Grammar but mostly 'shuttle' reference removal, and this also applies to notified spawn-character verb use + .["msg"] = "will arrive at the station shortly" else if(!fail_deadly) var/spawning = pick(latejoin) .["turf"] = get_turf(spawning) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index ef104f08c9..9cb8c9c9f1 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -11,8 +11,8 @@ var/const/ENGINEER =(1<<6) var/const/ATMOSTECH =(1<<7) var/const/AI =(1<<8) var/const/CYBORG =(1<<9) -var/const/BLUESHIELD =(1<<13) //YW addition -var/const/SECPILOT =(1<<14) //YW addition +var/const/CLOWN =(1<<13) //VOREStation Add +var/const/MIME =(1<<14) //VOREStation Add var/const/INTERN =(1<<15) //VOREStation Add var/const/MEDSCI =(1<<1) @@ -28,7 +28,10 @@ var/const/PSYCHIATRIST =(1<<7) var/const/ROBOTICIST =(1<<8) var/const/XENOBIOLOGIST =(1<<9) var/const/PARAMEDIC =(1<<10) -var/const/XENOBOTANIST =(1<<15) //VOREStation Add +var/const/PATHFINDER =(1<<11) //VOREStation Add +var/const/EXPLORER =(1<<12) //VOREStation Add +var/const/SAR =(1<<13) //VOREStation Add +var/const/XENOBOTANIST =(1<<14) //VOREStation Add var/const/CIVILIAN =(1<<2) @@ -45,9 +48,8 @@ var/const/LAWYER =(1<<9) var/const/CHAPLAIN =(1<<10) var/const/ASSISTANT =(1<<11) var/const/BRIDGE =(1<<12) -var/const/CLOWN =(1<<13) //VOREStation Add -var/const/MIME =(1<<14) //VOREStation Add -var/const/ENTERTAINER =(1<<15) //VOREStation Add +var/const/PILOT =(1<<13) //VOREStation Add +var/const/ENTERTAINER =(1<<14) //VOREStation Add var/list/assistant_occupations = list( ) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index a97fbf986f..e0ff3a6086 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -529,5 +529,5 @@ stasis_level = 100 //Just one setting /obj/machinery/sleeper/survival_pod/Initialize() - ..() + . = ..() RefreshParts(1) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 267524b979..08e22f96e0 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -14,7 +14,6 @@ active_power_usage = 10000 //10 kW. It's a big all-body scanner. light_color = "#00FF00" var/obj/machinery/body_scanconsole/console - var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal, /obj/item/weapon/implant/backup, /obj/item/device/nif) //VOREStation Add - Backup Implant, NIF var/printing_text = null /obj/machinery/bodyscanner/Initialize() @@ -255,12 +254,11 @@ organData["broken"] = E.min_broken_damage var/implantData[0] - for(var/obj/I in E.implants) + for(var/obj/thing in E.implants) var/implantSubData[0] - implantSubData["name"] = I.name - if(is_type_in_list(I, known_implants)) - implantSubData["known"] = 1 - + var/obj/item/weapon/implant/I = thing + implantSubData["name"] = I.name + implantSubData["known"] = istype(I) && I.known_implant implantData.Add(list(implantSubData)) organData["implants"] = implantData @@ -464,8 +462,9 @@ infected = "Gangrene Detected:" var/unknown_body = 0 - for(var/I in e.implants) - if(is_type_in_list(I,known_implants)) + for(var/thing in e.implants) + var/obj/item/weapon/implant/I = thing + if(istype(I) && I.known_implant) imp += "[I] implanted:" else unknown_body++ diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 4351d29698..f14fe8c846 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -39,6 +39,14 @@ if(!autolathe_recipes) autolathe_recipes = new() wires = new(src) + + for(var/Name in name_to_material) + if(Name in stored_material) + continue + + stored_material[Name] = 0 + storage_capacity[Name] = 0 + default_apply_parts() RefreshParts() @@ -273,6 +281,15 @@ //Create the desired item. var/obj/item/I = new making.path(src.loc) + + if(LAZYLEN(I.matter)) // Sadly we must obey the laws of equivalent exchange. + I.matter.Cut() + else + I.matter = list() + + for(var/material in making.resources) // Handle the datum's autoscaling for waste, so we're properly wasting material, but not so much if we have efficiency. + I.matter[material] = round(making.resources[material] / (making.no_scale ? 1 : 1.25)) * (making.no_scale ? 1 : mat_efficiency) + flick("[initial(icon_state)]_finish", src) if(multiplier > 1) if(istype(I, /obj/item/stack)) @@ -280,7 +297,16 @@ S.amount = multiplier else for(multiplier; multiplier > 1; --multiplier) // Create multiple items if it's not a stack. - new making.path(src.loc) + I = new making.path(src.loc) + // We've already deducted the cost of multiple items. Process the matter the same. + if(LAZYLEN(I.matter)) + I.matter.Cut() + + else + I.matter = list() + + for(var/material in making.resources) + I.matter[material] = round(making.resources[material] / (making.no_scale ? 1 : 1.25)) * (making.no_scale ? 1 : mat_efficiency) return TRUE return FALSE @@ -306,10 +332,9 @@ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) man_rating += M.rating - storage_capacity[DEFAULT_WALL_MATERIAL] = mb_rating * 25000 - storage_capacity[MAT_PLASTIC] = mb_rating * 20000 - storage_capacity[MAT_PLASTEEL] = mb_rating * 16250 - storage_capacity["glass"] = mb_rating * 12500 + for(var/mat_name in storage_capacity) + storage_capacity[mat_name] = mb_rating * 25000 + build_time = 50 / man_rating mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.6. Maximum rating of parts is 5 update_tgui_static_data(usr) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 8ddb76c68a..2c34326fa7 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -465,6 +465,7 @@ /obj/item/weapon/implant/health name = "health implant" + known_implant = TRUE var/healthstring = "" /obj/item/weapon/implant/health/proc/sensehealth() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 7ff97c83e8..179f8e0e16 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1,9 +1,8 @@ -/obj/machinery/computer/arcade/ +/obj/machinery/computer/arcade name = "random arcade" desc = "random arcade machine" - icon_state = "arcade" + icon_state = "arcade1" icon_keyboard = null - icon_screen = "invaders" clicksound = null //Gets too spammy and makes no sense for arcade to have the console keyboard noise anyway var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2, /obj/item/toy/blink = 2, @@ -25,15 +24,15 @@ /obj/item/toy/stickhorse = 2 ) -/obj/machinery/computer/arcade/New() - ..() +/obj/machinery/computer/arcade/Initialize() + . = ..() // If it's a generic arcade machine, pick a random arcade // circuit board for it and make the new machine if(!circuit) var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade/clawmachine) var/obj/item/weapon/circuitboard/CB = new choice() new CB.build_path(loc, CB) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/machinery/computer/arcade/proc/prizevend() if(!(contents-circuit).len) @@ -77,9 +76,10 @@ /////////////////// /obj/machinery/computer/arcade/battle - name = "arcade machine" - desc = "Does not support Pinball." - icon_state = "arcade" + name = "Battler" + desc = "Fight through what space has to offer!" + icon_state = "arcade2" + icon_screen = "battler" circuit = /obj/item/weapon/circuitboard/arcade/battle var/enemy_name = "Space Villian" var/temp = "Winners don't use space drugs" //Temporary message, for attack messages, etc @@ -310,7 +310,8 @@ /obj/machinery/computer/arcade/orion_trail name = "The Orion Trail" desc = "Learn how our ancestors got to Orion, and have fun in the process!" - icon_state = "arcade" + icon_state = "arcade1" + icon_screen = "orion" circuit = /obj/item/weapon/circuitboard/arcade/orion_trail var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game. var/engine = 0 @@ -1318,4 +1319,18 @@ wintick = 0 gameStatus = "CLAWMACHINE_NEW" emagged = 1 - return 1 \ No newline at end of file + return 1 + +/obj/machinery/computer/arcade/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/stack/arcadeticket)) + var/obj/item/stack/arcadeticket/T = O + var/amount = T.get_amount() + if(amount <2) + to_chat(user, "You need 2 tickets to claim a prize!") + return + prizevend(user) + T.pay_tickets() + T.update_icon() + O = T + to_chat(user, "You turn in 2 tickets to the [src] and claim a prize!") + return diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 0f52e67b8c..c08bcb2d82 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -157,7 +157,7 @@ switch(action) if("modify") if(modify) - data_core.manifest_modify(modify.registered_name, modify.assignment) + data_core.manifest_modify(modify.registered_name, modify.assignment, modify.rank) modify.name = "[modify.registered_name]'s ID Card ([modify.assignment])" if(ishuman(usr)) modify.forceMove(get_turf(src)) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index cc05d63217..5aa7f077c6 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -26,7 +26,7 @@ light_color = "#315ab4" /obj/machinery/computer/cloning/Initialize() - ..() + . = ..() pods = list() records = list() set_scan_temp("Scanner ready.", "good") @@ -380,7 +380,7 @@ return if(isnull(subject) || (!(ishuman(subject))) || (!subject.dna)) if(isalien(subject)) - set_scan_temp("Xenomorphs are not scannable.", "bad") + set_scan_temp("Genaprawns are not scannable.", "bad") //CHOMPedit SStgui.update_uis(src) return // can add more conditions for specific non-human messages here diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 0090d03b7a..e2e1535728 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -41,7 +41,7 @@ /obj/item/weapon/card/id/guest/attack_self(mob/living/user as mob) if(user.a_intent == I_HURT) - if(icon_state == "guest_invalid") + if(icon_state == "guest-invalid") to_chat(user, "This guest pass is already deactivated!") return @@ -49,7 +49,8 @@ if(confirm == "Yes") //rip guest pass \The [user] deactivates \the [src].") - icon_state = "guest_invalid" + icon_state = "guest-invalid" + update_icon() expiration_time = world.time expired = 1 return ..() @@ -66,7 +67,8 @@ /obj/item/weapon/card/id/guest/process() if(expired == 0 && world.time >= expiration_time) visible_message("\The [src] flashes a few times before turning red.") - icon_state = "guest_invalid" + icon_state = "guest-invalid" + update_icon() expired = 1 world.time = expiration_time return diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index adf53c80a8..680ce44345 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -29,7 +29,7 @@ /obj/machinery/computer/med_data/Initialize() - ..() + . = ..() field_edit_questions = list( // General "sex" = "Please select new sex:", diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 1caa7b61a4..430b42591c 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -335,7 +335,7 @@ name = "Monitor Decryption Key" /obj/item/weapon/paper/monitorkey/Initialize() - ..() //Late init + ..() return INITIALIZE_HINT_LATELOAD /obj/item/weapon/paper/monitorkey/LateInitialize() diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index dbd5ba8383..5eae5e82d0 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -13,7 +13,7 @@ var/title = "Mass Driver Controls" /obj/machinery/computer/pod/Initialize() - ..() //Not returning parent because lateload + ..() return INITIALIZE_HINT_LATELOAD /obj/machinery/computer/pod/LateInitialize() diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 33d37edfa6..25fe3d56db 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -15,6 +15,9 @@ var/stop = 0.0 var/screen = 0 // 0 - No Access Denied, 1 - Access allowed +/obj/machinery/computer/prisoner/attack_ai(var/mob/user as mob) + return src.attack_hand(user) + /obj/machinery/computer/prisoner/attack_hand(mob/user) if(..()) return @@ -28,7 +31,7 @@ /obj/machinery/computer/prisoner/tgui_data(mob/user) var/list/data = list() - + data["locked"] = !screen data["chemImplants"] = list() data["trackImplants"] = list() @@ -65,24 +68,22 @@ return data + /obj/machinery/computer/prisoner/tgui_act(action, list/params) if(..()) return TRUE - switch(action) if("inject") var/obj/item/weapon/implant/I = locate(params["imp"]) if(I) I.activate(clamp(params["val"], 0, 10)) . = TRUE - if("lock") if(allowed(usr)) screen = !screen else to_chat(usr, "Unauthorized Access.") . = TRUE - if("warn") var/warning = sanitize(input(usr, "Message:", "Enter your message here!", "")) if(!warning) @@ -91,5 +92,4 @@ if(I && I.imp_in) to_chat(I.imp_in, "You hear a voice in your head saying: '[warning]'") . = TRUE - - add_fingerprint(usr) \ No newline at end of file + add_fingerprint(usr) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 1fbd897113..4222e1264c 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -25,7 +25,7 @@ var/static/list/field_edit_choices /obj/machinery/computer/secure_data/Initialize() - ..() + . = ..() field_edit_questions = list( // General "name" = "Please enter new name:", @@ -389,11 +389,11 @@ if(field == "age") answer = text2num(answer) - + if(field == "rank") if(answer in joblist) active1.fields["real_rank"] = answer - + if(field == "criminal") for(var/mob/living/carbon/human/H in player_list) BITSET(H.hud_updateflag, WANTED_HUD) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 47b9e8ce25..e11f404b16 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -30,7 +30,7 @@ var/static/list/field_edit_choices /obj/machinery/computer/skills/Initialize() - ..() + . = ..() field_edit_questions = list( // General "name" = "Please input new name:", diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 8cfc711c18..80ce7a701d 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -177,7 +177,7 @@ card.rank = newjob.title card.assignment = newassignment card.name = text("[card.registered_name]'s ID Card ([card.assignment])") - data_core.manifest_modify(card.registered_name, card.assignment) + data_core.manifest_modify(card.registered_name, card.assignment, card.rank) card.last_job_switch = world.time callHook("reassign_employee", list(card)) newjob.current_positions++ @@ -203,7 +203,7 @@ card.rank = ptojob.title card.assignment = ptojob.title card.name = text("[card.registered_name]'s ID Card ([card.assignment])") - data_core.manifest_modify(card.registered_name, card.assignment) + data_core.manifest_modify(card.registered_name, card.assignment, card.rank) card.last_job_switch = world.time callHook("reassign_employee", list(card)) var/mob/living/carbon/human/H = usr diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm index 35eb699531..f9e43aaa7d 100644 --- a/code/game/machinery/computer3/computers/card.dm +++ b/code/game/machinery/computer3/computers/card.dm @@ -312,14 +312,14 @@ writer.assignment = t1 writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") - data_core.manifest_modify(writer.registered_name, writer.assignment) + data_core.manifest_modify(writer.registered_name, writer.assignment, writer.rank) callHook("reassign_employee", list(writer)) if("reg" in href_list) if(auth) writer.registered_name = href_list["reg"] writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") - data_core.manifest_modify(writer.registered_name, writer.assignment) + data_core.manifest_modify(writer.registered_name, writer.assignment, writer.rank) callHook("reassign_employee", list(writer)) computer.updateUsrDialog() diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 2a36b5db6c..5b4305844e 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -394,6 +394,8 @@ //Drop all items into the pod. for(var/obj/item/W in to_despawn) + if(istype(W,/obj/item/organ)) + continue to_despawn.drop_from_inventory(W) W.forceMove(src) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f25767059b..93d0bbb23b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -864,14 +864,14 @@ About the new airlock wires panel: /obj/machinery/door/airlock/tgui_data(mob/user) var/list/data = list() - + var/list/power = list() power["main"] = main_power_lost_until > 0 ? 0 : 2 power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) power["backup"] = backup_power_lost_until > 0 ? 0 : 2 power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) data["power"] = power - + data["shock"] = (electrified_until == 0) ? 2 : 0 data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) data["id_scanner"] = !aiDisabledIdScanner diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index bc9c199ed2..9d7e5ed958 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -29,6 +29,7 @@ var/close_sound = 'sound/machines/door/blastdoorclose.ogg' var/damage = BLAST_DOOR_CRUSH_DAMAGE var/multiplier = 1 // The multiplier for how powerful our YEET is. + var/istransparent = 0 closed_layer = ON_WINDOW_LAYER // Above airlocks when closed var/id = 1.0 @@ -108,10 +109,13 @@ src.density = 1 update_nearby_tiles() src.update_icon() - src.set_opacity(1) + if(src.istransparent) + src.set_opacity(0) + else + src.set_opacity(1) sleep(15) src.operating = 0 - + // Blast door crushing. for(var/turf/turf in locs) for(var/atom/movable/AM in turf) @@ -276,10 +280,11 @@ // Parameters: None // Description: Closes the door. Does necessary checks. /obj/machinery/door/blast/close() + if (src.operating || (stat & BROKEN || stat & NOPOWER)) return - force_close() + force_close() // Proc: repair() // Parameters: None @@ -323,5 +328,52 @@ obj/machinery/door/blast/regular/open icon_state = "shutter1" damage = SHUTTER_CRUSH_DAMAGE +// SUBTYPE: Transparent +// Not technically a blast door but operates like one. Allows air and light. +obj/machinery/door/blast/gate + name = "thick gate" + icon_state_open = "tshutter0" + icon_state_opening = "tshutterc0" + icon_state_closed = "tshutter1" + icon_state_closing = "tshutterc1" + icon_state = "tshutter1" + damage = SHUTTER_CRUSH_DAMAGE + maxhealth = 400 + block_air_zones = 0 + opacity = 0 + istransparent = 1 + +obj/machinery/door/blast/gate/open + icon_state = "tshutter0" + density = 0 + +/obj/machinery/door/blast/gate/thin + name = "thin gate" + icon_state_open = "shutter2_0" + icon_state_opening = "shutter2_c0" + icon_state_closed = "shutter2_1" + icon_state_closing = "shutter2_c1" + icon_state = "shutter2_1" + maxhealth = 200 + opacity = 0 + +/obj/machinery/door/blast/gate/thin/open + icon_state = "shutter2_1" + density = 0 + +/obj/machinery/door/blast/gate/bars + name = "prison bars" + icon_state_open = "bars_0" + icon_state_opening = "bars_c0" + icon_state_closed = "bars_1" + icon_state_closing = "bars_c1" + icon_state = "bars_1" + maxhealth = 600 + opacity = 0 + +/obj/machinery/door/blast/gate/bars/open + icon_state = "bars_1" + density = 0 + #undef BLAST_DOOR_CRUSH_DAMAGE #undef SHUTTER_CRUSH_DAMAGE \ No newline at end of file diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index c9262675cf..a98c9abb04 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -8,8 +8,6 @@ #define PRESET_MEDIUM 5 MINUTES #define PRESET_LONG 10 MINUTES -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - /////////////////////////////////////////////////////////////////////////////////////////////// // Brig Door control displays. // Description: This is a controls the timer for the brig doors, displays the timer on itself and @@ -25,22 +23,21 @@ layer = ABOVE_WINDOW_LAYER desc = "A remote control for a door." req_access = list(access_brig) - anchored = 1.0 // can't pick it up - density = 0 // can walk through it. - var/id = null // id of door it controls. - + anchored = 1.0 // can't pick it up + density = 0 // can walk through it. + var/id = null // id of door it controls. var/activation_time = 0 var/timer_duration = 0 var/timing = FALSE // boolean, true/1 timer is on, false/0 means it's not timing var/list/obj/machinery/targets = list() + maptext_height = 26 maptext_width = 32 /obj/machinery/door_timer/Initialize() ..() - //Doors need to go first, and can't rely on init order, so come back to me. return INITIALIZE_HINT_LATELOAD /obj/machinery/door_timer/LateInitialize() @@ -72,12 +69,12 @@ /obj/machinery/door_timer/process() if(stat & (NOPOWER|BROKEN)) return - if(timing) if(world.time - activation_time >= timer_duration) timer_end() // open doors, reset timer, clear status screen update_icon() + // has the door power situation changed, if so update icon. /obj/machinery/door_timer/power_change() ..() @@ -108,7 +105,7 @@ C.icon_state = "closed_locked" return 1 -// Opens and unlocks doors, power check +/// Opens and unlocks doors, power check /obj/machinery/door_timer/proc/timer_end(forced = FALSE) if(stat & (NOPOWER|BROKEN)) return 0 @@ -145,6 +142,9 @@ if(timer_duration && activation_time && timing) // Setting it while active will reset the activation time activation_time = world.time +/obj/machinery/door_timer/attack_ai(mob/user) + return src.attack_hand(user) + /obj/machinery/door_timer/attack_hand(mob/user) if(..()) return TRUE diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 25c3c631f2..be3ebba12d 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -4,6 +4,7 @@ /datum/feed_message var/author ="" + var/title var/body ="" var/message_type ="Story" var/datum/feed_channel/parent_channel @@ -58,9 +59,6 @@ var/list/datum/feed_channel/network_channels = list() var/datum/feed_message/wanted_issue -/datum/feed_network/New() - CreateFeedChannel("Station Announcements", "SS13", 1, 1, "New Station Announcement Available") - /datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0, var/announcement_message) var/datum/feed_channel/newChannel = new /datum/feed_channel newChannel.channel_name = channel_name @@ -73,12 +71,16 @@ newChannel.announcement = "Breaking news from [channel_name]!" network_channels += newChannel -/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "") +/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "", var/title) var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = author newMsg.body = msg newMsg.time_stamp = "[stationtime2text()]" newMsg.is_admin_message = adminMessage + if(title) + newMsg.title = title + else + newMsg.title = "News Update" newMsg.post_time = round_duration_in_ds // Should be almost universally unique if(message_type) newMsg.message_type = message_type @@ -147,6 +149,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) // 1 = there has var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster var/msg = ""; //Feed message + var/title = ""; // Feed title var/datum/news_photo/photo_data = null var/channel_name = ""; //the feed channel which will be receiving the feed, or being created var/c_locked=0; //Will our new channel be locked to public submissions? @@ -164,7 +167,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) securityCaster = 1 /obj/machinery/newscaster/Initialize() - ..() //Not returning . because lateload below + ..() GLOB.allCasters += src unit_no = ++unit_no_cur paper_remaining = 15 @@ -371,7 +374,6 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) /obj/machinery/newscaster/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - switch(action) if("cleartemp") temp = null @@ -434,6 +436,10 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) msg = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message|null) return TRUE + if("set_new_title") + title = sanitize(input(usr, "Enter your Feed title", "Network Channel Handler", "") as message|null) + return TRUE + if("set_attachment") AttachPhoto(usr) return TRUE @@ -449,10 +455,13 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) if(channel_name == "") set_temp("Error: Could not submit feed message to network: No feed channel selected.", "danger", FALSE) return TRUE + if(title == "") + set_temp("Error: Invalid Title.", "danger", FALSE) + return TRUE var/image = photo_data ? photo_data.photo : null feedback_inc("newscaster_stories",1) - news_network.SubmitArticle(msg, our_user, channel_name, image, 0) + news_network.SubmitArticle(msg, our_user, channel_name, image, 0, "", title) set_temp("Feed message created successfully.", "success", FALSE) return TRUE @@ -629,153 +638,6 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) photo_data = new(selection, 1) -//######################################################################################################################## -//###################################### NEWSPAPER! ###################################################################### -//######################################################################################################################## - -/obj/item/weapon/newspaper - name = "newspaper" - desc = "An issue of The Griffon, the newspaper circulating aboard most stations." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "newspaper" - w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! - attack_verb = list("bapped") - var/screen = 0 - var/pages = 0 - var/curr_page = 0 - var/list/datum/feed_channel/news_content = list() - var/datum/feed_message/important_message = null - var/scribble="" - var/scribble_page = null - drop_sound = 'sound/items/drop/wrapper.ogg' - pickup_sound = 'sound/items/pickup/wrapper.ogg' - -obj/item/weapon/newspaper/attack_self(mob/user) - if(ishuman(user)) - var/mob/living/carbon/human/human_user = user - var/dat - pages = 0 - switch(screen) - if(0) //Cover - dat+="
The Griffon
" - dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" - if(isemptylist(news_content)) - if(important_message) - dat+="Contents:
" - else - dat+="Other than the title, the rest of the newspaper is unprinted..." - else - dat+="Contents:
" - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Next Page
Done reading
" - if(1) // X channel pages inbetween. - for(var/datum/feed_channel/NP in news_content) - pages++ //Let's get it right again. - var/datum/feed_channel/C = news_content[curr_page] - dat+="[C.channel_name] \[created by: [C.author]\]

" - if(C.censored) - dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." - else - if(isemptylist(C.messages)) - dat+="No Feed stories stem from this channel..." - else - dat+="" - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "

Previous Page
Next Page
" - if(2) //Last page - for(var/datum/feed_channel/NP in news_content) - pages++ - if(important_message!=null) - dat+="
Wanted Issue:


" - dat+="Criminal name: [important_message.author]
" - dat+="Description: [important_message.body]
" - dat+="Photo:: " - if(important_message.img) - user << browse_rsc(important_message.img, "tmp_photow.png") - dat+="
" - else - dat+="None" - else - dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." - if(scribble_page==curr_page) - dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" - dat+= "
Previous Page
" - else - dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - - dat+="

[curr_page+1]
" - human_user << browse(dat, "window=newspaper_main;size=300x400") - onclose(human_user, "newspaper_main") - else - to_chat(user, "The paper is full of intelligible symbols!") - -obj/item/weapon/newspaper/Topic(href, href_list) - var/mob/living/U = usr - ..() - if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) - U.set_machine(src) - if(href_list["next_page"]) - if(curr_page == pages+1) - return //Don't need that at all, but anyway. - if(curr_page == pages) //We're at the middle, get to the end - screen = 2 - else - if(curr_page == 0) //We're at the start, get to the middle - screen = 1 - curr_page++ - playsound(src, "pageturn", 50, 1) - - else if(href_list["prev_page"]) - if(curr_page == 0) - return - if(curr_page == 1) - screen = 0 - - else - if(curr_page == pages+1) //we're at the end, let's go back to the middle. - screen = 1 - curr_page-- - playsound(src, "pageturn", 50, 1) - - if(istype(src.loc, /mob)) - attack_self(src.loc) - -obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user) - if(istype(W, /obj/item/weapon/pen)) - if(scribble_page == curr_page) - to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") - else - var/s = sanitize(input(user, "Write something", "Newspaper", "")) - s = sanitize(s) - if(!s) - return - if(!in_range(src, usr) && src.loc != usr) - return - scribble_page = curr_page - scribble = s - attack_self(user) - return - ////////////////////////////////////helper procs /obj/machinery/newscaster/proc/tgui_user_name(mob/user) if(ishuman(user)) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 92f6cd40df..c6945f1e79 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -376,10 +376,13 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) /obj/effect/projectile/tracer/pointdefense + icon = 'icons/obj/projectiles_vr.dmi' icon_state = "beam_pointdef" /obj/effect/projectile/muzzle/pointdefense + icon = 'icons/obj/projectiles_vr.dmi' icon_state = "muzzle_pointdef" /obj/effect/projectile/impact/pointdefense + icon = 'icons/obj/projectiles_vr.dmi' icon_state = "impact_pointdef" diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 259c907bde..98ad80e468 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -71,7 +71,6 @@ /obj/machinery/recharge_station/proc/process_occupant() if(isrobot(occupant)) var/mob/living/silicon/robot/R = occupant - if(R.module) R.module.respawn_consumable(R, charging_power * CELLRATE / 250) //consumables are magical, apparently if(R.cell && !R.cell.fully_charged()) @@ -247,6 +246,10 @@ if(!R.cell) return + if(R.mob_size >= MOB_LARGE) + to_chat(R, SPAN_WARNING("You are too large to fit into \the [src].")) + return + add_fingerprint(R) R.reset_view(src) R.forceMove(src) diff --git a/code/game/machinery/telecomms/broadcaster_ch.dm b/code/game/machinery/telecomms/broadcaster_ch.dm new file mode 100644 index 0000000000..6875970519 --- /dev/null +++ b/code/game/machinery/telecomms/broadcaster_ch.dm @@ -0,0 +1,72 @@ +//This is meant for essentially linking a separate z-level to the rest with telecomms +/obj/machinery/telecomms/allinone/link + name = "Telecommunications Mainframe" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "allinone" + desc = "A compact machine used for portable subspace telecommuniations processing." + density = 1 + use_power = USE_POWER_IDLE + idle_power_usage = 20 + anchored = 1 + machinetype = 6 + produces_heat = 0 + +/obj/machinery/telecomms/allinone/link/receive_signal(datum/signal/signal) + + // Has to be on to receive messages + if(!on) + return + + // Why did you use this subtype? + if(!using_map.use_overmap) + return + + // Is there a valid signal + if(!signal) + return + + // Where are we able to hear from (and talk to, since we're AIO) anyway? + //var/map_levels = using_map.get_map_levels(z, TRUE, overmap_range) + + if("[signal.data["level"]]" == "[z]") + signal.data["level"] = list(0) + else + signal.data["level"] = list(z) + + if(is_freq_listening(signal)) // detect subspace signals + + signal.data["done"] = 1 // mark the signal as being broadcasted since we're a broadcaster + signal.data["compression"] = 0 // decompress since we're a processor + + if(signal.data["slow"] > 0) + sleep(signal.data["slow"]) // simulate the network lag if necessary + + /* ###### Broadcast a message using signal.data ###### */ + + var/datum/radio_frequency/connection = signal.data["connection"] + + var/list/forced_radios + for(var/weakref/wr in linked_radios_weakrefs) + var/obj/item/device/radio/R = wr.resolve() + if(istype(R)) + LAZYDISTINCTADD(forced_radios, R) + + Broadcast_Message( + signal.data["connection"], + signal.data["mob"], + signal.data["vmask"], + signal.data["vmessage"], + signal.data["radio"], + signal.data["message"], + signal.data["name"], + signal.data["job"], + signal.data["realname"], + signal.data["vname"], + DATA_NORMAL, + signal.data["compression"], + signal.data["level"], + connection.frequency, + signal.data["verb"], + signal.data["language"], + forced_radios + ) \ No newline at end of file diff --git a/code/game/machinery/transportpod.dm b/code/game/machinery/transportpod.dm index 0b499096fe..4a43cb1890 100644 --- a/code/game/machinery/transportpod.dm +++ b/code/game/machinery/transportpod.dm @@ -32,7 +32,7 @@ sleep(2) go_out() sleep(2) - del(src) + qdel(src) /obj/machinery/transportpod/relaymove(mob/user as mob) if(user.stat) diff --git a/code/game/machinery/vending_machines.dm b/code/game/machinery/vending_machines.dm index 10607011ce..76f0c04885 100644 --- a/code/game/machinery/vending_machines.dm +++ b/code/game/machinery/vending_machines.dm @@ -71,6 +71,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/jager = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale/hushedwhisper = 15, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15, @@ -302,6 +303,7 @@ /obj/item/weapon/storage/fancy/cigarettes/jerichos = 10, /obj/item/weapon/storage/fancy/cigarettes/menthols = 10, /obj/item/weapon/storage/rollingpapers = 10, + /obj/item/weapon/storage/rollingpapers/blunt = 10, /obj/item/weapon/storage/chewables/tobacco = 5, /obj/item/weapon/storage/chewables/tobacco/fine = 5, /obj/item/weapon/storage/box/matches = 10, @@ -330,6 +332,7 @@ /obj/item/weapon/storage/fancy/cigarettes/jerichos = 22, /obj/item/weapon/storage/fancy/cigarettes/menthols = 18, /obj/item/weapon/storage/rollingpapers = 10, + /obj/item/weapon/storage/rollingpapers/blunt = 20, /obj/item/weapon/storage/chewables/tobacco = 10, /obj/item/weapon/storage/chewables/tobacco/fine = 20, /obj/item/weapon/storage/box/matches = 1, diff --git a/code/game/machinery/vending_machines_vr.dm b/code/game/machinery/vending_machines_vr.dm index 3c826b469e..7573e19a6a 100644 --- a/code/game/machinery/vending_machines_vr.dm +++ b/code/game/machinery/vending_machines_vr.dm @@ -249,1343 +249,6 @@ prices = list(/obj/item/device/flash = 600,/obj/item/weapon/reagent_containers/spray/pepper = 800, /obj/item/weapon/gun/projectile/olivaw = 1600, /obj/item/weapon/gun/projectile/giskard = 1200, /obj/item/ammo_magazine/mg/cl32/rubber = 200) */ -/obj/machinery/vending/fitness/New() - products += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 8) - prices += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 5) - ..() - -/obj/machinery/vending/blood - name = "Blood-Onator" - desc = "Freezer-vendor for storage and quick dispensing of blood packs" - product_ads = "The true life juice!;Vampire's choice!;Home-grown blood only!;Donate today, be saved tomorrow!;Approved by Zeng-Hu Pharmaceuticals Incorporated!; Curse you, Vey-Med artificial blood!" - icon = 'icons/obj/vending_vr.dmi' - icon_state = "blood" - vend_delay = 7 - idle_power_usage = 211 - req_access = list(access_medical) - products = list(/obj/item/weapon/reagent_containers/blood/prelabeled/APlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/AMinus = 3, - /obj/item/weapon/reagent_containers/blood/prelabeled/BPlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/BMinus = 3, - /obj/item/weapon/reagent_containers/blood/prelabeled/OPlus = 2,/obj/item/weapon/reagent_containers/blood/prelabeled/OMinus = 5, - /obj/item/weapon/reagent_containers/blood/empty = 5) - contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 2) - req_log_access = access_cmo - has_logs = 1 - -/obj/machinery/vending/loadout - name = "Fingers and Toes" - desc = "A special vendor for gloves and shoes!" - product_ads = "Do you have fingers and toes? COVER THEM UP!;Show me your toes! Wait. NO DON'T! BUY NEW SHOES!;Don't leave prints, BUY SOME GLOVES!;Remember to check your shoes for micros! You don't have to let them out, but just check for them!;Fingers and Toes is not liable for micro entrapment or abuse under the feet of our patrons.!;This little piggy went WE WE WE all the way down to FINGERS AND TOES to pick up some sweet new gloves and shoes." - icon = 'icons/obj/vending_vr.dmi' - icon_state = "glovesnshoes" - products = list(/obj/item/clothing/gloves/evening = 5, - /obj/item/clothing/gloves/fingerless = 5, - /obj/item/clothing/gloves/black = 5, - /obj/item/clothing/gloves/blue = 5, - /obj/item/clothing/gloves/brown = 5, - /obj/item/clothing/gloves/color = 5, - /obj/item/clothing/gloves/green = 5, - /obj/item/clothing/gloves/grey = 5, - /obj/item/clothing/gloves/sterile/latex = 5, - /obj/item/clothing/gloves/light_brown = 5, - /obj/item/clothing/gloves/sterile/nitrile = 5, - /obj/item/clothing/gloves/orange = 5, - /obj/item/clothing/gloves/purple = 5, - /obj/item/clothing/gloves/red = 5, - /obj/item/clothing/gloves/fluff/siren = 5, - /obj/item/clothing/gloves/white = 5, - /obj/item/clothing/gloves/duty = 5, - /obj/item/clothing/shoes/athletic = 5, - /obj/item/clothing/shoes/boots/fluff/siren = 5, - /obj/item/clothing/shoes/slippers = 5, - /obj/item/clothing/shoes/boots/cowboy/classic = 5, - /obj/item/clothing/shoes/boots/cowboy = 5, - /obj/item/clothing/shoes/boots/duty = 5, - /obj/item/clothing/shoes/flats/white/color = 5, - /obj/item/clothing/shoes/flipflop = 5, - /obj/item/clothing/shoes/heels = 5, - /obj/item/clothing/shoes/hitops/black = 5, - /obj/item/clothing/shoes/hitops/blue = 5, - /obj/item/clothing/shoes/hitops/green = 5, - /obj/item/clothing/shoes/hitops/orange = 5, - /obj/item/clothing/shoes/hitops/purple = 5, - /obj/item/clothing/shoes/hitops/red = 5, - /obj/item/clothing/shoes/flats/white/color = 5, - /obj/item/clothing/shoes/hitops/yellow = 5, - /obj/item/clothing/shoes/boots/jackboots = 5, - /obj/item/clothing/shoes/boots/jungle = 5, - /obj/item/clothing/shoes/black/cuffs = 5, - /obj/item/clothing/shoes/black/cuffs/blue = 5, - /obj/item/clothing/shoes/black/cuffs/red = 5, - /obj/item/clothing/shoes/sandal = 5, - /obj/item/clothing/shoes/black = 5, - /obj/item/clothing/shoes/blue = 5, - /obj/item/clothing/shoes/brown = 5, - /obj/item/clothing/shoes/laceup = 5, - /obj/item/clothing/shoes/green = 5, - /obj/item/clothing/shoes/laceup/brown = 5, - /obj/item/clothing/shoes/orange = 5, - /obj/item/clothing/shoes/purple = 5, - /obj/item/clothing/shoes/red = 5, - /obj/item/clothing/shoes/white = 5, - /obj/item/clothing/shoes/yellow = 5, - /obj/item/clothing/shoes/skater = 5, - /obj/item/clothing/shoes/boots/cowboy/snakeskin = 5, - /obj/item/clothing/shoes/boots/jackboots/toeless = 5, - /obj/item/clothing/shoes/boots/workboots/toeless = 5, - /obj/item/clothing/shoes/boots/winter = 5, - /obj/item/clothing/shoes/boots/workboots = 5, - /obj/item/clothing/shoes/footwraps = 5) - prices = list(/obj/item/clothing/gloves/evening = 50, - /obj/item/clothing/gloves/fingerless = 50, - /obj/item/clothing/gloves/black = 50, - /obj/item/clothing/gloves/blue = 50, - /obj/item/clothing/gloves/brown = 50, - /obj/item/clothing/gloves/color = 50, - /obj/item/clothing/gloves/green = 50, - /obj/item/clothing/gloves/grey = 50, - /obj/item/clothing/gloves/sterile/latex = 100, - /obj/item/clothing/gloves/light_brown = 50, - /obj/item/clothing/gloves/sterile/nitrile = 100, - /obj/item/clothing/gloves/orange = 50, - /obj/item/clothing/gloves/purple = 50, - /obj/item/clothing/gloves/red = 50, - /obj/item/clothing/gloves/fluff/siren = 50, - /obj/item/clothing/gloves/white = 50, - /obj/item/clothing/gloves/duty = 150, - /obj/item/clothing/shoes/athletic = 50, - /obj/item/clothing/shoes/boots/fluff/siren = 50, - /obj/item/clothing/shoes/slippers = 50, - /obj/item/clothing/shoes/boots/cowboy/classic = 50, - /obj/item/clothing/shoes/boots/cowboy = 50, - /obj/item/clothing/shoes/boots/duty = 100, - /obj/item/clothing/shoes/flats/white/color = 50, - /obj/item/clothing/shoes/flipflop = 50, - /obj/item/clothing/shoes/heels = 50, - /obj/item/clothing/shoes/hitops/black = 50, - /obj/item/clothing/shoes/hitops/blue = 50, - /obj/item/clothing/shoes/hitops/green = 50, - /obj/item/clothing/shoes/hitops/orange = 50, - /obj/item/clothing/shoes/hitops/purple = 50, - /obj/item/clothing/shoes/hitops/red = 50, - /obj/item/clothing/shoes/flats/white/color = 50, - /obj/item/clothing/shoes/hitops/yellow = 50, - /obj/item/clothing/shoes/boots/jackboots = 50, - /obj/item/clothing/shoes/boots/jungle = 100, - /obj/item/clothing/shoes/black/cuffs = 50, - /obj/item/clothing/shoes/black/cuffs/blue = 50, - /obj/item/clothing/shoes/black/cuffs/red = 50, - /obj/item/clothing/shoes/sandal = 50, - /obj/item/clothing/shoes/black = 50, - /obj/item/clothing/shoes/blue = 50, - /obj/item/clothing/shoes/brown = 50, - /obj/item/clothing/shoes/laceup = 50, - /obj/item/clothing/shoes/green = 50, - /obj/item/clothing/shoes/laceup/brown = 50, - /obj/item/clothing/shoes/orange = 50, - /obj/item/clothing/shoes/purple = 50, - /obj/item/clothing/shoes/red = 50, - /obj/item/clothing/shoes/white = 50, - /obj/item/clothing/shoes/yellow = 50, - /obj/item/clothing/shoes/skater = 50, - /obj/item/clothing/shoes/boots/cowboy/snakeskin = 50, - /obj/item/clothing/shoes/boots/jackboots/toeless = 50, - /obj/item/clothing/shoes/boots/workboots/toeless = 50, - /obj/item/clothing/shoes/boots/winter = 50, - /obj/item/clothing/shoes/boots/workboots = 50, - /obj/item/clothing/shoes/footwraps = 50) - premium = list(/obj/item/clothing/gloves/rainbow = 1, - /obj/item/clothing/shoes/rainbow = 1,) - contraband = list(/obj/item/clothing/shoes/syndigaloshes = 1, - /obj/item/clothing/shoes/clown_shoes = 1) - -/obj/machinery/vending/loadout/uniform - name = "The Basics" - desc = "A vendor using compressed matter cartridges to store large amounts of basic station uniforms." - product_ads = "Don't get caught naked!;Pick up your uniform!;Using compressed matter cartridges and VERY ETHICAL labor practices, we bring you the uniforms you need!;No uniform? No problem!;We've got your covered!;The Basics is not responsible for being crushed under the amount of things inside our machines. DO NOT VEND IN EXCESS!!" - icon_state = "loadout" - vend_delay = 16 - products = list(/obj/item/device/pda = 50, - /obj/item/device/radio/headset = 50, - /obj/item/weapon/storage/backpack/ = 10, - /obj/item/weapon/storage/backpack/messenger = 10, - /obj/item/weapon/storage/backpack/satchel = 10, - /obj/item/clothing/under/color = 5, - /obj/item/clothing/under/color/aqua = 5, - /obj/item/clothing/under/color/black = 5, - /obj/item/clothing/under/color/blackjumpskirt = 5, - /obj/item/clothing/under/color/blue = 5, - /obj/item/clothing/under/color/brown = 5, - /obj/item/clothing/under/color/green = 5, - /obj/item/clothing/under/color/grey = 5, - /obj/item/clothing/under/color/orange = 5, - /obj/item/clothing/under/color/pink = 5, - /obj/item/clothing/under/color/red = 5, - /obj/item/clothing/under/color/white = 5, - /obj/item/clothing/under/color/yellow = 5, - /obj/item/clothing/shoes/black = 20, - /obj/item/clothing/shoes/white = 20) - prices = list() - -/obj/machinery/vending/loadout/accessory - name = "Looty Inc." - desc = "A special vendor for accessories." - product_ads = "Want shinies? We have the shinies.;Need that special something to complete your outfit? We have what you need!;Ditch that old dull dangly something you've got and pick up one of our shinies!;Bracelets, collars, scarfs rings and more! We have the fancy things you need!;Does your pet need a collar? We don't judge! Keep them in line with one of one of ours!;Top of the line materials! 'Hand crafted' goods!" - icon_state = "accessory" - vend_delay = 6 - products = list(/obj/item/clothing/accessory = 5, - /obj/item/clothing/accessory/armband/med/color = 10, - /obj/item/clothing/accessory/asymmetric = 5, - /obj/item/clothing/accessory/asymmetric/purple = 5, - /obj/item/clothing/accessory/asymmetric/green = 5, - /obj/item/clothing/accessory/bracelet = 5, - /obj/item/clothing/accessory/bracelet/material = 5, - /obj/item/clothing/accessory/bracelet/friendship = 5, - /obj/item/clothing/accessory/chaps = 5, - /obj/item/clothing/accessory/chaps/black = 5, - /obj/item/weapon/storage/briefcase/clutch = 1, - /obj/item/clothing/accessory/collar = 5, - /obj/item/clothing/accessory/collar/bell = 5, - /obj/item/clothing/accessory/collar/spike = 5, - /obj/item/clothing/accessory/collar/pink = 5, - /obj/item/clothing/accessory/collar/holo = 5, - /obj/item/clothing/accessory/collar/shock = 5, - /obj/item/weapon/storage/belt/fannypack = 1, - /obj/item/weapon/storage/belt/fannypack/white = 5, - /obj/item/clothing/accessory/fullcape = 5, - /obj/item/clothing/accessory/halfcape = 5, - /obj/item/clothing/accessory/hawaii = 5, - /obj/item/clothing/accessory/hawaii/random = 5, - /obj/item/clothing/accessory/locket = 5, - /obj/item/weapon/storage/backpack/purse = 1, - /obj/item/clothing/accessory/sash = 5, - /obj/item/clothing/accessory/scarf = 5, - /obj/item/clothing/accessory/scarf/red = 5, - /obj/item/clothing/accessory/scarf/darkblue = 5, - /obj/item/clothing/accessory/scarf/purple = 5, - /obj/item/clothing/accessory/scarf/yellow = 5, - /obj/item/clothing/accessory/scarf/orange = 5, - /obj/item/clothing/accessory/scarf/lightblue = 5, - /obj/item/clothing/accessory/scarf/white = 5, - /obj/item/clothing/accessory/scarf/black = 5, - /obj/item/clothing/accessory/scarf/zebra = 5, - /obj/item/clothing/accessory/scarf/christmas = 5, - /obj/item/clothing/accessory/scarf/stripedred = 5, - /obj/item/clothing/accessory/scarf/stripedgreen = 5, - /obj/item/clothing/accessory/scarf/stripedblue = 5, - /obj/item/clothing/accessory/jacket = 5, - /obj/item/clothing/accessory/jacket/checkered = 5, - /obj/item/clothing/accessory/jacket/burgundy = 5, - /obj/item/clothing/accessory/jacket/navy = 5, - /obj/item/clothing/accessory/jacket/charcoal = 5, - /obj/item/clothing/accessory/vest = 5, - /obj/item/clothing/accessory/sweater = 5, - /obj/item/clothing/accessory/sweater/pink = 5, - /obj/item/clothing/accessory/sweater/mint = 5, - /obj/item/clothing/accessory/sweater/blue = 5, - /obj/item/clothing/accessory/sweater/heart = 5, - /obj/item/clothing/accessory/sweater/nt = 5, - /obj/item/clothing/accessory/sweater/keyhole = 5, - /obj/item/clothing/accessory/sweater/winterneck = 5, - /obj/item/clothing/accessory/sweater/uglyxmas = 5, - /obj/item/clothing/accessory/sweater/flowersweater = 5, - /obj/item/clothing/accessory/sweater/redneck = 5, - /obj/item/clothing/accessory/tie = 5, - /obj/item/clothing/accessory/tie/horrible = 5, - /obj/item/clothing/accessory/tie/white = 5, - /obj/item/clothing/accessory/tie/navy = 5, - /obj/item/clothing/accessory/tie/yellow = 5, - /obj/item/clothing/accessory/tie/darkgreen = 5, - /obj/item/clothing/accessory/tie/black = 5, - /obj/item/clothing/accessory/tie/red_long = 5, - /obj/item/clothing/accessory/tie/red_clip = 5, - /obj/item/clothing/accessory/tie/blue_long = 5, - /obj/item/clothing/accessory/tie/blue_clip = 5, - /obj/item/clothing/accessory/tie/red = 5, - /obj/item/clothing/accessory/wcoat = 5, - /obj/item/clothing/accessory/wcoat/red = 5, - /obj/item/clothing/accessory/wcoat/grey = 5, - /obj/item/clothing/accessory/wcoat/brown = 5, - /obj/item/clothing/accessory/wcoat/gentleman = 5, - /obj/item/clothing/accessory/wcoat/swvest = 5, - /obj/item/clothing/accessory/wcoat/swvest/blue = 5, - /obj/item/clothing/accessory/wcoat/swvest/red = 5, - /obj/item/weapon/storage/wallet = 5, - /obj/item/weapon/storage/wallet/poly = 5, - /obj/item/weapon/storage/wallet/womens = 5, - /obj/item/weapon/lipstick = 5, - /obj/item/weapon/lipstick/purple = 5, - /obj/item/weapon/lipstick/jade = 5, - /obj/item/weapon/lipstick/black = 5, - /obj/item/clothing/ears/earmuffs = 5, - /obj/item/clothing/ears/earmuffs/headphones = 5, - /obj/item/clothing/ears/earring/stud = 5, - /obj/item/clothing/ears/earring/dangle = 5, - /obj/item/clothing/gloves/ring/mariner = 5, - /obj/item/clothing/gloves/ring/engagement = 5, - /obj/item/clothing/gloves/ring/seal/signet = 5, - /obj/item/clothing/gloves/ring/seal/mason = 5, - /obj/item/clothing/gloves/ring/material/plastic = 5, - /obj/item/clothing/gloves/ring/material/steel = 5, - /obj/item/clothing/gloves/ring/material/gold = 5, - /obj/item/clothing/glasses/eyepatch = 5, - /obj/item/clothing/glasses/gglasses = 5, - /obj/item/clothing/glasses/regular/hipster = 5, - /obj/item/clothing/glasses/rimless = 5, - /obj/item/clothing/glasses/thin = 5, - /obj/item/clothing/glasses/monocle = 5, - /obj/item/clothing/glasses/goggles = 5, - /obj/item/clothing/glasses/fluff/spiffygogs = 5, - /obj/item/clothing/glasses/fakesunglasses = 5, - /obj/item/clothing/glasses/fakesunglasses/aviator = 5, - /obj/item/clothing/mask/bandana/blue = 5, - /obj/item/clothing/mask/bandana/gold = 5, - /obj/item/clothing/mask/bandana/green = 5, - /obj/item/clothing/mask/bandana/red = 5, - /obj/item/clothing/mask/surgical = 5) - prices = list(/obj/item/clothing/accessory = 50, - /obj/item/clothing/accessory/armband/med/color = 50, - /obj/item/clothing/accessory/asymmetric = 50, - /obj/item/clothing/accessory/asymmetric/purple = 50, - /obj/item/clothing/accessory/asymmetric/green = 50, - /obj/item/clothing/accessory/bracelet = 50, - /obj/item/clothing/accessory/bracelet/material = 50, - /obj/item/clothing/accessory/bracelet/friendship = 50, - /obj/item/clothing/accessory/chaps = 50, - /obj/item/clothing/accessory/chaps/black = 50, - /obj/item/weapon/storage/briefcase/clutch = 50, - /obj/item/clothing/accessory/collar = 50, - /obj/item/clothing/accessory/collar/bell = 50, - /obj/item/clothing/accessory/collar/spike = 50, - /obj/item/clothing/accessory/collar/pink = 50, - /obj/item/clothing/accessory/collar/holo = 50, - /obj/item/clothing/accessory/collar/shock = 50, - /obj/item/weapon/storage/belt/fannypack = 50, - /obj/item/weapon/storage/belt/fannypack/white = 50, - /obj/item/clothing/accessory/fullcape = 50, - /obj/item/clothing/accessory/halfcape = 50, - /obj/item/clothing/accessory/hawaii = 50, - /obj/item/clothing/accessory/hawaii/random = 50, - /obj/item/clothing/accessory/locket = 50, - /obj/item/weapon/storage/backpack/purse = 50, - /obj/item/clothing/accessory/sash = 50, - /obj/item/clothing/accessory/scarf = 5, - /obj/item/clothing/accessory/scarf/red = 50, - /obj/item/clothing/accessory/scarf/darkblue = 50, - /obj/item/clothing/accessory/scarf/purple = 50, - /obj/item/clothing/accessory/scarf/yellow = 100, - /obj/item/clothing/accessory/scarf/orange = 50, - /obj/item/clothing/accessory/scarf/lightblue = 50, - /obj/item/clothing/accessory/scarf/white = 50, - /obj/item/clothing/accessory/scarf/black = 50, - /obj/item/clothing/accessory/scarf/zebra = 50, - /obj/item/clothing/accessory/scarf/christmas = 50, - /obj/item/clothing/accessory/scarf/stripedred = 50, - /obj/item/clothing/accessory/scarf/stripedgreen = 50, - /obj/item/clothing/accessory/scarf/stripedblue = 50, - /obj/item/clothing/accessory/jacket = 50, - /obj/item/clothing/accessory/jacket/checkered = 50, - /obj/item/clothing/accessory/jacket/burgundy = 50, - /obj/item/clothing/accessory/jacket/navy = 50, - /obj/item/clothing/accessory/jacket/charcoal = 50, - /obj/item/clothing/accessory/vest = 50, - /obj/item/clothing/accessory/sweater = 50, - /obj/item/clothing/accessory/sweater/pink = 50, - /obj/item/clothing/accessory/sweater/mint = 50, - /obj/item/clothing/accessory/sweater/blue = 50, - /obj/item/clothing/accessory/sweater/heart = 50, - /obj/item/clothing/accessory/sweater/nt = 5, - /obj/item/clothing/accessory/sweater/keyhole = 50, - /obj/item/clothing/accessory/sweater/winterneck = 50, - /obj/item/clothing/accessory/sweater/uglyxmas = 5, - /obj/item/clothing/accessory/sweater/flowersweater = 50, - /obj/item/clothing/accessory/sweater/redneck = 50, - /obj/item/clothing/accessory/tie = 50, - /obj/item/clothing/accessory/tie/horrible = 50, - /obj/item/clothing/accessory/tie/white = 50, - /obj/item/clothing/accessory/tie/navy = 50, - /obj/item/clothing/accessory/tie/yellow = 50, - /obj/item/clothing/accessory/tie/darkgreen = 50, - /obj/item/clothing/accessory/tie/black = 50, - /obj/item/clothing/accessory/tie/red_long = 50, - /obj/item/clothing/accessory/tie/red_clip = 50, - /obj/item/clothing/accessory/tie/blue_long = 50, - /obj/item/clothing/accessory/tie/blue_clip = 50, - /obj/item/clothing/accessory/tie/red = 50, - /obj/item/clothing/accessory/wcoat = 50, - /obj/item/clothing/accessory/wcoat/red = 50, - /obj/item/clothing/accessory/wcoat/grey = 50, - /obj/item/clothing/accessory/wcoat/brown = 50, - /obj/item/clothing/accessory/wcoat/gentleman = 50, - /obj/item/clothing/accessory/wcoat/swvest = 50, - /obj/item/clothing/accessory/wcoat/swvest/blue = 50, - /obj/item/clothing/accessory/wcoat/swvest/red = 50, - /obj/item/weapon/storage/wallet = 50, - /obj/item/weapon/storage/wallet/poly = 50, - /obj/item/weapon/storage/wallet/womens = 50, - /obj/item/weapon/lipstick = 50, - /obj/item/weapon/lipstick/purple = 50, - /obj/item/weapon/lipstick/jade = 50, - /obj/item/weapon/lipstick/black = 50, - /obj/item/clothing/ears/earmuffs = 50, - /obj/item/clothing/ears/earmuffs/headphones = 50, - /obj/item/clothing/ears/earring/stud = 50, - /obj/item/clothing/ears/earring/dangle = 50, - /obj/item/clothing/gloves/ring/mariner = 50, - /obj/item/clothing/gloves/ring/engagement = 50, - /obj/item/clothing/gloves/ring/seal/signet = 50, - /obj/item/clothing/gloves/ring/seal/mason = 50, - /obj/item/clothing/gloves/ring/material/plastic = 50, - /obj/item/clothing/gloves/ring/material/steel = 50, - /obj/item/clothing/gloves/ring/material/gold = 100, - /obj/item/clothing/glasses/eyepatch = 50, - /obj/item/clothing/glasses/gglasses = 50, - /obj/item/clothing/glasses/regular/hipster = 50, - /obj/item/clothing/glasses/rimless = 50, - /obj/item/clothing/glasses/thin = 50, - /obj/item/clothing/glasses/monocle = 50, - /obj/item/clothing/glasses/goggles = 50, - /obj/item/clothing/glasses/fluff/spiffygogs = 50, - /obj/item/clothing/glasses/fakesunglasses = 50, - /obj/item/clothing/glasses/fakesunglasses/aviator = 50, - /obj/item/clothing/mask/bandana/blue = 50, - /obj/item/clothing/mask/bandana/gold = 50, - /obj/item/clothing/mask/bandana/green = 50, - /obj/item/clothing/mask/bandana/red = 50, - /obj/item/clothing/mask/surgical = 50) - premium = list(/obj/item/weapon/bedsheet/rainbow = 1) - contraband = list(/obj/item/clothing/mask/gas/clown_hat = 1) - -/obj/machinery/vending/loadout/clothing - name = "General Jump" - desc = "A special vendor using compressed matter cartridges to store large amounts of clothing." - product_ads = "Tired of your grey jumpsuit? Spruce yourself up!;We have the outfit for you!;Don't let that grey jumpsuit get you down, get a ROBUST outfit right now!;Using compressed matter catridges and VERY ETHICAL labor practices to bring YOU the clothing you crave!;Are you sure you want to go to work in THAT?;All of our wares have a whole TWO pockets!" - icon_state = "clothing" - vend_delay = 16 - products = list(/obj/item/clothing/under/bathrobe = 5, - /obj/item/clothing/under/dress/black_corset = 5, - /obj/item/clothing/under/blazer = 5, - /obj/item/clothing/under/blazer/skirt = 5, - /obj/item/clothing/under/cheongsam = 5, - /obj/item/clothing/under/cheongsam/red = 5, - /obj/item/clothing/under/cheongsam/blue = 5, - /obj/item/clothing/under/cheongsam/black = 5, - /obj/item/clothing/under/cheongsam/darkred = 5, - /obj/item/clothing/under/cheongsam/green = 5, - /obj/item/clothing/under/cheongsam/purple = 5, - /obj/item/clothing/under/cheongsam/darkblue = 5, - /obj/item/clothing/under/croptop = 5, - /obj/item/clothing/under/croptop/red = 5, - /obj/item/clothing/under/croptop/grey = 5, - /obj/item/clothing/under/cuttop = 5, - /obj/item/clothing/under/cuttop/red = 5, - /obj/item/clothing/under/suit_jacket/female/skirt = 5, - /obj/item/clothing/under/dress/dress_fire = 5, - /obj/item/clothing/under/dress/flamenco = 5, - /obj/item/clothing/under/dress/flower_dress = 5, - /obj/item/clothing/under/fluff/gnshorts = 5, - /obj/item/clothing/under/color = 5, - /obj/item/clothing/under/color/aqua = 5, - /obj/item/clothing/under/color/black = 5, - /obj/item/clothing/under/color/blackf = 5, - /obj/item/clothing/under/color/blackjumpskirt = 5, - /obj/item/clothing/under/color/blue = 5, - /obj/item/clothing/under/color/brown = 5, - /obj/item/clothing/under/color/darkblue = 5, - /obj/item/clothing/under/color/darkred = 5, - /obj/item/clothing/under/color/green = 5, - /obj/item/clothing/under/color/grey = 5, - /obj/item/clothing/under/color/lightblue = 5, - /obj/item/clothing/under/color/lightbrown = 5, - /obj/item/clothing/under/color/lightgreen = 5, - /obj/item/clothing/under/color/lightpurple = 5, - /obj/item/clothing/under/color/lightred = 5, - /obj/item/clothing/under/color/orange = 5, - /obj/item/clothing/under/color/pink = 5, - /obj/item/clothing/under/color/prison = 5, - /obj/item/clothing/under/color/ranger = 5, - /obj/item/clothing/under/color/red = 5, - /obj/item/clothing/under/color/white = 5, - /obj/item/clothing/under/color/yellow = 5, - /obj/item/clothing/under/color/yellowgreen = 5, - /obj/item/clothing/under/aether = 5, - /obj/item/clothing/under/focal = 5, - /obj/item/clothing/under/hephaestus = 5, - /obj/item/clothing/under/wardt = 5, - /obj/item/clothing/under/kilt = 5, - /obj/item/clothing/under/fluff/latexmaid = 5, - /obj/item/clothing/under/dress/lilacdress = 5, - /obj/item/clothing/under/dress/white2 = 5, - /obj/item/clothing/under/dress/white4 = 5, - /obj/item/clothing/under/dress/maid = 5, - /obj/item/clothing/under/dress/maid/sexy = 5, - /obj/item/clothing/under/dress/maid/janitor = 5, - /obj/item/clothing/under/moderncoat = 5, - /obj/item/clothing/under/permit = 5, - /obj/item/clothing/under/oldwoman = 5, - /obj/item/clothing/under/frontier = 5, - /obj/item/clothing/under/mbill = 5, - /obj/item/clothing/under/pants/baggy/ = 5, - /obj/item/clothing/under/pants/baggy/classicjeans = 5, - /obj/item/clothing/under/pants/baggy/mustangjeans = 5, - /obj/item/clothing/under/pants/baggy/blackjeans = 5, - /obj/item/clothing/under/pants/baggy/greyjeans = 5, - /obj/item/clothing/under/pants/baggy/youngfolksjeans = 5, - /obj/item/clothing/under/pants/baggy/white = 5, - /obj/item/clothing/under/pants/baggy/red = 5, - /obj/item/clothing/under/pants/baggy/black = 5, - /obj/item/clothing/under/pants/baggy/tan = 5, - /obj/item/clothing/under/pants/baggy/track = 5, - /obj/item/clothing/under/pants/baggy/khaki = 5, - /obj/item/clothing/under/pants/baggy/camo = 5, - /obj/item/clothing/under/pants/utility/ = 5, - /obj/item/clothing/under/pants/utility/orange = 5, - /obj/item/clothing/under/pants/utility/blue = 5, - /obj/item/clothing/under/pants/utility/white = 5, - /obj/item/clothing/under/pants/utility/red = 5, - /obj/item/clothing/under/pants/chaps = 5, - /obj/item/clothing/under/pants/chaps/black = 5, - /obj/item/clothing/under/pants/track = 5, - /obj/item/clothing/under/pants/track/red = 5, - /obj/item/clothing/under/pants/track/white = 5, - /obj/item/clothing/under/pants/track/green = 5, - /obj/item/clothing/under/pants/track/blue = 5, - /obj/item/clothing/under/pants/yogapants = 5, - /obj/item/clothing/under/ascetic = 5, - /obj/item/clothing/under/dress/white3 = 5, - /obj/item/clothing/under/skirt/pleated = 5, - /obj/item/clothing/under/dress/darkred = 5, - /obj/item/clothing/under/dress/redeveninggown = 5, - /obj/item/clothing/under/dress/red_swept_dress = 5, - /obj/item/clothing/under/dress/sailordress = 5, - /obj/item/clothing/under/dress/sari = 5, - /obj/item/clothing/under/dress/sari/green = 5, - /obj/item/clothing/under/dress/qipao = 5, - /obj/item/clothing/under/dress/qipao/red = 5, - /obj/item/clothing/under/dress/qipao/white = 5, - /obj/item/clothing/under/shorts/red = 5, - /obj/item/clothing/under/shorts/green = 5, - /obj/item/clothing/under/shorts/blue = 5, - /obj/item/clothing/under/shorts/black = 5, - /obj/item/clothing/under/shorts/grey = 5, - /obj/item/clothing/under/shorts/white = 5, - /obj/item/clothing/under/shorts/jeans = 5, - /obj/item/clothing/under/shorts/jeans/ = 5, - /obj/item/clothing/under/shorts/jeans/classic = 5, - /obj/item/clothing/under/shorts/jeans/mustang = 5, - /obj/item/clothing/under/shorts/jeans/youngfolks = 5, - /obj/item/clothing/under/shorts/jeans/black = 5, - /obj/item/clothing/under/shorts/jeans/grey = 5, - /obj/item/clothing/under/shorts/khaki/ = 5, - /obj/item/clothing/under/skirt/loincloth = 5, - /obj/item/clothing/under/skirt/khaki = 5, - /obj/item/clothing/under/skirt/blue = 5, - /obj/item/clothing/under/skirt/red = 5, - /obj/item/clothing/under/skirt/denim = 5, - /obj/item/clothing/under/skirt/pleated = 5, - /obj/item/clothing/under/skirt/outfit/plaid_blue = 5, - /obj/item/clothing/under/skirt/outfit/plaid_red = 5, - /obj/item/clothing/under/skirt/outfit/plaid_purple = 5, - /obj/item/clothing/under/overalls/sleek = 5, - /obj/item/clothing/under/sl_suit = 5, - /obj/item/clothing/under/gentlesuit = 5, - /obj/item/clothing/under/gentlesuit/skirt = 5, - /obj/item/clothing/under/suit_jacket = 5, - /obj/item/clothing/under/suit_jacket/really_black/skirt = 5, - /obj/item/clothing/under/suit_jacket/really_black = 5, - /obj/item/clothing/under/suit_jacket/female/skirt = 5, - /obj/item/clothing/under/suit_jacket/female/ = 5, - /obj/item/clothing/under/suit_jacket/red = 5, - /obj/item/clothing/under/suit_jacket/red/skirt = 5, - /obj/item/clothing/under/suit_jacket/charcoal = 5, - /obj/item/clothing/under/suit_jacket/charcoal/skirt = 5, - /obj/item/clothing/under/suit_jacket/navy = 5, - /obj/item/clothing/under/suit_jacket/navy/skirt = 5, - /obj/item/clothing/under/suit_jacket/burgundy = 5, - /obj/item/clothing/under/suit_jacket/burgundy/skirt = 5, - /obj/item/clothing/under/suit_jacket/checkered = 5, - /obj/item/clothing/under/suit_jacket/checkered/skirt = 5, - /obj/item/clothing/under/suit_jacket/tan = 5, - /obj/item/clothing/under/suit_jacket/tan/skirt = 5, - /obj/item/clothing/under/scratch = 5, - /obj/item/clothing/under/scratch/skirt = 5, - /obj/item/clothing/under/sundress = 5, - /obj/item/clothing/under/sundress_white = 5, - /obj/item/clothing/under/rank/psych/turtleneck/sweater = 5, - /obj/item/weapon/storage/box/fluff/swimsuit = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/blue = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/purple = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/green = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/red = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/white = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/earth = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/science = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/security = 5, - /obj/item/weapon/storage/box/fluff/swimsuit/medical = 5, - /obj/item/clothing/under/utility = 5, - /obj/item/clothing/under/utility/grey = 5, - /obj/item/clothing/under/utility/blue = 5, - /obj/item/clothing/under/fluff/v_nanovest = 5, - /obj/item/clothing/under/dress/westernbustle = 5, - /obj/item/clothing/under/wedding/bride_white = 5, - /obj/item/weapon/storage/backpack/ = 5, - /obj/item/weapon/storage/backpack/messenger = 5, - /obj/item/weapon/storage/backpack/satchel = 5) - prices = list(/obj/item/clothing/under/bathrobe = 50, - /obj/item/clothing/under/dress/black_corset = 50, - /obj/item/clothing/under/blazer = 50, - /obj/item/clothing/under/blazer/skirt = 50, - /obj/item/clothing/under/cheongsam = 50, - /obj/item/clothing/under/cheongsam/red = 50, - /obj/item/clothing/under/cheongsam/blue = 50, - /obj/item/clothing/under/cheongsam/black = 50, - /obj/item/clothing/under/cheongsam/darkred = 50, - /obj/item/clothing/under/cheongsam/green = 50, - /obj/item/clothing/under/cheongsam/purple = 50, - /obj/item/clothing/under/cheongsam/darkblue = 50, - /obj/item/clothing/under/croptop = 50, - /obj/item/clothing/under/croptop/red = 50, - /obj/item/clothing/under/croptop/grey = 50, - /obj/item/clothing/under/cuttop = 50, - /obj/item/clothing/under/cuttop/red = 50, - /obj/item/clothing/under/suit_jacket/female/skirt = 50, - /obj/item/clothing/under/dress/dress_fire = 50, - /obj/item/clothing/under/dress/flamenco = 50, - /obj/item/clothing/under/dress/flower_dress = 50, - /obj/item/clothing/under/fluff/gnshorts = 50, - /obj/item/clothing/under/color = 50, - /obj/item/clothing/under/color/aqua = 50, - /obj/item/clothing/under/color/black = 50, - /obj/item/clothing/under/color/blackf = 50, - /obj/item/clothing/under/color/blackjumpskirt = 50, - /obj/item/clothing/under/color/blue = 50, - /obj/item/clothing/under/color/brown = 50, - /obj/item/clothing/under/color/darkblue = 50, - /obj/item/clothing/under/color/darkred = 50, - /obj/item/clothing/under/color/green = 50, - /obj/item/clothing/under/color/grey = 50, - /obj/item/clothing/under/color/lightblue = 50, - /obj/item/clothing/under/color/lightbrown = 50, - /obj/item/clothing/under/color/lightgreen = 50, - /obj/item/clothing/under/color/lightpurple = 50, - /obj/item/clothing/under/color/lightred = 50, - /obj/item/clothing/under/color/orange = 50, - /obj/item/clothing/under/color/pink = 50, - /obj/item/clothing/under/color/prison = 50, - /obj/item/clothing/under/color/ranger = 50, - /obj/item/clothing/under/color/red = 50, - /obj/item/clothing/under/color/white = 50, - /obj/item/clothing/under/color/yellow = 50, - /obj/item/clothing/under/color/yellowgreen = 50, - /obj/item/clothing/under/aether = 50, - /obj/item/clothing/under/focal = 50, - /obj/item/clothing/under/hephaestus = 50, - /obj/item/clothing/under/wardt = 50, - /obj/item/clothing/under/kilt = 50, - /obj/item/clothing/under/fluff/latexmaid = 50, - /obj/item/clothing/under/dress/lilacdress = 50, - /obj/item/clothing/under/dress/white2 = 50, - /obj/item/clothing/under/dress/white4 = 50, - /obj/item/clothing/under/dress/maid = 50, - /obj/item/clothing/under/dress/maid/sexy = 50, - /obj/item/clothing/under/dress/maid/janitor = 50, - /obj/item/clothing/under/moderncoat = 50, - /obj/item/clothing/under/permit = 50, - /obj/item/clothing/under/oldwoman = 50, - /obj/item/clothing/under/frontier = 50, - /obj/item/clothing/under/mbill = 50, - /obj/item/clothing/under/pants/baggy/ = 50, - /obj/item/clothing/under/pants/baggy/classicjeans = 50, - /obj/item/clothing/under/pants/baggy/mustangjeans = 50, - /obj/item/clothing/under/pants/baggy/blackjeans = 50, - /obj/item/clothing/under/pants/baggy/greyjeans = 50, - /obj/item/clothing/under/pants/baggy/youngfolksjeans = 50, - /obj/item/clothing/under/pants/baggy/white = 50, - /obj/item/clothing/under/pants/baggy/red = 50, - /obj/item/clothing/under/pants/baggy/black = 50, - /obj/item/clothing/under/pants/baggy/tan = 50, - /obj/item/clothing/under/pants/baggy/track = 50, - /obj/item/clothing/under/pants/baggy/khaki = 50, - /obj/item/clothing/under/pants/baggy/camo = 50, - /obj/item/clothing/under/pants/utility/ = 50, - /obj/item/clothing/under/pants/utility/orange = 50, - /obj/item/clothing/under/pants/utility/blue = 50, - /obj/item/clothing/under/pants/utility/white = 50, - /obj/item/clothing/under/pants/utility/red = 50, - /obj/item/clothing/under/pants/chaps = 50, - /obj/item/clothing/under/pants/chaps/black = 50, - /obj/item/clothing/under/pants/track = 50, - /obj/item/clothing/under/pants/track/red = 50, - /obj/item/clothing/under/pants/track/white = 50, - /obj/item/clothing/under/pants/track/green = 50, - /obj/item/clothing/under/pants/track/blue = 50, - /obj/item/clothing/under/pants/yogapants = 50, - /obj/item/clothing/under/ascetic = 50, - /obj/item/clothing/under/dress/white3 = 50, - /obj/item/clothing/under/skirt/pleated = 50, - /obj/item/clothing/under/dress/darkred = 50, - /obj/item/clothing/under/dress/redeveninggown = 50, - /obj/item/clothing/under/dress/red_swept_dress = 50, - /obj/item/clothing/under/dress/sailordress = 50, - /obj/item/clothing/under/dress/sari = 50, - /obj/item/clothing/under/dress/sari/green = 50, - /obj/item/clothing/under/dress/qipao = 50, - /obj/item/clothing/under/dress/qipao/red = 50, - /obj/item/clothing/under/dress/qipao/white = 50, - /obj/item/clothing/under/shorts/red = 50, - /obj/item/clothing/under/shorts/green = 50, - /obj/item/clothing/under/shorts/blue = 50, - /obj/item/clothing/under/shorts/black = 50, - /obj/item/clothing/under/shorts/grey = 50, - /obj/item/clothing/under/shorts/white = 50, - /obj/item/clothing/under/shorts/jeans = 50, - /obj/item/clothing/under/shorts/jeans/ = 50, - /obj/item/clothing/under/shorts/jeans/classic = 50, - /obj/item/clothing/under/shorts/jeans/mustang = 50, - /obj/item/clothing/under/shorts/jeans/youngfolks = 50, - /obj/item/clothing/under/shorts/jeans/black = 50, - /obj/item/clothing/under/shorts/jeans/grey = 50, - /obj/item/clothing/under/shorts/khaki/ = 50, - /obj/item/clothing/under/skirt/loincloth = 50, - /obj/item/clothing/under/skirt/khaki = 50, - /obj/item/clothing/under/skirt/blue = 50, - /obj/item/clothing/under/skirt/red = 50, - /obj/item/clothing/under/skirt/denim = 50, - /obj/item/clothing/under/skirt/pleated = 50, - /obj/item/clothing/under/skirt/outfit/plaid_blue = 50, - /obj/item/clothing/under/skirt/outfit/plaid_red = 50, - /obj/item/clothing/under/skirt/outfit/plaid_purple = 50, - /obj/item/clothing/under/overalls/sleek = 50, - /obj/item/clothing/under/sl_suit = 50, - /obj/item/clothing/under/gentlesuit = 50, - /obj/item/clothing/under/gentlesuit/skirt = 50, - /obj/item/clothing/under/suit_jacket = 50, - /obj/item/clothing/under/suit_jacket/really_black/skirt = 50, - /obj/item/clothing/under/suit_jacket/really_black = 50, - /obj/item/clothing/under/suit_jacket/female/skirt = 50, - /obj/item/clothing/under/suit_jacket/female/ = 50, - /obj/item/clothing/under/suit_jacket/red = 50, - /obj/item/clothing/under/suit_jacket/red/skirt = 50, - /obj/item/clothing/under/suit_jacket/charcoal = 50, - /obj/item/clothing/under/suit_jacket/charcoal/skirt = 50, - /obj/item/clothing/under/suit_jacket/navy = 50, - /obj/item/clothing/under/suit_jacket/navy/skirt = 50, - /obj/item/clothing/under/suit_jacket/burgundy = 50, - /obj/item/clothing/under/suit_jacket/burgundy/skirt = 50, - /obj/item/clothing/under/suit_jacket/checkered = 50, - /obj/item/clothing/under/suit_jacket/checkered/skirt = 50, - /obj/item/clothing/under/suit_jacket/tan = 50, - /obj/item/clothing/under/suit_jacket/tan/skirt = 50, - /obj/item/clothing/under/scratch = 50, - /obj/item/clothing/under/scratch/skirt = 50, - /obj/item/clothing/under/sundress = 50, - /obj/item/clothing/under/sundress_white = 50, - /obj/item/clothing/under/rank/psych/turtleneck/sweater = 50, - /obj/item/weapon/storage/box/fluff/swimsuit = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/blue = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/purple = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/green = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/red = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/white = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/earth = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/engineering = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/science = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/security = 50, - /obj/item/weapon/storage/box/fluff/swimsuit/medical = 50, - /obj/item/clothing/under/utility = 50, - /obj/item/clothing/under/utility/grey = 50, - /obj/item/clothing/under/utility/blue = 50, - /obj/item/clothing/under/fluff/v_nanovest = 50, - /obj/item/clothing/under/dress/westernbustle = 50, - /obj/item/clothing/under/wedding/bride_white = 50, - /obj/item/weapon/storage/backpack/ = 50, - /obj/item/weapon/storage/backpack/messenger = 50, - /obj/item/weapon/storage/backpack/satchel = 50) - premium = list(/obj/item/clothing/under/color/rainbow = 1) - contraband = list(/obj/item/clothing/under/rank/clown = 1) - -/obj/machinery/vending/loadout/gadget - name = "Chips Co." - desc = "A special vendor for devices and gadgets." - product_ads = "You can't RESIST our great deals!;Feeling disconnected? We have a gadget for you!;You know you have the capacity to buy our capacitors!;FILL THAT HOLE IN YOUR HEART WITH OUR PLASTIC DISTRACTIONS!!!;Devices for everyone! Chips Co.!;ROBUST INVENTORY, GREAT PRICES! ;DON'T FORGET THE oyPAD 13s PRO! ON SALE NOW, ONLY ONE THOUSAND THALERS!" - icon_state = "gadgets" - vend_delay = 11 - products = list(/obj/item/clothing/suit/circuitry = 1, - /obj/item/clothing/head/circuitry = 1, - /obj/item/clothing/shoes/circuitry = 1, - /obj/item/clothing/gloves/circuitry = 1, - /obj/item/clothing/under/circuitry = 1, - /obj/item/clothing/glasses/circuitry = 1, - /obj/item/clothing/ears/circuitry = 1, - /obj/item/device/text_to_speech = 5, - /obj/item/device/paicard = 5, - /obj/item/device/communicator = 10, - /obj/item/device/communicator/watch = 10, - /obj/item/device/radio = 10, - /obj/item/device/camera = 5, - /obj/item/device/taperecorder = 5, - /obj/item/modular_computer/tablet/preset/custom_loadout/cheap = 5, - /obj/item/device/pda = 10, - /obj/item/device/radio/headset = 10, - /obj/item/device/flashlight = 5, - /obj/item/device/laser_pointer = 3, - /obj/item/clothing/glasses/omnihud = 10) - prices = list(/obj/item/clothing/suit/circuitry = 100, - /obj/item/clothing/head/circuitry = 100, - /obj/item/clothing/shoes/circuitry = 100, - /obj/item/clothing/gloves/circuitry = 100, - /obj/item/clothing/under/circuitry = 100, - /obj/item/clothing/glasses/circuitry = 100, - /obj/item/clothing/ears/circuitry = 100, - /obj/item/device/text_to_speech = 300, - /obj/item/device/paicard = 100, - /obj/item/device/communicator = 100, - /obj/item/device/communicator/watch = 100, - /obj/item/device/radio = 100, - /obj/item/device/camera = 100, - /obj/item/device/taperecorder = 100, - /obj/item/modular_computer/tablet/preset/custom_loadout/cheap = 1000, - /obj/item/device/pda = 50, - /obj/item/device/radio/headset = 50, - /obj/item/device/flashlight = 100, - /obj/item/device/laser_pointer = 200, - /obj/item/clothing/glasses/omnihud = 100) - premium = list(/obj/item/device/perfect_tele/one_beacon = 1) - contraband = list(/obj/item/weapon/disk/nifsoft/compliance = 1) - -/obj/machinery/vending/loadout/loadout_misc - name = "Bits and Bobs" - desc = "A special vendor for things and also stuff!" - product_ads = "You never know when you might need an umbrella.;Hey kid... want some cardemon cards?;Miscellaneous for your miscellaneous heart.;Who's bob? Wouldn't you like to know.;I'm sorry there's no grappling hooks in our umbrellas.;We sell things AND stuff." - icon_state = "loadout_misc" - products = list(/obj/item/weapon/cane = 5, - /obj/item/weapon/pack/cardemon = 25, - /obj/item/weapon/deck/holder = 5, - /obj/item/weapon/deck/cah = 5, - /obj/item/weapon/deck/cah/black = 5, - /obj/item/weapon/deck/tarot = 5, - /obj/item/weapon/deck/cards = 5, - /obj/item/weapon/pack/spaceball = 10, - /obj/item/weapon/storage/pill_bottle/dice = 5, - /obj/item/weapon/storage/pill_bottle/dice_nerd = 5, - /obj/item/weapon/melee/umbrella/random = 10) - prices = list(/obj/item/weapon/cane = 100, - /obj/item/weapon/pack/cardemon = 100, - /obj/item/weapon/deck/holder = 100, - /obj/item/weapon/deck/cah = 100, - /obj/item/weapon/deck/cah/black = 100, - /obj/item/weapon/deck/tarot = 100, - /obj/item/weapon/deck/cards = 100, - /obj/item/weapon/pack/spaceball = 100, - /obj/item/weapon/storage/pill_bottle/dice = 100, - /obj/item/weapon/storage/pill_bottle/dice_nerd = 100, - /obj/item/weapon/melee/umbrella/random = 100) - premium = list(/obj/item/toy/bosunwhistle = 1) - contraband = list(/obj/item/toy/katana = 1) - -/obj/machinery/vending/loadout/overwear - name = "Big D's Best" - desc = "A special vendor using compressed matter cartridges to store large amounts of overwear!" - product_ads = "Dress your best! It's what big D would want.;Overwear for all occasions!;Big D has what you need if what you need is some form of jacket!;Need a new hoodie? Bid D has you covered.;Big D says you need a new suit!;Big D smiles when he sees you in one of his coats!" - icon_state = "suit" - vend_delay = 16 - products = list(/obj/item/clothing/suit/storage/apron = 5, - /obj/item/clothing/suit/storage/flannel/aqua = 5, - /obj/item/clothing/suit/storage/toggle/bomber = 5, - /obj/item/clothing/suit/storage/bomber/alt = 5, - /obj/item/clothing/suit/storage/flannel/brown = 5, - /obj/item/clothing/suit/storage/toggle/cardigan = 5, - /obj/item/clothing/accessory/poncho/roles/cloak/custom = 5, - /obj/item/clothing/suit/storage/duster = 5, - /obj/item/clothing/suit/storage/toggle/denim_jacket = 5, - /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 5, - /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 5, - /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 5, - /obj/item/clothing/suit/storage/fluff/gntop = 5, - /obj/item/clothing/suit/greatcoat = 5, - /obj/item/clothing/suit/storage/flannel = 5, - /obj/item/clothing/suit/storage/greyjacket = 5, - /obj/item/clothing/suit/storage/hazardvest = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/black = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/red = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/blue = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/green = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/orange = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/cti = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/mu = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/nt = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/smw = 5, - /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 5, - /obj/item/clothing/suit/storage/fluff/jacket/field = 5, - /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 5, - /obj/item/clothing/suit/storage/fluff/jacket/air_force = 5, - /obj/item/clothing/suit/storage/fluff/jacket/navy = 5, - /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 5, - /obj/item/clothing/suit/kamishimo = 5, - /obj/item/clothing/suit/kimono = 5, - /obj/item/clothing/suit/storage/toggle/labcoat = 5, - /obj/item/clothing/suit/storage/toggle/labcoat/blue = 5, - /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 5, - /obj/item/clothing/suit/storage/toggle/labcoat/green = 5, - /obj/item/clothing/suit/storage/toggle/labcoat/orange = 5, - /obj/item/clothing/suit/storage/toggle/labcoat/pink = 5, - /obj/item/clothing/suit/storage/toggle/labcoat/red = 5, - /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 5, - /obj/item/clothing/suit/leathercoat = 5, - /obj/item/clothing/suit/storage/toggle/leather_jacket = 5, - /obj/item/clothing/suit/storage/leather_jacket_alt = 5, - /obj/item/clothing/suit/storage/toggle/brown_jacket = 5, - /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 5, - /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 5, - /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 5, - /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 5, - /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 5, - /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 5, - /obj/item/clothing/suit/storage/miljacket = 5, - /obj/item/clothing/suit/storage/miljacket/alt = 5, - /obj/item/clothing/suit/storage/miljacket/green = 5, - /obj/item/clothing/suit/storage/apron/overalls = 5, - /obj/item/clothing/suit/storage/toggle/peacoat = 5, - /obj/item/clothing/accessory/poncho = 5, - /obj/item/clothing/accessory/poncho/green = 5, - /obj/item/clothing/accessory/poncho/red = 5, - /obj/item/clothing/accessory/poncho/purple = 5, - /obj/item/clothing/accessory/poncho/blue = 5, - /obj/item/clothing/suit/jacket/puffer = 5, - /obj/item/clothing/suit/jacket/puffer/vest = 5, - /obj/item/clothing/suit/storage/flannel/red = 5, - /obj/item/clothing/suit/unathi/robe = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5, - /obj/item/clothing/suit/storage/toggle/internalaffairs = 5, - /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5, - /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5, - /obj/item/clothing/suit/suspenders = 5, - /obj/item/clothing/suit/storage/toggle/track = 5, - /obj/item/clothing/suit/storage/toggle/track/blue = 5, - /obj/item/clothing/suit/storage/toggle/track/green = 5, - /obj/item/clothing/suit/storage/toggle/track/red = 5, - /obj/item/clothing/suit/storage/toggle/track/white = 5, - /obj/item/clothing/suit/storage/trench = 5, - /obj/item/clothing/suit/storage/trench/grey = 5, - /obj/item/clothing/suit/varsity = 5, - /obj/item/clothing/suit/varsity/red = 5, - /obj/item/clothing/suit/varsity/purple = 5, - /obj/item/clothing/suit/varsity/green = 5, - /obj/item/clothing/suit/varsity/blue = 5, - /obj/item/clothing/suit/varsity/brown = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat = 5, - /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 5) - prices = list(/obj/item/clothing/suit/storage/apron = 100, - /obj/item/clothing/suit/storage/flannel/aqua = 100, - /obj/item/clothing/suit/storage/toggle/bomber = 100, - /obj/item/clothing/suit/storage/bomber/alt = 100, - /obj/item/clothing/suit/storage/flannel/brown = 100, - /obj/item/clothing/suit/storage/toggle/cardigan = 100, - /obj/item/clothing/accessory/poncho/roles/cloak/custom = 100, - /obj/item/clothing/suit/storage/duster = 100, - /obj/item/clothing/suit/storage/toggle/denim_jacket = 100, - /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen = 100, - /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless = 100, - /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless = 100, - /obj/item/clothing/suit/storage/fluff/gntop = 100, - /obj/item/clothing/suit/greatcoat = 100, - /obj/item/clothing/suit/storage/flannel = 100, - /obj/item/clothing/suit/storage/greyjacket = 100, - /obj/item/clothing/suit/storage/hazardvest = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/black = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/red = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/blue = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/green = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/orange = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/yellow = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/cti = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/mu = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/nt = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/smw = 100, - /obj/item/clothing/suit/storage/toggle/hoodie/nrti = 100, - /obj/item/clothing/suit/storage/fluff/jacket/field = 100, - /obj/item/clothing/suit/storage/fluff/jacket/air_cavalry = 100, - /obj/item/clothing/suit/storage/fluff/jacket/air_force = 100, - /obj/item/clothing/suit/storage/fluff/jacket/navy = 100, - /obj/item/clothing/suit/storage/fluff/jacket/special_forces = 100, - /obj/item/clothing/suit/kamishimo = 100, - /obj/item/clothing/suit/kimono = 100, - /obj/item/clothing/suit/storage/toggle/labcoat = 100, - /obj/item/clothing/suit/storage/toggle/labcoat/blue = 100, - /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge = 100, - /obj/item/clothing/suit/storage/toggle/labcoat/green = 100, - /obj/item/clothing/suit/storage/toggle/labcoat/orange = 100, - /obj/item/clothing/suit/storage/toggle/labcoat/pink = 100, - /obj/item/clothing/suit/storage/toggle/labcoat/red = 100, - /obj/item/clothing/suit/storage/toggle/labcoat/yellow = 100, - /obj/item/clothing/suit/leathercoat = 100, - /obj/item/clothing/suit/storage/toggle/leather_jacket = 100, - /obj/item/clothing/suit/storage/leather_jacket_alt = 100, - /obj/item/clothing/suit/storage/toggle/brown_jacket = 100, - /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen = 100, - /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen = 100, - /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless = 100, - /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless = 100, - /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless = 100, - /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless = 100, - /obj/item/clothing/suit/storage/miljacket = 100, - /obj/item/clothing/suit/storage/miljacket/alt = 100, - /obj/item/clothing/suit/storage/miljacket/green = 100, - /obj/item/clothing/suit/storage/apron/overalls = 100, - /obj/item/clothing/suit/storage/toggle/peacoat = 100, - /obj/item/clothing/accessory/poncho = 100, - /obj/item/clothing/accessory/poncho/green = 100, - /obj/item/clothing/accessory/poncho/red = 100, - /obj/item/clothing/accessory/poncho/purple = 100, - /obj/item/clothing/accessory/poncho/blue = 100, - /obj/item/clothing/suit/jacket/puffer = 100, - /obj/item/clothing/suit/jacket/puffer/vest = 100, - /obj/item/clothing/suit/storage/flannel/red = 100, - /obj/item/clothing/suit/unathi/robe = 100, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 100, - /obj/item/clothing/suit/storage/toggle/internalaffairs = 100, - /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 100, - /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 100, - /obj/item/clothing/suit/suspenders = 100, - /obj/item/clothing/suit/storage/toggle/track = 100, - /obj/item/clothing/suit/storage/toggle/track/blue = 100, - /obj/item/clothing/suit/storage/toggle/track/green = 100, - /obj/item/clothing/suit/storage/toggle/track/red = 100, - /obj/item/clothing/suit/storage/toggle/track/white = 100, - /obj/item/clothing/suit/storage/trench = 100, - /obj/item/clothing/suit/storage/trench/grey = 100, - /obj/item/clothing/suit/varsity = 100, - /obj/item/clothing/suit/varsity/red = 100, - /obj/item/clothing/suit/varsity/purple = 100, - /obj/item/clothing/suit/varsity/green = 100, - /obj/item/clothing/suit/varsity/blue = 100, - /obj/item/clothing/suit/varsity/brown = 100, - /obj/item/clothing/suit/storage/hooded/wintercoat = 100, - /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 100) - premium = list(/obj/item/clothing/suit/imperium_monk = 3) - contraband = list(/obj/item/toy/katana = 1) - -/obj/machinery/vending/loadout/costume - name = "Thespian's Delight" - desc = "Sometimes nerds need costumes!" - product_ads = "Don't let your art be stifled!;Remember, practice makes perfect!;Break a leg!;Don't make me get the cane!;Thespian's Delight entering stage right!;Costumes for your acting needs!" - icon = 'icons/obj/vending.dmi' - icon_state = "theater" - products = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 3, - /obj/item/clothing/suit/storage/hooded/carp_costume = 3, - /obj/item/clothing/suit/chickensuit = 3, - /obj/item/clothing/head/chicken = 3, - /obj/item/clothing/head/helmet/gladiator = 3, - /obj/item/clothing/under/gladiator = 3, - /obj/item/clothing/suit/storage/toggle/labcoat/mad = 3, - /obj/item/clothing/under/gimmick/rank/captain/suit = 3, - /obj/item/clothing/glasses/gglasses = 3, - /obj/item/clothing/head/flatcap = 3, - /obj/item/clothing/shoes/boots/jackboots = 3, - /obj/item/clothing/under/schoolgirl = 3, - /obj/item/clothing/head/kitty = 3, - /obj/item/clothing/glasses/sunglasses/blindfold = 3, - /obj/item/clothing/head/beret = 3, - /obj/item/clothing/under/skirt = 3, - /obj/item/clothing/under/suit_jacket = 3, - /obj/item/clothing/head/that = 3, - /obj/item/clothing/accessory/wcoat = 3, - /obj/item/clothing/under/scratch = 3, - /obj/item/clothing/shoes/white = 3, - /obj/item/clothing/gloves/white = 3, - /obj/item/clothing/under/kilt = 3, - /obj/item/clothing/glasses/monocle = 3, - /obj/item/clothing/under/sl_suit = 3, - /obj/item/clothing/mask/fakemoustache = 3, - /obj/item/weapon/cane = 3, - /obj/item/clothing/head/bowler = 3, - /obj/item/clothing/head/plaguedoctorhat = 3, - /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 3, - /obj/item/clothing/mask/gas/plaguedoctor/fluff = 3, - /obj/item/clothing/under/owl = 3, - /obj/item/clothing/mask/gas/owl_mask = 3, - /obj/item/clothing/under/waiter = 3, - /obj/item/clothing/suit/storage/apron = 3, - /obj/item/clothing/under/pirate = 3, - /obj/item/clothing/head/pirate = 3, - /obj/item/clothing/suit/pirate = 3, - /obj/item/clothing/glasses/eyepatch = 3, - /obj/item/clothing/head/ushanka = 3, - /obj/item/clothing/under/soviet = 3, - /obj/item/clothing/suit/imperium_monk = 1, - /obj/item/clothing/suit/holidaypriest = 3, - /obj/item/clothing/head/witchwig = 3, - /obj/item/clothing/under/sundress = 3, - /obj/item/weapon/staff/broom = 3, - /obj/item/clothing/suit/wizrobe/fake = 3, - /obj/item/clothing/head/wizard/fake = 3, - /obj/item/weapon/staff = 3, - /obj/item/clothing/mask/gas/sexyclown = 3, - /obj/item/clothing/under/sexyclown = 3, - /obj/item/clothing/mask/gas/sexymime = 3, - /obj/item/clothing/under/sexymime = 3, - /obj/item/clothing/suit/storage/hooded/knight_costume = 3, - /obj/item/clothing/suit/storage/hooded/knight_costume/galahad = 3, - /obj/item/clothing/suit/storage/hooded/knight_costume/lancelot = 3, - /obj/item/clothing/suit/storage/hooded/knight_costume/robin = 3, - /obj/item/clothing/suit/armor/combat/crusader_costume = 3, - /obj/item/clothing/suit/armor/combat/crusader_costume/bedevere = 3, - /obj/item/clothing/head/helmet/combat/crusader_costume = 3, - /obj/item/clothing/head/helmet/combat/bedevere_costume = 3, - /obj/item/clothing/gloves/combat/knight_costume = 3, - /obj/item/clothing/gloves/combat/knight_costume/brown = 3, - /obj/item/clothing/shoes/knight_costume = 3, - /obj/item/clothing/shoes/knight_costume/black = 3) - prices = list(/obj/item/clothing/suit/storage/hooded/carp_costume = 200, - /obj/item/clothing/suit/storage/hooded/carp_costume = 200, - /obj/item/clothing/suit/chickensuit = 200, - /obj/item/clothing/head/chicken = 200, - /obj/item/clothing/head/helmet/gladiator = 300, - /obj/item/clothing/under/gladiator = 500, - /obj/item/clothing/suit/storage/toggle/labcoat/mad = 200, - /obj/item/clothing/under/gimmick/rank/captain/suit = 200, - /obj/item/clothing/glasses/gglasses = 200, - /obj/item/clothing/head/flatcap = 200, - /obj/item/clothing/shoes/boots/jackboots = 200, - /obj/item/clothing/under/schoolgirl = 200, - /obj/item/clothing/head/kitty = 200, - /obj/item/clothing/glasses/sunglasses/blindfold = 200, - /obj/item/clothing/head/beret = 200, - /obj/item/clothing/under/skirt = 200, - /obj/item/clothing/under/suit_jacket = 200, - /obj/item/clothing/head/that = 200, - /obj/item/clothing/accessory/wcoat = 200, - /obj/item/clothing/under/scratch = 200, - /obj/item/clothing/shoes/white = 200, - /obj/item/clothing/gloves/white = 200, - /obj/item/clothing/under/kilt = 200, - /obj/item/clothing/glasses/monocle = 400, - /obj/item/clothing/under/sl_suit = 200, - /obj/item/clothing/mask/fakemoustache = 200, - /obj/item/weapon/cane = 300, - /obj/item/clothing/head/bowler = 200, - /obj/item/clothing/head/plaguedoctorhat = 300, - /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 300, - /obj/item/clothing/mask/gas/plaguedoctor/fluff = 600, - /obj/item/clothing/under/owl = 400, - /obj/item/clothing/mask/gas/owl_mask = 400, - /obj/item/clothing/under/waiter = 100, - /obj/item/clothing/suit/storage/apron = 200, - /obj/item/clothing/under/pirate = 300, - /obj/item/clothing/head/pirate = 400, - /obj/item/clothing/suit/pirate = 600, - /obj/item/clothing/glasses/eyepatch = 200, - /obj/item/clothing/head/ushanka = 200, - /obj/item/clothing/under/soviet = 200, - /obj/item/clothing/suit/imperium_monk = 2000, - /obj/item/clothing/suit/holidaypriest = 200, - /obj/item/clothing/head/witchwig = 200, - /obj/item/clothing/under/sundress = 50, - /obj/item/weapon/staff/broom = 400, - /obj/item/clothing/suit/wizrobe/fake = 200, - /obj/item/clothing/head/wizard/fake = 200, - /obj/item/weapon/staff = 400, - /obj/item/clothing/mask/gas/sexyclown = 600, - /obj/item/clothing/under/sexyclown = 200, - /obj/item/clothing/mask/gas/sexymime = 600, - /obj/item/clothing/under/sexymime = 200, - /obj/item/clothing/suit/storage/hooded/knight_costume = 200, - /obj/item/clothing/suit/storage/hooded/knight_costume/galahad = 200, - /obj/item/clothing/suit/storage/hooded/knight_costume/lancelot = 200, - /obj/item/clothing/suit/storage/hooded/knight_costume/robin = 200, - /obj/item/clothing/suit/armor/combat/crusader_costume = 200, - /obj/item/clothing/suit/armor/combat/crusader_costume/bedevere = 200, - /obj/item/clothing/head/helmet/combat/crusader_costume = 200, - /obj/item/clothing/head/helmet/combat/bedevere_costume = 200, - /obj/item/clothing/gloves/combat/knight_costume = 200, - /obj/item/clothing/gloves/combat/knight_costume/brown = 200, - /obj/item/clothing/shoes/knight_costume = 200, - /obj/item/clothing/shoes/knight_costume/black = 200) - premium = list(/obj/item/clothing/suit/imperium_monk = 3, - /obj/item/clothing/suit/barding/agatha = 2, - /obj/item/clothing/suit/barding/alt_agatha = 2, - /obj/item/clothing/suit/barding/mason = 2, - /obj/item/clothing/suit/drake_cloak = 2) - contraband = list(/obj/item/clothing/head/syndicatefake = 1, - /obj/item/clothing/suit/syndicatefake = 1) - -//TFF 19/12/19 - Brig version of a seed storage vendor -/obj/machinery/seed_storage/brig - name = "Prisoners' food seed storage" - starting_seeds = list( - /obj/item/seeds/appleseed = 3, - /obj/item/seeds/bananaseed = 3, - /obj/item/seeds/berryseed = 3, - /obj/item/seeds/cabbageseed = 3, - /obj/item/seeds/carrotseed = 3, - /obj/item/seeds/celery = 3, - /obj/item/seeds/chantermycelium = 3, - /obj/item/seeds/cherryseed = 3, - /obj/item/seeds/chiliseed = 3, - /obj/item/seeds/cocoapodseed = 3, - /obj/item/seeds/cornseed = 3, - /obj/item/seeds/durian = 3, - /obj/item/seeds/eggplantseed = 3, - /obj/item/seeds/grapeseed = 3, - /obj/item/seeds/grassseed = 3, - /obj/item/seeds/replicapod = 3, - /obj/item/seeds/lavenderseed = 3, - /obj/item/seeds/lemonseed = 3, - /obj/item/seeds/lettuce = 3, - /obj/item/seeds/limeseed = 3, - /obj/item/seeds/mtearseed = 2, - /obj/item/seeds/orangeseed = 3, - /obj/item/seeds/onionseed = 3, - /obj/item/seeds/peanutseed = 3, - /obj/item/seeds/plumpmycelium = 3, - /obj/item/seeds/poppyseed = 3, - /obj/item/seeds/potatoseed = 3, - /obj/item/seeds/pumpkinseed = 3, - /obj/item/seeds/rhubarb = 3, - /obj/item/seeds/riceseed = 3, - /obj/item/seeds/rose = 3, - /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, - /obj/item/seeds/sugarcaneseed = 3, - /obj/item/seeds/sunflowerseed = 3, - /obj/item/seeds/shandseed = 2, - /obj/item/seeds/tobaccoseed = 3, - /obj/item/seeds/tomatoseed = 3, - /obj/item/seeds/towermycelium = 3, - /obj/item/seeds/vanilla = 3, - /obj/item/seeds/watermelonseed = 3, - /obj/item/seeds/wheatseed = 3, - /obj/item/seeds/whitebeetseed = 3, - /obj/item/seeds/wabback = 2) - -/obj/machinery/vending/hydronutrients/brig - name = "Brig NutriMax" - desc = "A plant nutrients vendor. Seems some items aren't included." - products = list(/obj/item/weapon/reagent_containers/glass/bottle/eznutrient = 6,/obj/item/weapon/reagent_containers/glass/bottle/left4zed = 4,/obj/item/weapon/reagent_containers/glass/bottle/robustharvest = 3,/obj/item/weapon/plantspray/pests = 20, - /obj/item/weapon/reagent_containers/glass/beaker = 4,/obj/item/weapon/storage/bag/plants = 5) - premium = list(/obj/item/weapon/reagent_containers/glass/bottle/ammonia = 10,/obj/item/weapon/reagent_containers/glass/bottle/diethylamine = 5) - -/obj/machinery/vending/emergencyfood - name = "Food Cube Dispenser" - desc = "An ominous machine dispensing food cubes. It will keep you fed, but at what cost?" - icon = 'icons/obj/vending_vr.dmi' - icon_state = "foodcube" - product_ads = "Afraid to starve?;Starvation is not an option!;Add water before consumption.;Let me take care of you.;Dire circumstances call for food cubes, do not let the taste deter you." - products = list(/obj/item/weapon/storage/box/wings/tray = 5, - /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10) - contraband = list(/obj/item/weapon/storage/box/wings/tray = 5) - -/obj/machinery/vending/emergencyfood/filled - products = list(/obj/item/weapon/storage/box/wings/tray = 40) - contraband = list(/obj/item/weapon/storage/box/wings/tray = 20) - -/obj/machinery/vending/cola - icon_state = "Soda_Machine" - -/obj/machinery/vending/cola/soft - icon = 'icons/obj/vending_vr.dmi' - icon_state = "Cola_Machine" - -//Tweaked existing vendors -/obj/machinery/vending/hydroseeds/New() - products += list(/obj/item/seeds/shrinkshroom = 3,/obj/item/seeds/megashroom = 3) - ..() - -/obj/machinery/vending/security/New() - products += list(/obj/item/weapon/gun/energy/taser = 8,/obj/item/weapon/gun/energy/stunrevolver = 4, - /obj/item/weapon/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6, - /obj/item/clothing/glasses/omnihud/sec = 6) - ..() - -/obj/machinery/vending/tool/New() - products += list(/obj/item/weapon/reagent_containers/spray/windowsealant = 5) - ..() - -/obj/machinery/vending/engivend/New() - products += list(/obj/item/clothing/glasses/omnihud/eng = 6) - contraband += list(/obj/item/weapon/rms = 5) - ..() - -/obj/machinery/vending/medical/New() - products += list(/obj/item/weapon/storage/box/khcrystal = 4,/obj/item/weapon/backup_implanter = 3, - /obj/item/clothing/glasses/omnihud/med = 4, /obj/item/device/glasses_kit = 1, /obj/item/weapon/storage/quickdraw/syringe_case = 4) - ..() - -//I want this not just as part of the zoo. ;v -/obj/machinery/vending/food - name = "Food-O-Mat" - desc = "A technological marvel, supposedly able to cook or mix a large variety of food or drink." - icon_state = "hotfood" - products = list(/obj/item/weapon/tray = 8, - /obj/item/weapon/material/kitchen/utensil/fork = 6, - /obj/item/weapon/material/knife/plastic = 6, - /obj/item/weapon/material/kitchen/utensil/spoon = 6, - /obj/item/weapon/reagent_containers/food/snacks/tomatosoup = 8, - /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup = 8, - /obj/item/weapon/reagent_containers/food/snacks/jellysandwich = 8, - /obj/item/weapon/reagent_containers/food/snacks/taco = 8, - /obj/item/weapon/reagent_containers/food/snacks/cheeseburger = 8, - /obj/item/weapon/reagent_containers/food/snacks/grilledcheese = 8, - /obj/item/weapon/reagent_containers/food/snacks/hotdog = 8, - /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato = 8, - /obj/item/weapon/reagent_containers/food/snacks/omelette = 8, - /obj/item/weapon/reagent_containers/food/snacks/pastatomato = 8, - /obj/item/weapon/reagent_containers/food/snacks/tofuburger = 8, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza = 2, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza = 2, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita = 2, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza = 2, - /obj/item/weapon/reagent_containers/food/snacks/waffles = 4, - /obj/item/weapon/reagent_containers/food/snacks/muffin = 4, - /obj/item/weapon/reagent_containers/food/snacks/appletart = 4, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake = 2, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread = 2, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread = 2 - ) - contraband = list(/obj/item/weapon/reagent_containers/food/snacks/mysterysoup = 10) - vend_delay = 15 - -/obj/machinery/vending/food/arojoan //Fluff vendor for the lewd houseboat. - name = "Custom Food-O-Mat" - desc = "Do you think Joan cooks? Of course not. Lazy squirrel!" - products = list(/obj/item/weapon/tray = 6, - /obj/item/weapon/material/kitchen/utensil/fork = 6, - /obj/item/weapon/material/knife/plastic = 6, - /obj/item/weapon/material/kitchen/utensil/spoon = 6, - /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup = 3, - /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon = 3, - /obj/item/weapon/reagent_containers/food/snacks/generalschicken = 3, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi = 2, - /obj/item/weapon/reagent_containers/food/snacks/jellysandwich = 3, - /obj/item/weapon/reagent_containers/food/snacks/grilledcheese = 3, - /obj/item/weapon/reagent_containers/food/snacks/hotdog = 3, - /obj/item/weapon/storage/box/wings = 2, - /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato = 3, - /obj/item/weapon/reagent_containers/food/snacks/omelette = 3, - /obj/item/weapon/reagent_containers/food/snacks/waffles = 3, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza = 1, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza = 1, - /obj/item/weapon/reagent_containers/food/snacks/appletart = 2, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake = 1, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread = 2, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread = 2 - ) - contraband = list(/obj/item/weapon/reagent_containers/food/snacks/mysterysoup = 10) - vend_delay = 15 -/* For later, then -/obj/machinery/vending/weapon_machine - name = "Frozen Star Guns&Ammo" - desc = "A self-defense equipment vending machine. When you need to take care of that clown." - product_slogans = "The best defense is good offense!;Buy for your whole family today!;Nobody can outsmart bullet!;God created man - Frozen Star made them EQUAL!;Nobody can outsmart bullet!;Stupidity can be cured! By LEAD.;Dead kids can't bully your children!" - product_ads = "Stunning!;Take justice in your own hands!;LEADearship!" - icon = 'icons/obj/vending_vr.dmi' - icon_state = "weapon" - products = list(/obj/item/device/flash = 6,/obj/item/weapon/reagent_containers/spray/pepper = 6, /obj/item/weapon/gun/projectile/olivaw = 5, /obj/item/weapon/gun/projectile/giskard = 5, /obj/item/ammo_magazine/mg/cl32/rubber = 20) - contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6) - prices = list(/obj/item/device/flash = 600,/obj/item/weapon/reagent_containers/spray/pepper = 800, /obj/item/weapon/gun/projectile/olivaw = 1600, /obj/item/weapon/gun/projectile/giskard = 1200, /obj/item/ammo_magazine/mg/cl32/rubber = 200) -*/ - /obj/machinery/vending/fitness/New() products += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 8) prices += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 5) @@ -1616,17 +279,22 @@ products = list(/obj/item/weapon/card/id/syndicate/station_access = 1, /obj/item/weapon/storage/box/syndie_kit/chameleon = 1, /obj/item/clothing/mask/bandana = 1, + /obj/item/clothing/glasses/sunglasses = 1, /obj/item/device/radio/headset/syndicate/alt = 1, /obj/item/device/pda = 1, /obj/item/device/communicator = 1, /obj/item/weapon/tape_roll = 2, /obj/item/weapon/handcuffs = 4, + /obj/item/weapon/handcuffs/legcuffs = 4, /obj/item/weapon/cell/device/weapon/recharge/alien = 2, /obj/item/device/chameleon = 1, - /obj/item/weapon/storage/mre/menu11 = 2 + /obj/item/weapon/storage/mre/menu11 = 2, + /obj/item/device/flash = 2, + /obj/item/weapon/pen/reagent/paralysis = 4, + /obj/item/device/perfect_tele/alien = 1 ) vend_delay = 15 - + /obj/machinery/vending/loadout name = "Fingers and Toes" desc = "A special vendor for gloves and shoes!" @@ -2075,6 +743,7 @@ /obj/item/clothing/under/dress/maid = 5, /obj/item/clothing/under/dress/maid/sexy = 5, /obj/item/clothing/under/dress/maid/janitor = 5, + /obj/item/clothing/under/harness = 5, //CHOMP Edit: Added gear harness, /obj/item/clothing/under/moderncoat = 5, /obj/item/clothing/under/permit = 5, /obj/item/clothing/under/oldwoman = 5, @@ -2512,7 +1181,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 5, /obj/item/clothing/suit/storage/flannel/red = 5, /obj/item/clothing/suit/unathi/robe = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5, /obj/item/clothing/suit/storage/toggle/internalaffairs = 5, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5, @@ -2531,7 +1199,7 @@ /obj/item/clothing/suit/varsity/blue = 5, /obj/item/clothing/suit/varsity/brown = 5, /obj/item/clothing/suit/storage/hooded/wintercoat = 5, - /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 5) + /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 5) prices = list(/obj/item/clothing/suit/storage/apron = 100, /obj/item/clothing/suit/storage/flannel/aqua = 100, /obj/item/clothing/suit/storage/toggle/bomber = 100, @@ -2599,7 +1267,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 100, /obj/item/clothing/suit/storage/flannel/red = 100, /obj/item/clothing/suit/unathi/robe = 100, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 100, /obj/item/clothing/suit/storage/toggle/internalaffairs = 100, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 100, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 100, @@ -2618,7 +1285,7 @@ /obj/item/clothing/suit/varsity/blue = 100, /obj/item/clothing/suit/varsity/brown = 100, /obj/item/clothing/suit/storage/hooded/wintercoat = 100, - /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 100) + /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 100) premium = list(/obj/item/clothing/suit/imperium_monk = 3) contraband = list(/obj/item/toy/katana = 1) @@ -3139,6 +1806,7 @@ /obj/item/clothing/under/dress/maid = 5, /obj/item/clothing/under/dress/maid/sexy = 5, /obj/item/clothing/under/dress/maid/janitor = 5, + /obj/item/clothing/under/harness = 5, //CHOMP Edit: Added gear harness, /obj/item/clothing/under/moderncoat = 5, /obj/item/clothing/under/permit = 5, /obj/item/clothing/under/oldwoman = 5, @@ -3257,20 +1925,20 @@ /obj/item/clothing/under/rank/trek/command/voy = 5, /obj/item/clothing/under/rank/trek/command/ent = 5, /obj/item/clothing/under/rank/trek/eng = 5, + /obj/item/clothing/under/rank/trek/sec = 5, /obj/item/clothing/under/rank/trek/eng/next = 5, + /obj/item/clothing/under/rank/trek/sec/next = 5, /obj/item/clothing/under/rank/trek/eng/ds9 = 5, + /obj/item/clothing/under/rank/trek/sec/ds9 = 5, /obj/item/clothing/under/rank/trek/eng/voy = 5, + /obj/item/clothing/under/rank/trek/sec/voy = 5, /obj/item/clothing/under/rank/trek/eng/ent = 5, + /obj/item/clothing/under/rank/trek/sec/ent = 5, /obj/item/clothing/under/rank/trek/medsci = 5, /obj/item/clothing/under/rank/trek/medsci/next = 5, /obj/item/clothing/under/rank/trek/medsci/ds9 = 5, /obj/item/clothing/under/rank/trek/medsci/voy = 5, /obj/item/clothing/under/rank/trek/medsci/ent = 5, - /obj/item/clothing/under/rank/trek/sec = 5, - /obj/item/clothing/under/rank/trek/sec/next = 5, - /obj/item/clothing/under/rank/trek/sec/ds9 = 5, - /obj/item/clothing/under/rank/trek/sec/voy = 5, - /obj/item/clothing/under/rank/trek/sec/ent = 5, /obj/item/clothing/under/rank/khi/cmd = 5, /obj/item/clothing/under/rank/khi/eng = 5, /obj/item/clothing/under/rank/khi/med = 5, @@ -3501,7 +2169,6 @@ /obj/item/clothing/suit/jacket/puffer/vest = 5, /obj/item/clothing/suit/storage/flannel/red = 5, /obj/item/clothing/suit/unathi/robe = 5, - /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit = 5, /obj/item/clothing/suit/storage/toggle/internalaffairs = 5, /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket = 5, /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5, @@ -3520,7 +2187,7 @@ /obj/item/clothing/suit/varsity/blue = 5, /obj/item/clothing/suit/varsity/brown = 5, /obj/item/clothing/suit/storage/hooded/wintercoat = 5, - /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey = 5, + /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey = 5, /obj/item/clothing/suit/imperium_monk = 3, /obj/item/clothing/head/helmet/space/void/engineering = 5, /obj/item/clothing/suit/space/void/engineering = 5, @@ -3940,7 +2607,7 @@ /obj/item/weapon/reagent_containers/food/snacks/slice/mushroompizza = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/orangecake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/peanutcake = 10, - /obj/item/weapon/reagent_containers/food/snacks/slice/pineapple = 10, + /obj/item/weapon/reagent_containers/food/snacks/pineappleslice = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/plaincake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/pumpkinpie = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/tofubread = 10, @@ -4404,7 +3071,7 @@ /obj/item/weapon/reagent_containers/food/snacks/slice/mushroompizza = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/orangecake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/peanutcake = 10, - /obj/item/weapon/reagent_containers/food/snacks/slice/pineapple = 10, + /obj/item/weapon/reagent_containers/food/snacks/pineappleslice = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/plaincake = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/pumpkinpie = 10, /obj/item/weapon/reagent_containers/food/snacks/slice/tofubread = 10, @@ -4576,7 +3243,7 @@ /obj/item/seeds/riceseed = 3, /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, + /obj/item/seeds/pineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, diff --git a/code/game/mecha/combat/fighter_vr.dm b/code/game/mecha/combat/fighter_vr.dm new file mode 100644 index 0000000000..4bc4782e9f --- /dev/null +++ b/code/game/mecha/combat/fighter_vr.dm @@ -0,0 +1,8 @@ +/obj/mecha/combat/fighter + starting_components = list( + /obj/item/mecha_parts/component/hull/lightweight, + /obj/item/mecha_parts/component/actuator, + /obj/item/mecha_parts/component/armor, + /obj/item/mecha_parts/component/gas, + /obj/item/mecha_parts/component/electrical + ) diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm index 4aa9f9c03a..f37600acd5 100644 --- a/code/game/mecha/combat/gorilla.dm +++ b/code/game/mecha/combat/gorilla.dm @@ -31,7 +31,7 @@ thrusters_possible = 1 /obj/mecha/combat/gorilla/Initialize() - ..() + . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) // This thing basically cannot function without an external power supply. ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon(src) diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 3ae3e41e13..a1ea2ab451 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -40,7 +40,7 @@ switch_dmg_type_possible = TRUE /obj/mecha/combat/phazon/equipped/Initialize() - ..() + . = ..() starting_equipment = list( /obj/item/mecha_parts/mecha_equipment/tool/rcd, /obj/item/mecha_parts/mecha_equipment/gravcatapult diff --git a/code/game/mecha/components/_component.dm b/code/game/mecha/components/_component.dm index aadf390c61..3d770e0dce 100644 --- a/code/game/mecha/components/_component.dm +++ b/code/game/mecha/components/_component.dm @@ -43,7 +43,7 @@ . += "It is completely destroyed." /obj/item/mecha_parts/component/Initialize() - ..() + . = ..() integrity = max_integrity if(start_damaged) diff --git a/code/game/mecha/equipment/tools/inflatables.dm b/code/game/mecha/equipment/tools/inflatables.dm index b18ba2eae1..ff766577de 100644 --- a/code/game/mecha/equipment/tools/inflatables.dm +++ b/code/game/mecha/equipment/tools/inflatables.dm @@ -14,7 +14,7 @@ var/obj/item/weapon/inflatable_dispenser/my_deployer = null /obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Initialize() - ..() + . = ..() my_deployer = my_tool /obj/item/mecha_parts/mecha_equipment/tool/powertool/inflatables/Topic(href, href_list) diff --git a/code/game/mecha/equipment/tools/syringe_gun.dm b/code/game/mecha/equipment/tools/syringe_gun.dm index 1658a01df6..fd73d74fc2 100644 --- a/code/game/mecha/equipment/tools/syringe_gun.dm +++ b/code/game/mecha/equipment/tools/syringe_gun.dm @@ -318,7 +318,7 @@ equip_type = EQUIP_HULL /obj/item/mecha_parts/mecha_equipment/crisis_drone/Initialize() - ..() + . = ..() drone_overlay = new(src.icon, icon_state = droid_state) /obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy() diff --git a/code/game/mecha/equipment/weapons/energy/laser.dm b/code/game/mecha/equipment/weapons/energy/laser.dm index 372fe67f0f..9aca9100d7 100644 --- a/code/game/mecha/equipment/weapons/energy/laser.dm +++ b/code/game/mecha/equipment/weapons/energy/laser.dm @@ -20,6 +20,17 @@ origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3, TECH_PHORON = 3, TECH_POWER = 3) +/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/gamma //CHOMPedit begin : adds Gamma Laser as proof of concept + equip_cooldown = 5 + name = "\improper GA-X \"Render\" Experimental Gamma Laser" + desc = "A experimental suppression laser that fires blasts of radiation charged photons, extremely effective at punching through armor." + icon_state = "mecha_coil" + energy_drain = 80 + projectile = /obj/item/projectile/beam/gamma + fire_sound = 'sound/weapons/emitter.ogg' + + origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_PHORON = 4, TECH_POWER = 5, TECH_ILLEGAL = 3) //CHOMPedit end + /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/xray/rigged equip_cooldown = 12 name = "jury-rigged xray rifle" diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index c2288709e5..dce2c3c9db 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -8,23 +8,31 @@ layer = TURF_LAYER + 0.1 circuit = /obj/item/weapon/circuitboard/mech_recharger - var/obj/mecha/charging = null + var/atom/movable/charging var/charge = 45 var/repair = 0 + var/list/chargable_types = list( + /obj/mecha, + /mob/living/silicon/robot/platform + ) /obj/machinery/mech_recharger/Initialize() . = ..() default_apply_parts() -/obj/machinery/mech_recharger/Crossed(var/obj/mecha/M) +/obj/machinery/mech_recharger/Crossed(var/atom/movable/M) . = ..() - if(istype(M) && charging != M) - start_charging(M) + if(charging == M) + return + for(var/mtype in chargable_types) + if(istype(M, mtype)) + start_charging(M) + return -/obj/machinery/mech_recharger/Uncrossed(var/obj/mecha/M) +/obj/machinery/mech_recharger/Uncrossed(var/atom/movable/M) . = ..() if(M == charging) - stop_charging() + charging = null /obj/machinery/mech_recharger/RefreshParts() ..() @@ -44,26 +52,33 @@ if(!charging) return if(charging.loc != src.loc) // Could be qdel or teleport or something - stop_charging() + charging = null return + var/done = FALSE - if(charging.cell) - var/t = min(charge, charging.cell.maxcharge - charging.cell.charge) + var/obj/mecha/mech = charging + var/obj/item/weapon/cell/cell = charging.get_cell() + if(cell) + var/t = min(charge, cell.maxcharge - cell.charge) if(t > 0) - charging.give_power(t) + if(istype(mech)) + mech.give_power(t) + else + cell.give(t) use_power(t * 150) else - charging.occupant_message("Fully charged.") + if(istype(mech)) + mech.occupant_message(SPAN_NOTICE("Fully charged.")) done = TRUE - if(repair && charging.health < initial(charging.health)) - charging.health = min(charging.health + repair, initial(charging.health)) - if(charging.health == initial(charging.health)) - charging.occupant_message("Fully repaired.") + + if(repair && istype(mech) && mech.health < initial(mech.health)) + mech.health = min(mech.health + repair, initial(mech.health)) + if(mech.health == initial(mech.health)) + mech.occupant_message(SPAN_NOTICE("Fully repaired.")) else done = FALSE if(done) - stop_charging() - return + charging = null /obj/machinery/mech_recharger/attackby(var/obj/item/I, var/mob/user) if(default_deconstruction_screwdriver(user, I)) @@ -73,18 +88,19 @@ if(default_part_replacement(user, I)) return -/obj/machinery/mech_recharger/proc/start_charging(var/obj/mecha/M) - if(stat & (NOPOWER | BROKEN)) - M.occupant_message("Power port not responding. Terminating.") +/obj/machinery/mech_recharger/proc/start_charging(var/atom/movable/M) + var/obj/mecha/mech = M + if(stat & (NOPOWER | BROKEN)) + if(istype(mech)) + mech.occupant_message(SPAN_WARNING("Power port not responding. Terminating.")) + else + to_chat(M, SPAN_WARNING("Power port not responding. Terminating.")) return - if(M.cell) - M.occupant_message("Now charging...") + if(M.get_cell()) + if(istype(mech)) + mech.occupant_message(SPAN_NOTICE("Now charging...")) + else + to_chat(M, SPAN_NOTICE("Now charging...")) charging = M return - -/obj/machinery/mech_recharger/proc/stop_charging() - if(!charging) - - return - charging = null \ No newline at end of file diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 492837fbeb..d8e025df95 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -83,6 +83,14 @@ /obj/machinery/mecha_part_fabricator/Initialize() . = ..() + +// Go through all materials, and add them to the possible storage, but hide them unless we contain them. + for(var/Name in name_to_material) + if(Name in materials) + continue + + materials[Name] = 0 + default_apply_parts() files = new /datum/research(src) //Setup the research data holder. diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index bb0f4b7ba3..e58e427892 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -198,7 +198,7 @@ var/weapons_only_cycle = FALSE //So combat mechs don't switch to their equipment at times. /obj/mecha/Initialize() - ..() + . = ..() for(var/path in starting_components) var/obj/item/mecha_parts/component/C = new path(src) @@ -352,10 +352,10 @@ C.forceMove(src) cell = C return - cell = new(src) - cell.name = "mecha power cell" - cell.charge = 15000 - cell.maxcharge = 15000 + cell = new /obj/item/weapon/cell/mech(src) + +/obj/mecha/get_cell() + return cell /obj/mecha/proc/add_cabin() cabin_air = new diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index 4db6332cb1..316d39bace 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -127,7 +127,7 @@ C.images += holder */ /obj/mecha/medical/odysseus/loaded/Initialize() - ..() + . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tool/sleeper diff --git a/code/game/mecha/micro/mechfab_designs_vr.dm b/code/game/mecha/micro/mechfab_designs_vr.dm index 4ef7fa76e3..d2a9095274 100644 --- a/code/game/mecha/micro/mechfab_designs_vr.dm +++ b/code/game/mecha/micro/mechfab_designs_vr.dm @@ -118,7 +118,7 @@ name = "\improper PC-20 \"Lance\" micro laser cannon" //CHOMPedit id = "micro_laser_heavy" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, MAT_COPPER = 1000, "diamond" = 1000) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/microheavy /datum/design/item/mecha/weapon/grenade_launcher/micro @@ -192,5 +192,5 @@ desc = "A portable medical system used to treat external injuries from afar." id = "mech_medigun" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "diamond" = 1500, "phoron" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_COPPER = 4000, "gold" = 2000, "silver" = 1750, "diamond" = 1500) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun \ No newline at end of file diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index def044c9bb..4e92f757d2 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -70,7 +70,7 @@ max_special_equip = 1 /obj/mecha/working/ripley/deathripley/Initialize() - ..() + . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/safety ME.attach(src) return @@ -80,7 +80,7 @@ name = "APLU \"Miner\"" /obj/mecha/working/ripley/mining/Initialize() - ..() + . = ..() //Attach drill if(prob(25)) //Possible diamond drill... Feeling lucky? var/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index f4603bba52..1b3ca36032 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -40,10 +40,7 @@ return TRUE /atom/movable/proc/has_buckled_mobs() - if(!buckled_mobs) - return FALSE - if(buckled_mobs.len) - return TRUE + return LAZYLEN(buckled_mobs) /atom/movable/Destroy() unbuckle_all_mobs() diff --git a/code/game/objects/effects/alien/alien egg.dm b/code/game/objects/effects/alien/alien egg.dm index 8af53f8f3a..da12ae3f16 100644 --- a/code/game/objects/effects/alien/alien egg.dm +++ b/code/game/objects/effects/alien/alien egg.dm @@ -29,9 +29,9 @@ /obj/structure/alien/egg/process() progress++ if(progress >= MAX_PROGRESS) - for(var/mob/observer/ghost/O in GLOB.ghost_mob_list) - if(O.client && O.client.prefs && (BE_ALIEN)) - to_chat(O, "An alien is ready to hatch! ([ghost_follow_link(src, O)]) (spawn)") + for(var/mob/observer/dead/O) //CHOMPedit fixed the snowflake ghost_pod notification. + if(O.client) + to_chat(O, "An alien is ready to hatch! (spawn)") STOP_PROCESSING(SSobj, src) update_icon() @@ -56,10 +56,10 @@ // Check for bans properly. if(jobban_isbanned(user, MODE_XENOMORPH)) - to_chat(user, "You are banned from playing a Xenomorph.") + to_chat(user, "You are banned from playing a Genaprawn.") //CHOMPedit return - var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes") + var/confirm = alert(user, "Are you sure you want to join as a Genaprawn larva?", "Become Larva", "No", "Yes") //CHOMPedit if(!src || confirm != "Yes") return diff --git a/code/game/objects/effects/chem/coating.dm b/code/game/objects/effects/chem/coating.dm index a777bbe5e0..2e9ad26049 100644 --- a/code/game/objects/effects/chem/coating.dm +++ b/code/game/objects/effects/chem/coating.dm @@ -11,7 +11,7 @@ create_reagents(100) /obj/effect/decal/cleanable/chemcoating/Initialize() - ..() + . = ..() var/turf/T = get_turf(src) if(T) for(var/obj/O in get_turf(src)) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index c3716b031c..5286670849 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -90,6 +90,39 @@ serial_number = given_serial ..(loc) +//Selectable subtype +/obj/item/weapon/contraband/poster/custom + name = "rolled-up poly-poster" + desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. This one is made from some kind of e-paper, and could display almost anything!" + poster_type = /obj/structure/sign/poster/custom + +/obj/item/weapon/contraband/poster/custom/New(turf/loc, var/given_serial = 0) + if(given_serial == 0) + serial_number = 1 //Decidedly unrandom + else + serial_number = given_serial + ..(loc) + +/obj/item/weapon/contraband/poster/custom/verb/select_poster() + set name = "Set Poster type" + set category = "Object" + set desc = "Click to choose a poster to display." + + var/mob/M = usr + var/list/options = list() + for(var/datum/poster/posteroption in poster_designs) + options[posteroption.listing_name] = posteroption + + var/choice = input(M,"Choose a poster!","Customize Poster") in options + if(src && choice && !M.stat && in_range(M,src)) + var serial = poster_designs.Find(options[choice]) + serial_number = serial + name = "rolled-up poly-poster - No.[serial]" + to_chat(M, "The poster is now: [choice].") + return 1 + + + //############################## THE ACTUAL DECALS ########################### /obj/structure/sign/poster @@ -187,6 +220,7 @@ // Description suffix var/desc="" var/icon_state="" + var/listing_name="" // NT poster subtype. /obj/structure/sign/poster/nanotrasen @@ -201,3 +235,8 @@ set_poster(design) ..(newloc, placement_dir, serial, itemtype) + +//Non-Random Posters + +/obj/structure/sign/poster/custom + roll_type = /obj/item/weapon/contraband/poster/custom \ No newline at end of file diff --git a/code/game/objects/effects/decals/posters/bs12.dm b/code/game/objects/effects/decals/posters/bs12.dm index 7aadcb2ead..5c1c32d98b 100644 --- a/code/game/objects/effects/decals/posters/bs12.dm +++ b/code/game/objects/effects/decals/posters/bs12.dm @@ -1,290 +1,348 @@ // baystation12 posters /datum/poster/bay_1 icon_state="bsposter1" - name = "Unlucky Space Explorer" - desc = "This particular one depicts a skeletal form within a space suit." + name = "PSA: Unlucky Space Explorer" + desc = "This grim PSA depicts a skeletal form within a space suit. Thousands die every year as a result of failing to follow EVA safety guidelines." + listing_name = "PSA - EVA Accidents" /datum/poster/bay_2 icon_state="bsposter2" - name = "Positronic Logic Conflicts" - desc = "This particular one depicts the cold, unmoving stare of a particular advanced AI." + name = "PSA: Disobedient Drones" + desc = "This PSA depicts the cold, unmoving stare of a particularly advanced AI. Contact information for the Emergent Intelligence Oversight is included." + listing_name = "PSA - Emergent Drones" /datum/poster/bay_3 icon_state="bsposter3" - name = "Paranoia" - desc = "This particular one warns of the dangers of trusting your co-workers too much." + name = "PSA: Corporate Espionage" + desc = "This PSA warns of the dangers of trusting your co-workers with sensitive department information. They may be spying for a rival corporation, or worse!" + listing_name = "PSA - Corporate Espionage" /datum/poster/bay_4 icon_state="bsposter4" name = "Keep Calm" - desc = "This particular one is of a famous New Earth design, although a bit modified. Someone has scribbled an O over the A on the poster." + desc = "An incredibly vague message, presented in a classic form. Someone has scribbled an O over the A on the poster." + listing_name = "PSA - Keep Calm" /datum/poster/bay_5 icon_state="bsposter5" - name = "Martian Warlord" - desc = "This particular one depicts the cartoony mug of a certain Martial Warmonger." + name = "PSA: Saboteurs!" + desc = "A company PSA reminding employees to keep an eye out for suspicious activity, and report it immediately." + listing_name = "PSA - Saboteur" /datum/poster/bay_6 icon_state="bsposter6" - name = "Technological Singularity" - desc = "This particular one is of the blood-curdling symbol of a long-since defeated enemy of humanity." + name = "Eradicator XV" + desc = "An ad for the fifteenth installment in the Eradicator movie franchise, about a violent robotic uprising hellbent on wiping out humanity." + listing_name = "Ad - Eradicator XV" /datum/poster/bay_7 icon_state="bsposter7" - name = "Wasteland" - desc = "This particular one is of a couple of ragged gunmen, one male and one female, on top of a mound of rubble. The number \"12\" is visible on their blue jumpsuits." + name = "Wasteland: Battle for Earth" + desc = "This action movie ad shows a couple of ragged post-apocalyptic gunmen, one male and one female, on top of a mound of rubble." + listing_name = "Ad - Battle for Earth" /datum/poster/bay_8 icon_state="bsposter8" name = "Pinup Girl Cindy" - desc = "This particular one is of a historical corporate PR girl, Cindy, in a particularly feminine pose." + desc = "This is a vintage 2450s pin-up of NanoTrasen's PR girl, Cindy, in a particularly feminine pose." + listing_name = "Pin-up - Cindi" /datum/poster/bay_9 icon_state="bsposter9" name = "Pinup Girl Amy" - desc = "This particular one is of Amy, the nymphomaniac urban legend of deep space. How this photograph came to be is not known." + desc = "This pin-up is of Amy, one of NanoTrasen's most popular PR models." + listing_name = "Pin-up - Amy" /datum/poster/bay_10 icon_state="bsposter10" name = "Don't Panic" - desc = "This particular one depicts some sort of star in a grimace. The \"Don't Panic\" is written in big, friendly letters." + desc = "This ad for Vey-Medical anxiety pills depicts some sort of star in a grimace. The \"Don't Panic\" is written in big, friendly letters." + listing_name = "Ad - Don't panic." /datum/poster/bay_11 icon_state="bsposter11" - name = "Underwater Laboratory" - desc = "This particular one is of the fabled last crew of a previous Company project." + name = "Underwater Living" + desc = "This immigration poster encourages you to move to Earth;s premiere underwater city, Atlantis. One bedroom apartments start at half your salary." + listing_name = "Ad - Atlantis" /datum/poster/bay_12 icon_state="bsposter12" - name = "Rogue AI" - desc = "This particular one depicts the shell of the infamous AI that catastropically comandeered one of humanity's earliest space stations. Back then, the Company was just known as TriOptimum." + name = "Beware Rogue AI" + desc = "This ad for the Emergent Intelligence Oversight Recruitment Division depicts a menacing AI and asks if you're a bad enough dude to take it on." + listing_name = "Recruitment - EIO" /datum/poster/bay_13 icon_state="bsposter13" - name = "User of the Arcane Arts" - desc = "This particular one depicts a wizard, casting a spell. You can't really make out if it's an actual photograph or a computer-generated image." + name = "Become A User of the Arcane Arts" + desc = "This ad for popular Virtual Reality online game 'Wiz Online' depicts a wizard, casting a spell. You can't really make out if it's an actual photograph or a computer-generated image. Incredible graphics!" + listing_name = "Ad - Wiz Online" /datum/poster/bay_14 icon_state="bsposter14" name = "Levitating Skull" - desc = "This particular one is the portrait of a flying enchanted skull. Its adventures along with its fabled companion are now fading through history..." + desc = "This tacky ad is a portrait of the flying enchanted skull, Bones. Its adventures along with its fabled companion are showing now on a broadcast service near you!" + listing_name = "Ad - Bones Adventures" /datum/poster/bay_15 icon_state="bsposter15" name = "Augmented Legend" - desc = "This particular one is of an obviously augmented individual, gazing towards the sky. The cyber-city in the backround is rather punkish." + desc = "This ad for Ward-Takahashi cybernetic implants shows obviously augmented individual, gazing towards the sky. Is your body augmented?" + listing_name = "Ad - Ward-Takahashi Augments" /datum/poster/bay_16 icon_state="bsposter16" - name = "Dangerous Static" - desc = "This particular one depicts nothing remarkable other than a rather mesmerising pattern of monitor static. There's a tag on the sides of the poster, but it's ripped off." + name = "Snow Crash" + desc = "This particular one depicts nothing remarkable other than a rather mesmerising pattern of monitor static. You think it's an ad for something, but you're not sure what." + listing_name = "Ad - Snow Crash" /datum/poster/bay_17 icon_state="bsposter17" name = "Pinup Girl Val" desc = "Luscious Val McNeil, the vertically challenged Legal Extraordinaire, winner of Miss Space two years running and favoured pinup girl of Lawyers Weekly." + listing_name = "Pin-up - Val" /datum/poster/bay_18 icon_state="bsposter18" name = "Derpman, Enforcer of the State" - desc = "Here to protect and serve... your donuts! A generously proportioned man, he teaches you the value of hiding your snacks." + desc = "An ad for Centauri Provisions donuts. Officer Derpman is here to protect and serve... your donuts! A generously proportioned man, he teaches you the value of hiding your snacks." + listing_name = "Ad - Officer Derpman Donuts" /datum/poster/bay_19 icon_state="bsposter19" name = "Respect an Unathi" - desc = "This poster depicts a well dressed looking Unathi receiving a prestigious award. It appears to espouse greater co-operation and harmony between the two races." + desc = "This poster depicts a sharply dressed Unathi receiving a prestigious award. It appears to espouse greater co-operation and harmony between humanity and the Unathi." + listing_name = "PSA - Unathi" /datum/poster/bay_20 icon_state="bsposter20" - name = "Skrell Twilight" - desc = "This poster depicts a mysteriously inscrutable, alien scene. Numerous Skrell can be seen conversing amidst great, crystalline towers rising above crashing waves" + name = "Skrell Tourism" + desc = "This tourism poster depicts a mysteriously inscrutable, alien scene. Numerous Skrell can be seen conversing amidst great, crystalline towers rising above crashing waves." + listing_name = "Ad - Skrellian Tourism" /datum/poster/bay_21 icon_state="bsposter21" name = "Join the Fuzz!" desc = "It's a nice recruitment poster of a white haired Chinese woman that says; \"Big Guns, Hot Women, Good Times. Security. We get it done.\"" + listing_name = "Recruitment - NanoTrasen Security - Pinup" /datum/poster/bay_22 icon_state="bsposter22" name = "Looking for a career with excitement?" desc = "A recruitment poster starring a dark haired woman with glasses and a purple shirt that has \"Got Brains? Got Talent? Not afraid of electric flying monsters that want to suck the soul out of you? Then Xenobiology could use someone like you!\" written on the bottom." + listing_name = "Recruitment - Xenobiology" /datum/poster/bay_23 icon_state="bsposter23" name = "Safety first: because electricity doesn't wait!" desc = "A safety poster starring a clueless looking redhead with frazzled hair. \"Every year, hundreds of NT employees expose themselves to electric shock. Play it safe. Avoid suspicious doors after electrical storms, and always wear protection when doing electric maintenance.\"" + listing_name = "Safety - Electric Shock" /datum/poster/bay_24 icon_state="bsposter24" name = "Responsible medbay habits, No #259" desc = "A poster with a nervous looking geneticist on it states; \"Friends Tell Friends They're Clones. It can cause severe and irreparable emotional trauma if a person is not properly informed of their recent demise. Always follow your contractual obligation and inform them of their recent rejuvenation.\"" + listing_name = "Medical - Clone Disclosure" /datum/poster/bay_25 icon_state="bsposter25" name = "Irresponsible medbay habits, No #2" desc = "This is a safety poster starring a perverted looking naked doctor. \"Sexual harassment is never okay. REPORT any acts of sexual deviance or harassment that disrupt a healthy working environment.\"" + listing_name = "Medical - Sexual Harassment" /datum/poster/bay_26 icon_state="bsposter26" name = "The Men We Knew" - desc = "This movie poster depicts a group of soldiers fighting a large mech, the movie seems to be a patriotic war movie." + desc = "This movie poster depicts a group of soldiers fighting a large mech, it seems to be some kind of movie set during the Hegemony War." + listing_name = "Ad - Men We Knew" /datum/poster/bay_27 icon_state="bsposter27" name = "Plastic Sheep Can't Scream" - desc = "This is a movie poster for an upcoming horror movie, it features an AI in the front of it." + desc = "This is a movie poster for an upcoming horror movie, featuring a frightening looking robotic creature." + listing_name = "Ad - Plastic Sheep Can't Scream" /datum/poster/bay_28 icon_state="bsposter28" name = "The Stars Know Love" - desc = "This is a movie poster. A bleeding woman is shown drawing a heart in her blood on the window of space ship, it seems to be a romantic Drama." + desc = "This is a movie poster. A bleeding woman is shown drawing a heart in her blood on the window of space ship, it seems to be a romantic drama." + listing_name = "Ad - The Stars Know Love" /datum/poster/bay_29 icon_state="bsposter29" name = "Winter Is Coming" - desc = "On the poster is a frighteningly large wolf, he warns: \"Only YOU can keep the station from freezing during planetary occultation!\"" + desc = "On the poster is a frighteningly large wolf, he warns: \"Only YOU can keep yourself from freezing this winter!\". Below is the logo of NanoThreads clothing." + listing_name = "Ad - Cold-weather Gear" /datum/poster/bay_30 icon_state="bsposter30" name = "Ambrosia Vulgaris" - desc = "Just looking at this poster makes you feel a little bit dizzy." + desc = "It's an ad for getting absolutely shitfaced on psychadelics. Just looking at this poster makes you feel a little bit dizzy. Use responsibly." + listing_name = "Ad - Ambrosia Vulgaris" /datum/poster/bay_31 icon_state="bsposter31" - name = "Donut Corp" - desc = "This is an advertisement for Donut Corp, the new innovation in donut technology!" + name = "Donut Panic" + desc = "This is an advertisement for Donut Panic, the bi-monthly periodical for donut lovers galaxy-wide." + listing_name = "Ad - Donuts Panic" /datum/poster/bay_32 icon_state="bsposter32" name = "Eat!" - desc = "A poster depicting a hamburger. The poster orders you to consume the hamburger." + desc = "A NanoPastures poster depicting a synthmeat hamburger. The poster COMMANDS you to consume the hamburger." + listing_name = "Ad - Hamburger" /datum/poster/bay_33 icon_state="bsposter33" - name = "Tools, tools, tools" - desc = "You can never have enough tools, thats for sure!" + name = "Tools, tools, tools!" + desc = "Xion Manufacturing reminds you: Never trust an off-brand tool. " + listing_name = "Ad - Xion Tools" /datum/poster/bay_34 icon_state="bsposter34" name = "Power Up!" - desc = "High reward, higher risk!" + desc = "NanoTrasen are leaders in Phoron-based supermatter power! High reward, higher risk!" + listing_name = "Ad - Phoron Power" /datum/poster/bay_35 icon_state="bsposter35" - name = "Lamarr" - desc = "This is a poster depicting the pet and mascot of the science department." + name = "Kendrick" + desc = "This is a poster depicting the pet and mascot of the science department, and national corporate ambassador for slime-based science solutions.." + listing_name = "Ad - Slime Science" /datum/poster/bay_36 icon_state="bsposter36" name = "Fancy Borg" - desc = "A poster depicting a cyborg using the service module. 'Fancy Borg' is written on it." + desc = "A poster depicting a cyborg dressed to the nines. An ad for cybernetics enthusiast magazine, Borg Fancy." + listing_name = "Ad - Borg Fancy A" /datum/poster/bay_37 icon_state="bsposter37" name = "Fancier Borg" - desc = "A poster depicting a cyborg using the service module. 'Fancy Borg' is written on it. This is even fancier than the first poster." + desc = "A poster depicting a cyborg dressed to the nines. An ad for cybernetics enthusiast magazine, Borg Fancy. This is even fancier than the other poster." + listing_name = "Ad - Borg Fancy B" /datum/poster/bay_38 icon_state="bsposter38" name = "Toaster Love" - desc = "This is a poster of a toaster containing two slices of bread. The word LOVE is written in big pink letters underneath." + desc = "This is a poster of a toaster containing two slices of bread. The word LOVE is written in big pink letters underneath. An ad for a cybernetics 'enthusiast' magazine. " + listing_name = "Ad - Toaster Love" /datum/poster/bay_39 icon_state="bsposter39" name = "Responsible medbay habits, No #91" desc = "A safety poster with a chemist holding a vial. \"Always wear safety gear while handling dangerous chemicals, even if it concerns only small amounts.\"" + listing_name = "Safety - Chemicals" /datum/poster/bay_40 icon_state="bsposter40" name = "Agreeable work environment" desc = "This poster depicts a young woman in a stylish dress. \"Try to aim for a pleasant atmosphere in the workspace. A friendly word can do more than forms in triplicate.\"" + listing_name = "PSA - Agreeable Work Environment" /datum/poster/bay_41 icon_state="bsposter41" name = "Professional work environment" desc = "A safety poster featuring a green haired woman in a shimmering blue dress. \"As an Internal Affairs Agent, your job is to create a fair and agreeable work environment for the crewmembers, as discreetly and professionally as possible.\"" + listing_name = "Recruitment - Internal Affairs" /datum/poster/bay_42 icon_state="bsposter42" name = "Engineering pinup" desc = "This is pin-up poster. A half-naked girl with white hair, toned muscles and stunning blue eyes looks back at you from the poster. Her welding helmet, tattoos and grey jumpsuit hanging around her waist gives a bit of a rugged feel." + listing_name = "Pin-up - Engineer" /datum/poster/bay_43 icon_state="bsposter43" name = "Responsible medbay habits, No #3" desc = "A safety poster with a purple-haired surgeon. She looks a bit cross. \"Let the surgeons do their work. NEVER replace or remove a surgery tool from where the surgeon put it.\"" + listing_name = "Safety - Surgical Tools" /datum/poster/bay_44 icon_state="bsposter44" name = "Time for a drink?" - desc = "This poster depicts a friendly-looking Tajaran holding a tray of drinks." + desc = "This poster for a brand for \"Tajaran-style\" rum produced by Gilthari Exports depicts a friendly-looking Tajaran holding a tray of drinks." + listing_name = "Ad - Rarkajar Rum" /datum/poster/bay_45 icon_state="bsposter45" name = "Responsible engineering habits, No #1" desc = "A safety poster featuring a blue haired engineer. \"When repairing a machine or construction, always aim for long-term solutions.\"" + listing_name = "Safety - No Shortcut Fixes" /datum/poster/bay_46 icon_state="bsposter46" name = "Inspirational lawyer" - desc = "An inspirational poster depicting a Skrellian lawyer. He seems to be shouting something, while pointing fiercely to the right." + desc = "An inspirational poster depicting a Skrellian lawyer. He seems to be shouting something, while pointing fiercely to the right. It's an ad for a NanoTrasen subsidiary law firm." + listing_name = "Ad - NanoTrasen Law" /datum/poster/bay_47 icon_state="bsposter47" name = "Security pinup" desc = "This is a pin-up poster. A dark skinned white haired girl poses in the sunlight wearing a tank top with her stomach exposed. The text on the poster states \"M, Succubus of Security.\" and a lipstick mark stains the top right corner, as if kissed by the model herself." + listing_name = "Pin-up - Security" /datum/poster/bay_48 icon_state="bsposter48" - name = "Borg pinup?" - desc = "This is a.. pin-up poster? It is a diagram on an old model of cyborg with a note scribbled in marker on the bottom, on the top there is a large XO written in red marker." + name = "Remote Drones 4 U" + desc = "This is an ad for a fairly basic model of drone produced by Grayson Manufactories Ltd. for use in hazardous environments." + listing_name = "Ad - Grayson Drones" /datum/poster/bay_49 icon_state="bsposter49" name = "Engineering recruitment" desc = "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\"" + listing_name = "Recruitment - Engineering" /datum/poster/bay_50 icon_state="bsposter50" name = "Pinup Girl Cindy Kate" - desc = "This particular one is of Cindy Kate, a seductive performer well known among less savoury circles." + desc = "This particular one is of Cindy Kate, a seductive virtual performer well known among less savoury exonet circles." + listing_name = "Pin-up - Cindi-Kate" /datum/poster/bay_51 icon_state="bsposter51" - name = "space appreciation poster" - desc = "This is a poster produced by the Generic Space Company, as a part of a series of commemorative posters on the wonders of space. One of three." + name = "space tourism poster" + desc = "This is a poster produced by the Visit Space Society. This one is targeted at planet-dwellers, suggesting they generally visit space." + listing_name = "Tourism - Space" /datum/poster/bay_52 icon_state="bsposter52" name = "fire safety poster" desc = "This is a poster reminding you of what you should do if you are on fire, or if you are at a dance party." + listing_name = "Safety - Stop Drop and Roll" /datum/poster/bay_53 icon_state="bsposter53" name = "fire extinguisher poster" desc = "This is a poster reminding you of what you should use to put out a fire." + listing_name = "Safety - Fire Extinguishers" /datum/poster/bay_54 icon_state="bsposter54" name = "firefighter poster" desc = "This is a poster of a particularly stern looking firefighter. The caption reads, \"Only you can prevent space fires.\"" + listing_name = "Safety - Prevent Fires" /datum/poster/bay_55 icon_state="bsposter55" - name = "Earth appreciation poster" - desc = "This is a poster produced by the Generic Space Company, as a part of a series of commemorative posters on the wonders of space. Two of three." + name = "Binma tourism poster" + desc = "This is a poster produced by the Visit Space Society. This one suggests you visit the exotic garden world of Binma, and try not to get eaten." + listing_name = "Tourism - Binma" /datum/poster/bay_56 icon_state="bsposter56" name = "Mars appreciation poster" - desc = "This is a poster produced by the Generic Space Company, as a part of a series of commemorative posters on the wonders of space. Three of three." + desc = "This is a poster produced by the Visit Space Society. This one suggests you visit historic Mars. Come for the domes, stay for the monuments to hubris!" /datum/poster/bay_57 icon_state="bsposter57" name = "space carp warning poster" desc = "This poster tells of the dangers of space carp infestations." + listing_name = "Safety - Carp" /datum/poster/bay_58 icon_state="bsposter58" name = "space carp information poster" - desc = "This poster showcases an old spacer saying on the dangers of migrant space carp." \ No newline at end of file + desc = "This poster showcases an old spacer saying on the dangers of migrant space carp." + listing_name = "Safety - Carp Information" + diff --git a/code/game/objects/effects/decals/posters/polarisposters.dm b/code/game/objects/effects/decals/posters/polarisposters.dm index d40cdd0db0..45cfd8622d 100644 --- a/code/game/objects/effects/decals/posters/polarisposters.dm +++ b/code/game/objects/effects/decals/posters/polarisposters.dm @@ -2,41 +2,49 @@ icon_state="polposter1" name = "Safety!" desc = "A poster advising you to learn how to put on your internals at a moment's notice." + listing_name = "Safety - Internals" /datum/poster/pol_2 icon_state="polposter2" name = "Safety!" desc = "A blue and white colored poster. This one advises you to wear your safety goggles when handling chemicals." + listing_name = "Safety - Goggles" /datum/poster/pol_3 icon_state="polposter3" name = "Safety!" desc = "A safety poster instructing you to comply with the authorities, especially in an emergency." + listing_name = "Safety - Follow Instruction" /datum/poster/pol_4 icon_state="polposter4" name = "Clean Hands Save Lives" desc = "A safety poster reminding you to wash your hands." + listing_name = "Safety - Hand Washing" /datum/poster/pol_5 icon_state="polposter5" name = "Help!" desc = "This poster depicts a man helping another man get up." + listing_name = "Safety - Help Others" /datum/poster/pol_6 icon_state="polposter6" name = "Walk!" desc = "This poster depicts a man walking, presumably to encourage you not to run in the halls." + listing_name = "Safety - No Running" /datum/poster/pol_7 icon_state="polposter7" name = "Place your signs!" desc = "A safety poster reminding custodial staff to place wet floor signs where needed. This reminder's rarely heeded." + listing_name = "Safety - Wet Floor Signs" /datum/poster/pol_8 icon_state="polposter8" name = "Safety!" desc = "An advertisement / safety poster for EVA training and certification. Training is available at your local Central Command." + listing_name = "Safety - EVA Training" /datum/poster/pol_9 icon_state="poster10" //Recycling this icon @@ -44,52 +52,138 @@ desc = "This poster appears to be reference material for maintenance personnel, instructing to always wear insulated gloves, that wirecutters and \ a multitool are the optimal tools to use, and where to find the maintenance panel on most airlocks. Unfortunately, the poster does not mention any \ wire codes." + listing_name = "Safety - Airlock Maintenance" /datum/poster/pol_10 icon_state="polposter9" name = "orchid" desc = "This poster appears strangely familiar, depicting the flower of a tree native to the planet Earth." + listing_name = "General - Orchid" -// A new subset of poster datum for Security posters. +/datum/poster/pol_11 + icon_state="polposter10" + name = "firefighter pinup" + desc = "A buff firefighter with his shirt off. Maybe he's trying to raise awareness about fire safety, but you're a little distracted." + listing_name = "Pin-up - Firefighter" + +/datum/poster/pol_12 + icon_state="polposter11" + name = "CHUCK" + desc = "With the budget Cyber Solutions 'Chuck' model work drone, your days of menial labour are numbered! \"With Cyber Solutions, there's always someone beside you, helping you. You know their face. You know my face.\"" + listing_name = "Ad - Chuck" + +/datum/poster/pol_13 + icon_state="polposter12" + name = "New You" + desc = "An ad for Kaleidoscope Cosmetics. \"The common factor in all your failed relationships is you. Fix it with affordable gene therapy!\"" + listing_name = "Ad - Kaleidoscope" + +/datum/poster/pol_14 + icon_state="polposter13" + name = "Take a Taxi" + desc = "An ad for the Major Bill's Transportation drone-operated taxi service operating in most major cities throughout Solar space." + listing_name = "Ad - Taxi" + +/datum/poster/pol_15 + icon_state="polposter14" + name = "Adopt A Teshpet" + desc = "An ad for definitively racist virtual pet game, Teshpets." + listing_name = "Ad - Teshpets" + +/datum/poster/pol_16 + icon_state="polposter15" + name = "Train and Fight" + desc = "This poster of sweaty, near-naked wrestlers is the most masculine thing you've ever seen. You can barely tell where one man ends and the other begins. Always seek manliness!" + listing_name = "Pinup - Wrestling" + +/datum/poster/nt_3 + icon_state = "ntposter03" + name = "Mechatronic Safety" + desc = "This poster displays three cutting-edge gygaxes standing in line in front of a man in plain clothes.\ + The poster's captions explain the importance of knowing how to operate a mechatronic vehicle safely, especially near other personnel.\ + The image seems important." + listing_name = "Safety - Mech Operation" + +/datum/poster/nt_4 + icon_state = "ntposter04" + name = "Beware Aetotheans" + desc = "This poster displays a distinctly hostile-looking red Promethean in a black coat. The fine-print around the edges warns the reader about the dangers posed by Almachi Prometheans." + listing_name = "Safety - Aetothean Danger" + +/datum/poster/nt_5 + icon_state = "ntposter05" + name = "Promethean" + desc = "This poster displays a friendly-looking green Promethean in a labcoat. The fine-print around the edges talks about the benefits Prometheans give in laboratories." + listing_name = "Safety - Prometheans" + +/datum/poster/nt_6 + icon_state = "ntposter06" + name = "NanoTrasen" + desc = "This poster showcases an NT emblem. There is writing in the ring around the inner points, probably some sort of slogan no one bothers to memorize." + listing_name = "Ad - NanoTrasen" + +/datum/poster/nt_7 + icon_state = "ntposter07" + name = "SolGov" + desc = "This poster showcases an SCG emblem. The outer ring reads,\ + \"NIL MORTALIBUS ARDUI EST\".\ + Solar Confederate Government." + listing_name = "Political - SolGov" + +/datum/poster/nt_8 + icon_state = "ntposter08" + name = "wildlife hazard" + desc = "This SifGov poster warns against attempting to kill a fully grown giant spider or other hostile life-form alone." + listing_name = "Safety - Spiders" + +// A new subset of poster datum for ONLY 'Internal' NanoTrasen posters, given to Security. /datum/poster/nanotrasen icon_state = "polposter1" name = "Safety!" desc = "A poster advising you to learn how to put on your internals at a moment's notice." + listing_name = "Safety - Internals" /datum/poster/nanotrasen/pol_2 icon_state="polposter2" name = "Safety!" desc = "A blue and white colored poster. This one advises you to wear your safety goggles when handling chemicals." + listing_name = "Safety - Goggles" /datum/poster/nanotrasen/pol_3 icon_state="polposter3" name = "Safety!" desc = "A safety poster instructing you to comply with the authorities, especially in an emergency." + listing_name = "Safety - Follow Instruction" /datum/poster/nanotrasen/pol_4 icon_state="polposter4" name = "Clean Hands Save Lives" desc = "A safety poster reminding you to wash your hands." + listing_name = "Safety - Hand Washing" /datum/poster/nanotrasen/pol_5 icon_state="polposter5" name = "Help!" desc = "This poster depicts a man helping another man get up." + listing_name = "Safety - Help Others" /datum/poster/nanotrasen/pol_6 icon_state="polposter6" name = "Walk!" desc = "This poster depicts a man walking, presumably to encourage you not to run in the halls." + listing_name = "Safety - No Running" /datum/poster/nanotrasen/pol_7 icon_state="polposter7" name = "Place your signs!" desc = "A safety poster reminding custodial staff to place wet floor signs where needed. This reminder's rarely heeded." + listing_name = "Safety - Wet Floor Signs" /datum/poster/nanotrasen/pol_8 icon_state="polposter8" name = "Safety!" desc = "An advertisement / safety poster for EVA training and certification. Training is available at your local Central Command." + listing_name = "Safety - EVA Training" /datum/poster/nanotrasen/pol_9 icon_state="poster10" @@ -97,81 +191,97 @@ desc = "This poster appears to be reference material for maintenance personnel, instructing to always wear insulated gloves, that wirecutters and \ a multitool are the optimal tools to use, and where to find the maintenance panel on most airlocks. Unfortunately, the poster does not mention any \ wire codes." + listing_name = "Safety - Airlock Maintenance" /datum/poster/nanotrasen/pol_10 icon_state="polposter9" name = "orchid" desc = "This poster suggests a feeling of peace. It depicts the flower of a tree native to the planet Earth." + listing_name = "General - Orchid" /datum/poster/nanotrasen/bay_9 icon_state="bsposter9" name = "Pinup Girl Amy" desc = "This particular one is of Amy, the nymphomaniac urban legend of deep space. How this photograph came to be is not known." + listing_name = "Pin-up - Amy" /datum/poster/nanotrasen/bay_21 icon_state="bsposter21" name = "Join the Fuzz!" desc = "It's a nice recruitment poster of a white haired Chinese woman that says; \"Big Guns, Hot Women, Good Times. Security. We get it done.\"" + listing_name = "Recruitment - NanoTrasen Security - Pinup" /datum/poster/nanotrasen/bay_22 icon_state="bsposter22" name = "Looking for a career with excitement?" desc = "A recruitment poster starring a dark haired woman with glasses and a purple shirt that has \"Got Brains? Got Talent? Not afraid of electric flying monsters that want to suck the soul out of you? Then Xenobiology could use someone like you!\" written on the bottom." + listing_name = "Recruitment - Xenobiology" /datum/poster/nanotrasen/bay_23 icon_state="bsposter23" name = "Safety first: because electricity doesn't wait!" desc = "A safety poster starring a clueless looking redhead with frazzled hair. \"Every year, hundreds of NT employees expose themselves to electric shock. Play it safe. Avoid suspicious doors after electrical storms, and always wear protection when doing electric maintenance.\"" + listing_name = "Safety - Electric Shock" /datum/poster/nanotrasen/bay_24 icon_state="bsposter24" name = "Responsible medbay habits, No #259" desc = "A poster with a nervous looking geneticist on it states; \"Friends Tell Friends They're Clones. It can cause severe and irreparable emotional trauma if a person is not properly informed of their recent demise. Always follow your contractual obligation and inform them of their recent rejuvenation.\"" + listing_name = "Medical - Clone Disclosure" /datum/poster/nanotrasen/bay_25 icon_state="bsposter25" name = "Irresponsible medbay habits, No #2" desc = "This is a safety poster starring a perverted looking naked doctor. \"Sexual harassment is never okay. REPORT any acts of sexual deviance or harassment that disrupt a healthy working environment.\"" + listing_name = "Medical - Sexual Harassment" /datum/poster/nanotrasen/bay_49 icon_state="bsposter49" name = "Engineering recruitment" desc = "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\"" + listing_name = "Recruitment - Engineering" /datum/poster/nanotrasen/bay_52 icon_state="bsposter52" name = "fire safety poster" desc = "This is a poster reminding you of what you should do if you are on fire, or if you are at a dance party." + listing_name = "Safety - Stop Drop And Roll" /datum/poster/nanotrasen/bay_53 icon_state="bsposter53" name = "fire extinguisher poster" desc = "This is a poster reminding you of what you should use to put out a fire." + listing_name = "Safety - Extinguishers" /datum/poster/nanotrasen/bay_54 icon_state="bsposter54" name = "firefighter poster" desc = "This is a poster of a particularly stern looking firefighter. The caption reads, \"Only you can prevent space fires.\"" + listing_name = "Safety - Prevent Fires" /datum/poster/nanotrasen/bay_57 icon_state="bsposter57" name = "space carp warning poster" desc = "This poster tells of the dangers of space carp infestations." + listing_name = "Safety - Carp" /datum/poster/nanotrasen/bay_58 icon_state="bsposter58" name = "space carp information poster" desc = "This poster showcases an old spacer saying on the dangers of migrant space carp." + listing_name = "Safety - Carp Information" /datum/poster/nanotrasen/nt_1 icon_state = "ntposter01" name = "Security recruitment" desc = "This poster showcases an NT security guard in an excited pose, with a small blurb about the importance of Security." + listing_name = "Recruitment - NanoTrasen Security - Importance" /datum/poster/nanotrasen/nt_2 icon_state = "ntposter02" name = "Security recruitment" desc = "This poster showcases an NT security guard in an excited pose, with a small blurb about Security Employee benefits." + listing_name = "Recruitment - NanoTrasen Security - Benefits" /datum/poster/nanotrasen/nt_3 icon_state = "ntposter03" @@ -179,6 +289,7 @@ desc = "This poster displays three cutting-edge gygaxes standing in line in front of a man in plain clothes.\ The poster's captions explain the importance of knowing how to operate a mechatronic vehicle safely, especially near other personnel.\ The image seems important." + listing_name = "Safety - Mech Operation" //VOREStation Removal Start TFF 17/12/19 - lore not used in our station's own lore. /* @@ -186,6 +297,7 @@ icon_state = "ntposter04" name = "Beware Aetotheans" desc = "This poster displays a distinctly hostile-looking red Promethean in a black coat. The fine-print around the edges warns the reader about the dangers posed by Almachi Prometheans." + listing_name = "Safety - Aetothean Danger" */ //VOREstation Removal End @@ -193,11 +305,13 @@ icon_state = "ntposter05" name = "Promethean" desc = "This poster displays a friendly-looking green Promethean in a labcoat. The fine-print around the edges talks about the benefits Prometheans give in laboratories." + listing_name = "Safety - Prometheans" /datum/poster/nanotrasen/nt_6 icon_state = "ntposter06" name = "NanoTrasen" desc = "This poster showcases an NT emblem. There is writing in the ring around the inner points, probably some sort of slogan no one bothers to memorize." + listing_name = "Ad - NanoTrasen" /datum/poster/nanotrasen/nt_7 icon_state = "ntposter07" @@ -205,13 +319,16 @@ desc = "This poster showcases an SCG emblem. The outer ring reads,\ \"NIL MORTALIBUS ARDUI EST\".\ Solar Confederate Government." + listing_name = "Political - SolGov" /datum/poster/nanotrasen/nt_8 icon_state = "ntposter08" name = "wildlife hazard" desc = "This poster warns against attempting to kill a fully grown giant spider or other hostile life-form alone." + listing_name = "Safety - Spiders" /datum/poster/nanotrasen/nt_9 icon_state = "ntposter09" name = "Regulations and You" - desc = "This poster showcases an NT security guard reading from her PDA. The blurb advocates for the reader to keep corporate regulations in mind at all times, as an emergency can occur at any time." + desc = "This SifGov poster showcases an NT security guard reading from her PDA. The blurb advocates for the reader to keep corporate regulations in mind at all times, as an emergency can occur at any time." + listing_name = "Safety - Corporate Regulations" diff --git a/code/game/objects/effects/decals/warning_stripes.dm b/code/game/objects/effects/decals/warning_stripes.dm index db7c4bf74f..0e3d12897d 100644 --- a/code/game/objects/effects/decals/warning_stripes.dm +++ b/code/game/objects/effects/decals/warning_stripes.dm @@ -1,10 +1,10 @@ /obj/effect/decal/warning_stripes icon = 'icons/effects/warning_stripes.dmi' -/obj/effect/decal/warning_stripes/New() +/obj/effect/decal/warning_stripes/Initialize() . = ..() var/turf/T=get_turf(src) var/image/I=image(icon, icon_state = icon_state, dir = dir) I.color=color T.overlays += I - qdel(src) + return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 1e804bbb26..0ec3f40036 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -33,6 +33,9 @@ would spawn and follow the beaker, even if it is carried or thrown. proc/start() + Destroy() + holder = null + return ..() ///////////////////////////////////////////// // GENERIC STEAM SPREAD SYSTEM diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index c5e1f26c61..c49a4e0666 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -10,32 +10,37 @@ var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine var/panel_open = 0 var/datum/wires/mines/wires = null - register_as_dangerous_object = TRUE - var/camo_net = FALSE // Will the mine 'cloak' on deployment? // The trap item will be triggered in some manner when detonating. Default only checks for grenades. var/obj/item/trap = null -/obj/effect/mine/New() +/obj/effect/mine/Initialize() icon_state = "uglyminearmed" wires = new(src) - + . = ..() if(ispath(trap)) trap = new trap(src) - -/obj/effect/mine/Initialize() - ..() - + register_dangerous_to_step() if(camo_net) alpha = 50 /obj/effect/mine/Destroy() + unregister_dangerous_to_step() if(trap) QDEL_NULL(trap) qdel_null(wires) return ..() +/obj/effect/mine/Moved(atom/oldloc) + . = ..() + if(.) + var/turf/old_turf = get_turf(oldloc) + var/turf/new_turf = get_turf(src) + if(old_turf != new_turf) + old_turf.unregister_dangerous_object(src) + new_turf.register_dangerous_object(src) + /obj/effect/mine/proc/explode(var/mob/living/M) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() triggered = 1 diff --git a/code/game/objects/effects/prop/columnblast.dm b/code/game/objects/effects/prop/columnblast.dm index fc604235c8..ce0e4b2aad 100644 --- a/code/game/objects/effects/prop/columnblast.dm +++ b/code/game/objects/effects/prop/columnblast.dm @@ -17,7 +17,7 @@ ..() /obj/effect/temporary_effect/eruption/Initialize() - ..() + . = ..() flick("[icon_state]_create",src) /obj/effect/temporary_effect/eruption/Destroy() diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index c848a2f1df..eb025f9ba4 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -159,7 +159,6 @@ /obj/effect/spawner/newbomb/Initialize(newloc) ..(newloc) - var/obj/item/device/transfer_valve/V = new(src.loc) var/obj/item/weapon/tank/phoron/PT = new(V) var/obj/item/weapon/tank/oxygen/OT = new(V) @@ -183,19 +182,14 @@ OT.air_contents.temperature = PHORON_MINIMUM_BURN_TEMPERATURE+1 OT.air_contents.update_values() - var/obj/item/device/assembly/S = new assembly_type(V) - - V.attached_device = S S.holder = V S.toggle_secure() V.update_icon() - - qdel(src) - + return INITIALIZE_HINT_QDEL /////////////////////// diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index e48606a2ac..e45664e60d 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -74,6 +74,12 @@ light_power = 0.5 light_color = "#8837A3" +/obj/effect/projectile/impact/precursor //CHOMPedit add precursor impact + icon_state = "impact_prec" + light_range = 2 + light_power = 0.7 + light_color = "#FF0099" + /obj/effect/projectile/impact/tungsten icon_state = "impact_mhd_laser" light_range = 4 diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index a5c70aab2c..0c47f4ebb9 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -62,6 +62,12 @@ light_power = 0.5 light_color = "#8837A3" +/obj/effect/projectile/muzzle/precursor //CHOMPedit add Precursor muzzle + icon_state = "muzzle_prec" + light_range = 2 + light_power = 0.7 + light_color = "#FF0099" + /obj/effect/projectile/muzzle/inversion icon_state = "muzzle_invert" light_range = 2 diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 4326bc536d..908342e3ea 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -91,6 +91,12 @@ light_power = 0.5 light_color = "#8837A3" +/obj/effect/projectile/tracer/precursor //CHOMPedit add precursor tracer + icon_state = "prec" + light_range = 2 + light_power = 0.7 + light_color = "#FF0099" + /obj/effect/projectile/tracer/inversion icon_state = "invert" light_range = 2 diff --git a/code/game/objects/effects/zz_portals_ch.dm b/code/game/objects/effects/zz_portals_ch.dm index ac3bdda110..809d63a1fa 100644 --- a/code/game/objects/effects/zz_portals_ch.dm +++ b/code/game/objects/effects/zz_portals_ch.dm @@ -20,10 +20,14 @@ /obj/effect/simple_portal/proc/handle_teleport(atom/movable/AM) if(destination) AM.forceMove(destination) - if(!AM.is_incorporeal()) + if(!AM.is_incorporeal() && !istype(AM,/mob/observer)) playsound(get_turf(src),teleport_sound,60,1) playsound(get_turf(destination),teleport_sound,60,1) +/obj/effect/simple_portal/attack_ghost(var/mob/observer/dead/user) + . = ..() + handle_teleport(user) + /obj/effect/simple_portal/coords var/tele_x var/tele_y diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ff0ff75426..6d865085f5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -356,6 +356,10 @@ playsound(src, pickup_sound, 20, preference = /datum/client_preference/pickup_sounds) return +// As above but for items being equipped to an active module on a robot. +/obj/item/proc/equipped_robot(var/mob/user) + return + //Defines which slots correspond to which slot flags var/list/global/slot_flags_enumeration = list( "[slot_wear_mask]" = SLOT_MASK, @@ -612,9 +616,6 @@ var/list/global/slot_flags_enumeration = list( . = ..() if(blood_overlay) overlays.Remove(blood_overlay) - if(istype(src, /obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = src - G.transfer_blood = 0 /obj/item/reveal_blood() if(was_bloodied && !fluorescent) @@ -791,7 +792,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. drop_sound = 'sound/items/drop/device.ogg' //Worn icon generation for on-mob sprites -/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //VOREStation edit - add 'clip mask' argument. +/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //Get the required information about the base icon var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands) var/state2use = get_worn_icon_state(slot_name = slot_name) @@ -821,6 +822,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits. standing.filters += filter(type = "alpha", icon = clip_mask) + if(istype(clip_mask)) //For taur bodies/tails clipping off parts of uniforms and suits. + standing.filters += filter(type = "alpha", icon = clip_mask) + //Apply any special features if(!inhands) apply_blood(standing) //Some items show blood when bloodied @@ -952,4 +956,4 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. // Like the above, but used for RPED sorting of parts. /obj/item/proc/rped_rating() - return get_rating() \ No newline at end of file + return get_rating() diff --git a/code/game/objects/items/devices/communicator/UI_tgui.dm b/code/game/objects/items/devices/communicator/UI_tgui.dm index 8dabf77f42..4745a02488 100644 --- a/code/game/objects/items/devices/communicator/UI_tgui.dm +++ b/code/game/objects/items/devices/communicator/UI_tgui.dm @@ -1,3 +1,103 @@ +// Etc UI-only vars +/obj/item/device/communicator + // Stuff for moving cameras + var/turf/last_camera_turf + // Stuff needed to render the map + var/map_name + var/obj/screen/map_view/cam_screen + var/list/cam_plane_masters + var/obj/screen/background/cam_background + var/obj/screen/skybox/local_skybox + +// Proc: setup_tgui_camera() +// Parameters: None +// Description: This sets up all of the variables above to handle in-UI map windows. +/obj/item/device/communicator/proc/setup_tgui_camera() + map_name = "communicator_[REF(src)]_map" + + // Initialize map objects + cam_screen = new + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = FALSE + cam_screen.screen_loc = "[map_name]:1,1" + + cam_plane_masters = get_tgui_plane_masters() + + for(var/plane in cam_plane_masters) + var/obj/screen/instance = plane + instance.assigned_map = map_name + instance.del_on_map_removal = FALSE + instance.screen_loc = "[map_name]:CENTER" + + local_skybox = new() + local_skybox.assigned_map = map_name + local_skybox.del_on_map_removal = FALSE + local_skybox.screen_loc = "[map_name]:CENTER,CENTER" + cam_plane_masters += local_skybox + + cam_background = new + cam_background.assigned_map = map_name + cam_background.del_on_map_removal = FALSE + +// Proc: update_active_camera_screen() +// Parameters: None +// Description: This refreshes the camera location +/obj/item/device/communicator/proc/update_active_camera_screen() + if(!video_source?.can_use()) + show_static() + return + + var/newturf = get_turf(video_source) + if(!is_on_same_plane_or_station(get_z(newturf), get_z(src))) + show_static() + return + + var/obj/item/device/communicator/communicator = video_source.loc + if(istype(communicator)) + if(communicator.selfie_mode) + var/mob/target = get(communicator, /mob) + if(istype(target)) + cam_screen.vis_contents = list(target) + else + cam_screen.vis_contents = list(communicator) + cam_background.fill_rect(1, 1, 1, 1) + cam_background.icon_state = "clear" + local_skybox.cut_overlays() + return + + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + if(last_camera_turf == newturf) + return + + // We get a new turf in case they've moved in the last half decisecond (it's BYOND, it might happen) + last_camera_turf = get_turf(video_source) + + if(!is_on_same_plane_or_station(get_z(last_camera_turf), get_z(src))) + show_static() + return + + var/list/visible_turfs = list() + var/list/visible_things = view(video_range, last_camera_turf) + for(var/turf/visible_turf in visible_things) + visible_turfs += visible_turf + + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, (video_range * 2), (video_range * 2)) + + local_skybox.cut_overlays() + local_skybox.add_overlay(SSskybox.get_skybox(get_z(last_camera_turf))) + local_skybox.scale_to_view(video_range * 2) + local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - last_camera_turf.x, (world.maxy>>1) - last_camera_turf.y) + +/obj/item/device/communicator/proc/show_static() + cam_screen.vis_contents.Cut() + cam_background.icon_state = "scanline2" + cam_background.fill_rect(1, 1, (video_range * 2), (video_range * 2)) + local_skybox.cut_overlays() + // Proc: tgui_state() // Parameters: User // Description: This tells TGUI to only allow us to be interacted with while in a mob inventory. @@ -9,7 +109,15 @@ // Description: This proc handles opening the UI. It's basically just a standard stub. /obj/item/device/communicator/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) ui = SStgui.try_update_ui(user, src, ui) + // Update the camera every SStgui tick in case it moves + update_active_camera_screen() if(!ui) + // Register map objects + user.client.register_map_obj(cam_screen) + for(var/plane in cam_plane_masters) + user.client.register_map_obj(plane) + user.client.register_map_obj(cam_background) + // Setup UI ui = new(user, src, "Communicator", name) if(custom_state) ui.set_state(custom_state) @@ -188,6 +296,7 @@ data["target_feed"] = data["feeds"][newsfeed_channel] else data["target_feed"] = null + data["selfie_mode"] = selfie_mode return data @@ -200,6 +309,7 @@ if(data_core) data_core.get_manifest_list() data["manifest"] = PDA_Manifest + data["mapRef"] = map_name return data // Proc: tgui-act() @@ -231,6 +341,9 @@ if("toggle_ringer") ringer = !ringer + if("selfie_mode") + selfie_mode = !selfie_mode + if("add_hex") var/hex = params["add_hex"] add_to_EPv2(hex) @@ -324,3 +437,4 @@ if("newsfeed") newsfeed_channel = text2num(params["newsfeed"]) +#undef DEFAULT_MAP_SIZE \ No newline at end of file diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 358ef3b61b..6adbbf811c 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -26,9 +26,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list() show_messages = 1 origin_tech = list(TECH_ENGINEERING = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2, TECH_DATA = 2) - matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10, MAT_COPPER = 10) - var/video_range = 4 + var/video_range = 3 var/obj/machinery/camera/communicator/video_source // Their camera var/obj/machinery/camera/communicator/camera // Our camera @@ -72,6 +72,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list() var/update_ticks = 0 var/newsfeed_channel = 0 + // If you turn this on, it changes the way communicator video works. User configurable option. + var/selfie_mode = FALSE + // Proc: New() // Parameters: None // Description: Adds the new communicator to the global list of all communicators, sorts the list, obtains a reference to the Exonet node, then tries to @@ -86,6 +89,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() camera.name = "[src] #[rand(100,999)]" camera.c_tag = camera.name + setup_tgui_camera() + //This is a pretty terrible way of doing this. addtimer(CALLBACK(src, .proc/register_to_holder), 5 SECONDS) @@ -124,12 +129,9 @@ var/global/list/obj/item/device/communicator/all_communicators = list() /obj/item/device/communicator/examine(mob/user) . = ..() - if(Adjacent(user) && video_source) - . += "It looks like it's on a video call: \[view\]" - for(var/mob/living/voice/voice in contents) . += "On the screen, you can see a image feed of [voice]." - + if(voice && voice.key) switch(voice.stat) if(CONSCIOUS) @@ -142,17 +144,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list() else . += "The device doesn't appear to be transmitting any data." -// Proc: Topic() -// Parameters: href, href_list - Data from a link -// Description: Used by the above examine. -/obj/item/device/communicator/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["watchvideo"]) - if(video_source) - watch_video(usr) - // Proc: emp_act() // Parameters: None // Description: Drops all calls when EMPed, so the holder can then get murdered by the antagonist. @@ -234,8 +225,6 @@ var/global/list/obj/item/device/communicator/all_communicators = list() alert_called = 0 update_icon() tgui_interact(user) - if(video_source) - watch_video(user) // Proc: MouseDrop() //Same thing PDAs do @@ -316,6 +305,11 @@ var/global/list/obj/item/device/communicator/all_communicators = list() QDEL_NULL(camera) QDEL_NULL(exonet) + last_camera_turf = null + qdel(cam_screen) + QDEL_LIST(cam_plane_masters) + qdel(cam_background) + return ..() // Proc: update_icon() diff --git a/code/game/objects/items/devices/communicator/helper.dm b/code/game/objects/items/devices/communicator/helper.dm index 5cf5eac2c2..aa17fd4bd6 100644 --- a/code/game/objects/items/devices/communicator/helper.dm +++ b/code/game/objects/items/devices/communicator/helper.dm @@ -40,7 +40,7 @@ var/list/feeds = list() for(var/datum/feed_channel/channel in news_network.network_channels) var/list/messages = list() - if(!channel.censored) + if(!channel.censored && channel.channel_name != "Vir News Network") //Do not load the 'IC news' channel as it is simply too long. var/index = 0 for(var/datum/feed_message/FM in channel.messages) index++ diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm index 7075dbe958..bb25dce953 100644 --- a/code/game/objects/items/devices/communicator/phone.dm +++ b/code/game/objects/items/devices/communicator/phone.dm @@ -332,12 +332,15 @@ if(video_source) //Already in a video to_chat(user, "You are already connected to a video call!") + return if(user.blinded) //User is blinded to_chat(user, "You cannot see well enough to do that!") + return if(!(src in comm.communicating) || !comm.camera) //You called someone with a broken communicator or one that's fake or yourself or something to_chat(user, "[bicon(src)]ERROR: Video failed. Either bandwidth is too low, or the other communicator is malfunctioning.") + return to_chat(user, "[bicon(src)] Attempting to start video over existing call.") sleep(30) @@ -345,42 +348,16 @@ video_source = comm.camera comm.visible_message("[bicon(src)] New video connection from [comm].") - watch_video(user) + update_active_camera_screen() + GLOB.moved_event.register(video_source, src, .proc/update_active_camera_screen) update_icon() -// Proc: watch_video() -// Parameters: user - the mob doing the viewing of video -// Description: Moves a mob's eye to the far end for the duration of viewing the far end -/obj/item/device/communicator/proc/watch_video(mob/user) - if(!Adjacent(user) || !video_source) return - user.set_machine(video_source) - user.reset_view(video_source) - to_chat(user, "Now viewing video session. To leave camera view, close the communicator window OR: OOC -> Cancel Camera View") - to_chat(user, "To return to an active video session, use the communicator in your hand.") - spawn(0) - while(user.machine == video_source && Adjacent(user)) - var/turf/T = get_turf(video_source) - if(!T || !is_on_same_plane_or_station(T.z, user.z) || !video_source.can_use()) - to_chat(user, "The screen bursts into static, then goes black.") - video_cleanup(user) - return - sleep(10) - - video_cleanup(user) - -// Proc: video_cleanup() -// Parameters: user - the mob who doesn't want to see video anymore -// Description: Cleans up mob's client when they stop watching a video -/obj/item/device/communicator/proc/video_cleanup(mob/user) - if(!user) return - - user.reset_view(null) - user.unset_machine() - // Proc: end_video() // Parameters: reason - the text reason to print for why it ended // Description: Ends the video call by clearing video_source /obj/item/device/communicator/proc/end_video(var/reason) + GLOB.moved_event.unregister(video_source, src, .proc/update_active_camera_screen) + show_static() video_source = null . = "[bicon(src)] [reason ? reason : "Video session ended"]." diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 2247674f60..facc87ae64 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -33,7 +33,7 @@ var/cell_type = /obj/item/weapon/cell/device /obj/item/device/flash/Initialize() - ..() + . = ..() power_supply = new cell_type(src) /obj/item/device/flash/attackby(var/obj/item/W, var/mob/user) diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index d84f4bc3ca..c4c64f746c 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -1,5 +1,5 @@ /obj/item/device/floor_painter - name = "floor painter" + name = "paint sprayer" icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler1" @@ -43,6 +43,10 @@ if(!proximity) return + if(istype(A, /mob/living/silicon/robot/platform)) + var/mob/living/silicon/robot/platform/robit = A + return robit.try_paint(src, user) + var/turf/simulated/floor/F = A if(!istype(F)) to_chat(user, "\The [src] can only be used on station flooring.") @@ -115,20 +119,20 @@ /obj/item/device/floor_painter/verb/choose_colour() set name = "Choose Colour" - set desc = "Choose a floor painter colour." + set desc = "Choose a paint colour." set category = "Object" set src in usr if(usr.incapacitated()) return - var/new_colour = input(usr, "Choose a colour.", "Floor painter", paint_colour) as color|null + var/new_colour = input(usr, "Choose a colour.", name, paint_colour) as color|null if(new_colour && new_colour != paint_colour) paint_colour = new_colour to_chat(usr, "You set \the [src] to paint with a new colour.") /obj/item/device/floor_painter/verb/choose_decal() set name = "Choose Decal" - set desc = "Choose a floor painter decal." + set desc = "Choose a painting decal." set category = "Object" set src in usr @@ -142,7 +146,7 @@ /obj/item/device/floor_painter/verb/choose_direction() set name = "Choose Direction" - set desc = "Choose a floor painter direction." + set desc = "Choose a painting direction." set category = "Object" set src in usr diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index e14a4c0edf..7621f09830 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -9,24 +9,124 @@ var/list/GPS_list = list() slot_flags = SLOT_BELT origin_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 2, TECH_MAGNET = 1) matter = list(DEFAULT_WALL_MATERIAL = 500) + var/gps_tag = "GEN0" var/emped = FALSE - var/updating = TRUE // Lets users lock the UI so they don't have to deal with constantly shifting signals var/tracking = FALSE // Will not show other signals or emit its own signal if false. var/long_range = FALSE // If true, can see farther, depending on get_map_levels(). var/local_mode = FALSE // If true, only GPS signals of the same Z level are shown. var/hide_signal = FALSE // If true, signal is not visible to other GPS devices. var/can_hide_signal = FALSE // If it can toggle the above var. + var/mob/holder + var/is_in_processing_list = FALSE + var/list/tracking_devices + var/list/showing_tracked_names + var/obj/compass_holder/compass + /obj/item/device/gps/Initialize() . = ..() + compass = new(src) GPS_list += src name = "global positioning system ([gps_tag])" + update_holder() update_icon() +/obj/item/device/gps/proc/check_visible_to_holder() + . = (holder && (holder.get_active_hand() == src || holder.get_inactive_hand() == src)) + +/obj/item/device/gps/proc/update_holder() + + if(holder && loc != holder) + GLOB.moved_event.unregister(holder, src) + GLOB.dir_set_event.unregister(holder, src) + holder.client?.screen -= compass + holder = null + + if(istype(loc, /mob)) + holder = loc + GLOB.moved_event.register(holder, src, .proc/update_compass) + GLOB.dir_set_event.register(holder, src, .proc/update_compass) + + if(holder && tracking) + if(!is_in_processing_list) + START_PROCESSING(SSobj, src) + is_in_processing_list = TRUE + if(holder.client) + if(check_visible_to_holder()) + holder.client.screen |= compass + else + holder.client.screen -= compass + else + STOP_PROCESSING(SSobj, src) + is_in_processing_list = FALSE + if(holder?.client) + holder.client.screen -= compass + +/obj/item/device/gps/pickup() + . = ..() + update_holder() + +/obj/item/device/gps/equipped_robot() + . = ..() + update_holder() + +/obj/item/device/gps/equipped() + . = ..() + update_holder() + +/obj/item/device/gps/dropped() + . = ..() + update_holder() + +/obj/item/device/gps/process() + if(!tracking) + is_in_processing_list = FALSE + return PROCESS_KILL + update_holder() + if(holder) + update_compass(TRUE) + /obj/item/device/gps/Destroy() + STOP_PROCESSING(SSobj, src) + is_in_processing_list = FALSE GPS_list -= src - return ..() + . = ..() + update_holder() + QDEL_NULL(compass) + +/obj/item/device/gps/proc/can_track(var/obj/item/device/gps/other, var/reachable_z_levels) + if(!other.tracking || other.emped || other.hide_signal) + return FALSE + var/turf/origin = get_turf(src) + var/turf/target = get_turf(other) + if(!istype(origin) || !istype(target)) + return FALSE + if(origin.z == target.z) + return TRUE + if(local_mode) + return FALSE + reachable_z_levels = reachable_z_levels || using_map.get_map_levels(origin.z, long_range) + return (target.z in reachable_z_levels) + +/obj/item/device/gps/proc/update_compass(var/update_compass_icon) + compass.hide_waypoints(FALSE) + var/turf/my_turf = get_turf(src) + for(var/thing in tracking_devices) + var/obj/item/device/gps/gps = locate(thing) + if(!istype(gps) || QDELETED(gps)) + LAZYREMOVE(tracking_devices, thing) + LAZYREMOVE(showing_tracked_names, thing) + continue + var/turf/gps_turf = get_turf(gps) + var/gps_tag = LAZYACCESS(showing_tracked_names, thing) ? gps.gps_tag : null + if(istype(gps_turf)) + compass.set_waypoint("\ref[gps]", gps_tag, gps_turf.x, gps_turf.y, gps_turf.z, LAZYACCESS(tracking_devices, "\ref[gps]")) + else + compass.set_waypoint("\ref[gps]", gps_tag, 0, 0, 0, LAZYACCESS(tracking_devices, "\ref[gps]")) + if(can_track(gps) && gps_turf && my_turf && gps_turf.z == my_turf.z) + compass.show_waypoint("\ref[gps]") + compass.rebuild_overlay_lists(update_compass_icon) /obj/item/device/gps/AltClick(mob/user) toggletracking(user) @@ -37,14 +137,25 @@ var/list/GPS_list = list() if(emped) to_chat(user, "It's busted!") return + + toggle_tracking() if(tracking) to_chat(user, "[src] is no longer tracking, or visible to other GPS devices.") - tracking = FALSE - update_icon() else to_chat(user, "[src] is now tracking, and visible to other GPS devices.") - tracking = TRUE - update_icon() + +/obj/item/device/gps/proc/toggle_tracking() + tracking = !tracking + if(tracking) + if(!is_in_processing_list) + is_in_processing_list = TRUE + START_PROCESSING(SSobj, src) + else + is_in_processing_list = FALSE + STOP_PROCESSING(SSobj, src) + update_compass() + update_holder() + update_icon() /obj/item/device/gps/emp_act(severity) if(emped) // Without a fancy callback system, this will have to do. @@ -67,11 +178,7 @@ var/list/GPS_list = list() add_overlay("working") /obj/item/device/gps/attack_self(mob/user) - tgui_interact(user) - -/obj/item/device/gps/examine(mob/user) - . = ..() - . += display() + display(user) // Compiles all the data not available directly from the GPS // Like the positions and directions to all other GPS units @@ -81,24 +188,17 @@ var/list/GPS_list = list() var/turf/curr = get_turf(src) var/area/my_area = get_area(src) - dat["my_area_name"] = my_area.name + dat["my_area_name"] = strip_improper(my_area.name) dat["curr_x"] = curr.x dat["curr_y"] = curr.y dat["curr_z"] = curr.z - dat["curr_z_name"] = using_map.get_zlevel_name(curr.z) + dat["curr_z_name"] = strip_improper(using_map.get_zlevel_name(curr.z)) dat["gps_list"] = list() dat["z_level_detection"] = using_map.get_map_levels(curr.z, long_range) for(var/obj/item/device/gps/G in GPS_list - src) - if(!G.tracking || G.emped || G.hide_signal) - continue - var/turf/T = get_turf(G) - if(!T) - continue - if(local_mode && curr.z != T.z) - continue - if(!(T.z in dat["z_level_detection"])) + if(!can_track(G, dat["z_level_detection"])) continue var/gps_data[0] @@ -106,9 +206,10 @@ var/list/GPS_list = list() gps_data["gps_tag"] = G.gps_tag var/area/A = get_area(G) - gps_data["area_name"] = A.get_name() + gps_data["area_name"] = strip_improper(A.get_name()) - gps_data["z_name"] = using_map.get_zlevel_name(T.z) + var/turf/T = get_turf(G) + gps_data["z_name"] = strip_improper(using_map.get_zlevel_name(T.z)) gps_data["direction"] = get_adir(curr, T) gps_data["degrees"] = round(Get_Angle(curr,T)) gps_data["distX"] = T.x - curr.x @@ -122,37 +223,101 @@ var/list/GPS_list = list() return dat -/obj/item/device/gps/proc/display() - if(!tracking) - . = "The device is off. Alt-click it to turn it on." - return +/obj/item/device/gps/proc/display(mob/user) + if(emped) - . = "It's busted!" + to_chat(user, SPAN_WARNING("It's busted!")) return var/list/dat = list() var/list/gps_data = display_list() - dat += "Current location: [gps_data["my_area_name"]] ([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])" - dat += "[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. \[Change Tag\] \ - \[Toggle Scan Range\] \ - [can_hide_signal ? "\[Toggle Signal Visibility\]":""]" - - if(gps_data["gps_list"].len) - dat += "Detected signals;" - for(var/gps in gps_data["gps_list"]) - if(istype(gps_data["ref"], /obj/item/device/gps/internal/poi)) - dat += " [gps["gps_tag"]]: [gps["area_name"]] - [gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "in \the [gps["z_name"]]"]" - else - dat += " [gps["gps_tag"]]: [gps["area_name"]], ([gps["x"]], [gps["y"]]) - [gps["local"] ? "[gps["direction"]] Dist: [gps["distX"] ? "[abs(round(gps["distX"], 1))]m [(gps["distX"] > 0) ? "E" : "W"], " : ""][gps["distY"] ? "[abs(round(gps["distY"], 1))]m [(gps["distY"] > 0) ? "N" : "S"]" : ""]" : "in \the [gps["z_name"]]"]" + dat += "
Online players: [TGS_CLIENT_COUNT]
Crew members: [data_core.general.len]
NameRankActivity
" + if(!tracking) + dat += "\[Switch On\]" else - dat += "No other signals detected." + dat += "\[Switch Off\]" + dat += "" + dat += "" + dat += "" - . = dat + if(gps_data["gps_list"].len) + dat += "" + for(var/gps in gps_data["gps_list"]) + dat += "" + var/gps_ref = "\ref[gps["ref"]]" + dat += "" + + if(istype(gps_data["ref"], /obj/item/device/gps/internal/poi)) + dat += "" + else + dat += "" + + if(gps["local"]) + dat += "" + else + dat += "" + + if(LAZYACCESS(tracking_devices, gps_ref)) + dat += "" + else + dat += "" + dat += "" + else + dat += "" + dat += "
Current location[gps_data["my_area_name"]]([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])
[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.\[Change Tag\]\[Toggle Scan Range\][can_hide_signal ? "\[Toggle Signal Visibility\]":""]
Detected signals
[gps["gps_tag"]][gps["area_name"]][gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "[gps["z_name"]]"]([gps["x"]], [gps["y"]], [gps["z_name"]])[gps["distance"]]m[gps["direction"]]Non-local signal.\[Stop Tracking\] \[Colour [color_square(hex = LAZYACCESS(tracking_devices, gps_ref))]\] Show/Hide Label\[Start Tracking\]
No other signals detected.
" + + var/datum/browser/popup = new(user, "gps_\ref[src]", "Global Positioning System", 700, 1000) + popup.set_content(dat.Join(null)) + popup.open() /obj/item/device/gps/Topic(var/href, var/list/href_list) if(..()) - return 1 + return TRUE + + if(href_list["toggle_power"]) + toggle_tracking() + . = TRUE + + if(href_list["track_label"]) + var/gps_ref = href_list["track_label"] + var/obj/item/device/gps/gps = locate(gps_ref) + if(istype(gps) && !QDELETED(gps) && !LAZYACCESS(showing_tracked_names, gps_ref)) + LAZYSET(showing_tracked_names, gps_ref, TRUE) + else + LAZYREMOVE(showing_tracked_names, gps_ref) + to_chat(usr, SPAN_NOTICE("\The [src] is [LAZYACCESS(showing_tracked_names, gps_ref) ? "now showing" : "no longer showing"] labels for [gps.gps_tag].")) + + if(href_list["stop_track"]) + var/gps_ref = href_list["stop_track"] + var/obj/item/device/gps/gps = locate(gps_ref) + compass.clear_waypoint(gps_ref) + LAZYREMOVE(tracking_devices, gps_ref) + LAZYREMOVE(showing_tracked_names, gps_ref) + if(istype(gps) && !QDELETED(gps)) + to_chat(usr, SPAN_NOTICE("\The [src] is no longer tracking [gps.gps_tag].")) + update_compass() + . = TRUE + + if(href_list["start_track"]) + var/gps_ref = href_list["start_track"] + var/obj/item/device/gps/gps = locate(gps_ref) + if(istype(gps) && !QDELETED(gps)) + LAZYSET(tracking_devices, gps_ref, "#00ffff") + LAZYSET(showing_tracked_names, gps_ref, TRUE) + to_chat(usr, SPAN_NOTICE("\The [src] is now tracking [gps.gps_tag].")) + update_compass() + . = TRUE + + if(href_list["track_color"]) + var/obj/item/device/gps/gps = locate(href_list["track_color"]) + if(istype(gps) && !QDELETED(gps)) + var/new_colour = input("Enter a new tracking color.", "GPS Waypoint Color") as color|null + if(new_colour && istype(gps) && !QDELETED(gps) && holder == usr && !usr.incapacitated()) + to_chat(usr, SPAN_NOTICE("You adjust the colour \the [src] is using to highlight [gps.gps_tag].")) + LAZYSET(tracking_devices, href_list["track_color"], new_colour) + update_compass() + . = TRUE if(href_list["tag"]) var/a = input("Please enter desired tag.", name, gps_tag) as text @@ -161,95 +326,22 @@ var/list/GPS_list = list() gps_tag = a name = "global positioning system ([gps_tag])" to_chat(usr, "You set your GPS's tag to '[gps_tag]'.") + . = TRUE if(href_list["range"]) local_mode = !local_mode to_chat(usr, "You set the signal receiver to [local_mode ? "'NARROW'" : "'BROAD'"].") + . = TRUE if(href_list["hide"]) if(!can_hide_signal) return hide_signal = !hide_signal to_chat(usr, "You set the device to [hide_signal ? "not " : ""]broadcast a signal while scanning for other signals.") + . = TRUE -/obj/item/device/gps/tgui_interact(mob/user, datum/tgui/ui) - if(emped) - to_chat(user, "[src] fizzles weakly.") - return - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Gps", name) - ui.open() - ui.set_autoupdate(updating) - -/obj/item/device/gps/tgui_data(mob/user) - var/list/data = list() - data["power"] = tracking - data["tag"] = gps_tag - data["updating"] = updating - data["globalmode"] = !local_mode - if(!tracking || emped) //Do not bother scanning if the GPS is off or EMPed - return data - - var/turf/curr = get_turf(src) - data["currentArea"] = "[get_area_name(curr, TRUE)]" - data["currentCoords"] = list(curr.x, curr.y, curr.z) - data["currentCoordsText"] = "[curr.x], [curr.y], [using_map.get_zlevel_name(curr.z)]" - - data["zLevelDetection"] = using_map.get_map_levels(curr.z, long_range) - - var/list/signals = list() - data["signals"] = list() - - for(var/obj/item/device/gps/G in GPS_list - src) - if(!G.tracking || G.emped || G.hide_signal) - continue - - var/turf/T = get_turf(G) - if(!T) - continue - if(local_mode && curr.z != T.z) - continue - if(!(T.z in data["zLevelDetection"])) - continue - - var/list/signal = list() - signal["entrytag"] = G.gps_tag //Name or 'tag' of the GPS - signal["coords"] = list(T.x, T.y, T.z) - signal["coordsText"] = "[T.x], [T.y], [using_map.get_zlevel_name(T.z)]" - if(T.z == curr.z) //Distance/Direction calculations for same z-level only - signal["dist"] = max(get_dist(curr, T), 0) //Distance between the src and remote GPS turfs - signal["degrees"] = round(Get_Angle(curr, T)) //0-360 degree directional bearing, for more precision. - signals += list(signal) //Add this signal to the list of signals - data["signals"] = signals - return data - -/obj/item/device/gps/tgui_act(action, params) - if(..()) - return TRUE - - switch(action) - if("rename") - var/a = stripped_input(usr, "Please enter desired tag.", name, gps_tag, 20) - - if(!a) - return - - gps_tag = a - name = "global positioning system ([gps_tag])" - . = TRUE - - if("power") - toggletracking(usr) - . = TRUE - - if("updating") - updating = !updating - . = TRUE - - if("globalmode") - local_mode = !local_mode - . = TRUE + if(. && loc == usr) + display(usr) /obj/item/device/gps/on // Defaults to off to avoid polluting the signal list with a bunch of GPSes without owners. If you need to spawn active ones, use these. tracking = TRUE @@ -373,26 +465,42 @@ var/list/GPS_list = list() can_hide_signal = TRUE /obj/item/device/gps/syndie/display(mob/user) - if(!tracking) - . = "The device is off. Alt-click it to turn it on." - return + if(emped) - . = "It's busted!" + to_chat(user, "It's busted!") return var/list/dat = list() var/list/gps_data = display_list() - dat += "Current location: [gps_data["my_area_name"]] ([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])" - dat += "[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'. \[Change Tag\] \ - \[Toggle Scan Range\] \ - [can_hide_signal ? "\[Toggle Signal Visibility\]":""]" - - if(gps_data["gps_list"].len) - dat += "Detected signals;" - for(var/gps in gps_data["gps_list"]) - dat += " [gps["gps_tag"]]: [gps["area_name"]] ([gps["x"]], [gps["y"]], [gps["z_name"]]) [gps["local"] ? "Dist: [gps["distance"]]m Dir: [gps["degrees"]]° ([gps["direction"]])" :""]" + dat += "" + if(!tracking) + dat += "\[Switch On\]" else - dat += "No other signals detected." + dat += "\[Switch Off\]" + dat += "" + dat += "" + dat += "" - . = dat + if(gps_data["gps_list"].len) + dat += "" + for(var/gps in gps_data["gps_list"]) + dat += "" + var/gps_ref = "\ref[gps["ref"]]" + dat += "" + if(gps["local"]) + dat += "" + else + dat += "" + if(LAZYACCESS(tracking_devices, gps_ref)) + dat += "" + else + dat += "" + dat += "" + else + dat += "" + dat += "
Current location[gps_data["my_area_name"]]([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])
[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.\[Change Tag\]\[Toggle Scan Range\][can_hide_signal ? "\[Toggle Signal Visibility\]":""]
Detected signals
[gps["gps_tag"]][gps["area_name"]] ([gps["x"]], [gps["y"]], [gps["z_name"]])[gps["distance"]]m[gps["direction"]]Non-local signal.\[Stop Tracking\] \[Colour [color_square(hex = LAZYACCESS(tracking_devices, gps_ref))]\] Show/Hide Label\[Start Tracking\]
No other signals detected.
" + + var/datum/browser/popup = new(user, "gps_\ref[src]", "Global Positioning System", 700, 1000) + popup.set_content(dat.Join(null)) + popup.open() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 810147dbc4..7ccad467f6 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -6,7 +6,7 @@ item_state = "pen" var/pointer_icon_state slot_flags = SLOT_BELT - matter = list("glass" = 500,"metal" = 500) + matter = list("glass" = 500,"metal" = 500, MAT_COPPER = 10) w_class = 2 //Increased to 2, because diodes are w_class 2. Conservation of matter. origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1) var/turf/pointer_loc diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 837c6616f7..8ac7a07199 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -17,7 +17,7 @@ drop_sound = 'sound/items/drop/multitool.ogg' pickup_sound = 'sound/items/pickup/multitool.ogg' - matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) + matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20, MAT_COPPER = 10) var/mode_index = 1 var/toolmode = MULTITOOL_MODE_STANDARD diff --git a/code/game/objects/items/devices/paicard_ch.dm b/code/game/objects/items/devices/paicard_ch.dm new file mode 100644 index 0000000000..b6ce0d69d8 --- /dev/null +++ b/code/game/objects/items/devices/paicard_ch.dm @@ -0,0 +1,18 @@ +/obj/item/device/paicard/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/obj/item/weapon/card/id/ID = W.GetID() + if(ID) + if (src.pai.idaccessible == 1) + switch(alert(user, "Do you wish to add access to [src] or remove access from [src]?",,"Add Access","Remove Access", "Cancel")) + if("Add Access") + src.pai.idcard.access |= ID.access + to_chat(user, "You add the access from the [W] to [src].") + return + if("Remove Access") + src.pai.idcard.access = list() + to_chat(user, "You remove the access from [src].") + return + if("Cancel") + return + else if (istype(W, /obj/item/weapon/card/id) && src.pai.idaccessible == 0) + to_chat(user, "[src] is not accepting access modifcations at this time.") + return \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index cc555f8073..55b79eaef3 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -11,7 +11,7 @@ slot_flags = SLOT_BACK w_class = ITEMSIZE_HUGE - matter = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 2500) + matter = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 2500, MAT_COPPER = 1550) var/code = 2 diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 21b7463637..7c64f1b203 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -8,7 +8,7 @@ subspace_transmission = 1 canhear_range = 0 // can't hear headsets from very far away slot_flags = SLOT_EARS - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/ears.dmi') var/translate_binary = 0 var/translate_hive = 0 diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm index 9204c81dd1..8285fade75 100644 --- a/code/game/objects/items/devices/radio/headset_vr.dm +++ b/code/game/objects/items/devices/radio/headset_vr.dm @@ -22,7 +22,7 @@ icon_state = "nt_headset_alt" /obj/item/device/radio/headset - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi', + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/ears.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi') /obj/item/device/radio/headset/mob_headset //Adminbus headset for simplemob shenanigans. @@ -84,7 +84,6 @@ desc = "A headset used by pilots, has access to the explorer channel." icon_state = "pilot_headset" adhoc_fallback = TRUE - ks2type = /obj/item/device/encryptionkey/pilot /obj/item/device/radio/headset/pilot/alt name = "pilot's bowman headset" @@ -120,7 +119,7 @@ desc = "A headset used by volunteers to expedition teams, has access to the exploration channel." icon_state = "pilot_headset" adhoc_fallback = TRUE - ks2type = /obj/item/device/encryptionkey/pilot + ks2type = /obj/item/device/encryptionkey/explorer /obj/item/device/radio/headset/talon name = "talon headset" diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index d2511038dc..88e957f76e 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -61,7 +61,7 @@ var/global/list/default_medbay_channels = list( var/bs_tx_preload_id var/bs_rx_preload_id - matter = list("glass" = 25,DEFAULT_WALL_MATERIAL = 75) + matter = list("glass" = 25, DEFAULT_WALL_MATERIAL = 75, MAT_COPPER = 15) var/const/FREQ_LISTENING = 1 var/list/internal_channels @@ -297,7 +297,8 @@ var/global/list/default_medbay_channels = list( playsound(src, "button", 10) GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) -/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) //BS12 EDIT + +/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) if(!GLOB.autospeaker) return var/datum/radio_frequency/connection = null @@ -308,7 +309,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) else connection = radio_connection channel = null - if (!istype(connection)) + if(!istype(connection)) return if(!LAZYLEN(zlevels)) @@ -507,7 +508,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) else if(adhoc_fallback) //Less huzzah, we have to fallback to_chat(loc, "\The [src] pings as it falls back to local radio transmission.") subspace_transmission = FALSE - + else //Oh well return FALSE @@ -594,7 +595,7 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer) /obj/item/device/radio/examine(mob/user) . = ..() - + if((in_range(src, user) || loc == user)) if(b_stat) . += "\The [src] can be attached and modified!" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c949884c6f..291202f41f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -21,7 +21,7 @@ HALOGEN COUNTER - Radcount on mobs w_class = ITEMSIZE_SMALL throw_speed = 5 throw_range = 10 - matter = list(DEFAULT_WALL_MATERIAL = 200) + matter = list(DEFAULT_WALL_MATERIAL = 200, MAT_COPPER = 25) origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1) var/mode = 1; var/advscan = 0 diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index c4069be3ed..4c07229df7 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -1,5 +1,3 @@ -GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) - // I placed this here because of how relevant it is. // You place this in your uplinkable item to check if an uplink is active or not. // If it is, it will display the uplink menu and return 1, else it'll return false. @@ -14,29 +12,19 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) /obj/item/device/uplink var/welcome = "Welcome, Operative" // Welcoming menu message - var/uses // Numbers of crystals var/list/ItemsCategory // List of categories with lists of items var/list/ItemsReference // List of references with an associated item var/list/nanoui_items // List of items for NanoUI use var/faction = "" //Antag faction holder. - var/list/purchase_log = new - var/datum/mind/uplink_owner = null - var/used_TC = 0 var/offer_time = 10 MINUTES //The time increment per discount offered var/next_offer_time var/datum/uplink_item/discount_item //The item to be discounted var/discount_amount //The amount as a percent the item will be discounted by var/compact_mode = FALSE -/obj/item/device/uplink/Initialize(var/mapload, var/datum/mind/owner = null, var/telecrystals = DEFAULT_TELECRYSTAL_AMOUNT) +/obj/item/device/uplink/Initialize(var/mapload) . = ..() - uplink_owner = owner - purchase_log = list() - if(owner) - uses = owner.tcrystals - else - uses = telecrystals addtimer(CALLBACK(src, .proc/next_offer), offer_time) //It seems like only the /hidden type actually makes use of this... /obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost) @@ -85,7 +73,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) /obj/item/device/uplink/hidden/proc/trigger(mob/user as mob) if(!active) toggle() - interact(user) + tgui_interact(user) // Checks to see if the value meets the target. Like a frequency being a traitor_frequency, in order to unlock a headset. // If true, it accesses trigger() and returns 1. If it fails, it returns false. Use this to see if you need to close the @@ -93,8 +81,8 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) /obj/item/device/uplink/hidden/proc/check_trigger(mob/user as mob, var/value, var/target) if(value == target) trigger(user) - return 1 - return 0 + return TRUE + return FALSE // Legacy /obj/item/device/uplink/hidden/interact(mob/user) @@ -107,12 +95,11 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) return loc /obj/item/device/uplink/hidden/tgui_state(mob/user) - return GLOB.tgui_inventory_state + return GLOB.tgui_deep_inventory_state /obj/item/device/uplink/hidden/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) if(!active) toggle() - uses = user.mind.tcrystals ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "Uplink", "Remote Uplink") @@ -127,7 +114,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) var/list/data = ..() - data["telecrystals"] = uses + data["telecrystals"] = user.mind.tcrystals data["lockable"] = TRUE data["compactMode"] = compact_mode @@ -177,22 +164,19 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) data["categories"] = list() for(var/datum/uplink_category/category in uplink.categories) - if(category.can_view(src)) - var/list/cat = list( + var/list/cat = list( "name" = category.name, "items" = (category == selected_cat ? list() : null) ) - for(var/datum/uplink_item/item in category.items) - if(!item.can_view(src)) - continue - var/cost = item.cost(uses, src) || "???" - cat["items"] += list(list( - "name" = item.name, - "cost" = cost, - "desc" = item.description(), - "ref" = REF(item), - )) - data["categories"] += list(cat) + for(var/datum/uplink_item/item in category.items) + var/cost = item.cost(src, user) || "???" + cat["items"] += list(list( + "name" = item.name, + "cost" = cost, + "desc" = item.description(), + "ref" = REF(item), + )) + data["categories"] += list(cat) return data @@ -228,9 +212,9 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) // // Includes normal radio uplink, multitool uplink, // implant uplink (not the implant tool) and a preset headset uplink. -/obj/item/device/radio/uplink/New(atom/loc, datum/mind/target_mind, telecrystals) - ..(loc) - hidden_uplink = new(src, target_mind, telecrystals) +/obj/item/device/radio/uplink/New() + ..() + hidden_uplink = new(src) icon_state = "radio" /obj/item/device/radio/uplink/attack_self(mob/user as mob) @@ -238,6 +222,7 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) hidden_uplink.trigger(user) /obj/item/device/multitool/uplink/New() + ..() hidden_uplink = new(src) /obj/item/device/multitool/uplink/attack_self(mob/user as mob) @@ -250,4 +235,3 @@ GLOBAL_LIST_BOILERPLATE(world_uplinks, /obj/item/device/uplink) /obj/item/device/radio/headset/uplink/New() ..() hidden_uplink = new(src) - hidden_uplink.uses = DEFAULT_TELECRYSTAL_AMOUNT diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm index de05f91013..89bfd5f004 100644 --- a/code/game/objects/items/devices/uplink_random_lists.dm +++ b/code/game/objects/items/devices/uplink_random_lists.dm @@ -34,11 +34,11 @@ var/datum/uplink_random_selection/all_uplink_selection = new/datum/uplink_random if(!prob(RI.keep_probability)) continue var/datum/uplink_item/I = uplink.items_assoc[RI.uplink_item] - if(I.cost(telecrystals, U) > telecrystals) + if(I.cost(U) > telecrystals) continue if(bought_items && (I in bought_items) && !prob(RI.reselect_probability)) continue - if(U && !I.can_buy(U)) + if(U && !I.can_buy(U, telecrystals)) continue return I diff --git a/code/game/objects/items/pizza_voucher_vr.dm b/code/game/objects/items/pizza_voucher_vr.dm index 1d48bc9cda..a4dad4720f 100644 --- a/code/game/objects/items/pizza_voucher_vr.dm +++ b/code/game/objects/items/pizza_voucher_vr.dm @@ -8,10 +8,11 @@ w_class = ITEMSIZE_SMALL /obj/item/pizzavoucher/New() + ..() var/list/descstrings = list("24/7 PIZZA PIE HEAVEN", "WE ALWAYS DELIVER!", "24-HOUR PIZZA PIE POWER!", - "TOMATO SAUCE, CHEESE, WE'VE BOTH BOTH OF THESE!", + "TOMATO SAUCE, CHEESE, WE'VE BOTH OF THESE!", "COOKED WITH LOVE INSIDE A BIG OVEN!", "WHEN YOU NEED A SLICE OF JOY IN YOUR LIFE!", "WHEN YOU NEED A DISK OF OVEN BAKED BLISS!", diff --git a/code/game/objects/items/stacks/fifty_spawner.dm b/code/game/objects/items/stacks/fifty_spawner.dm index 81dfce9691..e3ba667703 100644 --- a/code/game/objects/items/stacks/fifty_spawner.dm +++ b/code/game/objects/items/stacks/fifty_spawner.dm @@ -7,15 +7,12 @@ var/obj/item/stack/type_to_spawn = null /obj/fiftyspawner/Initialize() - ..() //We're not returning . because we're going to ask to be deleted. - + ..() var/turf/T = get_turf(src) - var/obj/item/stack/M = new type_to_spawn(T) + var/obj/structure/closet/C = locate() in T + var/obj/item/stack/M = new type_to_spawn(C || T) M.amount = M.max_amount //some stuff spawns with 60, we're still calling it fifty M.update_icon() // Some stacks have different sprites depending on how full they are. - var/obj/structure/closet/C = locate() in T - if(C) - C.contents += M return INITIALIZE_HINT_QDEL //Bye! /obj/fiftyspawner/rods diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6ffa7100ca..9844ae1cba 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -14,6 +14,8 @@ max_amount = 60 attack_verb = list("hit", "bludgeoned", "whacked") + color = "#666666" + /obj/item/stack/rods/cyborg name = "metal rod synthesizer" desc = "A device that makes metal rods." @@ -24,8 +26,8 @@ stacktype = /obj/item/stack/rods no_variants = TRUE -/obj/item/stack/rods/New() - ..() +/obj/item/stack/rods/Initialize() + . = ..() recipes = rods_recipes update_icon() diff --git a/code/game/objects/items/stacks/sandbags.dm b/code/game/objects/items/stacks/sandbags.dm index c4e755c485..6eff93bfc5 100644 --- a/code/game/objects/items/stacks/sandbags.dm +++ b/code/game/objects/items/stacks/sandbags.dm @@ -32,19 +32,15 @@ bag_material = MAT_SYNCLOTH -/obj/item/stack/sandbags/New(var/newloc, var/amt, var/bag_mat) - ..() +/obj/item/stack/sandbags/Initialize(var/ml, var/amt, var/bag_mat) + . = ..(ml, amt) recipes = sandbag_recipes update_icon() - if(bag_mat) bag_material = bag_mat - var/datum/material/M = get_material_by_name("[bag_material]") if(!M) - qdel(src) - return - + return INITIALIZE_HINT_QDEL color = M.icon_colour /obj/item/stack/sandbags/update_icon() @@ -136,17 +132,13 @@ var/global/list/datum/stack_recipe/sandbag_recipes = list( \ var/bag_material = "cloth" -/obj/item/stack/emptysandbag/New(var/newloc, var/amt, var/bag_mat) - ..(newloc, amt) - +/obj/item/stack/emptysandbag/Initialize(var/ml, var/amt, var/bag_mat) + . = ..(ml, amt) if(bag_mat) bag_material = bag_mat - var/datum/material/M = get_material_by_name("[bag_material]") if(!M) - qdel(src) - return - + return INITIALIZE_HINT_QDEL color = M.icon_colour /obj/item/stack/emptysandbag/attack_self(var/mob/user) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d42d6c0e56..f4b52f07aa 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -29,14 +29,13 @@ var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc. var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc) -/obj/item/stack/New(var/loc, var/amount=null) - ..() - if (!stacktype) +/obj/item/stack/Initialize(var/ml, var/amount) + . = ..() + if(!stacktype) stacktype = type - if (amount) + if(amount) src.amount = amount update_icon() - return /obj/item/stack/Destroy() if(uses_charge) @@ -170,8 +169,37 @@ var/atom/O if(recipe.use_material) O = new recipe.result_type(user.loc, recipe.use_material) + + if(istype(O, /obj)) + var/obj/Ob = O + + if(LAZYLEN(Ob.matter)) // Law of equivalent exchange. + Ob.matter.Cut() + + else + Ob.matter = list() + + var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000 + + Ob.matter[recipe.use_material] = mattermult / produced * required + else O = new recipe.result_type(user.loc) + + if(recipe.matter_material) + if(istype(O, /obj)) + var/obj/Ob = O + + if(LAZYLEN(Ob.matter)) // Law of equivalent exchange. + Ob.matter.Cut() + + else + Ob.matter = list() + + var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000 + + Ob.matter[recipe.use_material] = mattermult / produced * required + O.set_dir(user.dir) O.add_fingerprint(user) @@ -379,8 +407,9 @@ var/on_floor = 0 var/use_material var/pass_color + var/matter_material // Material type used for recycling. Default, uses use_material. For non-material-based objects however, matter_material is needed. -/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color) +/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color, recycle_material = null) src.title = title src.result_type = result_type src.req_amount = req_amount @@ -392,6 +421,12 @@ src.use_material = supplied_material src.pass_color = pass_stack_color + if(!recycle_material && src.use_material) + src.matter_material = src.use_material + + else if(recycle_material) + src.matter_material = recycle_material + /* * Recipe list datum */ diff --git a/code/game/objects/items/stacks/tickets.dm b/code/game/objects/items/stacks/tickets.dm index 1d9cbf047e..6681934f7c 100644 --- a/code/game/objects/items/stacks/tickets.dm +++ b/code/game/objects/items/stacks/tickets.dm @@ -7,7 +7,7 @@ w_class = ITEMSIZE_TINY max_amount = 30 -/obj/item/stack/arcadeticket/New(loc, amount = null) +/obj/item/stack/arcadeticket/Initialize() . = ..() update_icon() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 609400ca36..145a67816e 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -25,8 +25,8 @@ var/perunit = SHEET_MATERIAL_AMOUNT var/apply_colour //CHOMPEDIT: End -/obj/item/stack/tile/New() - ..() +/obj/item/stack/tile/Initialize() + . = ..() randpixel_xy() /* diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm index 4391901918..ce75684b0d 100644 --- a/code/game/objects/items/toys/toys.dm +++ b/code/game/objects/items/toys/toys.dm @@ -419,6 +419,7 @@ desc = "A \"Space Life\" brand... wait, what the hell is this thing?" icon = 'icons/obj/toy.dmi' icon_state = "nuketoy" + w_class = ITEMSIZE_SMALL //chompstation add because WHY ARE THEY SO BIG var/cooldown = 0 var/toysay = "What the fuck did you do?" drop_sound = 'sound/items/drop/accessory.ogg' diff --git a/code/game/objects/items/toys/toys_ch.dm b/code/game/objects/items/toys/toys_ch.dm index 869c4cb180..8fe4f946b9 100644 --- a/code/game/objects/items/toys/toys_ch.dm +++ b/code/game/objects/items/toys/toys_ch.dm @@ -3,4 +3,17 @@ desc = "A \"Space Life\" brand bounty hunter action figure." icon = 'icons/obj/toy_ch.dmi' icon_state = "hunter" - toysay = "The last greytide is in captivity. The station is at peace." \ No newline at end of file + toysay = "The last greytide is in captivity. The station is at peace." + +/obj/item/toy/sif + name = "Sif planet model" + desc = "A \"Space Life\" brand planet model of Sif, it's oddly cold to the touch." + icon = 'icons/obj/toy_ch.dmi' + icon_state = "sif" + +/obj/item/toy/figure/station + name = "NLS Southern Cross action figure" + desc = "A \"Space Life\" brand figure of the NLS Southern Cross, the station you work in." + icon = 'icons/obj/toy_ch.dmi' + icon_state = "station" + toysay = "Attention! Alert level elevated to blue." \ No newline at end of file diff --git a/code/game/objects/items/weapons/RPD_vr.dm b/code/game/objects/items/weapons/RPD_vr.dm index d4650eb16a..d15236e7e7 100644 --- a/code/game/objects/items/weapons/RPD_vr.dm +++ b/code/game/objects/items/weapons/RPD_vr.dm @@ -24,6 +24,7 @@ throw_range = 5 w_class = ITEMSIZE_NORMAL matter = list(MAT_STEEL = 50000, MAT_GLASS = 25000) + origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 2) var/datum/effect/effect/system/spark_spread/spark_system var/p_dir = NORTH // Next pipe will be built with this dir var/p_flipped = FALSE // If the next pipe should be built flipped diff --git a/code/game/objects/items/weapons/canes.dm b/code/game/objects/items/weapons/canes.dm index 5b7f346684..48bf6454ca 100644 --- a/code/game/objects/items/weapons/canes.dm +++ b/code/game/objects/items/weapons/canes.dm @@ -22,11 +22,12 @@ /obj/item/weapon/cane/concealed var/concealed_blade -/obj/item/weapon/cane/concealed/New() - ..() +/obj/item/weapon/cane/concealed/Initialize() + . = ..() var/obj/item/weapon/material/butterfly/switchblade/temp_blade = new(src) concealed_blade = temp_blade - temp_blade.attack_self() + temp_blade.active = TRUE + temp_blade.update_force() /obj/item/weapon/cane/concealed/attack_self(var/mob/user) var/datum/gender/T = gender_datums[user.get_visible_gender()] diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 2ac0098203..ab91eca500 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -484,34 +484,70 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/joint name = "joint" - desc = "This probably shouldn't ever show up." + desc = "A joint lovingly rolled and crafted with care. Blaze it." icon_state = "joint" + max_smoketime = 400 + smoketime = 400 + chem_volume = 25 + +/obj/item/clothing/mask/smokable/cigarette/joint/blunt + name = "blunt" + desc = "A blunt lovingly rolled and crafted with care. Blaze it." + icon_state = "cigar" max_smoketime = 500 smoketime = 500 - nicotine_amt = 0 + nicotine_amt = 4 + chem_volume = 45 -/obj/item/weapon/rollingpaper +/obj/item/weapon/reagent_containers/rollingpaper name = "rolling paper" desc = "A small, thin piece of easily flammable paper, commonly used for rolling and smoking various dried plants." description_fluff = "The legalization of certain substances propelled the sale of rolling papers through the roof. Now almost every Trans-stellar produces a variety, often of questionable quality." icon = 'icons/obj/cigarettes.dmi' icon_state = "cig paper" + volume = 25 + var/obj/item/clothing/mask/smokable/cigarette/crafted_type = /obj/item/clothing/mask/smokable/cigarette/joint -/obj/item/weapon/rollingpaper/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/weapon/reagent_containers/rollingpaper/blunt + name = "blunt wrap" + desc = "A small piece of easily flammable paper similar to that which encases cigars. It's made out of tobacco, bigger than a standard rolling paper, and will last longer." + icon_state = "blunt paper" + volume = 45 + crafted_type = /obj/item/clothing/mask/smokable/cigarette/joint/blunt + +/obj/item/weapon/reagent_containers/rollingpaper/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/reagent_containers/food/snacks)) var/obj/item/weapon/reagent_containers/food/snacks/grown/G = W - if (!G.dry) - to_chat(user, "[G] must be dried before you roll it into [src].") + if (!G.dry) //This prevents people from just stuffing cheeseburgers into their joint + to_chat(user, "[G.name] must be dried before you add it to [src].") return - var/obj/item/clothing/mask/smokable/cigarette/joint/J = new /obj/item/clothing/mask/smokable/cigarette/joint(user.loc) - to_chat(usr, "You roll the [G.name] into a joint!") - J.add_fingerprint(user) + if (G.reagents.total_volume + src.reagents.total_volume > src.reagents.maximum_volume) //Check that we don't have too much already in the paper before adding things + to_chat(user, "The [src] is too full to add [G.name].") + return + if (src.reagents.total_volume == 0) + if (istype(src, /obj/item/weapon/reagent_containers/rollingpaper/blunt)) //update the icon if this is the first thing we're adding to the paper + src.icon_state = "blunt_full" + else + src.icon_state = "paper_full" + to_chat(user, "You add the [G.name] to the [src.name].") + src.add_fingerprint(user) if(G.reagents) - G.reagents.trans_to_obj(J, G.reagents.total_volume) - J.name = "[G.name] joint" - J.desc = "A joint lovingly rolled and filled with [G.name]. Blaze it." + G.reagents.trans_to_obj(src, G.reagents.total_volume) //adds the reagents from the plant into the paper + user.drop_from_inventory(G) qdel(G) - qdel(src) + +/obj/item/weapon/reagent_containers/rollingpaper/attack_self(mob/living/user) + if(!src.reagents) //don't roll an empty joint + to_chat(user, "There is nothing in [src]. Add something to it first.") + return + var/obj/item/clothing/mask/smokable/cigarette/J = new crafted_type() + to_chat(user,"You roll the [src] into a blunt!") + J.add_fingerprint(user) + if(src.reagents) + src.reagents.trans_to_obj(J, src.reagents.total_volume) + user.drop_from_inventory(src) + user.put_in_hands(J) + qdel(src) ///////// //ZIPPO// diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index 8b913eaf45..c8a3a672a7 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -23,6 +23,8 @@ drop_sound = 'sound/items/drop/device.ogg' pickup_sound = 'sound/items/pickup/device.ogg' + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) + //Called when the circuitboard is used to contruct a new machine. /obj/item/weapon/circuitboard/proc/construct(var/obj/machinery/M) if(istype(M, build_path)) diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index d91a25b631..bd1d057d37 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -10,37 +10,37 @@ name = T_BOARD("guestpass console") build_path = /obj/machinery/computer/guestpass board_type = new /datum/frame/frame_types/guest_pass_console - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/status_display name = T_BOARD("status display") build_path = /obj/machinery/status_display board_type = new /datum/frame/frame_types/display - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/ai_status_display name = T_BOARD("ai status display") build_path = /obj/machinery/ai_status_display board_type = new /datum/frame/frame_types/display - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/newscaster name = T_BOARD("newscaster") build_path = /obj/machinery/newscaster board_type = new /datum/frame/frame_types/newscaster - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/atm name = T_BOARD("atm") build_path = /obj/machinery/atm board_type = new /datum/frame/frame_types/atm - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/request name = T_BOARD("request console") build_path = /obj/machinery/requests_console board_type = new /datum/frame/frame_types/supply_request_console - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) //Alarm @@ -48,25 +48,25 @@ name = T_BOARD("fire alarm") build_path = /obj/machinery/firealarm board_type = new /datum/frame/frame_types/fire_alarm - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/airalarm name = T_BOARD("air alarm") build_path = /obj/machinery/alarm board_type = new /datum/frame/frame_types/air_alarm - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/intercom name = T_BOARD("intercom") build_path = /obj/item/device/radio/intercom board_type = new /datum/frame/frame_types/intercom - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/keycard_auth name = T_BOARD("keycard authenticator") build_path = /obj/machinery/keycard_auth board_type = new /datum/frame/frame_types/keycard_authenticator - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) //Computer @@ -74,7 +74,7 @@ name = T_BOARD("holopad") build_path = /obj/machinery/hologram/holopad board_type = new /datum/frame/frame_types/holopad - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/scanner_console name = T_BOARD("body scanner console") @@ -94,7 +94,7 @@ name = T_BOARD("photocopier") build_path = /obj/machinery/photocopier board_type = new /datum/frame/frame_types/photocopier - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, /obj/item/weapon/stock_parts/motor = 1, @@ -105,7 +105,7 @@ name = T_BOARD("fax") build_path = /obj/machinery/photocopier/faxmachine board_type = new /datum/frame/frame_types/fax - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, /obj/item/weapon/stock_parts/motor = 1, @@ -116,6 +116,7 @@ name = T_BOARD("conveyor") build_path = /obj/machinery/conveyor board_type = new /datum/frame/frame_types/conveyor + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/gear = 2, /obj/item/weapon/stock_parts/motor = 2, @@ -125,6 +126,7 @@ name = T_BOARD("recharger") build_path = /obj/machinery/recharger board_type = new /datum/frame/frame_types/recharger + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/capacitor = 1, /obj/item/stack/cable_coil = 5) @@ -138,6 +140,7 @@ name = T_BOARD("heavy-duty cell charger") build_path = /obj/machinery/cell_charger board_type = new /datum/frame/frame_types/cell_charger + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/capacitor = 1, /obj/item/stack/cable_coil = 5) @@ -146,7 +149,7 @@ name = T_BOARD("washing machine") build_path = /obj/machinery/washing_machine board_type = new /datum/frame/frame_types/washing_machine - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/motor = 1, /obj/item/weapon/stock_parts/gear = 2) @@ -155,6 +158,7 @@ name = T_BOARD("reagent grinder") build_path = /obj/machinery/reagentgrinder board_type = new /datum/frame/frame_types/grinder + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/motor = 1, /obj/item/weapon/stock_parts/gear = 1, @@ -163,6 +167,7 @@ /obj/item/weapon/circuitboard/distiller build_path = /obj/machinery/portable_atmospherics/powered/reagent_distillery board_type = new /datum/frame/frame_types/reagent_distillery + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/capacitor = 1, /obj/item/weapon/stock_parts/micro_laser = 1, @@ -173,6 +178,7 @@ name = T_BOARD("teleporter hub") build_path = /obj/machinery/teleport/hub board_type = new /datum/frame/frame_types/machine //YWEdit makes buildable + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_GOLD = 100) // origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 4) //CHOMPedit Balance req_components = list( @@ -187,6 +193,7 @@ name = T_BOARD("teleporter station") build_path = /obj/machinery/teleport/station board_type = new /datum/frame/frame_types/machine //YWEdit makes buildable + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_GOLD = 100) // origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 3) req_components = list( /obj/item/weapon/stock_parts/console_screen = 1, @@ -198,6 +205,7 @@ build_path = /obj/machinery/bodyscanner board_type = new /datum/frame/frame_types/medical_pod origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 3, /obj/item/stack/material/glass/reinforced = 2) @@ -206,6 +214,7 @@ name = T_BOARD("sleeper") build_path = /obj/machinery/sleeper board_type = new /datum/frame/frame_types/medical_pod + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) req_components = list( /obj/item/weapon/stock_parts/manipulator = 1, @@ -218,6 +227,7 @@ name = T_BOARD("VR sleeper") build_path = /obj/machinery/vr_sleeper board_type = new /datum/frame/frame_types/medical_pod + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_GOLD = 100) origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, @@ -227,6 +237,7 @@ name = T_BOARD("dna analyzer") build_path = /obj/machinery/dnaforensics board_type = new /datum/frame/frame_types/dna_analyzer + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_GOLD = 100) origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2, TECH_DATA = 2) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 2, @@ -237,6 +248,7 @@ name = T_BOARD("mass driver") build_path = /obj/machinery/mass_driver board_type = new /datum/frame/frame_types/mass_driver + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_GOLD = 100) req_components = list( /obj/item/weapon/stock_parts/gear = 2, /obj/item/weapon/stock_parts/motor = 2, diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm index 777146f385..132cf65de6 100644 --- a/code/game/objects/items/weapons/circuitboards/mecha.dm +++ b/code/game/objects/items/weapons/circuitboards/mecha.dm @@ -8,6 +8,7 @@ icon = 'icons/obj/module.dmi' icon_state = "std_mod" board_type = "other" + matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 100) /obj/item/weapon/circuitboard/mecha/ripley origin_tech = list(TECH_DATA = 3) diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 18e6062dba..5e26bd6e10 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -13,6 +13,7 @@ var/brightness_on = 1 chem_volume = 0 //ecig has no storage on its own but has reagent container created by parent obj item_state = "ecigoff" + is_pipe = TRUE //to avoid a runtime in examine() var/icon_off var/icon_empty var/ecig_colors = list(null, COLOR_DARK_GRAY, COLOR_RED_GRAY, COLOR_BLUE_GRAY, COLOR_GREEN_GRAY, COLOR_PURPLE_GRAY) @@ -21,6 +22,28 @@ ..() ec_cartridge = new cartridge_type(src) +/obj/item/clothing/mask/smokable/ecig/examine(mob/user) + . = ..() + + if(active) + . += "It is turned on." + else + . += "It is turned off." + if(Adjacent(user)) + if(ec_cartridge) + if(!ec_cartridge.reagents?.total_volume) + . += "Its cartridge is empty!" + else if (ec_cartridge.reagents.total_volume <= ec_cartridge.volume * 0.25) + . += "Its cartridge is almost empty!" + else if (ec_cartridge.reagents.total_volume <= ec_cartridge.volume * 0.66) + . += "Its cartridge is half full!" + else if (ec_cartridge.reagents.total_volume <= ec_cartridge.volume * 0.90) + . += "Its cartridge is almost full!" + else + . += "Its cartridge is full!" + else + . += "It has no cartridge." + /obj/item/clothing/mask/smokable/ecig/simple name = "simple electronic cigarette" desc = "A cheap Lucky 1337 electronic cigarette, styled like a traditional cigarette." @@ -56,6 +79,7 @@ var/mob/living/carbon/human/C = loc if (src == C.wear_mask && C.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob if (!active || !ec_cartridge || !ec_cartridge.reagents.total_volume)//no cartridge + to_chat(C, "[src] turns off. ") active=0//autodisable the cigarette STOP_PROCESSING(SSobj, src) update_icon() diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index f828b97b23..cd48a4a78a 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -77,7 +77,7 @@ /obj/item/weapon/lipstick/random, /obj/item/weapon/grenade/smokebomb, /obj/item/weapon/corncob, - /obj/item/weapon/contraband/poster, + /obj/item/weapon/contraband/poster/custom, /obj/item/weapon/book/manual/barman_recipes, /obj/item/weapon/book/manual/chef_recipes, /obj/item/weapon/bikehorn, diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 924d753c28..0f7405096d 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -19,7 +19,7 @@ var/cuff_sound = 'sound/weapons/handcuffs.ogg' var/cuff_type = "handcuffs" var/use_time = 30 - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/handcuffs.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/handcuffs.dmi') /obj/item/weapon/handcuffs/get_worn_icon_state(var/slot_name) if(slot_name == slot_handcuffed_str) @@ -214,7 +214,7 @@ var/last_chew = 0 origin_tech = list(TECH_MATERIAL = 1) breakouttime = 300 //Deciseconds = 30s = 0.5 minute cuff_type = "legcuffs" - sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/handcuffs.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/handcuffs.dmi') elastic = 0 cuff_sound = 'sound/weapons/handcuffs.ogg' //This shold work for now. diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm index fa56f6ccc1..e62268c2c1 100644 --- a/code/game/objects/items/weapons/id cards/cards.dm +++ b/code/game/objects/items/weapons/id cards/cards.dm @@ -13,19 +13,48 @@ */ /obj/item/weapon/card name = "card" - desc = "Does card things." - icon = 'icons/obj/card.dmi' + desc = "A tiny plaque of plastic. Does card things." + icon = 'icons/obj/card_new.dmi' w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS var/associated_account_number = 0 + var/list/initial_sprite_stack = list("") + var/base_icon = 'icons/obj/card_new.dmi' + var/list/sprite_stack + var/list/files = list( ) drop_sound = 'sound/items/drop/card.ogg' pickup_sound = 'sound/items/pickup/card.ogg' +/obj/item/weapon/card/New() + . = ..() + reset_icon() + +/obj/item/weapon/card/proc/reset_icon() + sprite_stack = initial_sprite_stack + update_icon() + +/obj/item/weapon/card/update_icon() + if(!sprite_stack || !istype(sprite_stack) || sprite_stack == list("")) + icon = base_icon + icon_state = initial(icon_state) + + var/icon/I = null + for(var/iconstate in sprite_stack) + if(!iconstate) + iconstate = icon_state + if(I) + var/icon/IC = new(base_icon, iconstate) + I.Blend(IC, ICON_OVERLAY) + else + I = new/icon(base_icon, iconstate) + if(I) + icon = I + /obj/item/weapon/card/data - name = "data disk" - desc = "A disk of data." + name = "data card" + desc = "A solid-state storage card, used to back up or transfer information. What knowledge could it contain?" icon_state = "data" var/function = "storage" var/data = "null" @@ -35,20 +64,20 @@ pickup_sound = 'sound/items/pickup/disk.ogg' /obj/item/weapon/card/data/verb/label(t as text) - set name = "Label Disk" + set name = "Label Card" set category = "Object" set src in usr if (t) - src.name = text("data disk- '[]'", t) + src.name = text("data card- '[]'", t) else - src.name = "data disk" + src.name = "data card" src.add_fingerprint(usr) return /obj/item/weapon/card/data/clown name = "\proper the coordinates to clown planet" - icon_state = "data" + icon_state = "rainbow" item_state = "card-id" level = 2 desc = "This card contains coordinates to the fabled Clown Planet. Handle with care." @@ -62,7 +91,7 @@ /obj/item/weapon/card/emag_broken desc = "It's a card with a magnetic strip attached to some circuitry. It looks too busted to be used for anything but salvage." name = "broken cryptographic sequencer" - icon_state = "emag" + icon_state = "emag-spent" item_state = "card-id" origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2) @@ -107,4 +136,4 @@ uses += T.amount/2 //Gives 5 uses per 10 TC uses = CEILING(uses, 1) //Ensures no decimal uses nonsense, rounds up to be nice to_chat(usr, "You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses].") - qdel(O) \ No newline at end of file + qdel(O) diff --git a/code/game/objects/items/weapons/id cards/cards_vr.dm b/code/game/objects/items/weapons/id cards/cards_vr.dm new file mode 100644 index 0000000000..c7abd117d6 --- /dev/null +++ b/code/game/objects/items/weapons/id cards/cards_vr.dm @@ -0,0 +1,10 @@ +/obj/item/weapon/card/emag/examine(mob/user) + . = ..() + . += "[uses] uses remaining." + +/obj/item/weapon/card/emag/used + uses = 1 + +/obj/item/weapon/card/emag/used/Initialize() + . = ..() + uses = rand(1, 5) diff --git a/code/game/objects/items/weapons/id cards/id_stacks.dm b/code/game/objects/items/weapons/id cards/id_stacks.dm new file mode 100644 index 0000000000..495697da7b --- /dev/null +++ b/code/game/objects/items/weapons/id cards/id_stacks.dm @@ -0,0 +1,148 @@ +// This is a defines file for card sprite stacks. If a new card set comes in, this file can just be disabled and a new one made to match the new sprites. +// Generally, if the icon file is card_xxx.dmi, this filename should be sprite_stacks_xxx.dm +// Please make sure that only the relevant sprite_stacks_xxx.file is included, if more are made. + +/obj/item/weapon/card + icon = 'icons/obj/card_new.dmi' // These are redefined here so that changing sprites is as easy as clicking the checkbox. + base_icon = 'icons/obj/card_new.dmi' + + // New sprite stacks can be defined here. You could theoretically change icon-states as well but right now this file compiles before station_ids.dm so those wouldn't be affected. + +/* +/obj/item/weapon/card/id/generic + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-silhouette", "clip") + +// CENTCOM +/obj/item/weapon/card/id/centcom + initial_sprite_stack = list("base-stamp", "top-blue", "stamp-n", "pips-gold") + +/obj/item/weapon/card/id/centcom/vip + initial_sprite_stack = list("base-stamp-gold", "top-blue", "stamp-n", "pips-gold") + +/obj/item/weapon/card/id/centcom/ERT + initial_sprite_stack = list("base-stamp", "top-blue", "stamp-n", "pips-red", "stripe-red") + +// GENERIC COMMAND +/obj/item/weapon/card/id/silver + initial_sprite_stack = list("base-stamp-silver", "top-mime", "stamp-n-generic") + +/obj/item/weapon/card/id/silver/secretary + initial_sprite_stack = list("base-stamp", "top-blue", "stamp-n") + +/obj/item/weapon/card/id/silver/hop + initial_sprite_stack = list("base-stamp", "top-blue", "stamp-n", "stripe-white") + +// MEDICAL +/obj/item/weapon/card/id/medical + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n") + +/obj/item/weapon/card/id/medical/chemist + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "pips-orange") + +/obj/item/weapon/card/id/medical/geneticist + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "pips-purple") + +/obj/item/weapon/card/id/medical/psych + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "pips-purple") + +/obj/item/weapon/card/id/medical/emt + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "pips-blue") + +/obj/item/weapon/card/id/medical/head + initial_sprite_stack = list("base-stamp-silver", "top-medblu", "stamp-n", "stripe-gold") + +/obj/item/weapon/card/id/medical/sar + initial_sprite_stack = list("base-stamp", "top-darkgreen", "stamp-n", "pips-medblu") + +// SECURITY +/obj/item/weapon/card/id/security + initial_sprite_stack = list("base-stamp", "top-red", "stamp-n") + +/obj/item/weapon/card/id/security/detective + initial_sprite_stack = list("base-stamp", "top-red", "stamp-n", "pips-brown") + +/obj/item/weapon/card/id/security/warden + initial_sprite_stack = list("base-stamp", "top-red", "stamp-n", "pips-white") + +/obj/item/weapon/card/id/security/head + initial_sprite_stack = list("base-stamp-silver", "top-red", "stamp-n", "stripe-gold") + +// ENGINEERING +/obj/item/weapon/card/id/engineering + initial_sprite_stack = list("base-stamp", "top-orange", "stamp-n") + +/obj/item/weapon/card/id/engineering/atmos + initial_sprite_stack = list("base-stamp", "top-orange", "pips-medblu", "stamp-n") + +/obj/item/weapon/card/id/engineering/head + initial_sprite_stack = list("base-stamp-silver", "top-orange", "stamp-n", "stripe-gold") + +// SCIENCE +/obj/item/weapon/card/id/science + initial_sprite_stack = list("base-stamp", "top-purple", "stamp-n") + +/obj/item/weapon/card/id/science/roboticist + initial_sprite_stack = list("base-stamp", "top-purple", "stamp-n", "pips-orange") + +/obj/item/weapon/card/id/science/explorer + initial_sprite_stack = list("base-stamp", "top-darkgreen", "stamp-n") + +/obj/item/weapon/card/id/science/head + initial_sprite_stack = list("base-stamp-silver", "top-purple", "stamp-n", "stripe-gold") + +/obj/item/weapon/card/id/science/head/pathfinder + initial_sprite_stack = list("base-stamp-silver", "top-blue", "dept-exploration", "stamp-n", "pips-gold") + +// CARGO +/obj/item/weapon/card/id/cargo + initial_sprite_stack = list("base-stamp", "top-brown", "stamp-n") + +/obj/item/weapon/card/id/cargo/miner + initial_sprite_stack = list("base-stamp", "top-brown", "stamp-n", "pips-purple") + +/obj/item/weapon/card/id/cargo/head + initial_sprite_stack = list("base-stamp-silver", "top-brown", "stamp-n", "pips-gold") + +// CIVLIAN +/obj/item/weapon/card/id/civilian + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n") + +/obj/item/weapon/card/id/civilian/chaplain + initial_sprite_stack = list("base-stamp-silver", "top-dark", "stamp-cross", "pips-white") + +/obj/item/weapon/card/id/civilian/internal_affairs + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n") + +/obj/item/weapon/card/id/civilian/botanist + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "pips-brown") + +/obj/item/weapon/card/id/civilian/bartender + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "pips-dark") + +/obj/item/weapon/card/id/civilian/chef + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "pips-white") + +/obj/item/weapon/card/id/civilian/janitor + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "pips-purple") + +/obj/item/weapon/card/id/civilian/journalist + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n") + +/obj/item/weapon/card/id/civilian/clown + initial_sprite_stack = list("base-stamp", "top-rainbow", "stamp-n") + +/obj/item/weapon/card/id/civilian/mime + initial_sprite_stack = list("base-stamp", "top-white", "stamp-n", "stripe-black") + +/obj/item/weapon/card/id/civilian/pilot + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-n", "pips-blue") + +/obj/item/weapon/card/id/civilian/head + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n", "stripe-white") + +/obj/item/weapon/card/id/syndicate + initial_sprite_stack = list("base-stamp-dark", "top-syndicate", "stamp-s") + +/obj/item/weapon/card/id/syndicate/officer + initial_sprite_stack = list("base-stamp-dark", "top-syndicate", "stamp-s", "pips-gold", "stripe-gold") +*/ \ No newline at end of file diff --git a/code/game/objects/items/weapons/id cards/id_stacks_vr.dm b/code/game/objects/items/weapons/id cards/id_stacks_vr.dm new file mode 100644 index 0000000000..7627d66cf3 --- /dev/null +++ b/code/game/objects/items/weapons/id cards/id_stacks_vr.dm @@ -0,0 +1,216 @@ +/obj/item/weapon/card + icon = 'icons/obj/card_new_vr.dmi' + base_icon = 'icons/obj/card_new_vr.dmi' + +//IDs + +/obj/item/weapon/card/id + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-n") + +/obj/item/weapon/card/id/generic + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-silhouette", "clip") + +//Central + +/obj/item/weapon/card/id/centcom + initial_sprite_stack = list("base-stamp-silver", "top-darkgreen", "stamp-n", "pips-gold", "stripe-gold") + +/obj/item/weapon/card/id/centcom/vip + initial_sprite_stack = list("base-stamp-gold", "top-darkgreen", "stamp-n", "pips-gold", "stripe-gold") + +//ERT + +/obj/item/weapon/card/id/centcom/ERT + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n", "pips-red", "stripe-red") + +/obj/item/weapon/card/id/centcom/ERT/medic + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n", "pips-medblu", "stripe-medblu") + +/obj/item/weapon/card/id/centcom/ERT/commander + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n", "pips-gold", "stripe-gold") + +/obj/item/weapon/card/id/centcom/ERT/engineer + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n", "pips-orange", "stripe-orange") + +/obj/item/weapon/card/id/centcom/ERT/janitor + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n", "pips-purple", "stripe-purple") + +//Silver + +/obj/item/weapon/card/id/silver + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n") + +/obj/item/weapon/card/id/silver/secretary + initial_sprite_stack = list("base-stamp", "top-blue", "stamp-n") + +/obj/item/weapon/card/id/silver/hop + initial_sprite_stack = list("base-stamp-silver", "top-blue", "stamp-n", "pips-gold") + +//Gold + +/obj/item/weapon/card/id/gold + initial_sprite_stack = list("base-stamp-gold", "top-blue", "stamp-n") + +/obj/item/weapon/card/id/gold/captain + initial_sprite_stack = list("base-stamp-gold", "top-blue", "stamp-n", "pips-gold") + +/obj/item/weapon/card/id/gold/captain/spare + initial_sprite_stack = list("base-stamp-gold", "top-gold", "stamp-n") + +//Medical + +/obj/item/weapon/card/id/medical + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n") + +/obj/item/weapon/card/id/medical/chemist + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "stripe-orange") + +/obj/item/weapon/card/id/medical/geneticist + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "stripe-purple") + +/obj/item/weapon/card/id/medical/psych + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "stripe-brown") + +/obj/item/weapon/card/id/medical/virologist + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "stripe-green") + +/obj/item/weapon/card/id/medical/emt + initial_sprite_stack = list("base-stamp", "top-medblu", "stamp-n", "stripe-blue") + +/obj/item/weapon/card/id/medical/head + initial_sprite_stack = list("base-stamp-silver", "top-medblu", "stamp-n", "pips-gold") + +//Security + +/obj/item/weapon/card/id/security + initial_sprite_stack = list("base-stamp", "top-red", "stamp-n") + +/obj/item/weapon/card/id/security/detective + initial_sprite_stack = list("base-stamp", "top-red", "stamp-n", "stripe-brown") + +/obj/item/weapon/card/id/security/warden + initial_sprite_stack = list("base-stamp", "top-red", "stamp-n", "stripe-white") + +/obj/item/weapon/card/id/security/head + initial_sprite_stack = list("base-stamp-silver", "top-red", "stamp-n", "pips-gold") + +//Engineering + +/obj/item/weapon/card/id/engineering + initial_sprite_stack = list("base-stamp", "top-orange", "stamp-n") + +/obj/item/weapon/card/id/engineering/atmos + initial_sprite_stack = list("base-stamp", "top-orange", "stripe-medblu", "stamp-n") + +/obj/item/weapon/card/id/engineering/head + initial_sprite_stack = list("base-stamp-silver", "top-orange", "stamp-n", "pips-gold") + +//Science + +/obj/item/weapon/card/id/science + initial_sprite_stack = list("base-stamp", "top-purple", "stamp-n") + +/obj/item/weapon/card/id/science/roboticist + initial_sprite_stack = list("base-stamp", "top-purple", "stamp-n", "stripe-brown") + +/obj/item/weapon/card/id/science/xenobiologist + initial_sprite_stack = list("base-stamp", "top-purple", "stamp-n", "stripe-orange") + +/obj/item/weapon/card/id/science/xenobotanist + initial_sprite_stack = list("base-stamp", "top-purple", "stamp-n", "stripe-green") + +/obj/item/weapon/card/id/science/head + initial_sprite_stack = list("base-stamp-silver", "top-purple", "stamp-n", "pips-gold") + +//Cargo + +/obj/item/weapon/card/id/cargo + initial_sprite_stack = list("base-stamp", "top-brown", "stamp-n") + +/obj/item/weapon/card/id/cargo/miner + initial_sprite_stack = list("base-stamp", "top-brown", "stamp-n", "stripe-purple") + +/obj/item/weapon/card/id/cargo/head + initial_sprite_stack = list("base-stamp-silver", "top-brown", "stamp-n", "pips-white") + +//Civilian + +/obj/item/weapon/card/id/civilian + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-n") + +/obj/item/weapon/card/id/civilian/chaplain + initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-cross", "stripe-white") + +/obj/item/weapon/card/id/civilian/journalist + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-n", "stripe-red") + +/obj/item/weapon/card/id/civilian/pilot + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-n", "stripe-pink") + +/obj/item/weapon/card/id/civilian/entertainer + initial_sprite_stack = list("base-stamp", "top-generic", "stamp-n", "stripe-brown") + +/obj/item/weapon/card/id/civilian/clown + initial_sprite_stack = list("base-stamp", "top-rainbow", "stamp-n") + +/obj/item/weapon/card/id/civilian/mime + initial_sprite_stack = list("base-stamp", "top-white", "stamp-n", "stripe-black") + +/obj/item/weapon/card/id/civilian/internal_affairs + initial_sprite_stack = list("base-stamp", "top-blue", "stamp-n", "stripe-black") + +//Service + +/obj/item/weapon/card/id/civilian/service + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n") + +/obj/item/weapon/card/id/civilian/service/botanist + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "stripe-darkgreen") + +/obj/item/weapon/card/id/civilian/service/bartender + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "stripe-black") + +/obj/item/weapon/card/id/civilian/service/chef + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "stripe-white") + +/obj/item/weapon/card/id/civilian/service/janitor + initial_sprite_stack = list("base-stamp", "top-green", "stamp-n", "stripe-purple") + +//Exploration + +/obj/item/weapon/card/id/exploration + initial_sprite_stack = list("base-stamp", "top-pink", "stamp-n") + +/obj/item/weapon/card/id/exploration/fm + initial_sprite_stack = list("base-stamp", "top-pink", "stamp-n", "stripe-medblu") + +/obj/item/weapon/card/id/exploration/head + initial_sprite_stack = list("base-stamp-silver", "top-pink", "stamp-n", "pips-white") + +//Talon + +/obj/item/weapon/card/id/talon + initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette") + +/obj/item/weapon/card/id/talon/doctor + initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-medblu", "stripe-medblu") + +/obj/item/weapon/card/id/talon/engineer + initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-orange", "stripe-orange") + +/obj/item/weapon/card/id/talon/officer + initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-red", "stripe-red") + +/obj/item/weapon/card/id/talon/pilot + initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-purple", "stripe-purple") + +/obj/item/weapon/card/id/talon/captain + initial_sprite_stack = list("base-stamp-dark", "top-dark", "stamp-silhouette", "pips-gold", "stripe-gold") + +//Antags + +/obj/item/weapon/card/id/syndicate + initial_sprite_stack = list("base-stamp-dark", "top-syndicate", "stamp-s") + +/obj/item/weapon/card/id/syndicate/officer + initial_sprite_stack = list("base-stamp-dark", "top-syndicate", "stamp-s", "pips-gold", "stripe-gold") \ No newline at end of file diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index ffa33472b6..5a8fe7448d 100644 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -1,11 +1,11 @@ /obj/item/weapon/card/id name = "identification card" desc = "A card used to provide ID and determine access across the station." - icon_state = "id" + icon_state = "generic-nt" item_state = "card-id" sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/id.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/id.dmi' ) var/access = list() @@ -127,13 +127,13 @@ /obj/item/weapon/card/id/silver name = "identification card" desc = "A silver card which shows honour and dedication." - icon_state = "silver" + icon_state = "silver-id" item_state = "silver_id" /obj/item/weapon/card/id/gold name = "identification card" desc = "A golden card which shows power and might." - icon_state = "gold" + icon_state = "gold-id" item_state = "gold_id" preserve_item = 1 @@ -144,23 +144,36 @@ /obj/item/weapon/card/id/gold/captain/spare name = "\improper Site Manager's spare ID" desc = "The spare ID of the High Lord himself." + icon_state = "gold-id-alternate" registered_name = "Site Manager" /obj/item/weapon/card/id/synthetic name = "\improper Synthetic ID" desc = "Access module for NanoTrasen Synthetics" icon_state = "id-robot" - item_state = "tdgreen" + item_state = "idgreen" assignment = "Synthetic" /obj/item/weapon/card/id/synthetic/Initialize() . = ..() access = get_all_station_access().Copy() + access_synth +/obj/item/weapon/card/id/platform + name = "\improper Support Platform ID" + desc = "Access module for support platforms." + icon_state = "id-robot" + item_state = "tdgreen" + assignment = "Synthetic" + access = list( + access_synth, access_mining, access_mining_station, access_mining_office, access_research, + access_xenoarch, access_xenobiology, access_external_airlocks, access_robotics, access_tox, + access_tox_storage, access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot + ) + /obj/item/weapon/card/id/centcom name = "\improper CentCom. ID" desc = "An ID straight from Central Command." - icon_state = "nanotrasen" + icon_state = "cc-id" registered_name = "Central Command" assignment = "General" @@ -175,7 +188,7 @@ /obj/item/weapon/card/id/centcom/ERT name = "\improper Emergency Response Team ID" assignment = "Emergency Response Team" - icon_state = "centcom" + icon_state = "ert-id" /obj/item/weapon/card/id/centcom/ERT/Initialize() . = ..() @@ -185,14 +198,13 @@ /obj/item/weapon/card/id/medical name = "identification card" desc = "A card issued to station medical staff." - icon_state = "med" + icon_state = "medical-id" primary_color = rgb(189,237,237) secondary_color = rgb(223,255,255) /obj/item/weapon/card/id/medical/head name = "identification card" desc = "A card which represents care and compassion." - icon_state = "medGold" primary_color = rgb(189,237,237) secondary_color = rgb(255,223,127) assignment = "Chief Medical Officer" @@ -201,14 +213,17 @@ /obj/item/weapon/card/id/security name = "identification card" desc = "A card issued to station security staff." - icon_state = "sec" + icon_state = "security-id" primary_color = rgb(189,47,0) secondary_color = rgb(223,127,95) +/obj/item/weapon/card/id/security/warden + assignment = "Warden" + rank = "Warden" + /obj/item/weapon/card/id/security/head name = "identification card" desc = "A card which represents honor and protection." - icon_state = "secGold" primary_color = rgb(189,47,0) secondary_color = rgb(255,223,127) assignment = "Head of Security" @@ -217,14 +232,17 @@ /obj/item/weapon/card/id/engineering name = "identification card" desc = "A card issued to station engineering staff." - icon_state = "eng" + icon_state = "engineering-id" primary_color = rgb(189,94,0) secondary_color = rgb(223,159,95) +/obj/item/weapon/card/id/engineering/atmos + assignment = "Atmospheric Technician" + rank = "Atmospheric Technician" + /obj/item/weapon/card/id/engineering/head name = "identification card" desc = "A card which represents creativity and ingenuity." - icon_state = "engGold" primary_color = rgb(189,94,0) secondary_color = rgb(255,223,127) assignment = "Chief Engineer" @@ -233,14 +251,13 @@ /obj/item/weapon/card/id/science name = "identification card" desc = "A card issued to station science staff." - icon_state = "sci" + icon_state = "science-id" primary_color = rgb(142,47,142) secondary_color = rgb(191,127,191) /obj/item/weapon/card/id/science/head name = "identification card" desc = "A card which represents knowledge and reasoning." - icon_state = "sciGold" primary_color = rgb(142,47,142) secondary_color = rgb(255,223,127) assignment = "Research Director" @@ -249,14 +266,13 @@ /obj/item/weapon/card/id/cargo name = "identification card" desc = "A card issued to station cargo staff." - icon_state = "cargo" + icon_state = "cargo-id" primary_color = rgb(142,94,0) secondary_color = rgb(191,159,95) /obj/item/weapon/card/id/cargo/head name = "identification card" desc = "A card which represents service and planning." - icon_state = "cargoGold" primary_color = rgb(142,94,0) secondary_color = rgb(255,223,127) assignment = "Quartermaster" @@ -269,7 +285,7 @@ /obj/item/weapon/card/id/civilian name = "identification card" desc = "A card issued to station civilian staff." - icon_state = "civ" + icon_state = "civilian-id" primary_color = rgb(0,94,142) secondary_color = rgb(95,159,191) assignment = "Civilian" @@ -278,13 +294,12 @@ /obj/item/weapon/card/id/civilian/head //This is not the HoP. There's no position that uses this right now. name = "identification card" desc = "A card which represents common sense and responsibility." - icon_state = "civGold" primary_color = rgb(0,94,142) secondary_color = rgb(255,223,127) /obj/item/weapon/card/id/external name = "identification card" desc = "An identification card of some sort. It does not look like it is issued by NT." - icon_state = "permit" + icon_state = "generic" primary_color = rgb(142,94,0) secondary_color = rgb(191,159,95) diff --git a/code/game/objects/items/weapons/id cards/station_ids_vr.dm b/code/game/objects/items/weapons/id cards/station_ids_vr.dm index 756ab3bc9c..0a9015145a 100644 --- a/code/game/objects/items/weapons/id cards/station_ids_vr.dm +++ b/code/game/objects/items/weapons/id cards/station_ids_vr.dm @@ -1,102 +1,273 @@ +/obj/item/weapon/card/id/event + var/configured = 0 + var/accessset = 0 + initial_sprite_stack = list() + var/list/title_strings = list() + var/preset_rank = FALSE + +/obj/item/weapon/card/id/event/attack_self(var/mob/user) + if(configured == 1) + return ..() + + if(!preset_rank) + var/title + if(user.client.prefs.player_alt_titles[user.job]) + title = user.client.prefs.player_alt_titles[user.job] + else + title = user.job + assignment = title + user.set_id_info(src) + if(user.mind && user.mind.initial_account) + associated_account_number = user.mind.initial_account.account_number + if(title_strings.len) + var/tempname = pick(title_strings) + name = tempname + " ([assignment])" + else + name = user.name + "'s ID card" + " ([assignment])" + + configured = 1 + to_chat(user, "Card settings set.") + +/obj/item/weapon/card/id/event/attackby(obj/item/I as obj, var/mob/user) + if(istype(I, /obj/item/weapon/card/id) && !accessset) + var/obj/item/weapon/card/id/O = I + access |= O.access + desc = I.desc + rank = O.rank + to_chat(user, "You copy the access from \the [I] to \the [src].") + user.drop_from_inventory(I) + qdel(I) + accessset = 1 + ..() + +/obj/item/weapon/card/id/event/accessset + accessset = 1 + + + /obj/item/weapon/card/id/gold/captain/spare/fakespare rank = "null" -/obj/item/weapon/card/id/itg +/obj/item/weapon/card/id/event/accessset/itg name = "identification card" desc = "A small card designating affiliation with the Ironcrest Transport Group." icon = 'icons/obj/card_vr.dmi' + base_icon = 'icons/obj/card_vr.dmi' icon_state = "itg" - item_state = "itg_id" -/obj/item/weapon/card/id/itg/green +/obj/item/weapon/card/id/event/accessset/itg/green icon_state = "itg_green" - item_state = "itg_green_id" -/obj/item/weapon/card/id/itg/red +/obj/item/weapon/card/id/event/accessset/itg/red icon_state = "itg_red" - item_state = "itg_red_id" -/obj/item/weapon/card/id/itg/purple +/obj/item/weapon/card/id/event/accessset/itg/purple icon_state = "itg_purple" - item_state = "itg_purple_id" -/obj/item/weapon/card/id/itg/white +/obj/item/weapon/card/id/event/accessset/itg/white icon_state = "itg_white" - item_state = "itg_white_id" -/obj/item/weapon/card/id/itg/orange +/obj/item/weapon/card/id/event/accessset/itg/orange icon_state = "itg_orange" - item_state = "itg_orange_id" -/obj/item/weapon/card/id/itg/blue +/obj/item/weapon/card/id/event/accessset/itg/blue icon_state = "itg_blue" - item_state = "itg_blue_id" -/obj/item/weapon/card/id/itg/event +/obj/item/weapon/card/id/event/accessset/itg/crew name = "\improper ITG Crew ID" assignment = "Crew" rank = "Crew" access = list(777) + preset_rank = TRUE -/obj/item/weapon/card/id/itg/event/pilot +/obj/item/weapon/card/id/event/accessset/itg/crew/pilot name = "\improper ITG Pilot's ID" desc = "An ID card belonging to the Pilot of an ITG vessel. The Pilot's responsibility is primarily to fly the ship. They may also be tasked to assist with cargo movement duties." assignment = "Pilot" rank = "Pilot" -/obj/item/weapon/card/id/itg/event/service +/obj/item/weapon/card/id/event/accessset/itg/crew/service name = "\improper ITG Cook's ID" desc = "An ID card belonging to the Cook of an ITG vessel. The Cook's responsibility is primarily to provide sustinence to the crew and passengers. The Cook answers to the Passenger Liason. In the absence of a Passenger Liason, the Cook is also responsible for tending to passenger related care and duties." assignment = "Cook" rank = "Cook" icon_state = "itg_green" - item_state = "itg_green_id" -/obj/item/weapon/card/id/itg/event/security +/obj/item/weapon/card/id/event/accessset/itg/crew/security name = "\improper ITG Security's ID" desc = "An ID card belonging to Security of an ITG vessel. Security's responsibility is primarily to protect the ship, cargo, or facility. They may also be tasked to assist with cargo movement duties and rescue operations. ITG Security is almost exclusively defensive. They should not start fights, but they are very capable of finishing them." assignment = "Security" rank = "Security" icon_state = "itg_red" - item_state = "itg_red_id" -/obj/item/weapon/card/id/itg/event/research +/obj/item/weapon/card/id/event/accessset/itg/crew/research name = "\improper ITG Research's ID" desc = "An ID card belonging to ITG Research staff. ITG Research staff primarily specializes in starship and starship engine design, and overcoming astronomic phenomena." assignment = "Research" rank = "Research" icon_state = "itg_purple" - item_state = "itg_purple_id" -/obj/item/weapon/card/id/itg/event/medical +/obj/item/weapon/card/id/event/accessset/itg/crew/medical name = "\improper ITG Medic's ID" desc = "An ID card belonging to the Medic of an ITG vessel. The Medic's responsibility is primarily to treat crew and passenger injuries. They may also be tasked with rescue operations." assignment = "Medic" rank = "Medic" icon_state = "itg_white" - item_state = "itg_white_id" -/obj/item/weapon/card/id/itg/event/engineer +/obj/item/weapon/card/id/event/accessset/itg/crew/engineer name = "\improper ITG Engineer's ID" desc = "An ID card belonging to the Engineer of an ITG vessel. The Engineer's responsibility is primarily to maintain the ship. They may also be tasked to assist with cargo movement duties." assignment = "Engineer" rank = "Engineer" icon_state = "itg_orange" - item_state = "itg_orange_id" -/obj/item/weapon/card/id/itg/event/passengerliason +/obj/item/weapon/card/id/event/accessset/itg/crew/passengerliason name = "\improper ITG Passenger Liason's ID" desc = "An ID card belonging to the Passenger Liason of an ITG vessel. The Passenger Liason's responsibility is primarily to manage and tend to passenger needs and maintain supplies and facilities for passenger use." assignment = "Passenger Liason" rank = "Passenger Liason" icon_state = "itg_blue" - item_state = "itg_blue_id" -/obj/item/weapon/card/id/itg/event/captain +/obj/item/weapon/card/id/event/accessset/itg/crew/captain name = "\improper ITG Captain's ID" desc = "An ID card belonging to the Captain of an ITG vessel. The Captain's responsibility is primarily to manage crew to ensure smooth ship operations. Captains often also often pilot the vessel when no dedicated pilot is assigned." assignment = "Captain" rank = "Captain" icon_state = "itg_blue" - item_state = "itg_blue_id" - access = list(777, 778) \ No newline at end of file + access = list(777, 778) + +/obj/item/weapon/card/id/event/altcard + icon = 'icons/obj/card_alt_vr.dmi' + base_icon = 'icons/obj/card_alt_vr.dmi' + icon_state = "id" + +/obj/item/weapon/card/id/event/altcard/spare + icon_state = "spare" + +/obj/item/weapon/card/id/event/altcard/clown + icon_state = "Clown" + +/obj/item/weapon/card/id/event/altcard/mime + icon_state = "Mime" + +/obj/item/weapon/card/id/event/altcard/centcom + icon_state = "CentCom Officer" + +/obj/item/weapon/card/id/event/altcard/ert + icon_state = "Emergency Responder" + +/obj/item/weapon/card/id/event/altcard/nt + icon_state = "nanotrasen" + +/obj/item/weapon/card/id/event/altcard/syndiegold + icon_state = "syndieGold" + +/obj/item/weapon/card/id/event/altcard/syndie + icon_state = "syndie" + +/obj/item/weapon/card/id/event/altcard/greengold + icon_state = "greenGold" + +/obj/item/weapon/card/id/event/altcard/pink + icon_state = "pink" + +/obj/item/weapon/card/id/event/altcard/pinkgold + icon_state = "pinkGold" + +/obj/item/weapon/card/id/event/polymorphic + var/base_icon_state + +/obj/item/weapon/card/id/event/polymorphic/digest_act(atom/movable/item_storage = null) + var/gimmeicon = icon + . = ..() + icon = gimmeicon + icon_state = base_icon_state + "_digested" + +/obj/item/weapon/card/id/event/polymorphic/altcard/attack_self(var/mob/user) + if(configured == 1) + return ..() + else + icon_state = user.job + base_icon_state = user.job + return ..() + +/obj/item/weapon/card/id/event/polymorphic/altcard + icon = 'icons/obj/card_alt_vr.dmi' + base_icon = 'icons/obj/card_alt_vr.dmi' + icon_state = "blank" + name = "contractor identification card" + desc = "An ID card typically used by contractors." + +/obj/item/weapon/card/id/event/polymorphic/itg/attack_self(var/mob/user) + if(!configured) + var/list/jobs_to_icon = list( //ITG only has a few kinds of icons so we have to group them up! + "Pilot" = "itg", + "Visitor" = "itg", + "Quartermaster" = "itg", + "Cargo Technician" = "itg", + "Shaft Miner" = "itg", + "Intern" = "itg", + "Talon Pilot" = "itg", + "Bartender" = "itg_green", + "Botanist" = "itg_green", + "Chef" = "itg_green", + "Janitor" = "itg_green", + "Chaplain" = "itg_green", + "Entertainer" = "itg_green", + "Janitor" = "itg_green", + "Librarian" = "itg_green", + "Warden" = "itg_red", + "Detective" = "itg_red", + "Security Officer" = "itg_red", + "Talon Guard" = "itg_red", + "Roboticist" = "itg_purple", + "Scientist" = "itg_purple", + "Xenobiologist" = "itg_purple", + "Xenobotanist" = "itg_purple", + "Pathfinder" = "itg_purple", + "Explorer" = "itg_purple", + "Chemist" = "itg_white", + "Medical Doctor" = "itg_white", + "Paramedic" = "itg_white", + "Psychiatrist" = "itg_white", + "Field Medic" = "itg_white", + "Talon Doctor" = "itg_white", + "Atmospheric Technician" = "itg_orange", + "Station Engineer" = "itg_orange", + "Off-duty Officer" = "itg_red", + "Off-duty Engineer" = "itg_orange", + "Off-duty Medic" = "itg_white", + "Off-duty Scientist" = "itg_purple", + "Off-duty Cargo" = "itg", + "Off-duty Explorer" = "itg_purple", + "Off-duty Worker" = "itg_green" + ) + var/guess = jobs_to_icon[user.job] + + if(!guess) + to_chat(user, "ITG Cards do not seem to be able to accept the access codes for your ID.") + return + else + icon_state = guess + base_icon_state = guess + . = ..() + name = user.name + "'s ITG ID card" + " ([assignment])" + + +/obj/item/weapon/card/id/event/polymorphic/itg/attackby(obj/item/I as obj, var/mob/user) + if(istype(I, /obj/item/weapon/card/id) && !accessset) + var/obj/item/weapon/card/id/O = I + var/list/itgdont = list("Site Manager", "Head of Personnel", "Command Secretary", "Head of Security", "Chief Engineer", "Chief Medical Officer", "Research Director", "Clown", "Mime", "Talon Captain") //If you're in as one of these you probably aren't representing ITG + if(O.rank in itgdont) + to_chat(user, "ITG Cards do not seem to be able to accept the access codes for your ID.") + return + . = ..() + desc = "A small card designating affiliation with the Ironcrest Transport Group. It has a NanoTrasen insignia and a lot of very small print on the back to do with practices and regulations for contractors to use." + + +/obj/item/weapon/card/id/event/polymorphic/itg + icon = 'icons/obj/card_vr.dmi' + base_icon = 'icons/obj/card_vr.dmi' + icon_state = "itg" + name = "\improper ITG identification card" + desc = "A small card designating affiliation with the Ironcrest Transport Group. It has a NanoTrasen insignia and a lot of very small print on the back to do with practices and regulations for contractors to use." diff --git a/code/game/objects/items/weapons/id cards/syndicate_ids.dm b/code/game/objects/items/weapons/id cards/syndicate_ids.dm index afb85ecb7a..01f6591104 100644 --- a/code/game/objects/items/weapons/id cards/syndicate_ids.dm +++ b/code/game/objects/items/weapons/id cards/syndicate_ids.dm @@ -1,6 +1,6 @@ /obj/item/weapon/card/id/syndicate name = "agent card" - icon_state = "syndicate" + icon_state = "generic-s" assignment = "Agent" origin_tech = list(TECH_ILLEGAL = 3) var/electronic_warfare = 1 @@ -67,11 +67,12 @@ if(!id_card_states) id_card_states = list() for(var/path in typesof(/obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/ID = path + var/obj/item/weapon/card/id/ID = new path() var/datum/card_state/CS = new() CS.icon_state = initial(ID.icon_state) CS.item_state = initial(ID.item_state) - CS.name = initial(ID.name) + " - " + initial(ID.icon_state) + CS.sprite_stack = ID.initial_sprite_stack + CS.name = initial(ID.name) id_card_states += CS id_card_states = dd_sortedObjectList(id_card_states) @@ -81,6 +82,7 @@ var/name var/icon_state var/item_state + var/sprite_stack /datum/card_state/dd_SortValue() return name @@ -89,5 +91,6 @@ name = "syndicate ID card" desc = "An ID straight from the Syndicate." registered_name = "Syndicate" - assignment = "Syndicate Overlord" - access = list(access_syndicate, access_external_airlocks) \ No newline at end of file + assignment = "Syndicate Commander" + icon_state = "syndicate-id" + access = list(access_syndicate, access_external_airlocks) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 81d5bb8f04..b06e92cc4a 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -7,6 +7,8 @@ icon = 'icons/obj/device.dmi' icon_state = "implant" w_class = ITEMSIZE_TINY + show_messages = TRUE + var/implanted = null var/mob/imp_in = null var/obj/item/organ/external/part = null @@ -14,7 +16,7 @@ var/allow_reagents = 0 var/malfunction = 0 var/initialize_loc = BP_TORSO - show_messages = 1 + var/known_implant = FALSE /obj/item/weapon/implant/proc/trigger(emote, source as mob) return @@ -65,16 +67,17 @@ malfunction = MALFUNCTION_PERMANENT /obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H) - if(H) - if(handle_implant(H, initialize_loc)) - invisibility = initial(invisibility) - post_implant(H) + . = istype(H) && handle_implant(H, initialize_loc) + if(.) + invisibility = initial(invisibility) + known_implant = TRUE + post_implant(H) /obj/item/weapon/implant/Destroy() if(part) part.implants.Remove(src) + part = null listening_objects.Remove(src) - part = null imp_in = null return ..() @@ -100,6 +103,7 @@ GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking /obj/item/weapon/implant/tracking name = "tracking implant" desc = "An implant normally given to dangerous criminals. Allows security to track your location." + known_implant = TRUE var/id = 1 var/degrade_time = 10 MINUTES //How long before the implant stops working outside of a living body. @@ -348,6 +352,7 @@ GLOBAL_LIST_BOILERPLATE(all_chem_implants, /obj/item/weapon/implant/chem) name = "chemical implant" desc = "Injects things." allow_reagents = 1 + known_implant = TRUE /obj/item/weapon/implant/chem/get_data() var/dat = {" @@ -418,6 +423,7 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/weapon/implant/loyalty name = "loyalty implant" desc = "Makes you loyal or such." + known_implant = TRUE /obj/item/weapon/implant/loyalty/get_data() var/dat = {" @@ -491,6 +497,7 @@ the implant may become unstable and either pre-maturely inject the subject or si name = "death alarm implant" desc = "An alarm which monitors host vital signs and transmits a radio message upon death." origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 2, TECH_DATA = 1) + known_implant = TRUE var/mobname = "Will Robinson" /obj/item/weapon/implant/death_alarm/get_data() diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index c404089028..9162be15eb 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -299,3 +299,13 @@ src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/blade( src ) ..() return + +/obj/item/weapon/implantcase/restrainingbolt + name = "glass case - 'Restraining Bolt'" + desc = "A case containing a restraining bolt." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/restrainingbolt/New() + src.imp = new /obj/item/weapon/implant/restrainingbolt( src ) + ..() + return diff --git a/code/game/objects/items/weapons/implants/implantdud.dm b/code/game/objects/items/weapons/implants/implantdud.dm index 110051e58d..cabf5bc906 100644 --- a/code/game/objects/items/weapons/implants/implantdud.dm +++ b/code/game/objects/items/weapons/implants/implantdud.dm @@ -4,18 +4,6 @@ icon = 'icons/obj/device.dmi' icon_state = "implant" initialize_loc = BP_HEAD - var/roundstart = TRUE /obj/item/weapon/implant/dud/torso - name = "unknown implant" - desc = "A small device with small connector wires." - icon = 'icons/obj/device.dmi' - icon_state = "implant" initialize_loc = BP_TORSO - -/obj/item/weapon/implant/dud/old - name = "old implant" - desc = "A small device with small connector wires." - icon = 'icons/obj/device.dmi' - icon_state = "implant" - roundstart = FALSE diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index c1b0d5db8d..adb79364dc 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -150,3 +150,12 @@ S.remove_from_storage(A) A.loc.contents.Remove(A) update() + +/obj/item/weapon/implanter/restrainingbolt + name = "implanter (bolt)" + +/obj/item/weapon/implanter/restrainingbolt/New() + src.imp = new /obj/item/weapon/implant/restrainingbolt( src ) + ..() + update() + return diff --git a/code/game/objects/items/weapons/implants/implantlanguage.dm b/code/game/objects/items/weapons/implants/implantlanguage.dm index 6a0f2baea8..692cdd381f 100644 --- a/code/game/objects/items/weapons/implants/implantlanguage.dm +++ b/code/game/objects/items/weapons/implants/implantlanguage.dm @@ -5,6 +5,7 @@ /obj/item/weapon/implant/language name = "GalCom language implant" desc = "An implant allowing someone to speak the range of frequencies used in Galactic Common, as well as produce any phonemes that they usually cannot. Only helps with producing sounds, not understanding them." + known_implant = TRUE var/list/languages = list(LANGUAGE_GALCOM) // List of languages that this assists with /obj/item/weapon/implant/language/post_implant(mob/M) // Amends the mob's voice organ, then deletes itself diff --git a/code/game/objects/items/weapons/implants/implantrestrainingbolt.dm b/code/game/objects/items/weapons/implants/implantrestrainingbolt.dm new file mode 100644 index 0000000000..7f4a562297 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implantrestrainingbolt.dm @@ -0,0 +1,5 @@ + +/obj/item/weapon/implant/restrainingbolt + name = "\improper restraining bolt" + icon = 'icons/obj/device.dmi' + icon_state = "implant" diff --git a/code/game/objects/items/weapons/manuals_ch.dm b/code/game/objects/items/weapons/manuals_ch.dm new file mode 100644 index 0000000000..25637382f5 --- /dev/null +++ b/code/game/objects/items/weapons/manuals_ch.dm @@ -0,0 +1,24 @@ +/obj/item/weapon/book/manual/chemistry_guide + name = "Chemical Recipes and Refreshers" + desc = "A lengthy guide on the most commonly used chemicals on a modern orbital facility" + icon_state = "bookMedical" + icon = 'icons/obj/library.dmi' + author = "NanoTrasen" + title = "Chemical Recipes and Refreshers" + +/obj/item/weapon/book/manual/chemistry_guide/New() + ..() + dat = {" + + + + +

((https://wiki.chompstation13.net/index.php?title=Guide_to_Chemistry))

+ "} \ No newline at end of file diff --git a/code/game/objects/items/weapons/manuals_vr.dm b/code/game/objects/items/weapons/manuals_vr.dm index 302e19ab2a..c14cfc12a0 100644 --- a/code/game/objects/items/weapons/manuals_vr.dm +++ b/code/game/objects/items/weapons/manuals_vr.dm @@ -42,4 +42,303 @@ - "} \ No newline at end of file + "} + +//accurate as of 2/17/21 Extra credit to document editting and proofreading editing to Luna +/obj/item/weapon/book/manual/cook_guide + name = "Food for Dummies 2" + desc = "A helpful guide to the world of cooking." + icon_state = "cook-guide" + icon = 'icons/obj/library_vr.dmi' + author = "Ali Big" + title = "Food for Dummies 2" + +/obj/item/weapon/book/manual/cook_guide/New() + ..() + dat = {" + + + + + + +

Food for Dummies 2

+
Penned by Ali Big
+

Hello Newbie, congratz on deciding to make food! This guide assumes you know absolutely nothing, so fret not, the information here will help you prepare food for your hungry crewmates!

+

Workspace prep:

+ This step is simple: merely go to the Grill, Oven, and Fryer and turn everything on so you do not need to wait for them to warm up later; they won’t start a fire unless food is left in them unchecked. It is also highly suggested to lay out at least a few Measuring Cups on the counters for ease of use. +

Basic ingredient prep:

+ In the lockers and fridges, you have all your needed supplies for this guide, so look through them and familiarize yourself! This guide will only use ingredients you already have access to, so don't worry about missing items! +

Part 1: How to Create Various Essential Ingredients with What You Have

+

Dough Creation:

+ The basis for a large quantity of meals. Simply take an Egg, crack it into a Beaker or Measuring Cup, and then add 10 units of Flour to create Dough. +

Dough Creation part 2:

+ With Dough, you can make a wide variety of base ingredients. Flattening it with a Rolling Pin makes Flat Dough. Flat Dough can be cooked in a Microwave for Flatbread, or if one adds Water and Flour in with the Flat Dough in the Microwave you get a Tortilla. Water can be obtained by filling a Cup at the Sink or Soda Machine. +

Dough Creation Part 3:

+ Alternatively, Flat Dough can be cut with a Knife to make Dough Slices, and those can be cut to make Spaghetti. +

Cheese Creation:

+ A common topping. Take a bottle of Universal Enzyme, put it in a Beaker or Measuring Cup, and add Milk until a Cheese Wheel pops out. Then cut the Cheese Wheel with a Knife to make Cheese Wedges, all recipes use Wedges not the full Wheel. +

Tofu Creation:

+ Same as cheese, but with Soymilk! +

Meatball Creation:

+ Mix Animal protein and Flour, to create Animal Protein grind down some Meat in the grinder, then remove the beaker and add Flour. +

Meat Uses:

+ Full pieces of Meat can be cut for Raw Cutlets, which can be cut once more to make Raw Bacon. Though be sure not to cut all of your meat, plenty of recipes need a full uncut piece! +

Part 2: Putting It All Together

+

Now that you know the fundamentals of how to make the base ingredients, here are some fairly easy recipes to put them together into something enjoyable for the crew.

+

Warning: recipes are upscale able, so you can add multiple of the same ingredients in the same ratio to cook lots of food at once!

+

Warning: do not try and cook multiple recipes at once as it is very likely it will default to a different recipe or will just cook the one and just "grill, bake, etc." the rest of the ingredients.

+

Burgers:

+ The cornerstone of basic food: to prepare these, microwave a piece of Dough to get a bun and grab a piece of Meat. Open the Grill, remove the Rack, and add both Bun and Meat to the Rack. Then, place the Rack back into the Grill to cook and remove it once finished. If you feel fancy, you can add cheese afterwards for a cheeseburger. +

Meat Pie:

+ Flat Dough and Meat in an Oven Pan, same way you use the Grill; take the Pan out, put the ingredients in, and place it back to cook. Simple, but very good looking and tasty! +

Burritos:

+ Burritos: A personal favorite due to flexibility of options: Use a Tortilla as a base for all of these. For a Chili one, add 2 Meatballs and 1 Space Spice (found near the Flour) to the Microwave; very simple and filling! Add a Cheese Wedge instead of the spice to make a queso burrito. For a Breakfast Wrap, add a whole Egg, Cooked Bacon (Raw Bacon cooked in the Microwave), and Cheese in with the Tortilla. For Vegan Burritos, just cook a Tortilla and Tofu together in the Microwave. +

Tacos:

+ Use a tortilla then 1 cooked Cutlet, and a Cheese Wedge. Very easy to mass produce, great in a pinch! +

Cheesy Nachos:

+ Tortilla, Cheese and 1 unit of Salt in the microwave, the perfect Finger Food! +

Spaghetti:

+ Without Tomato’s from Botany it's not going to be the flashiest, but one can make Boiled Spaghetti with Spaghetti and Water in the Microwave. Kitsune Udon can be made with Spaghetti, Egg Yolk (crack egg in beaker then add to microwave), and Tofu. Spaghetti and Meatballs can be made by doing the Boiled Spaghetti Recipe and adding 2 Meatballs; adding 4 Meatballs into the initial mix makes Spesslaw. Lastly, Spaghetti, Milk, and Cheese in the Oven makes Macaroni and Cheese. +

Steak:

+ For the pure meat eaters, just add Meat, 1 Salt, and 1 Pepper into the grill for them, and try not to cry as they use up all your Meat quickly. (There's a second Meat Locker in the freezer room if you do run out!) +

Donk Pockets:

+ Dough and Meatball in the Microwave, though we already have plenty lying around the station. +

Eggs:

+ Fried Egg, 1 Egg 1 Salt, 1 Pepper in a Microwave. Bacon and Eggs if you combine Cooked Bacon and Fried Egg in the Microwave. Great way to start the shift! +

Part 3: Final Notes

+

These recipes only scratch the surface, but it's all things that can be done with what is pre-provided. If you have a partner in Botany, feel free to request more meat or any other supplies to try new recipes!

+

The Fryer, CondiMaster3000, and other nearby devices have been deliberately left out of this guide; as you get more advanced feel free to experiment with them, though be careful with the Fryer especially as it's the #1 source of fires for learning chefs, myself included. The one other machine that is worth understanding is the Gibber in the freezer room. If you are delivered fish or such they can be gibbed for extra Meat, though you may need to butcher the parts with a Knife afterwards to get usable Meat! Though if the meat is purple or comes from Koi or Spacecarp do not directly serve it to crew! It contains toxins that are better taken care of by other departments.

+

Some wonderful websites share recipes and tips for learning chefs on the Extranet! Look on your PDA or preferred device at https://wiki.vore-station.net/Guide_to_Food_and_Drink and https://vore-station.net/infodump/recipes_food.html for further tips, though do note the latter is more accurate in regard to recipes. Happy cooking!

+

Pro Tips:

+

((The Food Bags in the Chef's Closet are great for moving a lot of food at once!))

+

((Stay out of the Freezer if you're Cold Blooded!))

+

((The websites linked above are also on our stations wiki. Which is always in need of helping heads to fix it up. The recipes listed on the web link may not be fully accurate so please don't be afraid to pop into the discord wiki channel and lend a hand!))

+ + + "} + +//accurate as of 2/23/21 +/obj/item/weapon/book/manual/bar_guide + name = "How to Alcohol (And other Drinks)" + desc = "A helpful guide to the world of barkeeping." + icon_state = "bar-guide" + icon = 'icons/obj/library_vr.dmi' + author = "Ali Big" + title = "How to Alcohol (And other Drinks)" + +/obj/item/weapon/book/manual/bar_guide/New() + ..() + dat = {" + + + + + +

How to Alcohol (And other Drinks)

+
Penned by Ali Big
+

Hello, and congratulations on taking on the admirable, and often thankless task of making Drinks for your fellow crewmates (or perhaps yourself if you hopped the bar, how rude!).

+

This guide will walk through the essentials of drink making... don't worry, it's not too complex! Recipes have been placed at the top for ease of use, but further down there is an actual guide as to how to make drinks, so give it a read if you don't know how, or just want some tips!

+

Part 0: Recipes Quick Reference (Ordered by strength, non-exhaustive list)

+

Low Alcohol:

+

Grog :

+ 1 part Rum, 1 part Water +

Sui Dream:

+ 1 part Space-Up, 1 part Miss Blue Curacao, 1 part Emeraldine Melon Liquor +

Baloon:

+ 1 part Cream, 1 part Miss Blue Curacao +

Gin and Tonic:

+ 1 part Gin, 1 part Tonic +

Appletini:

+ 2 parts Apple Juice, 1 part Vodka +

Medium Alcohol

+

Giant Beer:

Chrysanthemum: + 1 part Sake, 1 part Emeraldine Melon Liquor +

Barefoot:

+ 1 part Berry Juice, 1 part Cream, 1 part Vermouth. +

Clover Club:

+ 1 part Berry Juice, 1 Part Lemon Juice, 3 parts Gin +

Cold Front:

+ 1 part Iced Coffee, 1 part Whiskey, 1 part Mint (Allergy Warning: do not give to any species with less cold tolerance than Teshari, they will die if you do, if unsure do not serve) +

Cuba Libre (Often called Rum and Coke):

+ 1 part Space Cola, 2 parts Rum. +

Negroni Sbagliato:

+ 1 part Wine, 1 part Bermouth, 1 part Soda Water +

Slow Comfortable Screw Against the Wall (Stop giggling!):

+ 3 parts Screwdriver, 1 part Rum, 1 part Whiskey, 1 part Gin +

Space Bulldog:

+ 4 parts White Russian, 1 part Cola +

Sweet Rush:

+ 1 part Sugar, 1 part Soda Water, 1 part Vodka. +

Allies Cocktail:

+ 1 part Classic Martini, 1 part Vodka +

Bahama Mama:

+ 1 part Ice, 2 parts Orange Juice, 1 part Lime Juice, 2 parts Rum +

Classic Martini:

+ 2 parts Gin, 1 part Vermouth +

Daiquiri:

+ 3 Rum, 2 Lime Juice, 1 Sugar +

Ginza Mary:

+ 2 part Sake, 2 part Vodka, 1 part Tomato Juice +

Irish Cream:

+ 2 parts Whiskey, 1 part Cream +

Lotus:

+ 1 part Negroni Sbagliato, 1 part Sweet Rush +

Tequila Sunrise:

+ 2 parts Tequila, 1 part Orange Juice +

The Manly Dorf:

+ 1 part Beer, 2 parts Ale +

Whiskey Cola:

+ 2 parts Whiskey, 1 part Space Cola +

Binman Bliss:

+ 1 part Sake, 1 part Tequila + +

High Alcohol

+

Elysium Facepunch:

+ 1 part Kahlua, 1 part Lemon Juice +

Italian Crisis:

+ 1 part Space Bulldog, 1 part Negroni Sbagliato +

Whiskey Sour:

+ 2 Whiskey, 1 Lemon Juice, 1 Sugar +

Aloe:

+ 1 part Cream, 1 part Watermelon Juice, 1 part Whiskey (in that order) +

Andalusia:

+ 1 part Lemon Juice, 1 part Rum, 1 part Whiskey +

Black Russian:

+ 2 part Vodka, 1 part Kahlua +

Bloody Mary:

+ 3 parts Tomato Juice, 2 part Vodka, 1 part Lime Juice +

Brave Bull:

+ 2 parts Tequila, 1 part Kahlua +

Irish Car Bomb:

+ 1 part Ale, 1 part Irish Cream +

Irish Coffee:

+ 1 parts Irish Cream, 1 parts Coffee +

Manhattan:

+ 2 parts Whiskey, 1 part Vermouth +

Margarita:

+ 2 parts Tequila, 1 part Lime Juice +

Screwdriver:

+ 2 parts Vodka, 1 part Orange Juice +

Sex On The Beach:

+ 3 part Orange Juice, 2 part Grenadine Syrup, 1 part Vodka +

Vodka and Tonic:

+ 2 parts Vodka, 1 part Tonic +

Whiskey Soda:

+ 2 parts Whiskey, 1 part Soda Water +

White Russian:

+ 2 Black Russian, 1 part Cream +

WND-Garita:

+ 3 Margarita, 2 Mountain Wind, 1 Emeraldine Melon Liquor +

Mudslide:

+ 1 Black Russian, 1 Irish Cream + +

Very High Alcohol (Serve sparingly unless a patron proves they can handle a lot)

+

Anti-Freeze:

+ 1 part Cream, 1 part Ice, 1 parts Vodka (Feels cold but actually warms. Allergy Warning: Do not serve to Teshari or Promethians, or other heat vulnerable species, they will die if you do, if unsure do not serve) +

B-52:

+ 1 part Irish Cream, 1 part Cognac, 1 part Kahlua +

Long Island Iced Tea:

+ 3 part Cuba Libre, 1 part Vodka, 1 part Gin, 1 part Tequila +

Vodka Martini:

+ 2 parts Vodka, 1 part Vermouth +

Changeling Sting:

+ 1 part Screwdriver, 1 part Lemon Juice, 1 part Lime Juice +

Deathbell:

+ 1 part Anti-Freeze, 1 part Pan-Galactic Gargle Blaster, 1 part Syndicate Bomb (Allergy Warning: Poisonous to Teshari and other heat vulnerable species. Literally explodes Promethians. Metabolizes very quickly so it can kill a liver easily, be very careful with this one.) +

Erebus Moonrise:

+ 1 part Whiskey, 1 part Vodka, 1 part Tequila +

Pan-Galactic Gargle Blaster:

+ 1 part Gin, 2 part Vodka, 1 part Whiskey, 1 part Cognac, 1 part Lime Juice (Causes halucinations, don't slip it into other drinks you animal) +

Syndicate Bomb:

+ 1 part Whiskey Cola, 1 part Beer +

Euphoria:

+ 1 part Special Blend Whiskey, 2 part Cognac +

Screaming Viking:

+ Vodka, Vermouth, Lime Juice, Rum, Gin, and Tonic +
Good Luck figuring out the order and ratio :)
+

Fire Punch:

+ 1 part Sugar, 2 part Rum (Technically the strongest thing you can make, but it metabolizes slowish so it's slightly less dangerous than some others) + +

Non Alcoholic Drinks

+

Appleade:

+ 1 part Apple Juice, 1 part Sugar, 1 part Soda Water +

Arnold Palmer:

+ 1 Iced Tea, 1 Lemonade +

Berry Cordial:

+ 4 Berry Juice, 1 unit Sugar, 1 Lemon Juice +

Berry shake:

+ 1 part Milkshake, 1 part Berry Juice +

Brown Star:

+ 2 parts Orange Juice, 1 part Space Cola +

Cafe Latte:

+ 1 part Coffee, 1 part Milk +

Coffee Milkshake:

+ 1 part Milkshake, 1 part Coffee +

Driver's Punch:

+ 1 part Appleade, 1 part Orange Juice, 1 part Mint, 1 part Soda Water +

Graveyard:

+ All 4 Sodas in your Soft Drink Dispenser in equal parts, haha it go woosh. +

Grenadine Syrup:

+ 10 parts berry juice, 5 parts Universal Enzyme (Get Enzyme from Kitchen) +

Iced Coffee:

+ 1 part Ice, 2 parts Coffee +

Kira Special:

+ 1 part Orange Juice, 1 part Lime Juice, 1 part Soda Water +

Lemonade:

+ 1 part Lemon juice, 1 part Sugar, 1 part Water +

Melonade:

+ 1 part Watermelon Juice, 1 part Sugar, 1 part Soda Water +

Milkshake:

+ 1 part Cream, 2 parts Ice, 2 parts Milk +

Sweet Tea:

+ 2 parts Ice Tea, 1 part Sugar +

Note: There are many more drinks you can mix, these are just ones using resources you will almost always have available, the Extranet has good websites to check found here: https://wiki.vore-station.net/Guide_to_Food_and_Drink ass well as here: https://vore-station.net/infodump/recipes_drinks.html + +

Part 1: The Basics

+

First and foremost, making drinks is about understanding measurements. Drinks are measured in units a pint is 60 units, a half pint 30, and ratios of those units can create certain drinks.

+

The ratios of these drinks are denoted in "Parts". For example, Grog is 1 part rum and 1 part water mixed in a container that holds liquid. This means 1 unit of Rum and 1 unit of Water can make Grog, as can 30 units of Rum and 30 units of Water. Ratios aren't picky, if you have 5 units of Rum and 10 of Water in a glass, it will turn as much as possible into Grog, and the rest will remain as water (In this case, 10 units of Grog and 5 units of Water will be in the glass). When mixing drinks, you may accidentally have extra of an ingredient such as in the previous example, but this can easily be rectified by placing the drink in one of the Dispensers, and using the interface at the bottom to remove however many units you put extra, so don't worry about sloppiness as long as you clean up your mistakes!

+

Actually mixing drinks is simple enough, the vast majority of mixing should be done in a Dispenser, it can be done by hand outside of one, but generally you only want to be doing so for when the Dispenser lacks an ingredient to make life easier. Drinks automatically mix when placed into a container together, so you don't have to do anything special, think of it like a chemical reaction, it even bubbles when it works!

+

Part 2: General Tips/FAQ

+

"I don't have X item for the drink my patron wants." - If it's on the quick reference, you probably do, just be sure to check the Booze-O-Mat if it cannot be found in the dispenser. If it's not in either Dispenser or in the Coffee Dispenser in the Surface 1 Bar (Such as Berry Juice). If you still lack the materials, you may need to ask another department (Cargo, Science, or perhaps Med usually) for a delivery of them.

+

"I don't want to run to the Surface 1 Bar every time to make this specific drink." - You don't have to! A good practice as a bartender if you want to make your life easier is to take a screwdriver, use it on the machine, and select the cartridges you want to have in your bar. If you do this you will remove them, and are free to insert them into your own machines, but do be considerate if there are more bartenders around, don't steal their supplies if they need them! Another good practice is to move, or have someone else move the machine up to your bar instead of removing the cartridges, ultimately the choice is yours as to how best set up your bar!

+

"How do I deal with a rowdy patron?" - Ask Security for help, just because you have a shotgun doesn't mean you are the law in your bar. Respect procedure!

+

"What does the Grinder do?" - What it says on the tin, if you get Iron, Uranium, or something else needed for a drink that isn't already liquefied, you have to grind it down first to add it!

+

"Do I have to wear the hat?" - No, but you can if it looks good on you!

+

"How do I unlock the good music on the Jukebox?" - Get a Screwdriver and use it on the Jukebox to open the hatch, then use Wirecutters and cut/remend wires until you cut the one that turns the Parental Guidance light off. Beware of shocks (Insulated Gloves Suggested)! Be sure to close it again after.

+

"How do I make my drinks look pretty?" - Use the Metamorphic Glasses, though do note some drinks don't look any different even in one.

+

"Oh god my patron is convulsing, what do I do?" - Rush them to Medbay. If they're too big to move get a rolling chair from the Library, or get medical staff to come to the Bar.

+

"My patron drank too much and is definitely going to start convulsing, what do I do?" - Either rush them to Medbay, or get Medbay to give you pills that neutralize alcohol, it's ok to be the fun police to save a life.

+

"Nobody wants to stay at my bar!" - Try adopting a gimmick to spruce things up! Everyone's will be different, but doing something fun is a good way to attract customers. Creating your own unique mixes is another fun way to distinguish yourself.

+

"I don't like the way the bar looks with the lights dimmed/I don't like the way the bar looks with the lights bright!" - Enable or disable the night lighting on the APC by the bar then!

+

"A patron said they don't drink, woe is me, my job is now useless!" - Have you tried offering them a non-alcoholic drink? Or just talking to them? As long as you're providing a good time, you're still doing great!

+

"Somebody messed with a drink I left lying out on the counter, I think it's been spiked!" - Don't leave drinks lying on the counter. Not only is it a spiking hazzard, but inevitably somebody is gonna try to chug them all. If you want to do a pretty display, make it non alcoholic, or on the back bar counter out of easy reach!

+

"My patrons are all hungry because we have no Chef!" - Well, you have access to the Kitchen if you feel like trying to solve that, I have a guide for that there too!

+

"I feel like a hamster in a wheel, running hopelessly but never quite getting anywhere. No matter what I do, things just don't seem to change, I don't seem to change, and I worry, that maybe... they won't." - Try drinking some of your own booze until that feeling goes away.

+

Part 3: Closing Remarks

+

This all may seem daunting at a glance; so many recipes to learn, and a "lot" to keep in mind. But really it's not - tending the Bar is mostly about going with the flow of things and providing a good times, and drinks just provide liquid courage to make a good time easier. Take a deep breath if you ever feel overwhelmed, and handle one order at a time. You can do it! Don't feel the need to know every recipe, just learn your favorites and go from there; the rest is here or online if someone asks for it! If somebody asks you to give them anything without a specific request, don't panic: evalulate their likes and tolerance level, and try your best to give them something nice!

+ + "} \ No newline at end of file diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 678b77b622..78cd9c39e7 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -45,13 +45,15 @@ /obj/item/weapon/material/butterfly/attack_self(mob/user) active = !active - if(active) - to_chat(user, "You flip out \the [src].") - playsound(src, 'sound/weapons/flipblade.ogg', 15, 1) - else - to_chat(user, "\The [src] can now be concealed.") update_force() - add_fingerprint(user) + + if(user) + if(active) + to_chat(user, "You flip out \the [src].") + playsound(src, 'sound/weapons/flipblade.ogg', 15, 1) + else + to_chat(user, "\The [src] can now be concealed.") + add_fingerprint(user) /* * Kitchen knives @@ -138,6 +140,11 @@ slot_flags = SLOT_BELT default_material = "plasteel" //VOREStation Edit +/obj/item/weapon/material/knife/machete/cyborg + name = "integrated machete" + desc = "A sharp machete often found attached to robots." + unbreakable = TRUE + /obj/item/weapon/material/knife/tacknife/survival name = "survival knife" desc = "A hunting grade survival knife." diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm index 3d3f7a3c38..96496d2f8f 100644 --- a/code/game/objects/items/weapons/material/material_armor.dm +++ b/code/game/objects/items/weapons/material/material_armor.dm @@ -31,7 +31,9 @@ Protectiveness | Armor % var/applies_material_color = TRUE var/unbreakable = FALSE var/default_material = null // Set this to something else if you want material attributes on init. - var/material_armor_modifer = 1 // Adjust if you want seperate types of armor made from the same material to have different protectiveness (e.g. makeshift vs real armor) + var/material_armor_modifier = 1 // Adjust if you want seperate types of armor made from the same material to have different protectiveness (e.g. makeshift vs real armor) + var/material_slowdown_modifier = 0 + var/material_slowdown_multiplier = 1 /obj/item/clothing/New(var/newloc, var/material_key) ..(newloc) @@ -138,7 +140,7 @@ Protectiveness | Armor % return ..() var/reflectchance = (40 * material.reflectivity) - round(damage/3) - reflectchance *= material_armor_modifer + reflectchance *= material_armor_modifier if(!(def_zone in list(BP_TORSO, BP_GROIN))) reflectchance /= 2 if(P.starting && prob(reflectchance)) @@ -166,17 +168,17 @@ Protectiveness | Armor % if(material) var/melee_armor = 0, bullet_armor = 0, laser_armor = 0, energy_armor = 0, bomb_armor = 0 - melee_armor = calculate_material_armor(material.protectiveness * material_armor_modifer) + melee_armor = calculate_material_armor(material.protectiveness * material_armor_modifier) - bullet_armor = calculate_material_armor((material.protectiveness * (material.hardness / 100) * material_armor_modifer) * 0.7) + bullet_armor = calculate_material_armor((material.protectiveness * (material.hardness / 100) * material_armor_modifier) * 0.7) - laser_armor = calculate_material_armor((material.protectiveness * (material.reflectivity + 1) * material_armor_modifer) * 0.7) + laser_armor = calculate_material_armor((material.protectiveness * (material.reflectivity + 1) * material_armor_modifier) * 0.7) if(material.opacity != 1) laser_armor *= max(material.opacity - 0.3, 0) // Glass and such has an opacity of 0.3, but lasers should go through glass armor entirely. - energy_armor = calculate_material_armor((material.protectiveness * material_armor_modifer) * 0.4) + energy_armor = calculate_material_armor((material.protectiveness * material_armor_modifier) * 0.4) - bomb_armor = calculate_material_armor((material.protectiveness * material_armor_modifer) * 0.5) + bomb_armor = calculate_material_armor((material.protectiveness * material_armor_modifier) * 0.5) // Makes sure the numbers stay capped. for(var/number in list(melee_armor, bullet_armor, laser_armor, energy_armor, bomb_armor)) @@ -190,7 +192,12 @@ Protectiveness | Armor % if(!isnull(material.conductivity)) siemens_coefficient = between(0, material.conductivity / 10, 10) - slowdown = between(0, round(material.weight / 10, 0.1), 6) + + var/slowdownModified = between(0, round(material.weight / 10, 0.1), 6) + + var/slowdownUncapped = (material_slowdown_multiplier * slowdownModified) - material_slowdown_modifier + + slowdown = max(slowdownUncapped, 0) /obj/item/clothing/suit/armor/material name = "armor" @@ -201,6 +208,67 @@ Protectiveness | Armor % desc = "This appears to be two 'sheets' of a material held together by cable. If the sheets are strong, this could be rather protective." icon_state = "material_armor_makeshift" +/obj/item/clothing/accessory/material/makeshift/light //Craftable with 4 material sheets, less slowdown, less armour + name = "light armor plate" + desc = "A thin plate of padded material, designed to fit into a plate carrier. Attaches to a plate carrier." + icon = 'icons/obj/clothing/modular_armor.dmi' + icon_state = "armor_light" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + slot = ACCESSORY_SLOT_ARMOR_C + material_armor_modifier = 0.8 + material_slowdown_modifier = 0.5 //Subtracted from total slowdown + material_slowdown_multiplier = 0.8 //Multiplied by total slowdown + +/obj/item/clothing/accessory/material/makeshift/heavy //Craftable with 8 material sheets, more slowdown, more armour + name = "heavy armor plate" + desc = "A thick plate of padded material, designed to fit into a plate carrier. Attaches to a plate carrier." + icon = 'icons/obj/clothing/modular_armor.dmi' + icon_state = "armor_medium" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + slot = ACCESSORY_SLOT_ARMOR_C + material_armor_modifier = 1.2 + material_slowdown_modifier = 0 + material_slowdown_multiplier = 1 + +/obj/item/clothing/accessory/material/custom //Not yet craftable, advanced version made with science! + name = "custom armor plate" + desc = "A composite plate of custom machined material, designed to fit into a plate carrier. Attaches to a plate carrier." + icon = 'icons/obj/clothing/modular_armor.dmi' + icon_state = "armor_tactical" + body_parts_covered = UPPER_TORSO|LOWER_TORSO + slot = ACCESSORY_SLOT_ARMOR_C + material_armor_modifier = 1.2 + material_slowdown_modifier = 0.5 + material_slowdown_multiplier = 0.8 + +/obj/item/clothing/accessory/material/makeshift/armguards + name = "arm guards" + desc = "A pair of arm pads reinforced with material. Attaches to a plate carrier." +// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi') + icon = 'icons/obj/clothing/modular_armor.dmi' + icon_override = 'icons/mob/modular_armor.dmi' + icon_state = "armguards_material" + gender = PLURAL + body_parts_covered = ARMS + slot = ACCESSORY_SLOT_ARMOR_A + material_armor_modifier = 0.8 + material_slowdown_modifier = 0.8 + material_slowdown_multiplier = 0.8 + +/obj/item/clothing/accessory/material/makeshift/legguards + name = "leg guards" + desc = "A pair of leg guards reinforced with material. Attaches to a plate carrier." +// accessory_icons = list(slot_tie_str = 'icons/mob/modular_armor.dmi', slot_wear_suit_str = 'icons/mob/modular_armor.dmi') + icon = 'icons/obj/clothing/modular_armor.dmi' + icon_override = 'icons/mob/modular_armor.dmi' + icon_state = "legguards_material" + gender = PLURAL + body_parts_covered = LEGS + slot = ACCESSORY_SLOT_ARMOR_L + material_armor_modifier = 0.8 + material_slowdown_modifier = 0.8 + material_slowdown_multiplier = 0.8 + /obj/item/clothing/suit/armor/material/makeshift/durasteel default_material = "durasteel" @@ -218,6 +286,9 @@ Protectiveness | Armor % thrown_force_divisor = 0.2 var/wired = FALSE +/obj/item/weapon/material/armor_plating/insert + unbreakable = FALSE + /obj/item/weapon/material/armor_plating/attackby(var/obj/O, mob/user) if(istype(O, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/S = O @@ -249,6 +320,54 @@ Protectiveness | Armor % else ..() +//Make plating inserts for modular armour. +/obj/item/weapon/material/armor_plating/insert/attackby(var/obj/O, mob/user) + + . = ..() + + if(istype(O, /obj/item/weapon/weldingtool)) + var /obj/item/weapon/weldingtool/S = O + if(S.remove_fuel(0,user)) + if(!src || !S.isOn()) return + to_chat(user, "You trim down the edges to size.") + user.drop_from_inventory(src) + var/obj/item/clothing/accessory/material/makeshift/light/new_armor = new(null, src.material.name) + user.put_in_hands(new_armor) + qdel(src) + return + + if(istype(O, /obj/item/weapon/material/armor_plating/insert)) + var/obj/item/weapon/material/armor_plating/insert/second_plate = O + if(second_plate.material != src.material) + to_chat(user, "Both plates need to be the same type of material.") + return + to_chat(user, "You bond the two plates together.") + user.drop_from_inventory(src) + user.drop_from_inventory(second_plate) + var/obj/item/clothing/accessory/material/makeshift/heavy/new_armor = new(null, src.material.name) + user.put_in_hands(new_armor) + qdel(second_plate) + qdel(src) + return + + if(istype(O, /obj/item/weapon/tool/wirecutters)) + to_chat(user, "You split the plate down the middle, and joint it at the elbow.") + user.drop_from_inventory(src) + var/obj/item/clothing/accessory/material/makeshift/armguards/new_armor = new(null, src.material.name) + user.put_in_hands(new_armor) + qdel(src) + return + + if(istype(O, /obj/item/stack/material)) + var/obj/item/stack/material/S = O + if(S.material == get_material_by_name("leather")) + if(S.use(2)) + to_chat(user, "You curve the plate inwards, and add a strap for adjustment.") + user.drop_from_inventory(src) + var/obj/item/clothing/accessory/material/makeshift/legguards/new_armor = new(null, src.material.name) + user.put_in_hands(new_armor) + qdel(src) + return // Used to craft the makeshift helmet /obj/item/clothing/head/helmet/bucket diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index d8906955a1..bfa8b61680 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -77,14 +77,14 @@ //visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.") to_chat(user, "You smash the snowball in your hand.") var/atom/S = new /obj/item/stack/material/snow(user.loc) - del(src) + qdel(src) user.put_in_hands(S) else //visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.") to_chat(user, "You start compacting the snowball.") if(do_after(user, 2 SECONDS)) var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc) - del(src) + qdel(src) user.put_in_hands(S) /obj/item/weapon/material/snow/snowball/reinforced diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 1c4ad40773..c45e7125f5 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -177,4 +177,15 @@ default_material = "DEFAULT_WALL_MATERIAL" fragile = 0 sharp = 1 - edge = 0 \ No newline at end of file + edge = 0 + +/obj/item/weapon/material/twohanded/riding_crop + name = "riding crop" + desc = "A rod, a little over a foot long with a widened grip and a thick, leather patch at the end. Used since the dawn of the West to control animals." + force_divisor = 0.05 //Required in order for the X attacks Y message to pop up. + unwielded_force_divisor = 1 // One here, too. + applies_material_colour = 1 + unbreakable = 1 + base_icon = "riding_crop" + icon_state = "riding_crop0" + attack_verb = list("cropped","spanked","swatted","smacked","peppered") diff --git a/code/game/objects/items/weapons/material/twohanded_vr.dm b/code/game/objects/items/weapons/material/twohanded_vr.dm new file mode 100644 index 0000000000..f21738dd80 --- /dev/null +++ b/code/game/objects/items/weapons/material/twohanded_vr.dm @@ -0,0 +1,9 @@ +//1R1S: Malady Blanche +/obj/item/weapon/material/twohanded/riding_crop/malady + name = "Malady's riding crop" + icon = 'icons/vore/custom_items_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/vore/custom_items_left_hand_vr.dmi', + slot_r_hand_str = 'icons/vore/custom_items_right_hand_vr.dmi', + ) + desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked." diff --git a/code/game/objects/items/weapons/shields_vr.dm b/code/game/objects/items/weapons/shields_vr.dm index a9bce1d548..514ecd15c9 100644 --- a/code/game/objects/items/weapons/shields_vr.dm +++ b/code/game/objects/items/weapons/shields_vr.dm @@ -65,7 +65,6 @@ light_applied = 0 update_icon(user) user.update_action_buttons() - light = !light playsound(src, 'sound/weapons/empty.ogg', 15, 1, -3) /obj/item/weapon/shield/riot/explorer/update_icon() @@ -92,4 +91,4 @@ if(on) icon_state = "explorer_shield_P_lighted" else - icon_state = "explorer_shield_P" \ No newline at end of file + icon_state = "explorer_shield_P" diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 5741387b7b..8660d8a673 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/clothing/backpack.dmi' icon_state = "backpack" sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/back.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/back.dmi' ) w_class = ITEMSIZE_LARGE slot_flags = SLOT_BACK diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm index b7485be674..ab83c87752 100644 --- a/code/game/objects/items/weapons/storage/backpack_vr.dm +++ b/code/game/objects/items/weapons/storage/backpack_vr.dm @@ -6,7 +6,7 @@ item_state = "saddlebag" icon_state = "saddlebag" max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags - slowdown = 1 //And are slower, too...Unless you're a macro, that is. + slowdown = 1 //And are slower, too... var/taurtype = /datum/sprite_accessory/tail/taur/horse //Acceptable taur type to be wearing this var/no_message = "You aren't the appropriate taur type to wear this!" @@ -35,7 +35,7 @@ icon_state = "saddlebag" var/icon_base = "saddlebag" max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags - slowdown = 1 //And are slower, too...Unless you're a macro, that is. + slowdown = 1 //And are slower, too... var/no_message = "You aren't the appropriate taur type to wear this!" mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) @@ -44,11 +44,6 @@ log_runtime("[H] was not a valid human!") return - if(H.size_multiplier >= RESIZE_BIG) //Are they a macro? If yes, they get no slowdown. - slowdown = 0 - else - slowdown = initial(slowdown) - var/datum/sprite_accessory/tail/taur/TT = H.tail_style item_state = "[icon_base]_[TT.icon_sprite_tag]" //icon_sprite_tag is something like "deer" return 1 @@ -82,7 +77,7 @@ /obj/item/weapon/storage/backpack sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/back.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/back.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/back.dmi') /obj/item/weapon/storage/backpack/ert diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index cea6a3bf7b..1ca68b8d6b 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -186,6 +186,23 @@ else stored_ore[O.name] = 1 +//CHOMPstation edit START +/obj/item/weapon/storage/bag/ore/large + name = "large mining satchel" + desc = "This little bugger can be used to store and transport ores. Appears to have upgraded storage space, up to three times your normal satchel!" + icon = 'icons/obj/mining_ch.dmi' + icon_state = "satchel_large" + max_storage_space = ITEMSIZE_COST_NORMAL * 75 // triple storage size of original + +/obj/item/weapon/storage/bag/ore/holding + name = "satchel of holding" + desc = "An ore satchel that opens into a localized pocket of bluespace." + icon = 'icons/obj/mining_ch.dmi' + icon_state = "satchel_bspace" + max_storage_space = ITEMSIZE_COST_NORMAL * 250 // ten times storage size of original + +//CHOMPstation edit END + // ----------------------------- // Plant bag // ----------------------------- diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index c3dba166bc..5dc7f83da8 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -11,7 +11,7 @@ equip_sound = 'sound/items/toolbelt_equip.ogg' drop_sound = 'sound/items/drop/toolbelt.ogg' pickup_sound = 'sound/items/pickup/toolbelt.ogg' - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/belt.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/belt.dmi') var/show_above_suit = 0 diff --git a/code/game/objects/items/weapons/storage/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm index e726e30b9c..defdcc296b 100644 --- a/code/game/objects/items/weapons/storage/belt_vr.dm +++ b/code/game/objects/items/weapons/storage/belt_vr.dm @@ -1,6 +1,6 @@ /obj/item/weapon/storage/belt sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/belt.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/belt.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/belt.dmi') /obj/item/weapon/storage/belt/explorer diff --git a/code/game/objects/items/weapons/storage/egg_vr.dm b/code/game/objects/items/weapons/storage/egg_vr.dm new file mode 100644 index 0000000000..f7849040db --- /dev/null +++ b/code/game/objects/items/weapons/storage/egg_vr.dm @@ -0,0 +1,202 @@ +//Item type vorepanel egg release containers. + +/obj/item/weapon/storage/vore_egg + name = "egg" + desc = "It's an egg; it's smooth to the touch." //This is the default egg. + icon = 'icons/obj/egg_new_vr.dmi' + icon_state = "egg" + var/open_egg_icon = 'icons/obj/egg_open_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi', + ) + w_class = 2 + max_w_class = 0 + show_messages = 0 + allow_quick_empty = TRUE + use_sound = 'sound/items/drop/flesh.ogg' + +/obj/item/weapon/storage/vore_egg/open(mob/user as mob) + icon = open_egg_icon + ..() + +/obj/item/weapon/storage/vore_egg/proc/hatch(mob/living/user as mob) + visible_message("\The [src] begins to shake as something pushes out from within!") + animate_shake() + if(do_after(user, 50)) + if(use_sound) + playsound(src, src.use_sound, 50, 0, -5) + animate_shake() + drop_contents() + icon = open_egg_icon + +/obj/item/weapon/storage/vore_egg/proc/animate_shake() + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) + +/obj/item/weapon/storage/vore_egg/unathi + name = "unathi egg" + desc = "Some species of Unathi apparently lay soft-shelled eggs!" + icon_state = "egg_unathi" + +/obj/item/weapon/storage/vore_egg/nevrean + name = "nevrean egg" + desc = "Most Nevreans lay hard-shelled eggs!" + icon_state = "egg_nevrean" + +/obj/item/weapon/storage/vore_egg/human + name = "human egg" + desc = "Some humans lay eggs that are--wait, what?" + icon_state = "egg_human" + +/obj/item/weapon/storage/vore_egg/tajaran + name = "tajaran egg" + desc = "Apparently that's what a Tajaran egg looks like. Weird." + icon_state = "egg_tajaran" + +/obj/item/weapon/storage/vore_egg/skrell + name = "skrell egg" + desc = "Its soft and squishy" + icon_state = "egg_skrell" + +/obj/item/weapon/storage/vore_egg/shark + name = "akula egg" + desc = "Its soft and slimy to the touch" + icon_state = "egg_akula" + +/obj/item/weapon/storage/vore_egg/sergal + name = "sergal egg" + desc = "An egg with a slightly fuzzy exterior, and a hard layer beneath." + icon_state = "egg_sergal" + +/obj/item/weapon/storage/vore_egg/slime + name = "slime egg" + desc = "An egg with a soft and squishy interior, coated with slime." + icon_state = "egg_slime" + +/obj/item/weapon/storage/vore_egg/special //Not actually used, but the sprites are in, and it's there in case any admins need to spawn in the egg for any specific reasons. + name = "special egg" + desc = "This egg has a very unique look to it." + icon_state = "egg_unique" + +/obj/item/weapon/storage/vore_egg/scree + name = "Chimera egg" + desc = "...You don't know what type of creature laid this egg." + icon_state = "egg_scree" + +/obj/item/weapon/storage/vore_egg/xenomorph + name = "Xenomorph egg" + desc = "Some type of pitch black egg. It has a slimy exterior coating." + icon_state = "egg_xenomorph" + +/obj/item/weapon/storage/vore_egg/chocolate + name = "chocolate egg" + desc = "Delicious. May contain a choking hazard." + icon_state = "egg_chocolate" + +/obj/item/weapon/storage/vore_egg/owlpellet + name = "boney egg" + desc = "Can an egg shell be made of bones and hair?" + icon_state = "egg_pellet" + +/obj/item/weapon/storage/vore_egg/slimeglob + name = "glob of slime" + desc = "Very squishy." + icon_state = "egg_slimeglob" + +/obj/item/weapon/storage/vore_egg/chicken + name = "chicken egg" + desc = "Looks like chickens come in all sizes and shapes." + icon_state = "egg_chicken" + +/obj/item/weapon/storage/vore_egg/synthetic + name = "synthetic egg" + desc = "Smells like Easter morning." + icon_state = "egg_synthetic" + +/obj/item/weapon/storage/vore_egg/escapepod + name = "small escape pod" + desc = "Someone left in a hurry." + icon_state = "egg_escapepod" + +/obj/item/weapon/storage/vore_egg/floppy + name = "blue space floppy disc" + desc = "Probably shouldn't copy THIS floppy." + icon_state = "egg_floppy" + +/obj/item/weapon/storage/vore_egg/cd + name = "blue space cd" + desc = "What could even be on this?!" + icon_state = "egg_cd" + +/obj/item/weapon/storage/vore_egg/file + name = "blue space file" + desc = "Gotta wonder how much is compressed in there." + icon_state = "egg_file" + +/obj/item/weapon/storage/vore_egg/badrecipe + name = "Burned mess" + desc = "Someone didn't cook this egg quite right..." + icon_state = "egg_badrecipe" + +/obj/item/weapon/storage/vore_egg/cocoon + name = "web cocoon" + desc = "It straight up smells like spiders in here." + icon_state = "egg_cocoon" + +/obj/item/weapon/storage/vore_egg/honeycomb + name = "honeycomb" + desc = "Smells delicious!" + icon_state = "egg_honeycomb" + +/obj/item/weapon/storage/vore_egg/bugcocoon + name = "bug cocoon" + desc = "Metamorphosis!" + icon_state = "egg_bugcocoon" + +/obj/item/weapon/storage/vore_egg/rock + name = "rock egg" + desc = "It looks like a small boulder." + icon_state = "egg_rock" + +/obj/item/weapon/storage/vore_egg/yellow + name = "yellow egg" + desc = "It is a nice yellow egg." + icon_state = "egg_yellow" + +/obj/item/weapon/storage/vore_egg/blue + name = "blue egg" + desc = "It is a nice blue egg." + icon_state = "egg_blue" + +/obj/item/weapon/storage/vore_egg/green + name = "green egg" + desc = "It is a nice green egg." + icon_state = "egg_green" + +/obj/item/weapon/storage/vore_egg/orange + name = "orange egg" + desc = "It is a nice orange egg." + icon_state = "egg_orange" + +/obj/item/weapon/storage/vore_egg/purple + name = "purple egg" + desc = "It is a nice purple egg." + icon_state = "egg_purple" + +/obj/item/weapon/storage/vore_egg/red + name = "red egg" + desc = "It is a nice red egg." + icon_state = "egg_red" + +/obj/item/weapon/storage/vore_egg/rainbow + name = "rainbow egg" + desc = "It looks so colorful." + icon_state = "egg_rainbow" + +/obj/item/weapon/storage/vore_egg/pinkspots + name = "spotted pink egg" + desc = "It is a cute pink egg with white spots." + icon_state = "egg_pinkspots" diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e1e6ecd23f..1c5e0e7464 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -354,8 +354,16 @@ throwforce = 2 slot_flags = SLOT_BELT storage_slots = 14 - can_hold = list(/obj/item/weapon/rollingpaper) - starts_with = list(/obj/item/weapon/rollingpaper = 14) + can_hold = list(/obj/item/weapon/reagent_containers/rollingpaper) + starts_with = list(/obj/item/weapon/reagent_containers/rollingpaper = 14) + +/obj/item/weapon/storage/rollingpapers/blunt + name = "blunt wrap pack" + desc = "A small cardboard pack containing several folded blunt wraps." + icon_state = "bluntbox" + storage_slots = 7 + can_hold = list(/obj/item/weapon/reagent_containers/rollingpaper/blunt) + starts_with = list(/obj/item/weapon/reagent_containers/rollingpaper/blunt = 7) /* * Vial Box diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 277a083d54..1764b0d8be 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -174,7 +174,7 @@ gauge_icon = "indicator_emergency" /obj/item/weapon/tank/emergency/nitrogen/Initialize() - ..() + . = ..() src.air_contents.adjust_gas("nitrogen", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /obj/item/weapon/tank/emergency/nitrogen/double diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 5f587fccf2..806d26c90b 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -8,7 +8,7 @@ var/list/global/tank_gauge_cache = list() name = "tank" icon = 'icons/obj/tank.dmi' sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/back.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/back.dmi' ) drop_sound = 'sound/items/drop/gascan.ogg' pickup_sound = 'sound/items/pickup/gascan.ogg' @@ -341,6 +341,8 @@ var/list/global/tank_gauge_cache = list() return remove_air(moles_needed) /obj/item/weapon/tank/process() + if(!air_contents) + return //Allow for reactions air_contents.react() //cooking up air tanks - add phoron and oxygen, then heat above PHORON_MINIMUM_BURN_TEMPERATURE if(gauge_icon) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 988f165361..ee9d065ecb 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -671,7 +671,7 @@ always_process = TRUE /obj/item/weapon/weldingtool/electric/mounted/exosuit/Initialize() - ..() + . = ..() if(istype(loc, /obj/item/mecha_parts/mecha_equipment)) equip_mount = loc diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 2b41ce5163..77e1c43960 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -15,11 +15,11 @@ ..() switch(slot) if(slot_head) - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi') if(slot_wear_suit) - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi') if(slot_belt) - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/belt.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/belt.dmi') /obj/item/weapon/towel/attack_self(mob/living/user as mob) user.visible_message(text("[] uses [] to towel themselves off.", user, src)) diff --git a/code/game/objects/items/weapons/weldbackpack_ch.dm b/code/game/objects/items/weapons/weldbackpack_ch.dm new file mode 100644 index 0000000000..0235e8403f --- /dev/null +++ b/code/game/objects/items/weapons/weldbackpack_ch.dm @@ -0,0 +1,4 @@ +/obj/item/weapon/weldpack + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/back.dmi' + ) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 688236eda8..046958a915 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -19,29 +19,11 @@ var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak. var/show_examine = TRUE // Does this pop up on a mob when the mob is examined? - var/register_as_dangerous_object = FALSE // Should this tell its turf that it is dangerous automatically? - -/obj/Initialize() - if(register_as_dangerous_object) - register_dangerous_to_step() - return ..() /obj/Destroy() STOP_PROCESSING(SSobj, src) - if(register_as_dangerous_object) - unregister_dangerous_to_step() return ..() -/obj/Moved(atom/oldloc) - . = ..() - if(register_as_dangerous_object) - var/turf/old_turf = get_turf(oldloc) - var/turf/new_turf = get_turf(src) - - if(old_turf != new_turf) - old_turf.unregister_dangerous_object(src) - new_turf.register_dangerous_object(src) - /obj/Topic(href, href_list, var/datum/tgui_state/state = GLOB.tgui_default_state) if(usr && ..()) return 1 @@ -183,9 +165,6 @@ /obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) return -/obj/proc/get_cell() - return - // Used to mark a turf as containing objects that are dangerous to step onto. /obj/proc/register_dangerous_to_step() var/turf/T = get_turf(src) diff --git a/code/game/objects/random/_random.dm b/code/game/objects/random/_random.dm index 67f82ea155..7b9cc60617 100644 --- a/code/game/objects/random/_random.dm +++ b/code/game/objects/random/_random.dm @@ -8,7 +8,7 @@ // creates a new object and deletes itself /obj/random/Initialize() - . = ..() + ..() if (!prob(spawn_nothing_percentage)) spawn_item() return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 13568c27e6..3881cf031b 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -262,7 +262,7 @@ prob(8);/obj/item/weapon/haircomb, prob(4);/obj/item/weapon/storage/pill_bottle/happy, prob(4);/obj/item/weapon/storage/pill_bottle/zoom, - prob(10);/obj/item/weapon/contraband/poster, + prob(10);/obj/item/weapon/contraband/poster/custom, prob(4);/obj/item/weapon/material/butterfly, prob(6);/obj/item/weapon/material/butterflyblade, prob(6);/obj/item/weapon/material/butterflyhandle, @@ -362,6 +362,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/peppermintschnapps, /obj/item/weapon/reagent_containers/food/drinks/bottle/peachschnapps, /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps, + /obj/item/weapon/reagent_containers/food/drinks/bottle/jager, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/litebeer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, @@ -626,7 +627,12 @@ /obj/item/toy/figure/warden, /obj/item/toy/figure/psychologist, /obj/item/toy/figure/paramedic, - /obj/item/toy/figure/ert) + /obj/item/toy/figure/ert, + //chompstation Add start + /obj/item/toy/figure/station, + /obj/item/toy/sif) + //chompstation Add end + /obj/random/plushie name = "random plushie" diff --git a/code/game/objects/structures/cliff.dm b/code/game/objects/structures/cliff.dm index 66fb945988..ad4b23bdb8 100644 --- a/code/game/objects/structures/cliff.dm +++ b/code/game/objects/structures/cliff.dm @@ -1,236 +1,252 @@ -GLOBAL_LIST_EMPTY(cliff_icon_cache) - -/* -Cliffs give a visual illusion of depth by seperating two places while presenting a 'top' and 'bottom' side. - -Mobs moving into a cliff from the bottom side will simply bump into it and be denied moving into the tile, -where as mobs moving into a cliff from the top side will 'fall' off the cliff, forcing them to the bottom, causing significant damage and stunning them. - -Mobs can climb this while wearing climbing equipment by clickdragging themselves onto a cliff, as if it were a table. - -Flying mobs can pass over all cliffs with no risk of falling. - -Projectiles and thrown objects can pass, however if moving upwards, there is a chance for it to be stopped by the cliff. -This makes fighting something that is on top of a cliff more challenging. - -As a note, dir points upwards, e.g. pointing WEST means the left side is 'up', and the right side is 'down'. - -When mapping these in, be sure to give at least a one tile clearance, as NORTH facing cliffs expand to -two tiles on initialization, and which way a cliff is facing may change during maploading. -*/ - -/obj/structure/cliff - name = "cliff" - desc = "A steep rock ledge. You might be able to climb it if you feel bold enough." - description_info = "Walking off the edge of a cliff while on top will cause you to fall off, causing severe injury.
\ - You can climb this cliff if wearing special climbing equipment, by click-dragging yourself onto the cliff.
\ - Projectiles traveling up a cliff may hit the cliff instead, making it more difficult to fight something \ - on top." - icon = 'icons/obj/flora/rocks.dmi' - - anchored = TRUE - density = TRUE - opacity = FALSE - climbable = TRUE - climb_delay = 10 SECONDS - block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge. - register_as_dangerous_object = TRUE - - var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display. - var/corner = FALSE // Used for icon things. - var/ramp = FALSE // Ditto. - var/bottom = FALSE // Used for 'bottom' typed cliffs, to avoid infinite cliffs, and for icons. - - var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks. - var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff. - -// These arrange their sprites at runtime, as opposed to being statically placed in the map file. -/obj/structure/cliff/automatic - icon_state = "cliffbuilder" - dir = NORTH - -/obj/structure/cliff/automatic/corner - icon_state = "cliffbuilder-corner" - dir = NORTHEAST - corner = TRUE - -// Tiny part that doesn't block, used for making 'ramps'. -/obj/structure/cliff/automatic/ramp - icon_state = "cliffbuilder-ramp" - dir = NORTHEAST - density = FALSE - ramp = TRUE - -// Made automatically as needed by automatic cliffs. -/obj/structure/cliff/bottom - bottom = TRUE - -/obj/structure/cliff/automatic/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -// Paranoid about the maploader, direction is very important to cliffs, since they may get bigger if initialized while facing NORTH. -/obj/structure/cliff/automatic/LateInitialize() - if(dir in GLOB.cardinal) - icon_variant = pick("a", "b", "c") - - if(dir & NORTH && !bottom) // North-facing cliffs require more cliffs to be made. - make_bottom() - - update_icon() - -/obj/structure/cliff/proc/make_bottom() - // First, make sure there's room to put the bottom side. - var/turf/T = locate(x, y - 1, z) - if(!istype(T)) - return FALSE - - // Now make the bottom cliff have mostly the same variables. - var/obj/structure/cliff/bottom/bottom = new(T) - is_double_cliff = TRUE - climb_delay /= 2 // Since there are two cliffs to climb when going north, both take half the time. - - bottom.dir = dir - bottom.is_double_cliff = TRUE - bottom.climb_delay = climb_delay - bottom.icon_variant = icon_variant - bottom.corner = corner - bottom.ramp = ramp - bottom.layer = layer - 0.1 - bottom.density = density - bottom.update_icon() - -/obj/structure/cliff/set_dir(new_dir) - ..() - update_icon() - -/obj/structure/cliff/update_icon() - icon_state = "cliff-[dir][icon_variant][bottom ? "-bottom" : ""][corner ? "-corner" : ""][ramp ? "-ramp" : ""]" - - // Now for making the top-side look like a different turf. - var/turf/T = get_step(src, dir) - if(!istype(T)) - return - - var/subtraction_icon_state = "[icon_state]-subtract" - var/cache_string = "[icon_state]_[T.icon]_[T.icon_state]" - if(T && subtraction_icon_state in cached_icon_states(icon)) - cut_overlays() - // If we've made the same icon before, just recycle it. - if(cache_string in GLOB.cliff_icon_cache) - add_overlay(GLOB.cliff_icon_cache[cache_string]) - - else // Otherwise make a new one, but only once. - var/icon/underlying_ground = icon(T.icon, T.icon_state, T.dir) - var/icon/subtract = icon(icon, subtraction_icon_state) - underlying_ground.Blend(subtract, ICON_SUBTRACT) - var/image/final = image(underlying_ground) - final.layer = src.layer - 0.2 - GLOB.cliff_icon_cache[cache_string] = final - add_overlay(final) - - -// Movement-related code. - -/obj/structure/cliff/CanPass(atom/movable/mover, turf/target) - if(isliving(mover)) - var/mob/living/L = mover - if(L.hovering) // Flying mobs can always pass. - return TRUE - return ..() - - // Projectiles and objects flying 'upward' have a chance to hit the cliff instead, wasting the shot. - else if(istype(mover, /obj)) - var/obj/O = mover - if(check_shield_arc(src, dir, O)) // This is actually for mobs but it will work for our purposes as well. - if(prob(uphill_penalty / (1 + is_double_cliff) )) // Firing upwards facing NORTH means it will likely have to pass through two cliffs, so the chance is halved. - return FALSE - return TRUE - -/obj/structure/cliff/Bumped(atom/A) - if(isliving(A)) - var/mob/living/L = A - if(should_fall(L)) - fall_off_cliff(L) - return - ..() - -/obj/structure/cliff/proc/should_fall(mob/living/L) - if(L.hovering) - return FALSE - - var/turf/T = get_turf(L) - if(T && get_dir(T, loc) & reverse_dir[dir]) // dir points 'up' the cliff, e.g. cliff pointing NORTH will cause someone to fall if moving SOUTH into it. - return TRUE - return FALSE - -/obj/structure/cliff/proc/fall_off_cliff(mob/living/L) - if(!istype(L)) - return FALSE - var/turf/T = get_step(src, reverse_dir[dir]) - var/displaced = FALSE - - if(dir in list(EAST, WEST)) // Apply an offset if flying sideways, to help maintain the illusion of depth. - for(var/i = 1 to 2) - var/turf/new_T = locate(T.x, T.y - i, T.z) - if(!new_T || locate(/obj/structure/cliff) in new_T) - break - T = new_T - displaced = TRUE - - if(istype(T)) - visible_message(span("danger", "\The [L] falls off \the [src]!")) - L.forceMove(T) - - // Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice. - var/harm = !is_double_cliff ? 1 : 0.5 - if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely. - var/obj/vehicle/vehicle = L.buckled - vehicle.adjust_health(40 * harm) - to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it.")) - harm /= 2 - - playsound(L, 'sound/effects/break_stone.ogg', 70, 1) - L.Weaken(5 * harm) - var/fall_time = 3 - if(displaced) // Make the fall look more natural when falling sideways. - L.pixel_z = 32 * 2 - animate(L, pixel_z = 0, time = fall_time) - sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect. - playsound(L, "punch", 70, 1) - shake_camera(L, 1, 1) - visible_message(span("danger", "\The [L] hits the ground!")) - - // The bigger they are, the harder they fall. - // They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health. - // This scaling is capped at 100 total damage, which occurs if the thing that fell has more than 250 health. - var/damage = between(20, L.getMaxHealth() * 0.4, 100) - var/target_zone = ran_zone() - var/blocked = L.run_armor_check(target_zone, "melee") * harm - var/soaked = L.get_armor_soak(target_zone, "melee") * harm - - L.apply_damage(damage * harm, BRUTE, target_zone, blocked, soaked, used_weapon=src) - - // Now fall off more cliffs below this one if they exist. - var/obj/structure/cliff/bottom_cliff = locate() in T - if(bottom_cliff) - visible_message(span("danger", "\The [L] rolls down towards \the [bottom_cliff]!")) - sleep(5) - bottom_cliff.fall_off_cliff(L) - -/obj/structure/cliff/can_climb(mob/living/user, post_climb_check = FALSE) - // Cliff climbing requires climbing gear. - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/obj/item/clothing/shoes/shoes = H.shoes - if(shoes && shoes.rock_climbing) - return ..() // Do the other checks too. - - to_chat(user, span("warning", "\The [src] is too steep to climb unassisted.")) - return FALSE - -// This tells AI mobs to not be dumb and step off cliffs willingly. -/obj/structure/cliff/is_safe_to_step(mob/living/L) - if(should_fall(L)) - return FALSE - return ..() +GLOBAL_LIST_EMPTY(cliff_icon_cache) + +/* +Cliffs give a visual illusion of depth by seperating two places while presenting a 'top' and 'bottom' side. + +Mobs moving into a cliff from the bottom side will simply bump into it and be denied moving into the tile, +where as mobs moving into a cliff from the top side will 'fall' off the cliff, forcing them to the bottom, causing significant damage and stunning them. + +Mobs can climb this while wearing climbing equipment by clickdragging themselves onto a cliff, as if it were a table. + +Flying mobs can pass over all cliffs with no risk of falling. + +Projectiles and thrown objects can pass, however if moving upwards, there is a chance for it to be stopped by the cliff. +This makes fighting something that is on top of a cliff more challenging. + +As a note, dir points upwards, e.g. pointing WEST means the left side is 'up', and the right side is 'down'. + +When mapping these in, be sure to give at least a one tile clearance, as NORTH facing cliffs expand to +two tiles on initialization, and which way a cliff is facing may change during maploading. +*/ + +/obj/structure/cliff + name = "cliff" + desc = "A steep rock ledge. You might be able to climb it if you feel bold enough." + description_info = "Walking off the edge of a cliff while on top will cause you to fall off, causing severe injury.
\ + You can climb this cliff if wearing special climbing equipment, by click-dragging yourself onto the cliff.
\ + Projectiles traveling up a cliff may hit the cliff instead, making it more difficult to fight something \ + on top." + icon = 'icons/obj/flora/rocks.dmi' + + anchored = TRUE + density = TRUE + opacity = FALSE + climbable = TRUE + climb_delay = 10 SECONDS + block_turf_edges = TRUE // Don't want turf edges popping up from the cliff edge. + + var/icon_variant = null // Used to make cliffs less repeative by having a selection of sprites to display. + var/corner = FALSE // Used for icon things. + var/ramp = FALSE // Ditto. + var/bottom = FALSE // Used for 'bottom' typed cliffs, to avoid infinite cliffs, and for icons. + + var/is_double_cliff = FALSE // Set to true when making the two-tile cliffs, used for projectile checks. + var/uphill_penalty = 30 // Odds of a projectile not making it up the cliff. + +/obj/structure/cliff/Initialize() + . = ..() + register_dangerous_to_step() + +/obj/structure/cliff/Destroy() + unregister_dangerous_to_step() + . = ..() + +/obj/structure/cliff/Moved(atom/oldloc) + . = ..() + if(.) + var/turf/old_turf = get_turf(oldloc) + var/turf/new_turf = get_turf(src) + if(old_turf != new_turf) + old_turf.unregister_dangerous_object(src) + new_turf.register_dangerous_object(src) + +// These arrange their sprites at runtime, as opposed to being statically placed in the map file. +/obj/structure/cliff/automatic + icon_state = "cliffbuilder" + dir = NORTH + +/obj/structure/cliff/automatic/corner + icon_state = "cliffbuilder-corner" + dir = NORTHEAST + corner = TRUE + +// Tiny part that doesn't block, used for making 'ramps'. +/obj/structure/cliff/automatic/ramp + icon_state = "cliffbuilder-ramp" + dir = NORTHEAST + density = FALSE + ramp = TRUE + +// Made automatically as needed by automatic cliffs. +/obj/structure/cliff/bottom + bottom = TRUE + +/obj/structure/cliff/automatic/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +// Paranoid about the maploader, direction is very important to cliffs, since they may get bigger if initialized while facing NORTH. +/obj/structure/cliff/automatic/LateInitialize() + if(dir in GLOB.cardinal) + icon_variant = pick("a", "b", "c") + + if(dir & NORTH && !bottom) // North-facing cliffs require more cliffs to be made. + make_bottom() + + update_icon() + +/obj/structure/cliff/proc/make_bottom() + // First, make sure there's room to put the bottom side. + var/turf/T = locate(x, y - 1, z) + if(!istype(T)) + return FALSE + + // Now make the bottom cliff have mostly the same variables. + var/obj/structure/cliff/bottom/bottom = new(T) + is_double_cliff = TRUE + climb_delay /= 2 // Since there are two cliffs to climb when going north, both take half the time. + + bottom.dir = dir + bottom.is_double_cliff = TRUE + bottom.climb_delay = climb_delay + bottom.icon_variant = icon_variant + bottom.corner = corner + bottom.ramp = ramp + bottom.layer = layer - 0.1 + bottom.density = density + bottom.update_icon() + +/obj/structure/cliff/set_dir(new_dir) + ..() + update_icon() + +/obj/structure/cliff/update_icon() + icon_state = "cliff-[dir][icon_variant][bottom ? "-bottom" : ""][corner ? "-corner" : ""][ramp ? "-ramp" : ""]" + + // Now for making the top-side look like a different turf. + var/turf/T = get_step(src, dir) + if(!istype(T)) + return + + var/subtraction_icon_state = "[icon_state]-subtract" + var/cache_string = "[icon_state]_[T.icon]_[T.icon_state]" + if(T && subtraction_icon_state in cached_icon_states(icon)) + cut_overlays() + // If we've made the same icon before, just recycle it. + if(cache_string in GLOB.cliff_icon_cache) + add_overlay(GLOB.cliff_icon_cache[cache_string]) + + else // Otherwise make a new one, but only once. + var/icon/underlying_ground = icon(T.icon, T.icon_state, T.dir) + var/icon/subtract = icon(icon, subtraction_icon_state) + underlying_ground.Blend(subtract, ICON_SUBTRACT) + var/image/final = image(underlying_ground) + final.layer = src.layer - 0.2 + GLOB.cliff_icon_cache[cache_string] = final + add_overlay(final) + + +// Movement-related code. + +/obj/structure/cliff/CanPass(atom/movable/mover, turf/target) + if(isliving(mover)) + var/mob/living/L = mover + if(L.hovering) // Flying mobs can always pass. + return TRUE + return ..() + + // Projectiles and objects flying 'upward' have a chance to hit the cliff instead, wasting the shot. + else if(istype(mover, /obj)) + var/obj/O = mover + if(check_shield_arc(src, dir, O)) // This is actually for mobs but it will work for our purposes as well. + if(prob(uphill_penalty / (1 + is_double_cliff) )) // Firing upwards facing NORTH means it will likely have to pass through two cliffs, so the chance is halved. + return FALSE + return TRUE + +/obj/structure/cliff/Bumped(atom/A) + if(isliving(A)) + var/mob/living/L = A + if(should_fall(L)) + fall_off_cliff(L) + return + ..() + +/obj/structure/cliff/proc/should_fall(mob/living/L) + if(L.hovering) + return FALSE + + var/turf/T = get_turf(L) + if(T && get_dir(T, loc) & reverse_dir[dir]) // dir points 'up' the cliff, e.g. cliff pointing NORTH will cause someone to fall if moving SOUTH into it. + return TRUE + return FALSE + +/obj/structure/cliff/proc/fall_off_cliff(mob/living/L) + if(!istype(L)) + return FALSE + var/turf/T = get_step(src, reverse_dir[dir]) + var/displaced = FALSE + + if(dir in list(EAST, WEST)) // Apply an offset if flying sideways, to help maintain the illusion of depth. + for(var/i = 1 to 2) + var/turf/new_T = locate(T.x, T.y - i, T.z) + if(!new_T || locate(/obj/structure/cliff) in new_T) + break + T = new_T + displaced = TRUE + + if(istype(T)) + visible_message(span("danger", "\The [L] falls off \the [src]!")) + L.forceMove(T) + + // Do the actual hurting. Double cliffs do halved damage due to them most likely hitting twice. + var/harm = !is_double_cliff ? 1 : 0.5 + if(istype(L.buckled, /obj/vehicle)) // People falling off in vehicles will take less damage, but will damage the vehicle severely. + var/obj/vehicle/vehicle = L.buckled + vehicle.adjust_health(40 * harm) + to_chat(L, span("warning", "\The [vehicle] absorbs some of the impact, damaging it.")) + harm /= 2 + + playsound(L, 'sound/effects/break_stone.ogg', 70, 1) + L.Weaken(5 * harm) + var/fall_time = 3 + if(displaced) // Make the fall look more natural when falling sideways. + L.pixel_z = 32 * 2 + animate(L, pixel_z = 0, time = fall_time) + sleep(fall_time) // A brief delay inbetween the two sounds helps sell the 'ouch' effect. + playsound(L, "punch", 70, 1) + shake_camera(L, 1, 1) + visible_message(span("danger", "\The [L] hits the ground!")) + + // The bigger they are, the harder they fall. + // They will take at least 20 damage at the minimum, and tries to scale up to 40% of their max health. + // This scaling is capped at 100 total damage, which occurs if the thing that fell has more than 250 health. + var/damage = between(20, L.getMaxHealth() * 0.4, 100) + var/target_zone = ran_zone() + var/blocked = L.run_armor_check(target_zone, "melee") * harm + var/soaked = L.get_armor_soak(target_zone, "melee") * harm + + L.apply_damage(damage * harm, BRUTE, target_zone, blocked, soaked, used_weapon=src) + + // Now fall off more cliffs below this one if they exist. + var/obj/structure/cliff/bottom_cliff = locate() in T + if(bottom_cliff) + visible_message(span("danger", "\The [L] rolls down towards \the [bottom_cliff]!")) + sleep(5) + bottom_cliff.fall_off_cliff(L) + +/obj/structure/cliff/can_climb(mob/living/user, post_climb_check = FALSE) + // Cliff climbing requires climbing gear. + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/clothing/shoes/shoes = H.shoes + if(shoes && shoes.rock_climbing) + return ..() // Do the other checks too. + + to_chat(user, span("warning", "\The [src] is too steep to climb unassisted.")) + return FALSE + +// This tells AI mobs to not be dumb and step off cliffs willingly. +/obj/structure/cliff/is_safe_to_step(mob/living/L) + if(should_fall(L)) + return FALSE + return ..() diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm index 2706e11bd3..64c865604e 100644 --- a/code/game/objects/structures/crates_lockers/__closets.dm +++ b/code/game/objects/structures/crates_lockers/__closets.dm @@ -37,7 +37,6 @@ /obj/structure/closet/Initialize() ..() - // Closets need to come later because of spawners potentially creating objects during init. return INITIALIZE_HINT_LATELOAD /obj/structure/closet/LateInitialize() @@ -47,7 +46,7 @@ starts_with = null if(!opened) // if closed, any item at the crate's loc is put in the contents - if(istype(loc, /mob/living)) return //VOREStation Edit - No collecting mob organs if spawned inside mob + if(istype(loc, /mob/living)) return var/obj/item/I for(I in loc) if(I.density || I.anchored || I == src) continue @@ -260,7 +259,20 @@ return /obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(opened) + if(W.is_wrench()) + if(opened) + if(anchored) + user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") + else + user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") + if(do_after(user, 20 * W.toolspeed)) + if(!src) return + to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") + anchored = !anchored + return + else + to_chat(user, "You can't reach the anchoring bolts when the door is closed!") + else if(opened) if(istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W MouseDrop_T(G.affecting, user) //act like they were dragged onto the closet @@ -316,17 +328,6 @@ update_icon() for(var/mob/M in viewers(src)) M.show_message("[src] has been [sealed?"sealed":"unsealed"] by [user.name].", 3) - else if(W.is_wrench()) - if(sealed) - if(anchored) - user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") - else - user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") - playsound(src, W.usesound, 50) - if(do_after(user, 20 * W.toolspeed)) - if(!src) return - to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") - anchored = !anchored else attack_hand(user) return diff --git a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm index ba0809f638..dabc8fd88b 100644 --- a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm @@ -36,11 +36,11 @@ icon_opened = "egg_unathi_open" /obj/structure/closet/secure_closet/egg/nevrean - name = "nevarean egg" - desc = "Most Nevareans lay hard-shelled eggs!" - icon_state = "egg_nevarean" - icon_closed = "egg_nevarean" - icon_opened = "egg_nevarean_open" + name = "nevrean egg" + desc = "Most Nevreans lay hard-shelled eggs!" + icon_state = "egg_nevrean" + icon_closed = "egg_nevrean" + icon_opened = "egg_nevrean_open" /obj/structure/closet/secure_closet/egg/human name = "human egg" diff --git a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm index c76771d8ce..73f69ba4a5 100644 --- a/code/game/objects/structures/crates_lockers/closets/misc_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/misc_vr.dm @@ -133,7 +133,6 @@ /obj/item/clothing/gloves/fingerless, /obj/item/device/radio/headset/pilot, /obj/item/device/radio/headset/pilot/alt, - /obj/item/weapon/cartridge/explorer, /obj/item/device/flashlight, /obj/item/weapon/reagent_containers/food/snacks/liquidfood, /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index e5fc47c64a..9fae830b44 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -54,7 +54,20 @@ to_chat(user, "Access Denied") /obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(opened) + if(W.is_wrench()) + if(opened) + if(anchored) + user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") + else + user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") + if(do_after(user, 20 * W.toolspeed)) + if(!src) return + to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") + anchored = !anchored + return + else + to_chat(user, "You can't reach the anchoring bolts when the door is closed!") + else if(opened) if(istype(W, /obj/item/weapon/storage/laundry_basket)) return ..(W,user) if(istype(W, /obj/item/weapon/grab)) @@ -77,17 +90,6 @@ spark_system.start() playsound(src, 'sound/weapons/blade1.ogg', 50, 1) playsound(src, "sparks", 50, 1) - else if(W.is_wrench()) - if(sealed) - if(anchored) - user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") - else - user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") - if(do_after(user, 20 * W.toolspeed)) - if(!src) return - to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") - anchored = !anchored - return else if(istype(W,/obj/item/weapon/packageWrap) || istype(W,/obj/item/weapon/weldingtool)) return ..(W,user) else diff --git a/code/game/objects/structures/dancepole_vr.dm b/code/game/objects/structures/dancepole_vr.dm new file mode 100644 index 0000000000..0c9397142d --- /dev/null +++ b/code/game/objects/structures/dancepole_vr.dm @@ -0,0 +1,25 @@ +//Dance pole +/obj/structure/dancepole + name = "dance pole" + desc = "Engineered for your entertainment" + icon = 'icons/obj/objects_vr.dmi' + icon_state = "dancepole" + density = 0 + anchored = 1 + +/obj/structure/dancepole/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(O.is_screwdriver()) + anchored = !anchored + playsound(src, O.usesound, 50, 1) + if(anchored) + to_chat(user, "You secure \the [src].") + else + to_chat(user, "You unsecure \the [src].") + if(O.is_wrench()) + playsound(src, O.usesound, 50, 1) + to_chat(user, "Now disassembling \the [src]...") + if(do_after(user, 30 * O.toolspeed)) + if(!src) return + to_chat(user, "You dissasembled \the [src]!") + new /obj/item/stack/material/steel(src.loc, 1) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index bccdcf56c3..f584fd8838 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -14,7 +14,7 @@ var/smashed = 0 /obj/structure/fireaxecabinet/Initialize() - ..() + . = ..() fireaxe = new /obj/item/weapon/material/twohanded/fireaxe() /obj/structure/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri diff --git a/code/game/objects/structures/flora/flora.dm b/code/game/objects/structures/flora/flora.dm index cc5c5b510f..e97c7b84bb 100644 --- a/code/game/objects/structures/flora/flora.dm +++ b/code/game/objects/structures/flora/flora.dm @@ -22,7 +22,7 @@ var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree. /obj/structure/flora/Initialize() - ..() + . = ..() if(randomize_size) icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100 diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index c724b9bd80..469f27f27e 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -21,6 +21,7 @@ "Jelly Blob" = /mob/living/simple_mob/animal/space/jelly, "Wolf" = /mob/living/simple_mob/animal/wolf, "Sect Queen" = /mob/living/simple_mob/vore/sect_queen, + "Sect Drone" = /mob/living/simple_mob/vore/sect_drone, "Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged, ) @@ -37,7 +38,7 @@ break if(choice) - finalized = alert(M, "Are you sure you want to play as [choice]?","Confirmation","No","Yes") + finalized = alert(M, "Are you sure you want to play as [choice]? By clicking yes you should expect to be treated as vore predator and possibly killed. Do not attack other players. You will have minimal OOC pref protections.","Confirmation","No","Yes") if(randomize) choice = pick(possible_mobs) @@ -98,4 +99,4 @@ qdel(src) /obj/structure/ghost_pod/ghost_activated/morphspawn/no_announce - announce_prob = 0 \ No newline at end of file + announce_prob = 0 diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index 386d493d2d..7649c8573f 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -28,7 +28,7 @@ icon_state = icon_state_opened if(needscharger) new /obj/machinery/recharge_station/ghost_pod_recharger(src.loc) - del(src) + qdel(src) return TRUE else return FALSE diff --git a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm index 2d8f8198c5..08cb7c78ba 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm @@ -45,5 +45,5 @@ trigger() /obj/structure/ghost_pod/ghost_activated/Initialize() - ..() + . = ..() ghostpod_startup(spawn_active) \ No newline at end of file diff --git a/code/game/objects/structures/ghost_pods/human.dm b/code/game/objects/structures/ghost_pods/human.dm index 814db9cd75..f2b3291597 100644 --- a/code/game/objects/structures/ghost_pods/human.dm +++ b/code/game/objects/structures/ghost_pods/human.dm @@ -25,7 +25,7 @@ var/list/clothing_possibilities /obj/structure/ghost_pod/ghost_activated/human/Initialize() - ..() + . = ..() handle_clothing_setup() @@ -153,7 +153,7 @@ var/list/clothing_possibilities /obj/structure/ghost_pod/manual/human/Initialize() - ..() + . = ..() handle_clothing_setup() diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm index 32a26ce479..74f53e9204 100644 --- a/code/game/objects/structures/ghost_pods/silicon.dm +++ b/code/game/objects/structures/ghost_pods/silicon.dm @@ -89,7 +89,7 @@ qdel(src) /obj/structure/ghost_pod/ghost_activated/swarm_drone/event/Initialize() - ..() + . = ..() var/turf/T = get_turf(src) say_dead_object("A [drone_class] swarm drone shell is now available in \the [T.loc].", src) diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 57c9832fde..01069b8e23 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -254,8 +254,8 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/stack/material/steel{amount = 5}, /obj/item/stack/material/cardboard{amount = 5}, /obj/item/weapon/contraband/poster, + /obj/item/weapon/contraband/poster/custom, /obj/item/weapon/material/wirerod, - /obj/item/weapon/contraband/poster, /obj/item/weapon/newspaper, /obj/item/weapon/paper/crumpled, /obj/item/weapon/paper/crumpled/bloody @@ -376,6 +376,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/weapon/tool/wrench, /obj/item/weapon/tool/screwdriver, /obj/item/weapon/tool/wirecutters, + /obj/item/weapon/mining_scanner/advanced, /obj/item/device/multitool, /obj/item/mecha_parts/mecha_equipment/generator, /obj/item/mecha_parts/mecha_equipment/tool/cable_layer, diff --git a/code/game/objects/structures/props/nest.dm b/code/game/objects/structures/props/nest.dm index 4cb515fc36..ba16b0b055 100644 --- a/code/game/objects/structures/props/nest.dm +++ b/code/game/objects/structures/props/nest.dm @@ -20,7 +20,7 @@ var/total_creature_max //If set, it can spawn this many creatures, total, ever. /obj/structure/prop/nest/Initialize() - ..() + . = ..() den_mobs = list() START_PROCESSING(SSobj, src) last_spawn = world.time diff --git a/code/game/objects/structures/props/swarm.dm b/code/game/objects/structures/props/swarm.dm index 128254a456..51f59072f4 100644 --- a/code/game/objects/structures/props/swarm.dm +++ b/code/game/objects/structures/props/swarm.dm @@ -23,7 +23,7 @@ return ..() /obj/structure/cult/pylon/swarm/Initialize() - ..() + . = ..() active_beams = list() /obj/structure/cult/pylon/swarm/Destroy() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index f93ceaf0a1..78384b0285 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -321,73 +321,344 @@ desc = "A warning sign which reads XENOBIOLOGY." icon_state = "xenobio3" +//direction signs presented by the order they appear in the dmi /obj/structure/sign/directions name = "direction sign" - desc = "A direction sign, claiming to know the way." + desc = "A direction sign, claiming to know the way to... somewhere?" icon_state = "direction" + icon = 'icons/obj/decals_directions.dmi' + //TODO: set up overlay systems, inc. interactions (e.g. vines clear w/ plantbgone or fire, snow can be brushed off or melted, and so on) +//disabled this proc, it serves no purpose except to overwrite the description that already exists. may have been intended for making your own signs? +//seems to defeat the point of having a generic directional sign that mappers could edit and use in POIs? left it here in case something breaks. +/* /obj/structure/sign/directions/New() ..() - desc = "A direction sign, pointing out which way \the [src] is." - -/obj/structure/sign/directions/science - name = "\improper Science department" - desc = "A direction sign, pointing out which way the Science department is." - icon_state = "direction_sci" + desc = "A direction sign, pointing out the way to \the [src]." +*/ +//engineering signs /obj/structure/sign/directions/engineering - name = "\improper Engineering department" - desc = "A direction sign, pointing out which way the Engineering department is." + name = "\improper Engineering Department" + desc = "A direction sign, pointing out the way to the Engineering Department." icon_state = "direction_eng" +/obj/structure/sign/directions/engineering/reactor + name = "\improper Reactor" + desc = "A direction sign, pointing out the way to the Reactor." + icon_state = "direction_core" + +/obj/structure/sign/directions/engineering/solars + name = "\improper Solar Array" + desc = "A direction sign, pointing out the way to the nearest Solar Array." + icon_state = "direction_solar" + +/obj/structure/sign/directions/engineering/atmospherics + name = "\improper Atmospherics Department" + desc = "A direction sign, pointing out the way to the Atmospherics Department." + icon_state = "direction_atmos" + +/obj/structure/sign/directions/engineering/gravgen + name = "\improper Gravity Generator" + desc = "A direction sign, pointing out the way to the Artificial Gravity Generator." + icon_state = "direction_grav" + +/obj/structure/sign/directions/engineering/engeqp + name = "\improper Engineering Equipment Storage" + desc = "A direction sign, pointing out the way to Engineering Equipment Storage." + icon_state = "direction_engeqp" + +//security signs /obj/structure/sign/directions/security - name = "\improper Security department" - desc = "A direction sign, pointing out which way the Security department is." + name = "\improper Security Department" + desc = "A direction sign, pointing out the way to the Security Department." icon_state = "direction_sec" +/obj/structure/sign/directions/security/armory + name = "\improper Armory" + desc = "A direction sign, pointing out the way to the Armory." + icon_state = "direction_armory" + +/obj/structure/sign/directions/security/brig + name = "\improper Brig" + desc = "A direction sign, pointing out the way to the Brig." + icon_state = "direction_brig" + +/obj/structure/sign/directions/security/seceqp + name = "\improper Security Equipment Storage" + desc = "A direction sign, pointing out the way to Security Equipment Storage." + icon_state = "direction_seceqp" + +/obj/structure/sign/directions/security/internal_affairs + name = "\improper Internal Affairs Office" + desc = "A direction sign, pointing out the way to the Internal Affairs Office." + icon_state = "direction_intaff" + +/obj/structure/sign/directions/security/forensics + name = "\improper Forensics Lab" + desc = "A direction sign, pointing out the way to the Forensics Lab." + icon_state = "direction_forensics" + +/obj/structure/sign/directions/security/forensics/alt + icon_state = "direction_lab" + +/obj/structure/sign/directions/security/interrogation + name = "\improper Interrogations" + desc = "A direction sign, pointing out the way to Interrogations." + icon_state = "direction_interrogation" + +//science signs +/obj/structure/sign/directions/science + name = "\improper Science Department" + desc = "A direction sign, pointing out the way to the Science Department." + icon_state = "direction_sci" + +/obj/structure/sign/directions/science/rnd + name = "\improper Research & Development" + desc = "A direction sign, pointing out the way to Research & Development." + icon_state = "direction_rnd" + +/obj/structure/sign/directions/science/toxins + name = "\improper Toxins Lab" + desc = "A direction sign, pointing out the way to the Toxins Lab." + icon_state = "direction_sci" + +/obj/structure/sign/directions/science/robotics + name = "\improper Robotics Workshop" + desc = "A direction sign, pointing out the way to the Robotics Workshop." + icon_state = "direction_robotics" + +/obj/structure/sign/directions/science/xenoarch + name = "\improper Xenoarchaeology Lab" + desc = "A direction sign, pointing out the way to the Xenoarchaeology Lab." + icon_state = "direction_xenoarch" + +/obj/structure/sign/directions/science/xenobiology + name = "\improper Xenobiology Lab" + desc = "A direction sign, pointing out the way to the Xenobiology Lab." + icon_state = "direction_xbio" + +/obj/structure/sign/directions/science/xenoflora + name = "\improper Xenoflora Lab" + desc = "A direction sign, pointing out the way to the Xenoflora Lab." + icon_state = "direction_xflora" + +/obj/structure/sign/directions/science/exploration + name = "\improper Exploration Department" + desc = "A direction sign, pointing out the way to the Exploration Department." + icon_state = "direction_explo" + +//medical signs /obj/structure/sign/directions/medical name = "\improper Medical Bay" - desc = "A direction sign, pointing out which way the Medical Bay is." + desc = "A direction sign, pointing out the way to the Medical Bay." icon_state = "direction_med" +/obj/structure/sign/directions/medical/chemlab + name = "\improper Chemistry Lab" + desc = "A direction sign, pointing out the way to the Chemistry Lab." + icon_state = "direction_med" + +/obj/structure/sign/directions/medical/surgery + name = "\improper Surgery" + desc = "A direction sign, pointing out the way to Surgery." + icon_state = "direction_surgery" + +/obj/structure/sign/directions/medical/operating_1 + name = "\improper Operating Theatre 1" + desc = "A direction sign, pointing out the way to Operating Theatre 1." + icon_state = "direction_op1" + +/obj/structure/sign/directions/medical/operating_2 + name = "\improper Operating Theatre 2" + desc = "A direction sign, pointing out the way to Operating Theatre 2." + icon_state = "direction_op2" + +/obj/structure/sign/directions/medical/virology + name = "\improper Virology" + desc = "A direction sign, pointing out the way to the Virology Lab." + icon_state = "direction_viro" + +/obj/structure/sign/directions/medical/medeqp + name = "\improper Medical Equipment Storage" + desc = "A direction sign, pointing out the way to Medical Equipment Storage." + icon_state = "direction_medeqp" + +/obj/structure/sign/directions/medical/morgue + name = "\improper Morgue" + desc = "A direction sign, pointing out the way to the Morgue." + icon_state = "direction_morgue" + +/obj/structure/sign/directions/medical/cloning + name = "\improper Cloning Lab" + desc = "A direction sign, pointing out the way to the Cloning Lab." + icon_state = "direction_cloning" + +/obj/structure/sign/directions/medical/resleeving + name = "\improper Resleeving Lab" + desc = "A direction sign, pointing out the way to the Resleeving Lab." + icon_state = "direction_resleeve" + +//special signs /obj/structure/sign/directions/evac name = "\improper Evacuation" - desc = "A direction sign, pointing out which way the Escape Shuttle dock is." + desc = "A direction sign, pointing out the way to the Escape Shuttle Dock." icon_state = "direction_evac" +/obj/structure/sign/directions/eva + name = "\improper Extra-Vehicular Activity" + desc = "A direction sign, pointing out the way to the EVA Bay." + icon_state = "direction_eva" + +//command signs +/obj/structure/sign/directions/ai_core + name = "\improper AI Core" + desc = "A direction sign, pointing out the way to the AI Core." + icon_state = "direction_ai_core" + /obj/structure/sign/directions/bridge name = "\improper Bridge" + desc = "A direction sign, pointing out the way to the Bridge." icon_state = "direction_bridge" +/obj/structure/sign/directions/command + name = "\improper Command" + desc = "A direction sign, pointing out the way to the Command Center." + icon_state = "direction_command" + +/obj/structure/sign/directions/teleporter + name = "\improper Teleporter" + desc = "A direction sign, pointing out the way to the Teleporter." + icon_state = "direction_teleport" + +/obj/structure/sign/directions/telecomms + name = "\improper Telecommunications Hub" + desc = "A direction sign, pointing out the way to the Telecommunications Hub." + icon_state = "direction_tcomms" + +//cargonia signs /obj/structure/sign/directions/cargo - name = "\improper Cargo department" - desc = "A direction sign, pointing out which way the Cargo department is." + name = "\improper Cargo Department" + desc = "A direction sign, pointing out the way to the Cargo Department." icon_state = "direction_crg" -// VOREStation Edit - New signs for us -/obj/structure/sign/directions/command - icon = 'icons/obj/decals_vr.dmi' - name = "\improper Command department" - desc = "A direction sign, pointing out which way the Command department is." - icon_state = "direction_cmd" +/obj/structure/sign/directions/cargo/mining + name = "\improper Mining Department" + desc = "A direction sign, pointing out the way to the Mining Department." + icon_state = "direction_mining" -/obj/structure/sign/directions/elevator - icon = 'icons/obj/decals_vr.dmi' - name = "\improper Space Elevator" - desc = "A direction sign, pointing out which way the Space Elevator is." - icon_state = "direction_elv" -// VOREStation Edit End - -/obj/structure/sign/directions/cryo - name = "\improper Cryogenic Storage" - desc = "A direction sign, pointing out which way cryogenic storage is." - icon_state = "direction_cry" +/obj/structure/sign/directions/cargo/refinery + name = "\improper Refinery" + desc = "A direction sign, pointing out the way to the Refinery." + icon_state = "direction_refinery" +//civilian/misc signs /obj/structure/sign/directions/roomnum name = "room number" desc = "A sign detailing the number of the room beside it." icon_state = "roomnum" +/obj/structure/sign/directions/cryo + name = "\improper Cryogenic Storage" + desc = "A direction sign, pointing out the way to Cryogenic Storage." + icon_state = "direction_cry" + +/obj/structure/sign/directions/elevator + name = "\improper Elevator" + desc = "A direction sign, pointing out the way to the nearest elevator." + icon_state = "direction_elv" + +/obj/structure/sign/directions/bar + name = "\improper Bar" + desc = "A direction sign, pointing out the way to the nearest watering hole." + icon_state = "direction_bar" + +/obj/structure/sign/directions/kitchen + name = "\improper Kitchen" + desc = "A pictographic direction sign with a knife, plate, and fork, pointing out the way to the nearest dining establishment." + icon_state = "direction_kitchen" + +/obj/structure/sign/directions/tram + name = "\improper Public Transit Station" + desc = "A direction sign, pointing out the way to the nearest public transit station." + icon_state = "direction_tram" + +/obj/structure/sign/directions/janitor + name = "\improper Custodial Closet" + desc = "A direction sign, pointing out the way to the Custodial Closet." + icon_state = "direction_janitor" + +/obj/structure/sign/directions/chapel + name = "\improper Chapel" + desc = "A direction sign, pointing out the way to the Chapel." + icon_state = "direction_chapel" + +/obj/structure/sign/directions/dorms + name = "\improper Dormitories" + desc = "A direction sign, pointing out the way to the Dormitories." + icon_state = "direction_dorms" + +/obj/structure/sign/directions/library + name = "\improper Library" + desc = "A direction sign, pointing out the way to the Library." + icon_state = "direction_library" + +/obj/structure/sign/directions/dock + name = "\improper Dock" + desc = "A direction sign, pointing out the way to the nearest docking area." + icon_state = "direction_dock" + +/obj/structure/sign/directions/gym + name = "\improper Gym" + desc = "A direction sign, pointing out the way to the Gym." + icon_state = "direction_gym" + +/obj/structure/sign/directions/pool + name = "\improper Pool" + desc = "A direction sign, pointing out the way to the Pool." + icon_state = "direction_pool" + +/obj/structure/sign/directions/recreation + name = "\improper Recreation Area" + desc = "A direction sign, pointing out the way to the nearest Recreation Area." + icon_state = "direction_recreation" + +/obj/structure/sign/directions/stairwell + name = "\improper Stairwell" + desc = "A direction sign with stairs and a door, pointing out the way to the nearest stairwell." + icon_state = "stairwell" + +/obj/structure/sign/directions/stairs_up + name = "\improper Stairs Up" + desc = "A direction sign with stairs and an upward-slanted arrow, pointing out the way to the nearest set of stairs that go up." + icon_state = "stairs_up" + +/obj/structure/sign/directions/stairs_down + name = "\improper Stairs Down" + desc = "A direction sign with stairs and a downward-slanted arrow, pointing out the way to the nearest set of stairs that go down." + icon_state = "stairs_down" + +/obj/structure/sign/directions/ladderwell + name = "\improper Access Shaft" + desc = "A direction sign with a ladder and a door, pointing out the way to the nearest access shaft." + icon_state = "ladderwell" + +/obj/structure/sign/directions/ladder_up + name = "\improper Ladder Up" + desc = "A direction sign with a ladder and an upward arrow, pointing out the way to the nearest ladder that goes up." + icon_state = "ladder_up" + +/obj/structure/sign/directions/ladder_down + name = "\improper Ladder Down" + desc = "A direction sign with a ladder and a downward arrow, pointing out the way to the nearest ladder that goes down." + icon_state = "ladder_down" + +/obj/structure/sign/directions/exit + name = "\improper Emergency Exit" + desc = "A lurid green sign that unmistakably identifies that the door it's next to as an emergency exit route." + icon_state = "exit_sign" + +//OTHER STUFF /obj/structure/sign/christmas/lights name = "Christmas lights" desc = "Flashy and pretty." diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 089e65fc04..7459fcab6c 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -1,26 +1,59 @@ /obj/structure/bed/chair/wheelchair name = "wheelchair" desc = "You sit in this. Either by will or force." + icon = 'icons/obj/wheelchair.dmi' icon_state = "wheelchair" anchored = 0 buckle_movable = 1 + var/folded_type = /obj/item/wheelchair var/driving = 0 var/mob/living/pulling = null var/bloodiness + var/min_mob_buckle_size = MOB_SMALL + var/max_mob_buckle_size = MOB_LARGE + +/obj/structure/bed/chair/wheelchair/Initialize() + . = ..() + update_icon() + +/obj/structure/bed/chair/wheelchair/motor + name = "electric wheelchair" + desc = "A motorized wheelchair controlled with a joystick on one armrest" + icon_state = "motorchair" + folded_type = /obj/item/wheelchair/motor + +/obj/structure/bed/chair/wheelchair/smallmotor + name = "small electric wheelchair" + desc = "A small motorized wheelchair, it looks around the right size for a Teshari" + icon_state = "teshchair" + min_mob_buckle_size = MOB_SMALL + max_mob_buckle_size = MOB_MEDIUM + folded_type = /obj/item/wheelchair/motor/small + +/obj/structure/bed/chair/wheelchair/can_buckle_check(mob/living/M, forced = FALSE) + . = ..() + if(.) + if(M.mob_size < min_mob_buckle_size) + to_chat(M, SPAN_WARNING("You are too small to use \the [src].")) + . = FALSE + else if(M.mob_size >= max_mob_buckle_size) + to_chat(M, SPAN_WARNING("You are too large to use \the [src].")) + . = FALSE /obj/structure/bed/chair/wheelchair/update_icon() - return + cut_overlays() + var/image/O = image(icon = icon, icon_state = "[icon_state]_overlay", layer = ABOVE_MOB_LAYER) + O.plane = MOB_PLANE + add_overlay(O) /obj/structure/bed/chair/wheelchair/set_dir() - ..() - cut_overlays() - var/image/O = image(icon = 'icons/obj/furniture.dmi', icon_state = "w_overlay", layer = FLY_LAYER, dir = src.dir) - add_overlay(O) - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A - L.set_dir(dir) + . = ..() + if(.) + if(has_buckled_mobs()) + for(var/A in buckled_mobs) + var/mob/living/L = A + L.set_dir(dir) /obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob) if(W.is_wrench() || W.is_wirecutter() || istype(W,/obj/item/stack)) @@ -93,8 +126,6 @@ /obj/structure/bed/chair/wheelchair/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - - cut_overlays() playsound(src, 'sound/effects/roll.ogg', 75, 1) if(has_buckled_mobs()) for(var/A in buckled_mobs) @@ -203,28 +234,13 @@ usr.pulledby = null ..() -/obj/item/wheelchair - name = "wheelchair" - desc = "A folded wheelchair that can be carried around." - icon = 'icons/obj/furniture.dmi' - icon_state = "wheelchair_folded" - item_state = "wheelchair" - w_class = ITEMSIZE_HUGE // Can't be put in backpacks. Oh well. - -/obj/item/wheelchair/attack_self(mob/user) - var/obj/structure/bed/chair/wheelchair/R = new /obj/structure/bed/chair/wheelchair(user.loc) - R.add_fingerprint(user) - R.name = src.name - R.color = src.color - qdel(src) - /obj/structure/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location) ..() if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) if(!ishuman(usr)) return if(has_buckled_mobs()) return 0 visible_message("[usr] collapses \the [src.name].") - var/obj/item/wheelchair/R = new/obj/item/wheelchair(get_turf(src)) + var/obj/item/wheelchair/R = new folded_type(get_turf(src)) R.name = src.name R.color = src.color spawn(0) diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair_item.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair_item.dm new file mode 100644 index 0000000000..d18a9a88f1 --- /dev/null +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair_item.dm @@ -0,0 +1,29 @@ +/obj/item/wheelchair + name = "wheelchair" + desc = "A folded wheelchair that can be carried around." + icon = 'icons/obj/wheelchair.dmi' + icon_state = "wheelchair_folded" + item_state = "wheelchair" + w_class = ITEMSIZE_HUGE // Can't be put in backpacks. Oh well. + var/unfolded_type = /obj/structure/bed/chair/wheelchair + +/obj/item/wheelchair/attack_self(mob/user) + var/obj/structure/bed/chair/wheelchair/R = new unfolded_type(user.loc) + R.add_fingerprint(user) + R.name = src.name + R.color = src.color + qdel(src) + +/obj/item/wheelchair/motor + name = "electric wheelchair" + desc = "A motorized wheelchair controlled with a joystick on one armrest" + icon_state = "motorchair_folded" + item_state = "motorchair" + unfolded_type = /obj/structure/bed/chair/wheelchair/motor + +/obj/item/wheelchair/motor/small + name = "small electric wheelchair" + desc = "A small motorized wheelchair, it looks around the right size for a Teshari." + icon_state = "teshchair_folded" + item_state = "teshchair" + unfolded_type = /obj/structure/bed/chair/wheelchair/smallmotor diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm index 60326d9bbf..593a961e4a 100644 --- a/code/game/objects/structures/trash_pile_vr.dm +++ b/code/game/objects/structures/trash_pile_vr.dm @@ -181,6 +181,7 @@ prob(2);/obj/item/clothing/shoes/galoshes, prob(2);/obj/item/clothing/under/pants/camo, prob(2);/obj/item/clothing/under/syndicate/tacticool, + prob(2);/obj/item/clothing/under/hyperfiber, prob(2);/obj/item/device/camera, prob(2);/obj/item/device/flashlight/flare, prob(2);/obj/item/device/flashlight/glowstick, @@ -242,6 +243,7 @@ prob(2);/obj/item/weapon/handcuffs/legcuffs/fuzzy, prob(2);/obj/item/weapon/storage/box/syndie_kit/spy, prob(2);/obj/item/weapon/grenade/anti_photon, + prob(2);/obj/item/clothing/under/hyperfiber/bluespace, prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc, prob(1);/obj/item/device/nif/bad, prob(1);/obj/item/device/radio_jammer, diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index a7037105d2..282a10f9e0 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -215,82 +215,14 @@ L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily if(iscarbon(O)) - var/mob/living/carbon/M = O - if(M.r_hand) - M.r_hand.clean_blood() - if(M.l_hand) - M.l_hand.clean_blood() - if(M.back) - if(M.back.clean_blood()) - M.update_inv_back(0) - //flush away reagents on the skin + var/mob/living/carbon/M = O if(M.touching) var/remove_amount = M.touching.maximum_volume * M.reagent_permeability() //take off your suit first M.touching.remove_any(remove_amount) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/washgloves = 1 - var/washshoes = 1 - var/washmask = 1 - var/washears = 1 - var/washglasses = 1 - - if(H.wear_suit) - washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES) - washshoes = !(H.wear_suit.flags_inv & HIDESHOES) - - if(H.head) - washmask = !(H.head.flags_inv & HIDEMASK) - washglasses = !(H.head.flags_inv & HIDEEYES) - washears = !(H.head.flags_inv & HIDEEARS) - - if(H.wear_mask) - if (washears) - washears = !(H.wear_mask.flags_inv & HIDEEARS) - if (washglasses) - washglasses = !(H.wear_mask.flags_inv & HIDEEYES) - - if(H.head) - if(H.head.clean_blood()) - H.update_inv_head(0) - if(H.wear_suit) - if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0) - else if(H.w_uniform) - if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0) - if(H.gloves && washgloves) - if(H.gloves.clean_blood()) - H.update_inv_gloves(0) - if(H.shoes && washshoes) - if(H.shoes.clean_blood()) - H.update_inv_shoes(0) - if(H.wear_mask && washmask) - if(H.wear_mask.clean_blood()) - H.update_inv_wear_mask(0) - if(H.glasses && washglasses) - if(H.glasses.clean_blood()) - H.update_inv_glasses(0) - if(H.l_ear && washears) - if(H.l_ear.clean_blood()) - H.update_inv_ears(0) - if(H.r_ear && washears) - if(H.r_ear.clean_blood()) - H.update_inv_ears(0) - if(H.belt) - if(H.belt.clean_blood()) - H.update_inv_belt(0) - H.clean_blood(washshoes) - else - if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags - if(M.wear_mask.clean_blood()) - M.update_inv_wear_mask(0) - M.clean_blood() - else - O.clean_blood() - + M.clean_blood() + if(isturf(loc)) var/turf/tile = loc for(var/obj/effect/E in tile) diff --git a/code/game/objects/structures/watercloset_vr.dm b/code/game/objects/structures/watercloset_vr.dm new file mode 100644 index 0000000000..7e8790fbcc --- /dev/null +++ b/code/game/objects/structures/watercloset_vr.dm @@ -0,0 +1,41 @@ +//Flushable toilets on station levels. Flushing sends stuff directly to a trashpit landmark without stinking up the cargo office. +//Only on-station toilets are affected and only if the trashpit landmark also exists. Otherwise toilets will stay normal. + +/obj/structure/toilet + var/teleplumbed = FALSE + var/exit_landmark + +/obj/structure/toilet/Initialize() + if(z in global.using_map.map_levels) + teleplumbed = TRUE + exit_landmark = locate(/obj/effect/landmark/teleplumb_exit) + if(teleplumbed && exit_landmark) + desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean." + return ..() + +/obj/structure/toilet/attack_hand(mob/living/user as mob) + if(open && teleplumbed && exit_landmark) + var/list/bowl_contents = list() + for(var/obj/item/I in loc.contents) + if(istype(I) && !I.anchored) + bowl_contents += I + if(bowl_contents.len) + user.visible_message("[user] flushes the toilet.", "You flush the toilet.") + playsound(src, 'sound/vore/death7.ogg', 50, 1) //Got lazy about getting new sound files. Have a sick remix lmao. + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + playsound(src, 'sound/mecha/powerup.ogg', 30, 1) + for(var/obj/item/F in bowl_contents) + F.forceMove(get_turf(exit_landmark)) + bowl_contents -= F + return + return ..() + +/obj/structure/toilet/attack_ai(mob/user as mob) + if(isrobot(user)) + if(user.client && user.client.eye == user) + return attack_hand(user) + else + return attack_hand(user) + +/obj/effect/landmark/teleplumb_exit + name = "teleplumbing exit" diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm index bb8b5cff6b..dfeecb7be7 100644 --- a/code/game/objects/structures/window_spawner.dm +++ b/code/game/objects/structures/window_spawner.dm @@ -27,11 +27,10 @@ return FALSE /obj/effect/wingrille_spawn/Initialize() - . = ..() - if(!win_path) - return - if(ticker && ticker.current_state < GAME_STATE_PLAYING) + if(win_path && ticker && ticker.current_state < GAME_STATE_PLAYING) activate() + ..() + return INITIALIZE_HINT_QDEL /obj/effect/wingrille_spawn/proc/activate() if(activated) return @@ -58,7 +57,8 @@ activated = 1 for(var/obj/effect/wingrille_spawn/other in neighbours) if(!other.activated) other.activate() - qdel(src) + if(initialized && !QDELETED(src)) + qdel(src) /obj/effect/wingrille_spawn/proc/handle_window_spawn(var/obj/structure/window/W) return diff --git a/code/game/sound.dm b/code/game/sound.dm index 415a26c78c..5b1214c675 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -4,6 +4,9 @@ return var/turf/turf_source = get_turf(source) + if(!turf_source) + return + var/area/area_source = turf_source.loc //allocate a channel if necessary now so its the same for everyone channel = channel || open_sound_channel() @@ -19,6 +22,11 @@ if(!M || !M.client) continue var/turf/T = get_turf(M) + if(!T) + continue + var/area/A = T.loc + if((A.soundproofed || area_source.soundproofed) && (A != area_source)) + continue var/distance = get_dist(T, turf_source) if(distance <= maxdistance) diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 1d989c7099..31c8168a1c 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -12,9 +12,13 @@ var/list/floor_decals = list() /obj/effect/floor_decal/New(var/newloc, var/newdir, var/newcolour) supplied_dir = newdir - if(newcolour) color = newcolour + if(newcolour) + color = newcolour ..(newloc) +// TODO: identify what is causing these atoms to be qdeleted in New()/Initialize() +// somewhere in this chain. Alternatively repath to /obj/floor_decal or some other +// abstract handler that explicitly doesn't invoke any obj behavior. /obj/effect/floor_decal/Initialize() add_to_turf_decals() initialized = TRUE @@ -42,11 +46,11 @@ var/list/floor_decals = list() name = "reset marker" /obj/effect/floor_decal/reset/Initialize() + ..() var/turf/T = get_turf(src) if(T.decals && T.decals.len) T.decals.Cut() T.update_icon() - initialized = TRUE return INITIALIZE_HINT_QDEL /obj/effect/floor_decal/corner diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 5dc017addd..c47a94d09c 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -317,7 +317,6 @@ name = "tiles" icon_state = "freezer" initial_flooring = /decl/flooring/tiling/freezer - temperature = T0C - 5 // VOREStation Edit: Chillier Freezer Tiles on-start /turf/simulated/floor/lino name = "lino" diff --git a/code/game/turfs/flooring/flooring_vr.dm b/code/game/turfs/flooring/flooring_vr.dm index 2567ffd1a6..787c6bd10c 100644 --- a/code/game/turfs/flooring/flooring_vr.dm +++ b/code/game/turfs/flooring/flooring_vr.dm @@ -23,4 +23,7 @@ /decl/flooring/grass/outdoors/forest icon = 'icons/turf/outdoors.dmi' - icon_base = "grass-dark" \ No newline at end of file + icon_base = "grass-dark" + +/turf/simulated/floor/tiled/freezer/cold + temperature = T0C - 5 \ No newline at end of file diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 151efd819c..437912b4d2 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -86,7 +86,7 @@ var/static/list/antilight_cache /turf/simulated/shuttle/Initialize(mapload) - ..() + . = ..() if(!antilight_cache) antilight_cache = list() for(var/diag in cornerdirs) diff --git a/code/game/turfs/simulated/floor_types_eris.dm b/code/game/turfs/simulated/floor_types_eris.dm index bfc9945678..1cd067b957 100644 --- a/code/game/turfs/simulated/floor_types_eris.dm +++ b/code/game/turfs/simulated/floor_types_eris.dm @@ -1014,10 +1014,3 @@ oxygen = 0 nitrogen = 0 temperature = TCMB - -/* -/turf/simulated/floor/hull/New() - if(icon_state != "hullcenter0") - overrided_icon_state = icon_state - ..() -*/ \ No newline at end of file diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm index d6f1d178aa..6db2961d4b 100644 --- a/code/game/turfs/simulated/outdoors/snow.dm +++ b/code/game/turfs/simulated/outdoors/snow.dm @@ -31,7 +31,8 @@ to_chat(user, "You begin to remove \the [src] with your [W].") if(do_after(user, 4 SECONDS * W.toolspeed)) to_chat(user, "\The [src] has been dug up, and now lies in a pile nearby.") - new /obj/item/stack/material/snow(src) + var/obj/item/stack/material/snow/S = new(src) + S.amount = 10 demote() else to_chat(user, "You decide to not finish removing \the [src].") diff --git a/code/game/turfs/space/cracked_asteroid.dm b/code/game/turfs/space/cracked_asteroid.dm index ca77a8cd2c..224997ca8d 100644 --- a/code/game/turfs/space/cracked_asteroid.dm +++ b/code/game/turfs/space/cracked_asteroid.dm @@ -11,9 +11,3 @@ /turf/space/cracked_asteroid/is_space() // So people don't start floating when standing on it. return FALSE - -// u wot m8? ~Leshana -// /turf/space/cracked_asteroid/New() -// ..() -// spawn(2 SECONDS) -// overlays.Cut() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 43dffc352b..17bc2aee51 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -67,6 +67,17 @@ return 1 /turf/attack_hand(mob/user) + //QOL feature, clicking on turf can toggle doors, unless pulling something + if(!user.pulling) + var/obj/machinery/door/airlock/AL = locate(/obj/machinery/door/airlock) in src.contents + if(AL) + AL.attack_hand(user) + return TRUE + var/obj/machinery/door/firedoor/FD = locate(/obj/machinery/door/firedoor) in src.contents + if(FD) + FD.attack_hand(user) + return TRUE + if(!(user.canmove) || user.restrained() || !(user.pulling)) return 0 if(user.pulling.anchored || !isturf(user.pulling.loc)) diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 584137ff45..39c217a006 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -2,7 +2,13 @@ name = "command" oxygen = MOLES_O2STANDARD nitrogen = MOLES_N2STANDARD - initialized = TRUE // Don't call init on unsimulated turfs (at least not yet) + var/skip_init = TRUE // Don't call down the chain, apparently for performance when loading maps at runtime. + +/turf/unsimulated/Initialize(mapload) + if(skip_init) + initialized = TRUE + return INITIALIZE_HINT_NORMAL + . = ..() //VOREStation Add /turf/unsimulated/fake_space diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index c5338b3db9..b1841dadad 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -14,7 +14,7 @@ /turf/unsimulated/beach/water name = "Water" icon_state = "water" - initialized = FALSE + skip_init = FALSE movement_cost = 4 // Water should slow you down, just like simulated turf. /turf/unsimulated/beach/water/Initialize() diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm index 4fb26f16b6..9fe487410f 100644 --- a/code/game/turfs/unsimulated/planetary.dm +++ b/code/game/turfs/unsimulated/planetary.dm @@ -9,7 +9,6 @@ density = 1 alpha = 0 blocks_air = 0 - initialized = FALSE // Set these to get your desired planetary atmosphere. oxygen = 0 @@ -17,6 +16,7 @@ carbon_dioxide = 0 phoron = 0 temperature = T20C + skip_init = FALSE /turf/unsimulated/wall/planetary/Initialize() . = ..() diff --git a/code/game/verbs/advanced_who.dm b/code/game/verbs/advanced_who.dm index eff1f02636..4762280a73 100644 --- a/code/game/verbs/advanced_who.dm +++ b/code/game/verbs/advanced_who.dm @@ -86,6 +86,7 @@ entry += " - In Lobby
" else entry += " - Playing
" + Lines += entry msg += "" @@ -95,4 +96,4 @@ msg += "Total Players: [length(Lines)]" msg = "" + msg + "" to_chat(src, msg) -YW EDIT STOP*/ \ No newline at end of file +YW EDIT STOP*/ diff --git a/code/game/verbs/character_directory.dm b/code/game/verbs/character_directory.dm index 99f95700b8..e6e1bc3911 100644 --- a/code/game/verbs/character_directory.dm +++ b/code/game/verbs/character_directory.dm @@ -1,61 +1,139 @@ +GLOBAL_DATUM(character_directory, /datum/character_directory) + /client/verb/show_character_directory() set name = "Character Directory" set category = "OOC" set desc = "Shows a listing of all active characters, along with their associated OOC notes, flavor text, and more." - if(mob.next_move >= world.time) //This is primarily to stop malicious users from trying to lag the server by spamming this verb + // This is primarily to stop malicious users from trying to lag the server by spamming this verb + if(!usr.checkMoveCooldown()) + to_chat(usr, "Don't spam character directory refresh.") return + usr.setMoveCooldown(10) - mob.next_move = world.time + 10 + if(!GLOB.character_directory) + GLOB.character_directory = new + GLOB.character_directory.tgui_interact(mob) - var/html = "" - var/curID = 0 +// This is a global singleton. Keep in mind that all operations should occur on usr, not src. +/datum/character_directory +/datum/character_directory/tgui_state(mob/user) + return GLOB.tgui_always_state + +/datum/character_directory/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CharacterDirectory", "Character Directory") + ui.open() + +/datum/character_directory/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + data["personalVisibility"] = user?.client?.prefs?.show_in_directory + data["personalTag"] = user?.client?.prefs?.directory_tag || "Unset" + data["personalErpTag"] = user?.client?.prefs?.directory_erptag || "Unset" + + return data + +/datum/character_directory/tgui_static_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + var/list/directory_mobs = list() for(var/client/C in GLOB.clients) - if(C.prefs && !C.prefs.show_in_directory) + // Allow opt-out. + if(!C?.prefs?.show_in_directory) continue + + // These are the three vars we're trying to find + // The approach differs based on the mob the client is controlling + var/name = null + var/ooc_notes = null + var/flavor_text = null + var/tag = C.prefs.directory_tag || "Unset" + var/erptag = C.prefs.directory_erptag || "Unset" + var/character_ad = C.prefs.directory_ad + if(ishuman(C.mob)) var/mob/living/carbon/human/H = C.mob if(data_core && data_core.general) if(!find_general_record("name", H.real_name)) if(!find_record("name", H.real_name, data_core.hidden_general)) continue - curID++ - html += "
" - html += "

[H.real_name]


" - if(H.flavor_texts["general"]) - html += "Flavor text" - html += "" - if(H.ooc_notes) - html += "OOC notes" - html += "" - html += "
" + name = H.real_name + ooc_notes = H.ooc_notes + flavor_text = H.flavor_texts["general"] + if(isAI(C.mob)) var/mob/living/silicon/ai/A = C.mob - curID++ - html += "
" - html += "

[A.name] (Artificial Intelligence)


" - if(A.ooc_notes) - html += "OOC notes" - html += "" - html += "
" + name = "[A.name] (Artificial Intelligence)" + ooc_notes = A.ooc_notes + flavor_text = null // No flavor text for AIs :c + if(isrobot(C.mob)) var/mob/living/silicon/robot/R = C.mob if(R.scrambledcodes || (R.module && R.module.hide_on_manifest)) continue - curID++ - html += "
" - html += "

[R.name] ([R.modtype] [R.braintype])


" - if(R.flavor_text) - html += "Flavor text" - html += "" - if(R.ooc_notes) - html += "OOC notes" - html += "" - html += "
" - if(!curID) - html += "

404: Station not found

" + name = "[R.name] ([R.modtype] [R.braintype])" + ooc_notes = R.ooc_notes + flavor_text = R.flavor_text - var/datum/browser/popup = new(mob, "chardir", "Character Directory", 640, 480) - popup.set_content(html) - popup.open() + // It's okay if we fail to find OOC notes and flavor text + // But if we can't find the name, they must be using a non-compatible mob type currently. + if(!name) + continue + + directory_mobs.Add(list(list( + "name" = name, + "ooc_notes" = ooc_notes, + "tag" = tag, + "erptag" = erptag, + "character_ad" = character_ad, + "flavor_text" = flavor_text, + ))) + + data["directory"] = directory_mobs + + return data + + +/datum/character_directory/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + . = ..() + if(.) + return + + switch(action) + if("refresh") + // This is primarily to stop malicious users from trying to lag the server by spamming this verb + if(!usr.checkMoveCooldown()) + to_chat(usr, "Don't spam character directory refresh.") + return + usr.setMoveCooldown(10) + update_tgui_static_data(usr, ui) + return TRUE + if("setTag") + var/list/new_tag = input(usr, "Pick a new Vore tag for the character directory", "Character Tag", usr?.client?.prefs?.directory_tag) as null|anything in GLOB.char_directory_tags + if(!new_tag) + return + usr?.client?.prefs?.directory_tag = new_tag + return TRUE + if("setErpTag") + var/list/new_erptag = input(usr, "Pick a new ERP tag for the character directory", "Character ERP Tag", usr?.client?.prefs?.directory_erptag) as null|anything in GLOB.char_directory_erptags + if(!new_erptag) + return + usr?.client?.prefs?.directory_erptag = new_erptag + return TRUE + if("setVisible") + usr?.client?.prefs?.show_in_directory = !usr?.client?.prefs?.show_in_directory + to_chat(usr, "You are now [usr.client.prefs.show_in_directory ? "shown" : "not shown"] in the directory.") + return TRUE + if("editAd") + if(!usr?.client?.prefs) + return + + var/current_ad = usr.client.prefs.directory_ad + var/new_ad = sanitize(input(usr, "Change your character ad", "Character Ad", current_ad) as message|null, extra = 0) + if(isnull(new_ad)) + return + usr.client.prefs.directory_ad = new_ad + return TRUE \ No newline at end of file diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index ce0b82df9b..cd4a90354e 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -73,9 +73,9 @@ return log_and_message_admins("[key_name(src)] commited suicide") - + var/datum/gender/T = gender_datums[get_visible_gender()] - + var/suicidemsg suicidemsg = pick("[src] is attempting to bite [T.his] tongue off! It looks like [T.he] [T.is] trying to commit suicide.", \ "[src] is jamming [T.his] thumbs into [T.his] eye sockets! It looks like [T.he] [T.is] trying to commit suicide.", \ @@ -152,6 +152,7 @@ adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) updatehealth() +/* CHOMP EDIT START: Removing PAI suicide, literally no one needs this. /mob/living/silicon/pai/verb/suicide() set category = "pAI Commands" set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)" @@ -166,3 +167,5 @@ death(0) else to_chat(src, "Aborting suicide attempt.") + +*/ diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index be062aef6f..6cec049ed2 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -1,4 +1,3 @@ - /client/verb/who() set name = "Who" set category = "OOC" @@ -206,3 +205,4 @@ msg += "\nAdminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond." return msg + diff --git a/code/game/world.dm b/code/game/world.dm index 92f0359913..867301f989 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -57,12 +57,8 @@ // Create robolimbs for chargen. populate_robolimb_list() - //Must be done now, otherwise ZAS zones and lighting overlays need to be recreated. - //createRandomZlevel() //VOREStation Removal: Deprecated - master_controller = new /datum/controller/game_controller() - - Master.Initialize(10, FALSE, TRUE) + Master.Initialize(10, FALSE) spawn(1) master_controller.setup() @@ -171,42 +167,57 @@ var/world_topic_spam_protect_time = world.timeofday var/real_rank = make_list_rank(t.fields["real_rank"]) var/department = 0 + var/active = 0 //CHOMPStation Edit Begin + for(var/mob/M in player_list) + if(M.real_name == name && M.client && M.client.inactivity <= 10 MINUTES) + active = 1 + break + var/isactive = active ? "Active" : "Inactive" for(var/k in set_names) if(real_rank in set_names[k]) if(!positions[k]) positions[k] = list() - positions[k][name] = rank + positions[k][name] = list(rank,isactive) department = 1 if(!department) if(!positions["misc"]) positions["misc"] = list() - positions["misc"][name] = rank + positions["misc"][name] = list(rank,isactive) for(var/datum/data/record/t in data_core.hidden_general) var/name = t.fields["name"] var/rank = t.fields["rank"] var/real_rank = make_list_rank(t.fields["real_rank"]) + var/active = 0 //CHOMPStation Edit Begin + for(var/mob/M in player_list) + if(M.real_name == name && M.client && M.client.inactivity <= 10 MINUTES) + active = 1 + break + var/isactive = active ? "Active" : "Inactive" + var/datum/job/J = SSjob.get_job(real_rank) if(J?.offmap_spawn) if(!positions["off"]) positions["off"] = list() - positions["off"][name] = rank + positions["off"][name] = list(rank,isactive) // Synthetics don't have actual records, so we will pull them from here. for(var/mob/living/silicon/ai/ai in mob_list) + var/isactive = (ai.client && ai.client.inactivity <= 10 MINUTES) ? "Active" : "Inactive" if(!positions["bot"]) positions["bot"] = list() - positions["bot"][ai.name] = "Artificial Intelligence" + positions["bot"][ai.name] = list("Artificial Intelligence",isactive) for(var/mob/living/silicon/robot/robot in mob_list) // No combat/syndicate cyborgs, no drones, and no AI shells. + var/isactive = (robot.client && robot.client.inactivity <= 10 MINUTES) ? "Active" : "Inactive" if(robot.shell) continue - if(robot.module && robot.module.hide_on_manifest) + if(robot.module && robot.module.hide_on_manifest()) continue if(!positions["bot"]) positions["bot"] = list() - positions["bot"][robot.name] = "[robot.modtype] [robot.braintype]" + positions["bot"][robot.name] = list("[robot.modtype] [robot.braintype]",isactive) //CHOMPEdit end for(var/k in positions) positions[k] = list2params(positions[k]) // converts positions["heads"] = list("Bob"="Captain", "Bill"="CMO") into positions["heads"] = "Bob=Captain&Bill=CMO" @@ -408,7 +419,6 @@ var/world_topic_spam_protect_time = world.timeofday to_world("Rebooting world immediately due to host request") else Master.Shutdown() //run SS shutdowns - //processScheduler.stop() //VOREStation Removal for(var/client/C in GLOB.clients) if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite C << link("byond://[config.server]") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 3d169758f5..92a1d78508 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -407,7 +407,7 @@ proc/admin_notice(var/message, var/rights) dat+="ERROR: Could not submit Feed story to Network.

" if(src.admincaster_feed_channel.channel_name=="") dat+="•Invalid receiving channel name.
" - if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") + if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]" || admincaster_feed_message.title == "") dat+="•Invalid message body.
" dat+="
Return
" if(7) @@ -436,11 +436,14 @@ proc/admin_notice(var/message, var/rights) var/i = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) i++ - dat+="-[MESSAGE.body]
" + //dat+="-[MESSAGE.body]
" + var/pic_data if(MESSAGE.img) usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png") - dat+="

" - dat+="\[Story by [MESSAGE.author]\]
" + pic_data+="
" + dat+= get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author,"#d4cec1", pic_data) + dat+="
" + dat+="\[Story by [MESSAGE.author] - [MESSAGE.time_stamp]\]
" dat+={"

Refresh
Back @@ -948,7 +951,7 @@ var/datum/announcement/minor/admin_min_announcer = new log_admin("[key_name(usr)] toggled persistence to [config.persistence_disabled ? "Off" : "On"].") world.update_status() feedback_add_details("admin_verb","TPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - + /datum/admins/proc/togglemaploadpersistence() set category = "Server" set desc="Whether mapload persistent data will be saved from now on." @@ -1426,6 +1429,11 @@ var/datum/announcement/minor/admin_min_announcer = new return 1 if(tomob.client) //No need to ghostize if there is no client tomob.ghostize(0) + if(frommob.mind && frommob.mind.current) //Preserve teleop for original body when adminghosting. + var/mob/body = frommob.mind.current + if(body) + if(body.teleop) + body.teleop = tomob message_admins("[key_name_admin(usr)] has put [frommob.ckey] in control of [tomob.name].") log_admin("[key_name(usr)] stuffed [frommob.ckey] into [tomob.name].") feedback_add_details("admin_verb","CGD") diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 1342fc2f5f..65c8afb298 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -23,7 +23,7 @@ if(!message) return var/F = investigate_subject2file(subject) if(!F) return - to_chat(F, "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
") + to_file(F, "[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z]) || [src] [message]
") //ADMINVERBS /client/proc/investigate_show( subject in list("hrefs","notes","singulo","telesci") ) diff --git a/code/modules/admin/admin_tools.dm b/code/modules/admin/admin_tools.dm index 42ab6aae9a..2d9ae2cdd4 100644 --- a/code/modules/admin/admin_tools.dm +++ b/code/modules/admin/admin_tools.dm @@ -76,9 +76,4 @@ onclose(usr, "admin_dialogue_log") - feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -// Used to get `atom/O as obj|mob|turf in view()` to match against strings containing apostrophes immediately after substrings that match to other objects. Somehow. - Ater -/proc/admin_atom_validate(atom/A) - return view() \ No newline at end of file + feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm index a33611b459..2772597162 100644 --- a/code/modules/admin/admin_verb_lists.dm +++ b/code/modules/admin/admin_verb_lists.dm @@ -60,6 +60,7 @@ var/list/admin_verbs_admin = list( /client/proc/check_ai_laws, //shows AI and borg laws, /client/proc/rename_silicon, //properly renames silicons, /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , + /client/proc/shuttle_panel, // Allows controlling all shuttles remotely. /client/proc/check_antagonists, /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, /client/proc/dsay, //talk in deadchat using our ckey/fakekey, @@ -105,7 +106,6 @@ var/list/admin_verbs_admin = list( /datum/admins/proc/paralyze_mob, /client/proc/fixatmos, /datum/admins/proc/quick_nif, //VOREStation Add, - /datum/admins/proc/quick_authentic_nif, //CHOMPStation add /datum/admins/proc/sendFax, /client/proc/despawn_player, /datum/admins/proc/view_feedback, @@ -360,7 +360,6 @@ var/list/admin_verbs_mod = list( /datum/admins/proc/view_persistent_data, /datum/admins/proc/view_txt_log, //shows the server log (diary) for today, /datum/admins/proc/quick_nif, //CHOMPEdit - /datum/admins/proc/quick_authentic_nif, //CHOMPEdit /client/proc/admin_teleport, //CHOMPEdit /datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently, ) @@ -452,6 +451,7 @@ var/list/admin_verbs_event_manager = list( /client/proc/check_ai_laws, //shows AI and borg laws, /client/proc/rename_silicon, //properly renames silicons, /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , + /client/proc/shuttle_panel, // Allows controlling all shuttles remotely. /client/proc/check_antagonists, /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, /client/proc/dsay, //talk in deadchat using our ckey/fakekey, diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6635b07061..d8deb0dce6 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -437,6 +437,17 @@ set_security_level(sec_level) log_admin("[key_name(usr)] changed the security level to code [sec_level].") +/client/proc/shuttle_panel() + set name = "Shuttle Control Panel" + set category = "Admin" + + if(!check_rights(R_ADMIN | R_EVENT)) + return + + var/datum/tgui_module/admin_shuttle_controller/A = new(src) + A.tgui_interact(usr) + log_and_message_admins("has opened the shuttle panel.") + feedback_add_details("admin_verb","SHCP") //---- bs12 verbs ---- @@ -525,4 +536,4 @@ T.spell_list += new S feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") - message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) + message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) \ No newline at end of file diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 3fe1f52465..d92b3be0cb 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1742,16 +1742,20 @@ src.admincaster_feed_channel.channel_name = sanitizeSafe(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels ) src.access_news_network() + else if(href_list["ac_set_new_title"]) + src.admincaster_feed_message.title = sanitize(input(usr, "Enter the Feed title", "Network Channel Handler", "")) + src.access_news_network() + else if(href_list["ac_set_new_message"]) - src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "")) + src.admincaster_feed_message.body = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message) src.access_news_network() else if(href_list["ac_submit_new_message"]) - if(src.admincaster_feed_message.body =="" || src.admincaster_feed_message.body =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" ) + if(src.admincaster_feed_message.body =="" || admincaster_feed_message.title == "" || admincaster_feed_message.body =="\[REDACTED\]" || admincaster_feed_channel.channel_name == "" ) src.admincaster_screen = 6 else feedback_inc("newscaster_stories",1) - news_network.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, src.admincaster_feed_channel.channel_name, null, 1) + news_network.SubmitArticle(admincaster_feed_message.body, admincaster_signature, admincaster_feed_channel.channel_name, null, 1, "", admincaster_feed_message.title) src.admincaster_screen=4 log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index c9aabc4749..9d89d54fc5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,6 +1,25 @@ /client/var/datum/admin_help/current_ticket //the current ticket the (usually) not-admin client is dealing with -// +//CHOMPEdit Begin +/proc/get_ahelp_channel() + var/datum/tgs_api/v5/api = TGS_READ_GLOBAL(tgs) + if(istype(api) && config.ahelp_channel_tag) + for(var/datum/tgs_chat_channel/channel in api.chat_channels) + if(channel.custom_tag == config.ahelp_channel_tag) + return list(channel) + return 0 + +/proc/ahelp_discord_message(var/message) + if(!message) + return + if(config.discord_ahelps_disabled) + return + var/datum/tgs_chat_channel/ahelp_channel = get_ahelp_channel() + if(ahelp_channel) + world.TgsChatBroadcast(message,ahelp_channel) + else + world.TgsTargetedChatBroadcast(message,TRUE) +//CHOMPEdit End //TICKET MANAGER // @@ -190,9 +209,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/list/activemins = adm["present"] var activeMins = activemins.len if(is_bwoink) - world.TgsTargetedChatBroadcast("ADMINHELP: FROM: [key_name_admin(usr)] TO [initiator_ckey]/[initiator_key_name] - MSG: **[msg]** - Heard by [activeMins] NON-AFK staff members.", TRUE) + ahelp_discord_message("ADMINHELP: FROM: [key_name_admin(usr)] TO [initiator_ckey]/[initiator_key_name] - MSG: **[msg]** - Heard by [activeMins] NON-AFK staff members.") //CHOMPEdit else - world.TgsTargetedChatBroadcast("ADMINHELP: FROM: [initiator_ckey]/[initiator_key_name] - MSG: **[msg]** - Heard by [activeMins] NON-AFK staff members.", TRUE) + ahelp_discord_message("ADMINHELP: FROM: [initiator_ckey]/[initiator_key_name] - MSG: **[msg]** - Heard by [activeMins] NON-AFK staff members.") //CHOMPEdit //YW EDIT END GLOB.ahelp_tickets.active_tickets += src @@ -203,7 +222,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) return ..() /datum/admin_help/proc/AddInteraction(formatted_message) - _interactions += "[gameTimestamp()]: [formatted_message]" + var/curinteraction = "[gameTimestamp()]: [formatted_message]" + if(config.discord_ahelps_all) //CHOMPEdit + ahelp_discord_message("ADMINHELP: TICKETID:[id] [strip_html_properly(curinteraction)]") //CHOMPEdit + _interactions += curinteraction //private /datum/admin_help/proc/FullMonty(ref_src) diff --git a/code/modules/admin/verbs/change_appearance.dm b/code/modules/admin/verbs/change_appearance.dm index 2f7166a2c0..94c5170347 100644 --- a/code/modules/admin/verbs/change_appearance.dm +++ b/code/modules/admin/verbs/change_appearance.dm @@ -92,15 +92,7 @@ var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter") if (new_gender) - if(new_gender == "Male") - M.gender = MALE - M.dna.SetUIState(DNA_UI_GENDER, FALSE) - else if (new_gender == "Female") - M.gender = FEMALE - M.dna.SetUIState(DNA_UI_GENDER, TRUE) - else - M.gender = NEUTER - M.dna.SetUIState(DNA_UI_GENDER, FALSE) + M.set_gender(new_gender) M.update_dna(M) M.update_hair(FALSE) diff --git a/code/modules/admin/verbs/debug_ch.dm b/code/modules/admin/verbs/debug_ch.dm deleted file mode 100644 index b33604b7ea..0000000000 --- a/code/modules/admin/verbs/debug_ch.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/admins/proc/quick_authentic_nif() - set category = "Fun" - set name = "Quick Auth NIF" - set desc = "Spawns an authentic NIF into someone in quick-implant mode." - - if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) //CHOMPStation Edit TFF 24/4/19: Allow Devs to use Quick-NIF verb. - return - - var/mob/living/carbon/human/H = input("Pick a mob with a player","Quick Authentic NIF") as null|anything in player_list - - if(!H) - return - - if(!istype(H)) - to_chat(usr,"That mob type ([H.type]) doesn't support NIFs, sorry.") - return - - if(!H.get_organ(BP_HEAD)) - to_chat(usr,"Target is unsuitable.") - return - - if(H.nif) - to_chat(usr,"Target already has a NIF.") - return - - if(H.species.flags & NO_SCAN) - new /obj/item/device/nif/authenticbio(H) - else - new /obj/item/device/nif/authentic(H) - - log_and_message_admins("[key_name(src)] Quick Authentic NIF'd [H.real_name].") - feedback_add_details("admin_verb","QANIF") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2e59ce752c..1916c1d880 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -523,6 +523,12 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.add_language(lang) //VOREStation Add End + for(var/lang in picked_client.prefs.alternate_languages) + var/datum/language/chosen_language = GLOB.all_languages[lang] + if(chosen_language) + if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) + new_character.add_language(lang) + //If desired, apply equipment. if(equipment) if(charjob) @@ -629,7 +635,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in admin_atom_validate(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater +/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in _validate_atom(O)) // I don't understand precisely how this fixes the string matching against a substring, but it does - Ater set category = "Admin" set name = "Delete" diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm index d99247fe58..7358a7790f 100644 --- a/code/modules/ai/ai_holder.dm +++ b/code/modules/ai/ai_holder.dm @@ -46,6 +46,7 @@ // mob to stay still (e.g. delayed attacking). If you need the mob to be inactive for an extended period of time, // consider sleeping the AI instead. var/process_flags = 0 // Where we're processing, see flag defines. + var/list/snapshot = null // A list used in mass-editing of AI datums, holding a snapshot of the 'before' state var/list/static/fastprocess_stances = list( STANCE_ALERT, STANCE_APPROACH, @@ -69,6 +70,143 @@ hostile = TRUE retaliate = TRUE +/datum/ai_holder/vv_get_dropdown() + . = ..() + if(snapshot) + VV_DROPDOWN_OPTION("mass_edit_finish", "End Mass Edit") + else + VV_DROPDOWN_OPTION("mass_edit_start", "Begin Mass Edit") + +/datum/ai_holder/vv_do_topic(list/href_list) + . = ..() + IF_VV_OPTION("mass_edit_start") + if(!check_rights(R_ADMIN)) + return + if(snapshot) + to_chat(usr, "Someone (or you) may have started a mass edit on this AI datum already. Refresh the VV window to get the option to end the mass edit instead.") + href_list["datumrefresh"] = "\ref[src]" + return + snapshot = vars.Copy() //'vars' appears to be special in that vars.Copy produces a flat list of keys with no values. It seems that 'vars[key]' is handled somewhere in the byond engine differently than normal lists. + + // Remove things that may change without admin input during editing. If they aren't present in the snapshot, they aren't eligible for the diff. + snapshot -= list( + //other + "datum_flags", + "active_timers", + //main + "snapshot", + "stance", + "process_flags", + //targeting + "target", + "preferred_target", + "target_last_seen_turf", + "attackers", + "lose_target_time", + //pathfinding + "path", + "obstacles", + "failed_steps", + //movement + "destination", + "failed_breakthroughs", + "faction_friends", + //communication + "threatening", + "last_conflict_time", + "last_threaten_time", + "last_target_time" + ) + + for(var/key in snapshot) + var/thing = vars[key] + if(islist(thing)) // This is just too dangerous to do. Maybe in the future we can have a whitelist of lists that are fine to edit. + thing = null + snapshot[key] = thing + + VARSET_IN(src, snapshot, null, 2 MINUTES) // Safety + to_chat(usr, "Variable snapshot saved. Begin editing the datum, and end the mass edit from the dropdown menu within 2 minutes. Note that editing the contents of lists is not supported.") + href_list["datumrefresh"] = "\ref[src]" + + IF_VV_OPTION("mass_edit_finish") + if(!check_rights(R_ADMIN)) + return + + var/list/before = snapshot //This PROBABLY works, right? + snapshot = null + var/list/after = vars.Copy() //'vars' appears to be special in that vars.Copy produces a flat list of keys with no values. It seems that 'vars[key]' is handled somewhere in the byond engine differently than normal lists. + after &= before //Ignore any dangerous keys. Not a big deal, because just 'before' being safe is enough to exclude the dangerous ones from the diff, but why not + for(var/key in after) + var/thing = vars[key] + if(islist(thing)) // This is just too dangerous to do. Maybe in the future we can have a whitelist of lists that are fine to edit. + thing = null + after[key] = thing + + var/list/diff = list() + for(var/key in before) + if(before[key] == after[key]) + continue + diff += key + + if(!diff.len) + to_chat(usr, "You don't appear to have changed anything on the AI datum you were editing.") + href_list["datumrefresh"] = "\ref[src]" + else + var/message = "These differences were detected in your varedit. If you notice any that you didn't change, please redo your edit:
" + for(var/key in diff) + message += "- [key]: [before[key]] => [after[key]]
" + message += "
" + to_chat(usr,message) + + var/original_type = holder.type + var/list/levels_working = GetConnectedZlevels(holder.z) + + var/list/types = list() + var/list/split = splittext("[original_type]", "/") + split -= "" // The first / creates an empty string at the start as it tries to split on [nothing]/mob/living etc + var/typestring = "/" + for(var/el in split) + typestring += el + + types += text2path(typestring) + typestring += "/" + + var/list/searching = living_mob_list // Started/seeded with this + var/list/choices = list() + for(var/typechoice in types) + var/list/found = list() + for(var/mob in searching) // Isnt't there a helper for this, maybe? I forget. + var/atom/M = mob + if(!(M.z in levels_working)) + continue + if(!istype(mob,typechoice)) + continue + found += M + choices["[typechoice] ([found.len])"] = found // Prettified name for the user input below) + searching = found // Now we only search the list we just made, because of the order of our types list, each subsequent list will be a subset of the one we just finished + + var/choice = input(usr,"Based on your AI holder's mob location, we'll edit mobs on Z [levels_working.Join(",")]. What types do you want to alter?") as null|anything in choices + if(!choice) + href_list["datumrefresh"] = "\ref[src]" + return + var/list/selected = choices[choice] + for(var/mob in selected) + var/mob/living/L = mob + if(!istype(L)) + to_chat(usr,"Skipping incompatible mob: [L] [ADMIN_COORDJMP(L)]") + continue + if(!L.ai_holder) + to_chat(usr,"Skipping due to no AI: [L] [ADMIN_COORDJMP(L)]") + continue + for(var/newvar in diff) + if(newvar in L.ai_holder.vars) + L.ai_holder.vars[newvar] = after[newvar] + else + to_chat(usr,"Skipping unavailable var '[newvar]' on: [L] [ADMIN_COORDJMP(L)]") + + to_chat(usr,"Mass AI edit done.") + href_list["datumrefresh"] = "\ref[src]" + /datum/ai_holder/New(var/new_holder) ASSERT(new_holder) holder = new_holder diff --git a/code/modules/ai/ai_holder_combat.dm b/code/modules/ai/ai_holder_combat.dm index 075a9196d8..e2e1ecbdea 100644 --- a/code/modules/ai/ai_holder_combat.dm +++ b/code/modules/ai/ai_holder_combat.dm @@ -9,7 +9,7 @@ var/violent_breakthrough = TRUE // If false, the AI is not allowed to destroy things like windows or other structures in the way. Requires above var to be true. var/stand_ground = FALSE // If true, the AI won't try to get closer to an enemy if out of range. - + // This does the actual attacking. /datum/ai_holder/proc/engage_target() ai_log("engage_target() : Entering.", AI_LOG_DEBUG) @@ -293,7 +293,7 @@ // Kill common obstacle in the way like tables. var/obj/structure/obstacle = locate(/obj/structure, problem_turf) - if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille)) + if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille) || istype(obstacle, /obj/effect/weaversilk/wall)) //VOREStation Edit: spdr ai_log("destroy_surroundings() : Attacking generic structure.", AI_LOG_INFO) return melee_attack(obstacle) diff --git a/code/modules/artifice/cursedform.dm b/code/modules/artifice/cursedform.dm index 17f8fbf618..43acac8bf3 100644 --- a/code/modules/artifice/cursedform.dm +++ b/code/modules/artifice/cursedform.dm @@ -2,7 +2,7 @@ name = "Form - Inventory Requisition r10.7.1E" /obj/item/weapon/paper/carbon/cursedform/Initialize() - ..() + . = ..() info = {"

Form - Inventory Requisition r10.7.1E

General Request Form


General


Name:
Department:
Departmental Rank:
Organization(If not Nanotrasen):
Date:



Requested Item(s):
Quantity:
Reason for request:
Is this replacement equipment?:
If `Yes`; above, specify equiment and reason for replacement:


Authorization


Authorizing Department:
Authorizing Dept. Head:


Contact and Delivery


EPv2 Address of requesting party(Do not leave blank):
Delivery location or department:


Nanotrasen Employee Identification Number:
Signature of Requester and Date





Authorizor`s Nanotrasen Employee Identification Number:
Authorizing Signature and Date(Include authorizing department`s stamp below)




Shipping Department Only

(Do not write below this line)

Nanotrasen Purchasing Approval Code:
Nanotrasen Employee Identification Number:
Receiving Shipping Employee:
Signature and Date


"} info_links = {"

Form - Inventory Requisition r10.7.1E

General Request Form


General


Name: write
Department: write
Departmental Rank: write
Organization(If not Nanotrasen): write
Date: write



Requested Item(s): write
Quantity: write
Reason for request: write
Is this replacement equipment?: write
If `Yes` above, specify equiment and reason for replacement: write


Authorization


Authorizing Department: write
Authorizing Dept. Head: write


Contact and Delivery


EPv2 Address of requesting party(Do not leave blank): write
Delivery location or department: write


Nanotrasen Employee Identification Number: write
Signature of Requester and Date

write



Authorizor`s Nanotrasen Employee Identification Number: write
Authorizing Signature and Date(Include authorizing department`s stamp below)

write


Shipping Department Only

(Do not write below this line)

Nanotrasen Purchasing Approval Code: write
Nanotrasen Employee Identification Number: write
Receiving Shipping Employee: write
Signature and Date

write
write"} diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 5344d4b15b..5a673280ce 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -3,7 +3,7 @@ desc = "A small electronic device able to ignite combustable substances." icon_state = "igniter" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10) secured = 1 wires = WIRE_RECEIVE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 853f2f230b..3a7952ecfe 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -5,7 +5,7 @@ desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted." icon_state = "infrared" origin_tech = list(TECH_MAGNET = 2) - matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "waste" = 100) + matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, MAT_COPPER = 10, "waste" = 100) wires = WIRE_PULSE diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index b292d3f753..de764c5011 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -3,7 +3,7 @@ desc = "Used for scanning and alerting when someone enters a certain proximity." icon_state = "prox" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50) + matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, MAT_COPPER = 10, "waste" = 50) wires = WIRE_PULSE secured = 0 diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index e98ff5372c..392a7efdfe 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -4,7 +4,7 @@ icon_state = "signaller" item_state = "signaler" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100) + matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, MAT_COPPER = 10, "waste" = 100) wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE secured = TRUE diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index fa8b783815..144a21bcd0 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -3,7 +3,7 @@ desc = "Used to time things. Works well with contraptions which has to count down. Tick tock." icon_state = "timer" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10) wires = WIRE_PULSE diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 8990e01d63..c608db5ff1 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -3,7 +3,7 @@ desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated." icon_state = "voice" origin_tech = list(TECH_MAGNET = 1) - matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10) + matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, MAT_COPPER = 10, "waste" = 10) var/listening = 0 var/recorded //the activation message diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm index 1c1d901161..530358940c 100644 --- a/code/modules/awaymissions/loot.dm +++ b/code/modules/awaymissions/loot.dm @@ -8,18 +8,14 @@ /obj/effect/spawner/lootdrop/Initialize() ..() var/list/things = params2list(loot) - if(things && things.len) for(var/i = lootcount, i > 0, i--) if(!things.len) return - var/loot_spawn = pick(things) var/loot_path = text2path(loot_spawn) - if(!loot_path || !lootdoubles) things.Remove(loot_spawn) continue - new loot_path(get_turf(src)) return INITIALIZE_HINT_QDEL diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index 6121bedb22..5c10eae367 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -26,6 +26,7 @@ var/datum/chatOutput/chatOutput var/datum/volume_panel/volume_panel = null // Initialized by /client/verb/volume_panel() var/chatOutputLoadedAt + var/seen_news = 0 var/adminhelped = 0 diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 7db4d9393a..e7946e833a 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -45,7 +45,6 @@ if( findtext(href,"> pref.colorblind_vulp S["colorblind_taj"] >> pref.colorblind_taj S["haemophilia"] >> pref.haemophilia //YWadd end + S["ear_style"] >> pref.ear_style + S["r_ears"] >> pref.r_ears + S["g_ears"] >> pref.g_ears + S["b_ears"] >> pref.b_ears + S["r_ears2"] >> pref.r_ears2 + S["g_ears2"] >> pref.g_ears2 + S["b_ears2"] >> pref.b_ears2 + S["r_ears3"] >> pref.r_ears3 + S["g_ears3"] >> pref.g_ears3 + S["b_ears3"] >> pref.b_ears3 + S["tail_style"] >> pref.tail_style + S["r_tail"] >> pref.r_tail + S["g_tail"] >> pref.g_tail + S["b_tail"] >> pref.b_tail + S["r_tail2"] >> pref.r_tail2 + S["g_tail2"] >> pref.g_tail2 + S["b_tail2"] >> pref.b_tail2 + S["r_tail3"] >> pref.r_tail3 + S["g_tail3"] >> pref.g_tail3 + S["b_tail3"] >> pref.b_tail3 + S["wing_style"] >> pref.wing_style + S["r_wing"] >> pref.r_wing + S["g_wing"] >> pref.g_wing + S["b_wing"] >> pref.b_wing + S["r_wing2"] >> pref.r_wing2 + S["g_wing2"] >> pref.g_wing2 + S["b_wing2"] >> pref.b_wing2 + S["r_wing3"] >> pref.r_wing3 + S["g_wing3"] >> pref.g_wing3 + S["b_wing3"] >> pref.b_wing3 /datum/category_item/player_setup_item/general/body/save_character(var/savefile/S) S["species"] << pref.species @@ -92,6 +153,36 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["colorblind_vulp"] << pref.colorblind_vulp S["colorblind_taj"] << pref.colorblind_taj S["haemophilia"] << pref.haemophilia //YWadd end + S["ear_style"] << pref.ear_style + S["r_ears"] << pref.r_ears + S["g_ears"] << pref.g_ears + S["b_ears"] << pref.b_ears + S["r_ears2"] << pref.r_ears2 + S["g_ears2"] << pref.g_ears2 + S["b_ears2"] << pref.b_ears2 + S["r_ears3"] << pref.r_ears3 + S["g_ears3"] << pref.g_ears3 + S["b_ears3"] << pref.b_ears3 + S["tail_style"] << pref.tail_style + S["r_tail"] << pref.r_tail + S["g_tail"] << pref.g_tail + S["b_tail"] << pref.b_tail + S["r_tail2"] << pref.r_tail2 + S["g_tail2"] << pref.g_tail2 + S["b_tail2"] << pref.b_tail2 + S["r_tail3"] << pref.r_tail3 + S["g_tail3"] << pref.g_tail3 + S["b_tail3"] << pref.b_tail3 + S["wing_style"] << pref.wing_style + S["r_wing"] << pref.r_wing + S["g_wing"] << pref.g_wing + S["b_wing"] << pref.b_wing + S["r_wing2"] << pref.r_wing2 + S["g_wing2"] << pref.g_wing2 + S["b_wing2"] << pref.b_wing2 + S["r_wing3"] << pref.r_wing3 + S["g_wing3"] << pref.g_wing3 + S["b_wing3"] << pref.b_wing3 /datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S) if(!pref.species || !(pref.species in GLOB.playable_species)) @@ -126,6 +217,49 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options)) pref.bgstate = "000" + pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears)) + pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears)) + pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears)) + pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2)) + pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2)) + pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2)) + pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3)) + pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3)) + pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3)) + pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail)) + pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail)) + pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail)) + pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2)) + pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2)) + pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2)) + pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3)) + pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3)) + pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3)) + pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing)) + pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing)) + pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing)) + pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2)) + pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2)) + pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2)) + pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3)) + pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3)) + pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3)) + if(pref.ear_style) + pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) + var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style] + if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed))) + pref.ear_style = initial(pref.ear_style) + if(pref.tail_style) + pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) + var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style] + if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed))) + pref.tail_style = initial(pref.tail_style) + if(pref.wing_style) + pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style)) + var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style] + if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed))) + pref.wing_style = initial(pref.wing_style) + // Moved from /datum/preferences/proc/copy_to() /datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character) // Copy basic values @@ -157,6 +291,38 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.g_synth = pref.g_synth character.b_synth = pref.b_synth character.synth_markings = pref.synth_markings + character.ear_style = ear_styles_list[pref.ear_style] + character.r_ears = pref.r_ears + character.b_ears = pref.b_ears + character.g_ears = pref.g_ears + character.r_ears2 = pref.r_ears2 + character.b_ears2 = pref.b_ears2 + character.g_ears2 = pref.g_ears2 + character.r_ears3 = pref.r_ears3 + character.b_ears3 = pref.b_ears3 + character.g_ears3 = pref.g_ears3 + character.tail_style = tail_styles_list[pref.tail_style] + character.r_tail = pref.r_tail + character.b_tail = pref.b_tail + character.g_tail = pref.g_tail + character.r_tail2 = pref.r_tail2 + character.b_tail2 = pref.b_tail2 + character.g_tail2 = pref.g_tail2 + character.r_tail3 = pref.r_tail3 + character.b_tail3 = pref.b_tail3 + character.g_tail3 = pref.g_tail3 + character.wing_style = wing_styles_list[pref.wing_style] + character.r_wing = pref.r_wing + character.b_wing = pref.b_wing + character.g_wing = pref.g_wing + character.r_wing2 = pref.r_wing2 + character.b_wing2 = pref.b_wing2 + character.g_wing2 = pref.g_wing2 + character.r_wing3 = pref.r_wing3 + character.b_wing3 = pref.b_wing3 + character.g_wing3 = pref.g_wing3 + character.set_gender( pref.biological_gender) + if(pref.species == "Grey")//YWadd START character.wingdings = pref.wingdings @@ -171,7 +337,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(pref.haemophilia == 1) character.add_modifier(/datum/modifier/trait/haemophilia) - //YWadd END + //YWadd END // Destroy/cyborgize organs and limbs. for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) @@ -384,6 +550,62 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
Body Color
" . += "Change Color [color_square(pref.r_skin, pref.g_skin, pref.b_skin)]
" + . += "

Genetics Settings

" + + var/ear_display = "Normal" + if(pref.ear_style && (pref.ear_style in ear_styles_list)) + var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] + ear_display = instance.name + + else if(pref.ear_style) + ear_display = "REQUIRES UPDATE" + . += "Ears
" + . += " Style: [ear_display]
" + if(ear_styles_list[pref.ear_style]) + var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] + if(ear.do_colouration) + . += "Change Color [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]
" + if(ear.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]
" + if(ear.extra_overlay2) + . += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
" + + var/tail_display = "Normal" + if(pref.tail_style && (pref.tail_style in tail_styles_list)) + var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] + tail_display = instance.name + else if(pref.tail_style) + tail_display = "REQUIRES UPDATE" + . += "Tail
" + . += " Style: [tail_display]
" + + if(tail_styles_list[pref.tail_style]) + var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] + if(T.do_colouration) + . += "Change Color [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]
" + if(T.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]
" + if(T.extra_overlay2) + . += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
" + + var/wing_display = "Normal" + if(pref.wing_style && (pref.wing_style in wing_styles_list)) + var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style] + wing_display = instance.name + else if(pref.wing_style) + wing_display = "REQUIRES UPDATE" + . += "Wing
" + . += " Style: [wing_display]
" + + if(wing_styles_list[pref.wing_style]) + var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style] + if(W.do_colouration) + . += "Change Color [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]
" + if(W.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]
" + if(W.extra_overlay2) + . += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
" + . += "
Body Markings +
" . += "
" for(var/M in pref.body_markings) @@ -912,8 +1134,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["cycle_bg"]) pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) return TOPIC_REFRESH_UPDATE_PREVIEW - + //YW Add Start + else if(href_list["wingdings"]) pref.wingdings = !pref.wingdings Disabilities_YW(usr) @@ -944,7 +1167,131 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O //YW Add End + else if(href_list["ear_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_ear_styles = list("Normal" = null) + for(var/path in ear_styles_list) + var/datum/sprite_accessory/ears/instance = ear_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_ear_styles[instance.name] = path + // Present choice to user + var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles + if(new_ear_style) + pref.ear_style = pretty_ear_styles[new_ear_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color"]) + var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference", + rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null + if(new_earc) + pref.r_ears = hex2num(copytext(new_earc, 2, 4)) + pref.g_ears = hex2num(copytext(new_earc, 4, 6)) + pref.b_ears = hex2num(copytext(new_earc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color2"]) + var/new_earc2 = input(user, "Choose your character's ear colour:", "Character Preference", + rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null + if(new_earc2) + pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4)) + pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6)) + pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color3"]) + var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference", + rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null + if(new_earc3) + pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4)) + pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6)) + pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_tail_styles = list("Normal" = null) + for(var/path in tail_styles_list) + var/datum/sprite_accessory/tail/instance = tail_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_tail_styles[instance.name] = path + + // Present choice to user + var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles + if(new_tail_style) + pref.tail_style = pretty_tail_styles[new_tail_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color"]) + var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference", + rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null + if(new_tailc) + pref.r_tail = hex2num(copytext(new_tailc, 2, 4)) + pref.g_tail = hex2num(copytext(new_tailc, 4, 6)) + pref.b_tail = hex2num(copytext(new_tailc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color2"]) + var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference", + rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null + if(new_tailc2) + pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4)) + pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6)) + pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color3"]) + var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference", + rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null + if(new_tailc3) + pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4)) + pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6)) + pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_wing_styles = list("Normal" = null) + for(var/path in wing_styles_list) + var/datum/sprite_accessory/wing/instance = wing_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_wing_styles[instance.name] = path + + // Present choice to user + var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles + if(new_wing_style) + pref.wing_style = pretty_wing_styles[new_wing_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color"]) + var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference", + rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null + if(new_wingc) + pref.r_wing = hex2num(copytext(new_wingc, 2, 4)) + pref.g_wing = hex2num(copytext(new_wingc, 4, 6)) + pref.b_wing = hex2num(copytext(new_wingc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color2"]) + var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference", + rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null + if(new_wingc2) + pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4)) + pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6)) + pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color3"]) + var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference", + rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null + if(new_wingc3) + pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4)) + pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6)) + pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() /datum/category_item/player_setup_item/general/body/proc/reset_limbs() diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm index 8d9206b64c..0c26ba6ae5 100644 --- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm +++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm @@ -1,3 +1,5 @@ +#define LOADOUT_BAN_STRING "Custom loadout" + /datum/gear_tweak/proc/get_contents(var/metadata) return @@ -165,7 +167,7 @@ var/datum/gear_tweak/custom_name/gear_tweak_free_name = new() return "" /datum/gear_tweak/custom_name/get_metadata(var/user, var/metadata) - if(jobban_isbanned(user, "Custom loadout")) + if(jobban_isbanned(user, LOADOUT_BAN_STRING)) to_chat(user, SPAN_WARNING("You are banned from using custom loadout names/descriptions.")) return if(valid_custom_names) @@ -196,7 +198,7 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new() return "" /datum/gear_tweak/custom_desc/get_metadata(var/user, var/metadata) - if(jobban_isbanned(user, "Custom loadout")) + if(jobban_isbanned(user, LOADOUT_BAN_STRING)) to_chat(user, SPAN_WARNING("You are banned from using custom loadout names/descriptions.")) return if(valid_custom_desc) @@ -507,3 +509,46 @@ var/datum/gear_tweak/custom_desc/gear_tweak_free_desc = new() var/t = ValidTeslaLinks[metadata[7]] I.tesla_link = new t(I) I.update_verbs() + +/datum/gear_tweak/implant_location + var/static/list/bodypart_names_to_tokens = list( + "head" = BP_HEAD, + "upper body" = BP_TORSO, + "lower body" = BP_GROIN, + "left hand" = BP_L_HAND, + "left arm" = BP_L_ARM, + "right hand" = BP_R_HAND, + "right arm" = BP_R_ARM, + "left foot" = BP_L_FOOT, + "left leg" = BP_L_LEG, + "right foot" = BP_R_FOOT, + "right leg" = BP_R_LEG + ) + var/static/list/bodypart_tokens_to_names = list( + BP_HEAD = "head", + BP_TORSO = "upper body", + BP_GROIN = "lower body", + BP_LEFT_HAND = "left hand", + BP_LEFT_ARM = "left arm", + BP_RIGHT_HAND = "right hand", + BP_RIGHT_ARM = "right arm", + BP_LEFT_FOOT = "left foot", + BP_LEFT_LEG = "left leg", + BP_RIGHT_FOOT = "right foot", + BP_RIGHT_LEG = "right leg" + ) + +/datum/gear_tweak/implant_location/get_default() + return bodypart_names_to_tokens[1] + +/datum/gear_tweak/implant_location/tweak_item(var/obj/item/weapon/implant/I, var/metadata) + if(istype(I)) + I.initialize_loc = bodypart_names_to_tokens[metadata] || BP_TORSO + +/datum/gear_tweak/implant_location/get_contents(var/metadata) + return "Location: [metadata]" + +/datum/gear_tweak/implant_location/get_metadata(var/user, var/metadata) + return (input(user, "Select a bodypart for the implant to be implanted inside.", "Implant Location", metadata || "upper body") as null|anything in bodypart_names_to_tokens) || bodypart_tokens_to_names[BP_TORSO] + +#undef LOADOUT_BAN_STRING \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_cyberware.dm b/code/modules/client/preference_setup/loadout/loadout_cyberware.dm new file mode 100644 index 0000000000..2540e86fc8 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_cyberware.dm @@ -0,0 +1,56 @@ +/datum/gear/utility/implant + display_name = "implant, neural assistance web" + description = "A complex web implanted into the subject, medically in order to compensate for neurological disease." + path = /obj/item/weapon/implant/neural + slot = "implant" + exploitable = 1 + sort_category = "Cyberware" + cost = 6 + +/datum/gear/utility/implant/tracking + display_name = "implant, tracking" + path = /obj/item/weapon/implant/tracking/weak + cost = 0 //VOREStation Edit. Changed cost to 0 + +// Remove these after generic implant has been in for awhile and everyone has had a reasonable period to copy their old descs. +/datum/gear/utility/implant/dud1 + display_name = "implant, head" + description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)." + path = /obj/item/weapon/implant/dud + cost = 1 +/datum/gear/utility/implant/dud2 + display_name = "implant, torso" + description = "An implant with no obvious purpose (DEPRECATED, USE GENERIC IMPLANT)." + path = /obj/item/weapon/implant/dud/torso + cost = 1 +// End removal marker. + +/datum/gear/utility/implant/generic + display_name = "implant, generic, primary" + description = "An implant with no obvious purpose." + path = /obj/item/weapon/implant + cost = 1 + +/datum/gear/utility/implant/generic/second + display_name = "implant, generic, secondary" + +/datum/gear/utility/implant/generic/third + display_name = "implant, generic, tertiary" + +/datum/gear/utility/implant/generic/New() + ..() + gear_tweaks += global.gear_tweak_implant_location + +/datum/gear/utility/implant/language + cost = 2 + exploitable = 0 + +/datum/gear/utility/implant/language/eal + display_name = "vocal synthesizer, EAL" + description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it." + path = /obj/item/weapon/implant/language/eal + +/datum/gear/utility/implant/language/skrellian + display_name = "vocal synthesizer, Skrellian" + description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it." + path = /obj/item/weapon/implant/language/skrellian diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 63f5749c2b..5abadc042f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -29,7 +29,7 @@ // 0-9 CKEYS /datum/gear/fluff/malady_crop - path = /obj/item/weapon/material/twohanded/fluff/riding_crop/malady + path = /obj/item/weapon/material/twohanded/riding_crop/malady display_name = "Malady's Crop" ckeywhitelist = list("1r1s") character_name = list("Malady Blanche") @@ -506,7 +506,7 @@ character_name = list("Ketrai") /datum/gear/fluff/amaya_id - path = /obj/item/weapon/card/id/fluff/amaya + path = /obj/item/weapon/card/id/event/fluff/amaya display_name = "Amaya's ID" ckeywhitelist = list("kiraalitruss") character_name = list("Amaya Rahl") @@ -1046,6 +1046,12 @@ ckeywhitelist = list("vitoras") character_name = list("Roanna Ti'Rox") +/datum/gear/fluff/harmony_id + path = /obj/item/weapon/card/id/event/polymorphic/itg + display_name = "Harmony's ITG-ID card" + ckeywhitelist = list("verysoft") + character_name = list("Harmony") + // W CKEYS /datum/gear/fluff/sthasha_bracer path = /obj/item/clothing/accessory/bracer/fluff/xander_sthasha diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 14f78b6e91..ee161f598d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -88,6 +88,11 @@ display_name = "cap, grey" path = /obj/item/clothing/head/soft/grey +/datum/gear/head/cap/med + display_name = "cap, medical (Medical)" + path = /obj/item/clothing/head/soft/med + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Search and Rescue") + /datum/gear/head/cap/orange display_name = "cap, orange" path = /obj/item/clothing/head/soft/orange @@ -330,7 +335,7 @@ path = /obj/item/clothing/head/welding/engie /datum/gear/head/beret/solgov - display_name = "beret sol, selection" + display_name = "beret government, selection" path = /obj/item/clothing/head/beret/solgov /datum/gear/head/beret/solgov/New() @@ -386,4 +391,8 @@ /datum/gear/head/blackngoldheaddress display_name = "black and gold headdress" - path = /obj/item/clothing/head/blackngoldheaddress \ No newline at end of file + path = /obj/item/clothing/head/blackngoldheaddress + +/datum/gear/head/plaguedoctor2 + display_name = "golden plague doctor's hat" + path = /obj/item/clothing/head/plaguedoctorhat/gold \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_mask.dm b/code/modules/client/preference_setup/loadout/loadout_mask.dm index 716cdb4268..5de81409f3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_mask.dm +++ b/code/modules/client/preference_setup/loadout/loadout_mask.dm @@ -24,4 +24,9 @@ /datum/gear/mask/veil display_name = "black veil" - path = /obj/item/clothing/mask/veil \ No newline at end of file + path = /obj/item/clothing/mask/veil + +/datum/gear/mask/plaguedoctor2 + display_name = "golden plague doctor's mask" + path = /obj/item/clothing/mask/gas/plaguedoctor/gold + cost = 3 ///Because it functions as a gas mask, and therefore has a mechanical advantage. \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index decfe8199d..aaa47d1b72 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -175,6 +175,10 @@ datum/gear/suit/duster path = /obj/item/clothing/suit/storage/toggle/labcoat/emt allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist") +/datum/gear/suit/miscellaneous/labcoat + display_name = "plague doctor's coat" + path = /obj/item/clothing/suit/storage/toggle/labcoat/plaguedoctor + /datum/gear/suit/roles/surgical_apron display_name = "surgical apron" path = /obj/item/clothing/suit/surgicalapron diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm index aa158a1aaa..a61b2f7e0a 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm @@ -71,4 +71,14 @@ //greek thing /datum/gear/suit/chiton display_name = "chiton" - path = /obj/item/clothing/suit/chiton \ No newline at end of file + path = /obj/item/clothing/suit/chiton + + +//oversized t-shirt +/datum/gear/suit/oversize + display_name = "oversized t-shirt (colorable)" + path = /obj/item/clothing/suit/oversize + +/datum/gear/suit/oversize/New() + ..() + gear_tweaks += gear_tweak_free_color_choice \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index aa6ae67d3e..4d9e530992 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -644,4 +644,16 @@ /datum/gear/uniform/gothic2 display_name = "lacey gothic dress" - path = /obj/item/clothing/under/dress/gothic2 \ No newline at end of file + path = /obj/item/clothing/under/dress/gothic2 + +/datum/gear/uniform/flowerskirt + display_name = "flower skirt" + path = /obj/item/clothing/under/flower_skirt + +/datum/gear/uniform/flowerskirt/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/uniform/countess + display_name = "countess dress" + path = /obj/item/clothing/under/dress/countess \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index 7c1f855841..2ea5713655 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -216,3 +216,11 @@ Qipao /datum/gear/uniform/qipao_white display_name = "qipao, white" path = /obj/item/clothing/under/dress/qipao/white + +/* +Bluespace jumpsuit +*/ +/datum/gear/uniform/hfjumpsuit + display_name = "HYPER jumpsuit" + path = /obj/item/clothing/under/hyperfiber + cost = 2 \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_yw.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_yw.dm index b635994995..13497a5275 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_yw.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_yw.dm @@ -39,4 +39,4 @@ description = "A lightweight uniform intended for vehicle and powersuit operators, designed to allow free movement and maximum comfort in hot, cramped cockpits. Comes prefitted with a harness and webbing for gear." path = /obj/item/clothing/under/rank/khi/sec/pilot cost = 2 //base cost 1 + accessory 1 - allowed_roles = list("Security Pilot") \ No newline at end of file + allowed_roles = list("Pilot","Security Pilot") //CHOMPEDIT: Adding this to pilots as well diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 4b8eb45819..4798a4b994 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -115,60 +115,10 @@ display_name = "cell, device" path = /obj/item/weapon/cell/device -/datum/gear/utility/implant - slot = "implant" - exploitable = 1 - -/datum/gear/utility/implant/tracking - display_name = "implant, tracking" - path = /obj/item/weapon/implant/tracking/weak - cost = 0 //VOREStation Edit. Changed cost to 0 - -/datum/gear/utility/implant/neural - display_name = "implant, neural assistance web" - description = "A complex web implanted into the subject, medically in order to compensate for neurological disease." - path = /obj/item/weapon/implant/neural - cost = 6 - -/datum/gear/utility/implant/dud1 - display_name = "implant, head" - description = "An implant with no obvious purpose." - path = /obj/item/weapon/implant/dud - cost = 1 - -/datum/gear/utility/implant/dud2 - display_name = "implant, torso" - description = "An implant with no obvious purpose." - path = /obj/item/weapon/implant/dud/torso - cost = 1 - -/datum/gear/utility/implant/language - cost = 2 - exploitable = 0 - -/datum/gear/utility/implant/language/eal - display_name = "vocal synthesizer, EAL" - description = "A surgically implanted vocal synthesizer which allows the owner to speak EAL, if they know it." - path = /obj/item/weapon/implant/language/eal - -/datum/gear/utility/implant/language/skrellian - display_name = "vocal synthesizer, Skrellian" - description = "A surgically implanted vocal synthesizer which allows the owner to speak Common Skrellian, if they know it." - path = /obj/item/weapon/implant/language/skrellian - /datum/gear/utility/pen display_name = "Fountain Pen" path = /obj/item/weapon/pen/fountain -/datum/gear/utility/wheelchair/color - display_name = "wheelchair" - path = /obj/item/wheelchair - cost = 4 - -/datum/gear/utility/wheelchair/color/New() - ..() - gear_tweaks += gear_tweak_free_color_choice - /datum/gear/utility/umbrella display_name = "Umbrella" path = /obj/item/weapon/melee/umbrella @@ -178,6 +128,20 @@ ..() gear_tweaks += gear_tweak_free_color_choice +/datum/gear/utility/wheelchair + display_name = "wheelchair selection" + path = /obj/item/wheelchair + cost = 4 + +/datum/gear/utility/wheelchair/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + var/list/wheelchairs = list( + "wheelchair" = /obj/item/wheelchair, + "motorized wheelchair" = /obj/item/wheelchair/motor + ) + gear_tweaks += new/datum/gear_tweak/path(wheelchairs) + /**************** modular computers ****************/ diff --git a/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm b/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm index d37f929e48..8fd7fa081d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility_vr.dm @@ -55,3 +55,8 @@ display_name = "science dufflebag" path = /obj/item/weapon/storage/backpack/dufflebag/sci allowed_roles = list("Research Director","Scientist","Roboticist","Xenobiologist","Xenobotanist","Explorer","Pathfinder") + +/datum/gear/utility/ID + display_name = "contractor identification card" + path = /obj/item/weapon/card/id/event/polymorphic/altcard + cost = 1 diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index f2996bed5b..d402fd4c4e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -94,43 +94,43 @@ /datum/gear/uniform/smock display_name = "smock selection (Teshari)" - path = /obj/item/clothing/under/seromi/smock + path = /obj/item/clothing/under/teshari/smock whitelisted = SPECIES_TESHARI sort_category = "Xenowear" /datum/gear/uniform/smock/New() ..() var/list/smocks = list() - for(var/smock in typesof(/obj/item/clothing/under/seromi/smock)) - var/obj/item/clothing/under/seromi/smock/smock_type = smock + for(var/smock in typesof(/obj/item/clothing/under/teshari/smock)) + var/obj/item/clothing/under/teshari/smock/smock_type = smock smocks[initial(smock_type.name)] = smock_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(smocks)) /datum/gear/uniform/undercoat display_name = "undercoat selection (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/standard + path = /obj/item/clothing/under/teshari/undercoat/standard whitelisted = SPECIES_TESHARI sort_category = "Xenowear" /datum/gear/uniform/undercoat/New() ..() var/list/undercoats = list() - for(var/undercoat in typesof(/obj/item/clothing/under/seromi/undercoat/standard)) - var/obj/item/clothing/under/seromi/undercoat/standard/undercoat_type = undercoat + for(var/undercoat in typesof(/obj/item/clothing/under/teshari/undercoat/standard)) + var/obj/item/clothing/under/teshari/undercoat/standard/undercoat_type = undercoat undercoats[initial(undercoat_type.name)] = undercoat_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(undercoats)) /datum/gear/suit/cloak display_name = "cloak selection (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/standard + path = /obj/item/clothing/suit/storage/teshari/cloak/standard whitelisted = SPECIES_TESHARI sort_category = "Xenowear" /datum/gear/suit/cloak/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/standard)) - var/obj/item/clothing/suit/storage/seromi/cloak/standard/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/standard)) + var/obj/item/clothing/suit/storage/teshari/cloak/standard/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) @@ -168,107 +168,107 @@ /datum/gear/uniform/dept/undercoat/cap display_name = "facility director undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/cap + path = /obj/item/clothing/under/teshari/undercoat/jobs/cap allowed_roles = list("Facility Director") /datum/gear/uniform/dept/undercoat/hop display_name = "head of personnel undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/hop + path = /obj/item/clothing/under/teshari/undercoat/jobs/hop allowed_roles = list("Head of Personnel") /datum/gear/uniform/dept/undercoat/rd display_name = "research director undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/rd + path = /obj/item/clothing/under/teshari/undercoat/jobs/rd allowed_roles = list("Research Director") /datum/gear/uniform/dept/undercoat/hos display_name = "head of security undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/hos + path = /obj/item/clothing/under/teshari/undercoat/jobs/hos allowed_roles = list("Head of Security") /datum/gear/uniform/dept/undercoat/ce display_name = "chief engineer undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/ce + path = /obj/item/clothing/under/teshari/undercoat/jobs/ce allowed_roles = list("Chief Engineer") /datum/gear/uniform/dept/undercoat/cmo display_name = "chief medical officer undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/cmo + path = /obj/item/clothing/under/teshari/undercoat/jobs/cmo allowed_roles = list("Chief Medical Officer") /datum/gear/uniform/dept/undercoat/qm display_name = "quartermaster undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/qm + path = /obj/item/clothing/under/teshari/undercoat/jobs/qm allowed_roles = list("Quartermaster") /datum/gear/uniform/dept/undercoat/cargo display_name = "cargo undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/cargo + path = /obj/item/clothing/under/teshari/undercoat/jobs/cargo allowed_roles = list("Cargo Technician","Quartermaster","Shaft Miner") /datum/gear/uniform/dept/undercoat/mining display_name = "mining undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/mining + path = /obj/item/clothing/under/teshari/undercoat/jobs/mining allowed_roles = list("Quartermaster","Shaft Miner") /datum/gear/uniform/dept/undercoat/security display_name = "security undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/sec + path = /obj/item/clothing/under/teshari/undercoat/jobs/sec allowed_roles = list("Head of Security","Detective","Warden","Security Officer","Security Pilot")//YW ADDITIONS /datum/gear/uniform/dept/undercoat/service display_name = "service undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/service + path = /obj/item/clothing/under/teshari/undercoat/jobs/service allowed_roles = list("Head of Personnel","Bartender","Botanist","Janitor","Chef","Librarian","Chaplain") /datum/gear/uniform/dept/undercoat/engineer display_name = "engineering undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/engineer + path = /obj/item/clothing/under/teshari/undercoat/jobs/engineer allowed_roles = list("Chief Engineer","Station Engineer") /datum/gear/uniform/dept/undercoat/atmos display_name = "atmospherics undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/atmos + path = /obj/item/clothing/under/teshari/undercoat/jobs/atmos allowed_roles = list("Chief Engineer","Atmospheric Technician") /datum/gear/uniform/dept/undercoat/research display_name = "scientist undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/sci + path = /obj/item/clothing/under/teshari/undercoat/jobs/sci allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist") /datum/gear/uniform/dept/undercoat/robo display_name = "roboticist undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/robo + path = /obj/item/clothing/under/teshari/undercoat/jobs/robo allowed_roles = list("Research Director","Roboticist") /datum/gear/uniform/dept/undercoat/medical display_name = "medical undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/medical + path = /obj/item/clothing/under/teshari/undercoat/jobs/medical allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Psychiatrist") /datum/gear/uniform/dept/undercoat/chemistry display_name = "chemist undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/chemistry + path = /obj/item/clothing/under/teshari/undercoat/jobs/chemistry allowed_roles = list("Chief Medical Officer","Chemist") /datum/gear/uniform/dept/undercoat/virology display_name = "virologist undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/viro + path = /obj/item/clothing/under/teshari/undercoat/jobs/viro allowed_roles = list("Chief Medical Officer","Medical Doctor") /datum/gear/uniform/dept/undercoat/psych display_name = "psychiatrist undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/psych + path = /obj/item/clothing/under/teshari/undercoat/jobs/psych allowed_roles = list("Chief Medical Officer","Psychiatrist") /datum/gear/uniform/dept/undercoat/paramedic display_name = "paramedic undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/para + path = /obj/item/clothing/under/teshari/undercoat/jobs/para allowed_roles = list("Chief Medical Officer","Paramedic") /datum/gear/uniform/dept/undercoat/iaa display_name = "internal affairs undercoat (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/jobs/iaa + path = /obj/item/clothing/under/teshari/undercoat/jobs/iaa allowed_roles = list("Internal Affairs Agent") /datum/gear/suit/dept/cloak @@ -277,248 +277,248 @@ /datum/gear/suit/dept/cloak/cap display_name = "facility director cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs allowed_roles = list("Facility Director") /datum/gear/suit/dept/cloak/hop display_name = "head of personnel cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/hop + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/hop allowed_roles = list("Head of Personnel") /datum/gear/suit/dept/cloak/rd display_name = "research director cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/rd + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/rd allowed_roles = list("Research Director") /datum/gear/suit/dept/cloak/hos display_name = "head of security cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/hos + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/hos allowed_roles = list("Head of Security") /datum/gear/suit/dept/cloak/hos/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/hos,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/hos)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/hos,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/hos)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/cloak/dept/ce display_name = "chief engineer cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/ce + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/ce allowed_roles = list("Chief Engineer") /datum/gear/suit/dept/cloak/ce/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/ce,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/ce)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/ce,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/ce)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/cmo display_name = "chief medical officer cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/cmo + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/cmo allowed_roles = list("Chief Medical Officer") /datum/gear/suit/dept/cloak/cmo/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/cmo,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cmo)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/cmo,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cmo)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/qm display_name = "quartermaster cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/qm + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/qm allowed_roles = list("Chief Medical Officer") /datum/gear/suit/dept/cloak/qm/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/qm,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/qm)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/qm,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/qm)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/cargo display_name = "cargo cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/cargo + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/cargo allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician") /datum/gear/suit/dept/cloak/cargo/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/cargo,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cargo)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/cargo,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cargo)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/mining display_name = "mining cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/mining + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/mining allowed_roles = list("Quartermaster","Shaft Miner") /datum/gear/suit/dept/cloak/mining/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/mining,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/mining)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/mining,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/mining)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/security display_name = "security cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/sec + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/sec allowed_roles = list("Head of Security","Detective","Warden","Security Officer","Security Pilot")//YW ADDITIONS /datum/gear/suit/dept/cloak/security/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/sec,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/sec)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/sec,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/sec)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/service display_name = "service cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/service + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/service allowed_roles = list("Head of Personnel","Bartender","Botanist","Janitor","Chef","Librarian","Chaplain") /datum/gear/suit/dept/cloak/service/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/service,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/service)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/service,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/service)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/engineer display_name = "engineering cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/engineer + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/engineer allowed_roles = list("Chief Engineer","Station Engineer") /datum/gear/suit/dept/cloak/engineer/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/engineer,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/engineer)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/engineer,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/engineer)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/atmos display_name = "atmospherics cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/atmos + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/atmos allowed_roles = list("Chief Engineer","Atmospheric Technician") /datum/gear/suit/dept/cloak/atmos/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/atmos,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/atmos)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/atmos,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/atmos)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/research display_name = "scientist cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/sci + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/sci allowed_roles = list("Research Director","Scientist","Roboticist","Xenobiologist") /datum/gear/suit/dept/cloak/research/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/sci,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/sci)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/sci,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/sci)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/robo display_name = "roboticist cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/robo + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/robo allowed_roles = list("Research Director","Roboticist") /datum/gear/suit/dept/cloak/robo/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/robo,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/robo)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/robo,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/robo)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/medical display_name = "medical cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/medical + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/medical allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist", "Psychiatrist") /datum/gear/suit/dept/cloak/medical/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/medical,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/medical)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/medical,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/medical)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/chemistry display_name = "chemist cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/chemistry + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/chemistry allowed_roles = list("Chemist") /datum/gear/suit/dept/cloak/chemistry/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/chemistry,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/chemistry)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/chemistry,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/chemistry)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/virology display_name = "virologist cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/viro + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/viro allowed_roles = list("Medical Doctor") /datum/gear/suit/dept/cloak/virology/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/viro,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/viro)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/viro,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/viro)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/psych display_name = "psychiatrist cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/psych + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/psych allowed_roles = list("Chief Medical Officer","Psychiatrist") /datum/gear/suit/dept/cloak/paramedic display_name = "paramedic cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/para + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/para allowed_roles = list("Chief Medical Officer","Paramedic") /datum/gear/suit/dept/cloak/paramedic/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/para,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/para)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/para,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/para)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/dept/cloak/iaa display_name = "internal affairs cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/iaa + path = /obj/item/clothing/suit/storage/teshari/cloak/jobs/iaa allowed_roles = list("Internal Affairs Agent") /datum/gear/suit/dept/cloak/iaa/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/cloak/jobs/iaa,/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/iaa)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/cloak/jobs/iaa,/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/iaa)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/uniform/smockcolor display_name = "smock, recolorable (Teshari)" - path = /obj/item/clothing/under/seromi/smock/white + path = /obj/item/clothing/under/teshari/smock/white whitelisted = SPECIES_TESHARI sort_category = "Xenowear" @@ -528,21 +528,21 @@ /datum/gear/suit/beltcloak display_name = "belted cloak selection (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/beltcloak/standard + path = /obj/item/clothing/suit/storage/teshari/beltcloak/standard whitelisted = SPECIES_TESHARI sort_category = "Xenowear" /datum/gear/suit/beltcloak/New() ..() var/list/cloaks = list() - for(var/cloak in typesof(/obj/item/clothing/suit/storage/seromi/beltcloak/standard)) - var/obj/item/clothing/suit/storage/seromi/beltcloak/standard/cloak_type = cloak + for(var/cloak in typesof(/obj/item/clothing/suit/storage/teshari/beltcloak/standard)) + var/obj/item/clothing/suit/storage/teshari/beltcloak/standard/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/suit/beltcloak_color display_name = "belted cloak, recolorable (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/beltcloak/standard/white_grey + path = /obj/item/clothing/suit/storage/teshari/beltcloak/standard/white_grey whitelisted = SPECIES_TESHARI sort_category = "Xenowear" @@ -552,17 +552,17 @@ /datum/gear/suit/dept/beltcloak/wrdn display_name = "warden belted cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/beltcloak/jobs/wrdn + path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/wrdn allowed_roles = list("Head of Security","Warden") /datum/gear/suit/dept/beltcloak/jani display_name = "janitor belted cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/beltcloak/jobs/jani + path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/jani allowed_roles = list("Janitor") /datum/gear/suit/dept/beltcloak/cmd display_name = "command belted cloak (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/beltcloak/jobs/command + path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/command allowed_roles = list("Site Manager","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director") /datum/gear/suit/cloak_hood @@ -575,27 +575,27 @@ ..() var/list/cloaks = list() for(var/cloak in typesof(/obj/item/clothing/suit/storage/hooded/teshari/standard)) - var/obj/item/clothing/suit/storage/seromi/cloak/cloak_type = cloak + var/obj/item/clothing/suit/storage/teshari/cloak/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) /datum/gear/uniform/worksuit display_name = "worksuit selection (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/standard/worksuit + path = /obj/item/clothing/under/teshari/undercoat/standard/worksuit whitelisted = SPECIES_TESHARI sort_category = "Xenowear" /datum/gear/uniform/worksuit/New() ..() var/list/worksuits = list() - for(var/worksuit in typesof(/obj/item/clothing/under/seromi/undercoat/standard/worksuit)) - var/obj/item/clothing/under/seromi/undercoat/standard/worksuit/worksuit_type = worksuit + for(var/worksuit in typesof(/obj/item/clothing/under/teshari/undercoat/standard/worksuit)) + var/obj/item/clothing/under/teshari/undercoat/standard/worksuit/worksuit_type = worksuit worksuits[initial(worksuit_type.name)] = worksuit_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(worksuits)) /datum/gear/uniform/undercoatcolor display_name = "undercoat, recolorable (Teshari)" - path = /obj/item/clothing/under/seromi/undercoat/standard/white_grey + path = /obj/item/clothing/under/teshari/undercoat/standard/white_grey whitelisted = SPECIES_TESHARI sort_category = "Xenowear" @@ -605,7 +605,7 @@ /datum/gear/suit/cloakcolor display_name = "cloak, recolorable (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey + path = /obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey whitelisted = SPECIES_TESHARI sort_category = "Xenowear" @@ -670,3 +670,10 @@ path = /obj/item/clothing/glasses/aerogelgoggles whitelisted = SPECIES_TESHARI sort_category = "Xenowear" + +/datum/gear/utility/teshchair + display_name = "small electric wheelchair (Teshari)" + path = /obj/item/wheelchair/motor/small + whitelisted = SPECIES_TESHARI + sort_category = "Xenowear" + cost = 4 diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno_ch.dm b/code/modules/client/preference_setup/loadout/loadout_xeno_ch.dm index b7cc25c227..6ec1f68fa7 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno_ch.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno_ch.dm @@ -1,6 +1,6 @@ /datum/gear/suit/hood display_name = "hooded cloak selection (Teshari)" - path = /obj/item/clothing/suit/storage/seromi/cloak/standard + path = /obj/item/clothing/suit/storage/teshari/cloak/standard whitelisted = SPECIES_TESHARI sort_category = "Xenowear" @@ -8,7 +8,7 @@ ..() var/list/cloaks = list() for(var/cloak in typesof(/obj/item/clothing/suit/storage/hooded/teshari/standard)) - var/obj/item/clothing/suit/storage/seromi/cloak/cloak_type = cloak + var/obj/item/clothing/suit/storage/teshari/cloak/cloak_type = cloak cloaks[initial(cloak_type.name)] = cloak_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cloaks)) diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index d0157420f4..06d1547506 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -153,6 +153,9 @@ var/available_in_hours = job.available_in_playhours(user.client) . += "[rank]" continue + if(!is_job_whitelisted(user,rank)) + . += "[rank]" + continue //VOREStation Add End if(job.minimum_character_age && user.client && (user.client.prefs.age < job.minimum_character_age)) . += "[rank]" diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 638768ae9e..aaec0a0840 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -299,7 +299,3 @@ if(PREF_FBP_SOFTWARE) return 150 return S.max_age // welp - -/datum/category_item/player_setup_item/proc/color_square(red, green, blue, hex) - var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]" - return "___" \ No newline at end of file diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm index 8ad3ff9253..9eb4793b5e 100644 --- a/code/modules/client/preference_setup/traits/trait_defines.dm +++ b/code/modules/client/preference_setup/traits/trait_defines.dm @@ -23,7 +23,8 @@ // Physical traits are what they sound like, and involve the character's physical body, as opposed to their mental state. /datum/trait/modifier/physical - category = "Physical Quirks" //VOREStation Edit + name = "Physical" + category = "Physical" /datum/trait/modifier/physical/flimsy @@ -194,6 +195,7 @@ // 'Mental' traits are just those that only sapients can have, for now, and generally involves fears. // So far, all of them are just for fluff/don't have mechanical effects. /datum/trait/modifier/mental + name = "Mental" category = "Mental" /datum/trait/modifier/mental/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup) diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm index dea5be0479..c9998dece0 100644 --- a/code/modules/client/preference_setup/vore/01_ears.dm +++ b/code/modules/client/preference_setup/vore/01_ears.dm @@ -3,373 +3,3 @@ name = "VORE" sort_order = 8 category_item_type = /datum/category_item/player_setup_item/vore - -// Define a place to save appearance in character setup -/datum/preferences - var/ear_style // Type of selected ear style - var/r_ears = 30 // Ear color. - var/g_ears = 30 // Ear color - var/b_ears = 30 // Ear color - var/r_ears2 = 30 // Ear extra color. - var/g_ears2 = 30 // Ear extra color - var/b_ears2 = 30 // Ear extra color - var/r_ears3 = 30 // Ear tertiary color. - var/g_ears3 = 30 // Ear tertiary color - var/b_ears3 = 30 // Ear tertiary color - var/tail_style // Type of selected tail style - var/r_tail = 30 // Tail/Taur color - var/g_tail = 30 // Tail/Taur color - var/b_tail = 30 // Tail/Taur color - var/r_tail2 = 30 // For extra overlay. - var/g_tail2 = 30 // For extra overlay. - var/b_tail2 = 30 // For extra overlay. - var/r_tail3 = 30 // For tertiary overlay. - var/g_tail3 = 30 // For tertiary overlay. - var/b_tail3 = 30 // For tertiary overlay. - var/wing_style // Type of selected wing style - var/r_wing = 30 // Wing color - var/g_wing = 30 // Wing color - var/b_wing = 30 // Wing color - var/r_wing2 = 30 // Wing extra color - var/g_wing2 = 30 // Wing extra color - var/b_wing2 = 30 // Wing extra color - var/r_wing3 = 30 // Wing tertiary color - var/g_wing3 = 30 // Wing tertiary color - var/b_wing3 = 30 // Wing tertiary color - -// Definition of the stuff for Ears -/datum/category_item/player_setup_item/vore/ears - name = "Appearance" - sort_order = 1 - -/datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S) - S["ear_style"] >> pref.ear_style - S["r_ears"] >> pref.r_ears - S["g_ears"] >> pref.g_ears - S["b_ears"] >> pref.b_ears - S["r_ears2"] >> pref.r_ears2 - S["g_ears2"] >> pref.g_ears2 - S["b_ears2"] >> pref.b_ears2 - S["r_ears3"] >> pref.r_ears3 - S["g_ears3"] >> pref.g_ears3 - S["b_ears3"] >> pref.b_ears3 - S["tail_style"] >> pref.tail_style - S["r_tail"] >> pref.r_tail - S["g_tail"] >> pref.g_tail - S["b_tail"] >> pref.b_tail - S["r_tail2"] >> pref.r_tail2 - S["g_tail2"] >> pref.g_tail2 - S["b_tail2"] >> pref.b_tail2 - S["r_tail3"] >> pref.r_tail3 - S["g_tail3"] >> pref.g_tail3 - S["b_tail3"] >> pref.b_tail3 - S["wing_style"] >> pref.wing_style - S["r_wing"] >> pref.r_wing - S["g_wing"] >> pref.g_wing - S["b_wing"] >> pref.b_wing - S["r_wing2"] >> pref.r_wing2 - S["g_wing2"] >> pref.g_wing2 - S["b_wing2"] >> pref.b_wing2 - S["r_wing3"] >> pref.r_wing3 - S["g_wing3"] >> pref.g_wing3 - S["b_wing3"] >> pref.b_wing3 - -/datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S) - S["ear_style"] << pref.ear_style - S["r_ears"] << pref.r_ears - S["g_ears"] << pref.g_ears - S["b_ears"] << pref.b_ears - S["r_ears2"] << pref.r_ears2 - S["g_ears2"] << pref.g_ears2 - S["b_ears2"] << pref.b_ears2 - S["r_ears3"] << pref.r_ears3 - S["g_ears3"] << pref.g_ears3 - S["b_ears3"] << pref.b_ears3 - S["tail_style"] << pref.tail_style - S["r_tail"] << pref.r_tail - S["g_tail"] << pref.g_tail - S["b_tail"] << pref.b_tail - S["r_tail2"] << pref.r_tail2 - S["g_tail2"] << pref.g_tail2 - S["b_tail2"] << pref.b_tail2 - S["r_tail3"] << pref.r_tail3 - S["g_tail3"] << pref.g_tail3 - S["b_tail3"] << pref.b_tail3 - S["wing_style"] << pref.wing_style - S["r_wing"] << pref.r_wing - S["g_wing"] << pref.g_wing - S["b_wing"] << pref.b_wing - S["r_wing2"] << pref.r_wing2 - S["g_wing2"] << pref.g_wing2 - S["b_wing2"] << pref.b_wing2 - S["r_wing3"] << pref.r_wing3 - S["g_wing3"] << pref.g_wing3 - S["b_wing3"] << pref.b_wing3 - -/datum/category_item/player_setup_item/vore/ears/sanitize_character() - pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears)) - pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears)) - pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears)) - pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2)) - pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2)) - pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2)) - pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3)) - pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3)) - pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3)) - pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail)) - pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail)) - pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail)) - pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2)) - pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2)) - pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2)) - pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3)) - pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3)) - pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3)) - pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing)) - pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing)) - pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing)) - pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2)) - pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2)) - pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2)) - pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3)) - pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3)) - pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3)) - - if(pref.ear_style) - pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) - var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style] - if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed))) - pref.ear_style = initial(pref.ear_style) - if(pref.tail_style) - pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) - var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style] - if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed))) - pref.tail_style = initial(pref.tail_style) - if(pref.wing_style) - pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style)) - var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style] - if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed))) - pref.wing_style = initial(pref.wing_style) - -/datum/category_item/player_setup_item/vore/ears/copy_to_mob(var/mob/living/carbon/human/character) - character.ear_style = ear_styles_list[pref.ear_style] - character.r_ears = pref.r_ears - character.b_ears = pref.b_ears - character.g_ears = pref.g_ears - character.r_ears2 = pref.r_ears2 - character.b_ears2 = pref.b_ears2 - character.g_ears2 = pref.g_ears2 - character.r_ears3 = pref.r_ears3 - character.b_ears3 = pref.b_ears3 - character.g_ears3 = pref.g_ears3 - character.tail_style = tail_styles_list[pref.tail_style] - character.r_tail = pref.r_tail - character.b_tail = pref.b_tail - character.g_tail = pref.g_tail - character.r_tail2 = pref.r_tail2 - character.b_tail2 = pref.b_tail2 - character.g_tail2 = pref.g_tail2 - character.r_tail3 = pref.r_tail3 - character.b_tail3 = pref.b_tail3 - character.g_tail3 = pref.g_tail3 - character.wing_style = wing_styles_list[pref.wing_style] - character.r_wing = pref.r_wing - character.b_wing = pref.b_wing - character.g_wing = pref.g_wing - character.r_wing2 = pref.r_wing2 - character.b_wing2 = pref.b_wing2 - character.g_wing2 = pref.g_wing2 - character.r_wing3 = pref.r_wing3 - character.b_wing3 = pref.b_wing3 - character.g_wing3 = pref.g_wing3 - - - -/datum/category_item/player_setup_item/vore/ears/content(var/mob/user) - . += "

VORE Station Settings

" - - var/ear_display = "Normal" - if(pref.ear_style && (pref.ear_style in ear_styles_list)) - var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] - ear_display = instance.name - - else if(pref.ear_style) - ear_display = "REQUIRES UPDATE" - . += "Ears
" - . += " Style: [ear_display]
" - if(ear_styles_list[pref.ear_style]) - var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] - if(ear.do_colouration) - . += "Change Color [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]
" - if(ear.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]
" - if(ear.extra_overlay2) - . += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
" - - var/tail_display = "Normal" - if(pref.tail_style && (pref.tail_style in tail_styles_list)) - var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] - tail_display = instance.name - else if(pref.tail_style) - tail_display = "REQUIRES UPDATE" - . += "Tail
" - . += " Style: [tail_display]
" - - if(tail_styles_list[pref.tail_style]) - var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] - if(T.do_colouration) - . += "Change Color [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]
" - if(T.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]
" - if(T.extra_overlay2) - . += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
" - - var/wing_display = "Normal" - if(pref.wing_style && (pref.wing_style in wing_styles_list)) - var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style] - wing_display = instance.name - else if(pref.wing_style) - wing_display = "REQUIRES UPDATE" - . += "Wing
" - . += " Style: [wing_display]
" - - if(wing_styles_list[pref.wing_style]) - var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style] - if (W.do_colouration) - . += "Change Color [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]
" - if (W.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]
" - if (W.extra_overlay2) - . += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
" - -/datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user) - if(!CanUseTopic(user)) - return TOPIC_NOACTION - - else if(href_list["ear_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_ear_styles = list("Normal" = null) - for(var/path in ear_styles_list) - var/datum/sprite_accessory/ears/instance = ear_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_ear_styles[instance.name] = path - - // Present choice to user - var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles - if(new_ear_style) - pref.ear_style = pretty_ear_styles[new_ear_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color"]) - var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference", - rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null - if(new_earc) - pref.r_ears = hex2num(copytext(new_earc, 2, 4)) - pref.g_ears = hex2num(copytext(new_earc, 4, 6)) - pref.b_ears = hex2num(copytext(new_earc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color2"]) - var/new_earc2 = input(user, "Choose your character's secondary ear colour:", "Character Preference", - rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null - if(new_earc2) - pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4)) - pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6)) - pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color3"]) - var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference", - rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null - if(new_earc3) - pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4)) - pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6)) - pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_tail_styles = list("Normal" = null) - for(var/path in tail_styles_list) - var/datum/sprite_accessory/tail/instance = tail_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_tail_styles[instance.name] = path - - // Present choice to user - var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles - if(new_tail_style) - pref.tail_style = pretty_tail_styles[new_tail_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color"]) - var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference", - rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null - if(new_tailc) - pref.r_tail = hex2num(copytext(new_tailc, 2, 4)) - pref.g_tail = hex2num(copytext(new_tailc, 4, 6)) - pref.b_tail = hex2num(copytext(new_tailc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color2"]) - var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference", - rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null - if(new_tailc2) - pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4)) - pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6)) - pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color3"]) - var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference", - rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null - if(new_tailc3) - pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4)) - pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6)) - pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_wing_styles = list("Normal" = null) - for(var/path in wing_styles_list) - var/datum/sprite_accessory/wing/instance = wing_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_wing_styles[instance.name] = path - - // Present choice to user - var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles - if(new_wing_style) - pref.wing_style = pretty_wing_styles[new_wing_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color"]) - var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference", - rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null - if(new_wingc) - pref.r_wing = hex2num(copytext(new_wingc, 2, 4)) - pref.g_wing = hex2num(copytext(new_wingc, 4, 6)) - pref.b_wing = hex2num(copytext(new_wingc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color2"]) - var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference", - rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null - if(new_wingc2) - pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4)) - pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6)) - pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color3"]) - var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference", - rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null - if(new_wingc3) - pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4)) - pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6)) - pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - return ..() diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index 774bdede17..a1149821d2 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -45,7 +45,6 @@ character.weight_gain = pref.weight_gain character.weight_loss = pref.weight_loss character.fuzzy = pref.fuzzy - character.appearance_flags -= pref.fuzzy*PIXEL_SCALE character.resize(pref.size_multiplier, animate = FALSE) /datum/category_item/player_setup_item/vore/size/content(var/mob/user) @@ -70,7 +69,7 @@ else if(href_list["toggle_fuzzy"]) pref.fuzzy = pref.fuzzy ? 0 : 1; - return TOPIC_REFRESH + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["weight"]) var/new_weight = input(user, "Choose your character's relative body weight.\n\ diff --git a/code/modules/client/preference_setup/vore/03_egg.dm b/code/modules/client/preference_setup/vore/03_egg.dm index 648b31b399..6c090478d5 100644 --- a/code/modules/client/preference_setup/vore/03_egg.dm +++ b/code/modules/client/preference_setup/vore/03_egg.dm @@ -1,15 +1,3 @@ -var/UNATHI_EGG = "Unathi" -var/TAJARAN_EGG = "Tajaran" -var/AKULA_EGG = "Akula" -var/SKRELL_EGG = "Skrell" -var/SERGAL_EGG = "Sergal" -var/HUMAN_EGG = "Human" -var/NEVREAN_EGG = "nevrean" -var/SLIME_EGG = "Slime" -var/EGG_EGG = "Egg" -var/XENOCHIMERA_EGG = "Xenochimera" -var/XENOMORPH_EGG = "Xenomorph" - // Define a place to save appearance in character setup /datum/preferences var/vore_egg_type = "Egg" //The egg type they have. @@ -26,8 +14,7 @@ var/XENOMORPH_EGG = "Xenomorph" S["vore_egg_type"] << pref.vore_egg_type /datum/category_item/player_setup_item/vore/egg/sanitize_character() - var/valid_vore_egg_types = global_vore_egg_types - pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, valid_vore_egg_types, initial(pref.vore_egg_type)) + pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, global_vore_egg_types, initial(pref.vore_egg_type)) /datum/category_item/player_setup_item/vore/egg/copy_to_mob(var/mob/living/carbon/human/character) character.vore_egg_type = pref.vore_egg_type @@ -44,7 +31,7 @@ var/XENOMORPH_EGG = "Xenomorph" var/list/vore_egg_types = global_vore_egg_types var/selection = input(user, "Choose your character's egg type:", "Character Preference", pref.vore_egg_type) as null|anything in vore_egg_types if(selection) - pref.vore_egg_type = vore_egg_types[selection] + pref.vore_egg_type = selection return TOPIC_REFRESH else return diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index 782111c161..17147acb27 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -2,11 +2,19 @@ #define NEUTRAL_MODE 2 #define NEGATIVE_MODE 3 +#define ORGANICS 1 +#define SYNTHETICS 2 + /datum/preferences var/custom_species // Custom species name, can't be changed due to it having been used in savefiles already. var/custom_base // What to base the custom species on var/blood_color = "#A10808" + var/custom_say = null + var/custom_whisper = null + var/custom_ask = null + var/custom_exclaim = null + var/list/pos_traits = list() // What traits they've selected for their custom species var/list/neu_traits = list() var/list/neg_traits = list() @@ -15,6 +23,7 @@ var/starting_trait_points = STARTING_SPECIES_POINTS var/max_traits = MAX_SPECIES_TRAITS var/dirty_synth = 0 //Are you a synth + var/gross_meatbag = 0 //Where'd I leave my Voight-Kampff test kit? // Definition of the stuff for Ears /datum/category_item/player_setup_item/vore/traits @@ -29,10 +38,15 @@ S["neg_traits"] >> pref.neg_traits S["blood_color"] >> pref.blood_color - S["traits_cheating"]>> pref.traits_cheating + S["traits_cheating"] >> pref.traits_cheating S["max_traits"] >> pref.max_traits S["trait_points"] >> pref.starting_trait_points + S["custom_say"] >> pref.custom_say + S["custom_whisper"] >> pref.custom_whisper + S["custom_ask"] >> pref.custom_ask + S["custom_exclaim"] >> pref.custom_exclaim + /datum/category_item/player_setup_item/vore/traits/save_character(var/savefile/S) S["custom_species"] << pref.custom_species S["custom_base"] << pref.custom_base @@ -41,10 +55,15 @@ S["neg_traits"] << pref.neg_traits S["blood_color"] << pref.blood_color - S["traits_cheating"]<< pref.traits_cheating + S["traits_cheating"] << pref.traits_cheating S["max_traits"] << pref.max_traits S["trait_points"] << pref.starting_trait_points + S["custom_say"] << pref.custom_say + S["custom_whisper"] << pref.custom_whisper + S["custom_ask"] << pref.custom_ask + S["custom_exclaim"] << pref.custom_exclaim + /datum/category_item/player_setup_item/vore/traits/sanitize_character() if(!pref.pos_traits) pref.pos_traits = list() if(!pref.neu_traits) pref.neu_traits = list() @@ -77,16 +96,22 @@ var/datum/species/selected_species = GLOB.all_species[pref.species] if(selected_species.selects_bodytype) // Allowed! - else if(!pref.custom_base || !(pref.custom_base in custom_species_bases)) + else if(!pref.custom_base || !(pref.custom_base in GLOB.custom_species_bases)) pref.custom_base = SPECIES_HUMAN /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) character.custom_species = pref.custom_species + character.custom_say = pref.custom_say + character.custom_ask = pref.custom_ask + character.custom_whisper = pref.custom_whisper + character.custom_exclaim = pref.custom_exclaim if(character.isSynthetic()) //Checking if we have a synth on our hands, boys. pref.dirty_synth = 1 - else //CHOMPEdit - pref.dirty_synth = 0 //CHOMPEdit + pref.gross_meatbag = 0 + else + pref.gross_meatbag = 1 + pref.dirty_synth = 0 var/datum/species/S = character.species var/SB @@ -119,14 +144,14 @@ . += "[pref.custom_base ? pref.custom_base : "Human"]
" var/traits_left = pref.max_traits - . += "Traits Left: [traits_left]
" + if(pref.species == SPECIES_CUSTOM) var/points_left = pref.starting_trait_points for(var/T in pref.pos_traits + pref.neg_traits) points_left -= traits_costs[T] traits_left-- - + . += "Traits Left: [traits_left]
" . += "Points Left: [points_left]
" if(points_left < 0 || traits_left < 0 || !pref.custom_species) . += "^ Fix things! ^
" @@ -153,6 +178,16 @@ . += "Blood Color: " //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color. . += "Set Color" . += "R
" + . += "
" + + . += "Custom Say: " + . += "Set Say Verb
" + . += "Custom Whisper: " + . += "Set Whisper Verb
" + . += "Custom Ask: " + . += "Set Ask Verb
" + . += "Custom Exclaim: " + . += "Set Exclaim Verb
" /datum/category_item/player_setup_item/vore/traits/OnTopic(var/href,var/list/href_list, var/mob/user) if(!CanUseTopic(user)) @@ -172,7 +207,7 @@ return TOPIC_REFRESH else if(href_list["custom_base"]) - var/list/choices = custom_species_bases + var/list/choices = GLOB.custom_species_bases if(pref.species != SPECIES_CUSTOM) choices = (choices | pref.species) var/text_choice = input("Pick an icon set for your species:","Icon Base") in choices @@ -216,6 +251,30 @@ pref.neg_traits -= trait return TOPIC_REFRESH + else if(href_list["custom_say"]) + var/say_choice = sanitize(input(usr, "This word or phrase will appear instead of 'says': [pref.real_name] says, \"Hi.\"", "Custom Say", pref.custom_say) as null|text, 12) + if(say_choice) + pref.custom_say = say_choice + return TOPIC_REFRESH + + else if(href_list["custom_whisper"]) + var/whisper_choice = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [pref.real_name] whispers, \"Hi...\"", "Custom Whisper", pref.custom_whisper) as null|text, 12) + if(whisper_choice) + pref.custom_whisper = whisper_choice + return TOPIC_REFRESH + + else if(href_list["custom_ask"]) + var/ask_choice = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [pref.real_name] asks, \"Hi?\"", "Custom Ask", pref.custom_ask) as null|text, 12) + if(ask_choice) + pref.custom_ask = ask_choice + return TOPIC_REFRESH + + else if(href_list["custom_exclaim"]) + var/exclaim_choice = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [pref.real_name] exclaims, \"Hi!\"", "Custom Exclaim", pref.custom_exclaim) as null|text, 12) + if(exclaim_choice) + pref.custom_exclaim = exclaim_choice + return TOPIC_REFRESH + else if(href_list["add_trait"]) var/mode = text2num(href_list["add_trait"]) var/list/picklist @@ -276,13 +335,23 @@ var/conflict = FALSE - user.isSynthetic() //Recheck just to be sure - if(pref.dirty_synth && instance.not_for_synths)//if you are a synth you can't take this trait. - alert("You cannot take this trait as a SYNTH.\ - Please remove that trait, or pick another trait to add.","Error") - //pref.dirty_synth = 0 //Just to be sure // Commented out because it allow for someone to take a synth-blacklisted trait CHOMP Edit + if(pref.dirty_synth && !(instance.can_take & SYNTHETICS)) + alert("The trait you've selected can only be taken by organic characters!","Error") + //pref.dirty_synth = 0 //Just to be sure //CHOMPEdit this shit broke, stop. return TOPIC_REFRESH + if(pref.gross_meatbag && !(instance.can_take & ORGANICS)) + alert("The trait you've selected can only be taken by synthetic characters!","Error") + pref.gross_meatbag = 0 //Just to be sure + return TOPIC_REFRESH + + if(pref.species in instance.banned_species) + alert("The trait you've selected cannot be taken by the species you've chosen!","Error") + return TOPIC_REFRESH + + if( LAZYLEN(instance.allowed_species) && !(pref.species in instance.allowed_species)) //Adding white list handling -shark + alert("The trait you've selected cannot be taken by the species you've chosen!","Error") + return TOPIC_REFRESH if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits) conflict = instance.name diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm index 2911c8a10d..1214fd2c89 100644 --- a/code/modules/client/preference_setup/vore/09_misc.dm +++ b/code/modules/client/preference_setup/vore/09_misc.dm @@ -6,10 +6,16 @@ /datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S) S["show_in_directory"] >> pref.show_in_directory + S["directory_tag"] >> pref.directory_tag + S["directory_erptag"] >> pref.directory_erptag + S["directory_ad"] >> pref.directory_ad S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved /datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S) S["show_in_directory"] << pref.show_in_directory + S["directory_tag"] << pref.directory_tag + S["directory_erptag"] << pref.directory_erptag + S["directory_ad"] << pref.directory_ad S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable //TFF 5/8/19 - add new datum category to allow for setting multiple settings when this is selected in the loadout. @@ -20,17 +26,38 @@ /datum/category_item/player_setup_item/vore/misc/sanitize_character() pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory)) + pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag)) + pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag)) pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs /datum/category_item/player_setup_item/vore/misc/content(var/mob/user) . += "
" . += "Appear in Character Directory:[pref.show_in_directory ? "Yes" : "No"]
" + . += "Character Directory Vore Tag:[pref.directory_tag]
" + . += "Character Directory ERP Tag:[pref.directory_erptag]
" + . += "Character Directory Advertisement:Set Directory Ad
" . += "Suit Sensors Preference:[sensorpreflist[pref.sensorpref]]
" //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random /datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user) if(href_list["toggle_show_in_directory"]) pref.show_in_directory = pref.show_in_directory ? 0 : 1; return TOPIC_REFRESH + else if(href_list["directory_tag"]) + var/new_tag = input(user, "Pick a new Vore tag for the character directory", "Character Vore Tag", pref.directory_tag) as null|anything in GLOB.char_directory_tags + if(!new_tag) + return + pref.directory_tag = new_tag + return TOPIC_REFRESH + else if(href_list["directory_erptag"]) + var/new_erptag = input(user, "Pick a new ERP tag for the character directory", "Character ERP Tag", pref.directory_erptag) as null|anything in GLOB.char_directory_erptags + if(!new_erptag) + return + pref.directory_erptag = new_erptag + return TOPIC_REFRESH + else if(href_list["directory_ad"]) + var/msg = sanitize(input(user,"Write your advertisement here!", "Flavor Text", html_decode(pref.directory_ad)) as message, extra = 0) //VOREStation Edit: separating out OOC notes + pref.directory_ad = msg + return TOPIC_REFRESH //TFF 5/8/19 - add new thing so you can choose the sensor setting your character can get. else if(href_list["toggle_sensor_setting"]) var/new_sensorpref = input(user, "Choose your character's sensor preferences:", "Character Preferences", sensorpreflist[pref.sensorpref]) as null|anything in sensorpreflist diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 741033824d..179245a44f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -83,11 +83,11 @@ datum/preferences //Mob preview var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. var/static/list/preview_screen_locs = list( - "1" = "character_preview_map:1,5:-12", - "2" = "character_preview_map:1,3:15", - "4" = "character_preview_map:1:7,2:10", - "8" = "character_preview_map:1:-7,1:5", - "BG" = "character_preview_map:1,1 to 1,5" + "1" = "character_preview_map:2,7", + "2" = "character_preview_map:2,5", + "4" = "character_preview_map:2,3", + "8" = "character_preview_map:2,1", + "BG" = "character_preview_map:1,1 to 3,8" ) //Jobs, uses bitflags @@ -281,7 +281,7 @@ datum/preferences if(!BG) BG = new BG.plane = TURF_PLANE - BG.icon = 'icons/effects/128x48.dmi' + BG.icon = 'icons/effects/setup_backgrounds_vr.dmi' BG.pref = src LAZYSET(char_render_holders, "BG", BG) client.screen |= BG diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 4cb6695985..783ee0c4ae 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -1,5 +1,8 @@ /datum/preferences var/show_in_directory = 1 //Show in Character Directory + var/directory_tag = "Unset" //Sorting tag to use in character directory + var/directory_erptag = "Unset" //ditto, but for non-vore scenes + var/directory_ad = "" //Advertisement stuff to show in character directory. var/sensorpref = 5 //Set character's suit sensor level var/job_talon_high = 0 var/job_talon_med = 0 diff --git a/code/modules/client/verbs/ping.dm b/code/modules/client/verbs/ping.dm new file mode 100644 index 0000000000..8213daa750 --- /dev/null +++ b/code/modules/client/verbs/ping.dm @@ -0,0 +1,12 @@ +/client/proc/pingfromtime(time) + return ((world.time+world.tick_lag*world.tick_usage/100)-time)*100 + +/client/verb/display_ping(time as num) + set instant = TRUE + set name = ".display_ping" + to_chat(src, "Round trip ping took [round(pingfromtime(time),1)]ms") + +/client/verb/ping() + set name = "Ping" + set category = "OOC" + winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]") \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 4b230053d9..c0a71f2c66 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -38,7 +38,7 @@ // Aurora forensics port. /obj/item/clothing/clean_blood() - ..() + . = ..() gunshot_residue = null @@ -55,6 +55,12 @@ verbs |= /obj/item/clothing/proc/change_color //VOREStation edit start +/obj/item/clothing/update_icon() + overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + /obj/item/clothing/equipped(var/mob/user,var/slot) ..() if(enables_planes) @@ -223,7 +229,7 @@ throwforce = 2 slot_flags = SLOT_EARS sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi') + SPECIES_TESHARI = 'icons/mob/species/teshari/ears.dmi') /obj/item/clothing/ears/attack_hand(mob/user as mob) if (!user) return @@ -322,7 +328,7 @@ slot_flags = SLOT_GLOVES attack_verb = list("challenged") sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/gloves.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/gloves.dmi', SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi' ) drop_sound = 'sound/items/drop/gloves.ogg' @@ -366,6 +372,11 @@ return */ +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + /obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) var/mob/living/carbon/human/H = user @@ -459,7 +470,7 @@ var/image/helmet_light sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi' ) drop_sound = 'sound/items/drop/hat.ogg' @@ -565,7 +576,7 @@ body_parts_covered = FACE|EYES blood_sprite_state = "maskblood" sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/masks.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/masks.dmi', SPECIES_VOX = 'icons/mob/species/vox/masks.dmi', SPECIES_TAJ = 'icons/mob/species/tajaran/mask.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/mask.dmi', @@ -619,7 +630,7 @@ var/overshoes = 0 species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/shoes.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/shoes.dmi', SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi' ) drop_sound = 'sound/items/drop/shoes.ogg' @@ -685,9 +696,7 @@ update_icon() /obj/item/clothing/shoes/update_icon() - overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. - if(blood_DNA) - add_blood() + . = ..() if(holding) overlays += image(icon, "[icon_state]_knife") if(contaminated) @@ -698,7 +707,6 @@ if(ismob(usr)) var/mob/M = usr M.update_inv_shoes() - return ..() /obj/item/clothing/shoes/clean_blood() update_icon() @@ -736,6 +744,8 @@ slot_flags = SLOT_OCLOTHING var/blood_overlay_type = "suit" blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE siemens_coefficient = 0.9 w_class = ITEMSIZE_NORMAL preserve_item = 1 @@ -743,7 +753,7 @@ sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi' ) @@ -771,6 +781,43 @@ set_clothing_index() +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if((taurized && !isTaurTail(H.tail_style)) || (!taurized && isTaurTail(H.tail_style))) + taurize(user) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) + if(isTaurTail(Taur.tail_style)) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + /////////////////////////////////////////////////////////////////////// //Under clothing /obj/item/clothing/under @@ -800,7 +847,7 @@ var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/uniform.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/uniform.dmi', SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi', SPECIES_GREY_YW = 'icons/mob/species/grey/uniform.dmi'/*YWedit*/ ) @@ -1048,7 +1095,6 @@ to_chat(usr, "You roll down your [src]'s sleeves.") update_clothing_icon() - /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index 68df04ae22..bf28eb5a36 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -5,7 +5,7 @@ var/list/inside_emotes = list() var/recent_squish = 0 sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/shoes.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/shoes.dmi', SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/feet.dmi') @@ -85,13 +85,13 @@ /obj/item/clothing/gloves sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/gloves.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/gloves.dmi', SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/hands.dmi') /obj/item/clothing/ears sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/ears.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi') /obj/item/clothing/relaymove(var/mob/living/user,var/direction) @@ -131,7 +131,7 @@ slot_wear_mask_str = 'icons/mob/mask_vr.dmi' ) sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/masks_vr.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/masks_vr.dmi', SPECIES_VOX = 'icons/mob/species/vox/masks.dmi', SPECIES_TAJ = 'icons/mob/species/tajaran/mask_vr.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/mask_vr.dmi', @@ -149,54 +149,17 @@ //Switch to taur sprites if a taur equips /obj/item/clothing/suit - var/taurized = FALSE //Easier than trying to 'compare icons' to see if it's a taur suit sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi') -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - var/normalize = TRUE - - //Pyramid of doom-y. Improve somehow? - if(!taurized && slot == slot_wear_suit && ishuman(user)) - var/mob/living/carbon/human/H = user - if(isTaurTail(H.tail_style)) - var/datum/sprite_accessory/tail/taur/taurtail = H.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - normalize = FALSE - taurized = TRUE - - if(normalize && taurized) - icon_override = initial(icon_override) - taurized = FALSE - - return ..() - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - //TFF 5/8/19 - sets Vorestation /obj/item/clothing/under sensor setting default? /obj/item/clothing/under sensor_mode = 3 var/sensorpref = 5 sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/uniform.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/uniform.dmi', SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/uniform.dmi', SPECIES_GREY_YW = 'icons/mob/species/grey/uniform.dmi'/*ywedit*/ @@ -218,6 +181,6 @@ /obj/item/clothing/head sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/head.dmi') diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index c02bca7e13..92c63c3acd 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -31,9 +31,9 @@ BLIND // can't see anything pickup_sound = 'sound/items/pickup/accessory.ogg' sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/eyes.dmi', - "Vox" = 'icons/mob/species/vox/eyes.dmi', - "Sergal" = 'icons/mob/species/sergal/eyes_yw.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/eyes.dmi', + SPECIES_VOX = 'icons/mob/species/vox/eyes.dmi', + "Sergal" = 'icons/mob/species/sergal/eyes_yw.dmi', //YWedit SPECIES_GREY_YW = 'icons/mob/species/grey/eyes.dmi'/*ywedit*/ ) diff --git a/code/modules/clothing/glasses/glasses_vr.dm b/code/modules/clothing/glasses/glasses_vr.dm index 2608444513..aa0335ddf3 100644 --- a/code/modules/clothing/glasses/glasses_vr.dm +++ b/code/modules/clothing/glasses/glasses_vr.dm @@ -125,7 +125,7 @@ /obj/item/clothing/glasses sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/eyes.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/eyes.dmi', SPECIES_VOX = 'icons/mob/species/vox/eyes.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/eyes.dmi', SPECIES_GREY_YW = 'icons/mob/species/grey/eyes.dmi'/*ywedit*/ diff --git a/code/modules/clothing/gloves/antagonist.dm b/code/modules/clothing/gloves/antagonist.dm index d1a01d0e68..2f369adba0 100644 --- a/code/modules/clothing/gloves/antagonist.dm +++ b/code/modules/clothing/gloves/antagonist.dm @@ -104,7 +104,7 @@ return battery /obj/item/clothing/gloves/ring/buzzer/Initialize() - ..() + . = ..() if(!battery) battery = new battery_type(src) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 79642d34c1..4b410163fe 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -10,7 +10,7 @@ desc = "an ultra rare hat. It commands a certain respect." icon_state = "petehat" sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi' ) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index a617717576..8cf8a6292e 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -117,6 +117,15 @@ min_cold_protection_temperature = T0C - 20 cold_protection = HEAD +/obj/item/clothing/head/helmet/explorer + name = "explorer hood" + desc = "An armoured hood for exploring harsh environments." + icon_state = "explorer" + flags = THICKMATERIAL + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE + siemens_coefficient = 0.9 + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) + /obj/item/clothing/head/helmet/swat name = "\improper SWAT helmet" desc = "They're often used by highly trained SWAT Officers." diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 23c629fac2..da22b29f1f 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -175,6 +175,7 @@ icon_state = "beret_corporate_hos" item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black") + //Medical /obj/item/clothing/head/surgery name = "surgical cap" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index dab5e97075..0d567bb7e8 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -126,6 +126,11 @@ siemens_coefficient = 0.9 body_parts_covered = 0 +/obj/item/clothing/head/plaguedoctorhat/gold + name = "golden plague doctor's hat" + desc = "These were once used by plague doctors, allegedly. This one has gold accents." + icon_state = "plaguedoctor2" + /obj/item/clothing/head/hasturhood name = "hastur's hood" desc = "It's unspeakably stylish" @@ -452,3 +457,31 @@ icon_state = "blackngoldheaddress" flags_inv = HIDEEYES body_parts_covered = HEAD|EYES + +//Corporate Berets + +/obj/item/clothing/head/beret/corp/saare + name = "\improper SAARE beret" + desc = "A red beret denoting service with Stealth Assault Enterprises. For mercenaries that are more inclined towards style than safety." + icon_state = "beret_red" + +/obj/item/clothing/head/beret/corp/saare/officer + name = "\improper SAARE officer beret" + desc = "A red beret with a gold insignia, denoting senior service with Stealth Assault Enterprises. For mercenaries who are more inclined towards style than safety." + icon_state = "beret_redgold" + +/obj/item/clothing/head/beret/corp/pcrc + name = "\improper PCRC beret" + desc = "A black beret with a PCRC logo insignia, denoting service with Proxima Centauri Risk Control. For private security personnel that are more inclined towards style than safety." + icon_state = "beret_black_observatory" + + +/obj/item/clothing/head/beret/corp/hedberg + name = "\improper Hedberg-Hammarstrom beret" + desc = "A tan beret denoting service with Hedberg-Hammarstrom private security. For mercenaries who are more inclined towards style than safety." + icon_state = "beret_tan" + +/obj/item/clothing/head/beret/corp/xion + name = "\improper Xion beret" + desc = "An orange beret denoting employment with Xion Manufacturing. For personnel that are more inclined towards style than safety." + icon_state = "beret_orange" \ No newline at end of file diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 4cf06d6cc2..6ef9ee2be6 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -151,11 +151,11 @@ flags_inv = HIDEEARS /obj/item/clothing/head/ushanka/attack_self(mob/user as mob) - if(src.icon_state == "ushankadown") - src.icon_state = "ushankaup" + if(src.icon_state == initial(icon_state)) + src.icon_state = "[icon_state]up" to_chat(user, "You raise the ear flaps on the ushanka.") else - src.icon_state = "ushankadown" + src.icon_state = initial(icon_state) to_chat(user, "You lower the ear flaps on the ushanka.") /* diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm index 135c73d539..519f7cd1a7 100644 --- a/code/modules/clothing/head/pilot_helmet.dm +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -6,7 +6,7 @@ icon_state = "pilot_helmet1" item_icons = list(slot_head_str = 'icons/mob/pilot_helmet.dmi') sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/pilot_helmet.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/pilot_helmet.dmi' ) flags = THICKMATERIAL armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0) diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 5bcec8a56e..c3bdad4e4e 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -99,3 +99,9 @@ desc = "It's a ballcap bearing the colors of Major Bill's Shipping." icon_state = "mbillsoft" catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills) + +/obj/item/clothing/head/soft/med + name = "medical cap" + desc = "It's a field cap in white, with a blue cross on the front." + icon_state = "medsoft" + item_state_slots = list(slot_r_hand_str = "mimesoft", slot_l_hand_str = "mimesoft") diff --git a/code/modules/clothing/head/solgov.dm b/code/modules/clothing/head/solgov.dm index 6a3c585aaa..6b2623ff52 100644 --- a/code/modules/clothing/head/solgov.dm +++ b/code/modules/clothing/head/solgov.dm @@ -11,14 +11,14 @@ ) /obj/item/clothing/head/soft/solgov/veteranhat - name = "veteran hat" - desc = "It's a tacky black ballcap bearing the yellow service ribbon of the Gaia Conflict." + name = "veteran cap" + desc = "It's a tacky black ballcap bearing the yellow service ribbon of the Almach War." icon_state = "cap_veteran" /obj/item/clothing/head/soft/solgov/sifguard name = "\improper SifGuard cap" desc = "It's a black ballcap bearing a Sif Defense Force crest." - icon_state = "expeditionsoft" + icon_state = "sifguardsoft" item_state_slots = list( slot_l_hand_str = "blacksoft", slot_r_hand_str = "blacksoft", @@ -27,7 +27,7 @@ /obj/item/clothing/head/soft/solgov/sifguard/co name = "\improper SifGuard captain's cap" desc = "It's a black ballcap bearing the Sif Defense Force crest. The brim has gold trim." - icon_state = "expeditioncomsoft" + icon_state = "sifguardcomsoft" /obj/item/clothing/head/soft/solgov/fleet name = "fleet cap" @@ -88,17 +88,17 @@ /obj/item/clothing/head/service/sifguard name = "\improper SifGuard peaked cap" desc = "A peaked black uniform cap belonging to the Sif Defense Force Corps." - icon_state = "ecdresscap" + icon_state = "sifguarddresscap" /obj/item/clothing/head/service/sifguard/command name = "\improper SifGuard officer's peaked cap" desc = "A peaked black uniform cap belonging to the Sif Defense Force. This one is trimmed in gold." - icon_state = "ecdresscap_ofcr" + icon_state = "sifguarddresscap_ofcr" /obj/item/clothing/head/service/sifguard/captain name = "\improper SifGuard captain's peaked cap" desc = "A gold-trimmed peaked black uniform cap belonging to a Captain of the Sif Defense Force." - icon_state = "ecdresscap_capt" + icon_state = "sifguarddresscap_capt" /obj/item/clothing/head/service/sifguard/senior_command name = "senior SifGuard officer's peaked cap" @@ -127,7 +127,7 @@ /obj/item/clothing/head/service/army/campaign name = "campaign cover" - desc = "A green campaign cover with an SCG Marine crest. Only found on the heads of Drill Sergeants." + desc = "A green campaign cover with an SCG Marine crest. Typically found on the heads of Drill Sergeants." icon_state = "greendrill" //Dress @@ -170,60 +170,45 @@ //Berets +//Government Departments + /obj/item/clothing/head/beret/solgov - name = "peacekeeper beret" - desc = "A beret in Solar Confederate Government colors. For peacekeepers that are more inclined towards style than safety." + name = "\improper SCG beret" + desc = "A beret in basic Solar Confederate Government colors. For peacekeepers that are more inclined towards style than safety." icon_state = "beret_lightblue" -/obj/item/clothing/head/beret/solgov/homeguard - name = "home guard beret" - desc = "A red beret denoting service in the Sol Home Guard. For personnel that are more inclined towards style than safety." - icon_state = "beret_red" - -/obj/item/clothing/head/beret/solgov/gateway - name = "gateway administration beret" - desc = "An orange beret denoting service in the Gateway Administration. For personnel that are more inclined towards style than safety." - icon_state = "beret_orange" - -/obj/item/clothing/head/beret/solgov/customs - name = "customs and trade beret" - desc = "A purple beret denoting service in the Customs and Trade Bureau. For personnel that are more inclined towards style than safety." +/obj/item/clothing/head/beret/solgov/ttc + name = "transgressive technologies beret" + desc = "A purple beret denoting service in the Transgressive Technologies Commission. For g-men that are more inclined towards style than safety." icon_state = "beret_purpleyellow" -/obj/item/clothing/head/beret/solgov/orbital - name = "orbital assault beret" - desc = "A blue beret denoting orbital assault training. For helljumpers that are more inclined towards style than safety." +/obj/item/clothing/head/beret/solgov/eio + name = "intelligence oversight beret" + desc = "A blue beret denoting service in Emergent Intelligent Oversight. For g-men that are more inclined towards style than safety." icon_state = "beret_blue" -/obj/item/clothing/head/beret/solgov/research - name = "government research beret" - desc = "A green beret denoting service in the Bureau of Research. For explorers that are more inclined towards style than safety." +/obj/item/clothing/head/beret/solgov/survey + name = "government survey beret" + desc = "A green beret denoting service in the SCG Galactic Survey Administration. For explorers that are more inclined towards style than safety." icon_state = "beret_green" +/obj/item/clothing/head/beret/solgov/survey/extraplanar + name = "extraplanar survey beret" + desc = "A green beret with a silver emblem, denoting service in the Extraplanar Discovery Division of the GSA. For extraplanar explorers who are more inclined towards style than safety." + icon_state = "beret_greensilver" + +/obj/item/clothing/head/beret/solgov/inspector + name = "\improper Solar Inspection Group beret" + desc = "A grey beret with a silver insignia, denoting service in the Solar Inspection Group. For Almach-inspection personnel who are more inclined towards style than safety." + icon_state = "beret_graysilver" + /obj/item/clothing/head/beret/solgov/health name = "health service beret" desc = "A white beret denoting service in the Interstellar Health Service. For medics that are more inclined towards style than safety." icon_state = "beret_white" -/obj/item/clothing/head/beret/solgov/marcom - name = "\improper MARSCOM beret" - desc = "A red beret with a gold insignia, denoting service in the SCGDF Mars Central Command. For brass who are more inclined towards style than safety." - icon_state = "beret_redgold" -/obj/item/clothing/head/beret/solgov/stratcom - name = "\improper STRATCOM beret" - desc = "A grey beret with a silver insignia, denoting service in the SCGDF Strategic Command. For intelligence personnel who are more inclined towards style than safety." - icon_state = "beret_graysilver" - -/obj/item/clothing/head/beret/solgov/diplomatic - name = "diplomatic security beret" - desc = "A tan beret denoting service in the SCG Marines Diplomatic Security Group. For security personnel who are more inclined towards style than safety." - icon_state = "beret_tan" - -/obj/item/clothing/head/beret/solgov/borderguard - name = "border security beret" - desc = "A green beret with a silver emblem, denoting service in the Bureau of Border Security. For border guards who are more inclined towards style than safety." - icon_state = "beret_greensilver" +//SifGuard /obj/item/clothing/head/beret/solgov/sifguard name = "\improper SifGuard beret" @@ -260,15 +245,12 @@ desc = "A Sif Defense Force beret with a command crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_command" -/obj/item/clothing/head/beret/solgov/sifguard/branch - name = "\improper Field Operations beret" - desc = "An Sif Defense Force beret carrying insignia of the Field Operations section of the Sif Defense Force. For personnel that are more inclined towards style than safety." - icon_state = "beret_black_fieldOps" +/obj/item/clothing/head/beret/solgov/sifguard/patrol + name = "\improper SifGuard Anti-piracy beret" + desc = "An Sif Defense Force beret carrying insignia of the Anti-Piracy taskforce. For personnel that are more inclined towards style than safety." + icon_state = "beret_black_patrol" -/obj/item/clothing/head/beret/solgov/sifguard/branch/observatory - name = "\improper Observatory beret" - desc = "An Sif Defense Force beret carrying insignia of the Observatory section of the Sif Defense Force. For personnel that are more inclined towards style than safety." - icon_state = "beret_black_observatory" +//Fleet /obj/item/clothing/head/beret/solgov/fleet name = "fleet beret" @@ -320,6 +302,8 @@ desc = "A white SCG Fleet beret with a golden crest. For personnel that are more inclined towards style than safety." icon_state = "beret_whiterim_com" +/* +Unused Baylore Stuff /obj/item/clothing/head/beret/solgov/fleet/branch name = "first fleet beret" desc = "An SCG Fleet beret carrying insignia of First Fleet, the Sol Guard, stationed in Sol. For personnel that are more inclined towards style than safety." @@ -345,46 +329,44 @@ desc = "An SCG Fleet beret carrying insignia of Fifth Fleet, the Quick Reaction Force, recently formed and outfited with last tech. For personnel that are more inclined towards style than safety." icon_state = "beret_navy_fifth" +*/ + //ushanka /obj/item/clothing/head/ushanka/solgov name = "\improper SifGuard fur hat" desc = "An Sif Defense Force synthfur-lined hat for operating in cold environments." - icon_state = "ecushankadown" - //icon_state_up = "ecushankaup" + icon_state = "sifguardushankadown" /obj/item/clothing/head/ushanka/solgov/fleet name = "fleet fur hat" desc = "An SCG Fleet synthfur-lined hat for operating in cold environments." icon_state = "flushankadown" - //icon_state_up = "flushankaup" -/obj/item/clothing/head/ushanka/solgov/army +/obj/item/clothing/head/ushanka/solgov/marine name = "marine fur hat" desc = "An SCG Marine synthfur-lined hat for operating in cold environments." icon_state = "barushankadown" - //icon_state_up = "barushankaup" -/obj/item/clothing/head/ushanka/solgov/army/green - name = "green marine fur hat" - desc = "An SCG Marine synthfur-lined hat for operating in cold environments." +/obj/item/clothing/head/ushanka/solgov/marine/green + name = "\improper Hedberg-Hammarstrom fur hat" + desc = "An Hedberg-Hammarstrom private security synthfur-lined hat for operating in cold environments." icon_state = "arushankadown" - //icon_state_up = "mcushankaup" -//Terran +//Almachi -/obj/item/clothing/head/terran/navy/service - name = "ICCGN service cover" - desc = "A service uniform cover, worn by low-ranking crew within the Independent Navy." - icon_state = "terranservice" - item_state = "terranservice" +/obj/item/clothing/head/almach + name = "\improper Almach Militia service cover" + desc = "A service uniform cover, occasionally worn by crew within the defunct Almach Militia." + icon_state = "almachhat" + item_state = "almachhat" item_state_slots = list( slot_l_hand_str = "helmet", slot_r_hand_str = "helmet") body_parts_covered = 0 /obj/item/clothing/head/terran/navy/service/command - name = "ICCGN command service cover" - desc = "A service uniform cover, worn by high-ranking crew within the Independent Navy." - icon_state = "terranservice_comm" - item_state = "terranservice_comm" + name = "\improper Almach Militia command service cover" + desc = "A service uniform cover, occasionally worn by command crew within the defunct Almach Militia." + icon_state = "almachhat_comm" + item_state = "almachhat_comm" diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 25b9e00f68..a73e6d7a73 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -69,6 +69,11 @@ armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 90, rad = 0) body_parts_covered = HEAD|FACE|EYES +/obj/item/clothing/mask/gas/plaguedoctor/gold + name = "gold plague doctor mask" + desc = "A modern version of the age old classic, this mask is both capable of filtering air, and connecting to an air supply. This one is gold." + icon_state = "plaguedoctor2" + /obj/item/clothing/mask/gas/swat name = "\improper SWAT mask" desc = "A close-fitting tactical mask that can be connected to an air supply." diff --git a/code/modules/clothing/masks/tesh_synth_facemask.dm b/code/modules/clothing/masks/tesh_synth_facemask.dm index 1f8f241c5b..0d7b0dbce1 100644 --- a/code/modules/clothing/masks/tesh_synth_facemask.dm +++ b/code/modules/clothing/masks/tesh_synth_facemask.dm @@ -3,19 +3,31 @@ name = "Synth Face" desc = "A round dark muzzle made of LEDs." body_parts_covered = FACE|EYES - icon = 'icons/mob/species/seromi/synth_facemask.dmi' - icon_override = 'icons/mob/species/seromi/synth_facemask.dmi' + icon = 'icons/mob/species/teshari/synth_facemask.dmi' + icon_override = 'icons/mob/species/teshari/synth_facemask.dmi' icon_state = "synth_facemask" origin_tech = list(TECH_ILLEGAL = 1) + var/lstat + var/mob/living/carbon/maskmaster equipped() ..() var/mob/living/carbon/human/H = loc if(istype(H) && H.wear_mask == src) canremove = 0 + maskmaster = H + START_PROCESSING(SSprocessing, src) + dropped() canremove = 1 + maskmaster = null + STOP_PROCESSING(SSprocessing, src) return ..() + + Destroy() + . = ..() + STOP_PROCESSING(SSprocessing, src) + mob_can_equip(var/mob/living/carbon/human/user, var/slot) if (!..()) return 0 @@ -27,12 +39,20 @@ return 0 update_icon() var/mob/living/carbon/human/H = loc - if (H.stat == DEAD) icon_state = "synth_facemask_dead" + if (maskmaster && maskmaster.stat == DEAD) icon_state = "synth_facemask_dead" + else icon_state = "synth_facemask" if(istype(H)) H.update_inv_wear_mask() + process() + if(maskmaster && lstat != maskmaster.stat) + lstat = maskmaster.stat + update_icon() + lstat = maskmaster.stat + + //LOADOUT ITEM /datum/gear/mask/synthface/ - display_name = "Synth Facemask(Tesh)" + display_name = "Synth Facemask (Teshari)" path = /obj/item/clothing/mask/synthfacemask sort_category = "Xenowear" whitelisted = SPECIES_TESHARI diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index dfd9abb9c2..dc8a31c8e6 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -267,12 +267,18 @@ /stat_rig_module/Click() if(CanUse()) - var/list/href_list = list( - "interact_module" = module.holder.installed_modules.Find(module), - "module_mode" = module_mode - ) - AddHref(href_list) - module.holder.Topic(usr, href_list) + switch(module_mode) + if("select") + module.holder.selected_module = module + if("engage") + module.engage() + if("toggle") + if(module.active) + module.deactivate() + else + module.activate() + if("select_charge_type") + module.charge_selected = module.charges[module.charges.Find(module.charge_selected)] /stat_rig_module/DblClick() return Click() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 9606205cc4..1b649ff8fe 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -44,6 +44,8 @@ var/glove_type = /obj/item/clothing/gloves/gauntlets/rig var/cell_type = /obj/item/weapon/cell/high var/air_type = /obj/item/weapon/tank/oxygen + var/unremovable_cell = FALSE //CHOMP Edit - an addition for protean living hardsuit. + //Component/device holders. var/obj/item/weapon/tank/air_supply // Air tank, if any. @@ -899,14 +901,19 @@ wearer.lay_down() to_chat(user, "\The [wearer] is now [wearer.resting ? "resting" : "getting up"].") -/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user) +/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user, var/ai_moving = TRUE) // Why is all this shit in client/Move()? Who knows? if(world.time < wearer_move_delay) return - if(!wearer || !wearer.loc || !ai_can_move_suit(user, check_user_module = 1)) + if(!wearer || !wearer.loc) //CHOMP Edit - Removed some stuff for protean living hardsuit return + +//CHOMP Addition - Added this for protean living hardsuit + if(ai_moving) + if(!ai_can_move_suit(user, check_user_module = 1)) + return //This is sota the goto stop mobs from moving var if(wearer.transforming || !wearer.canmove) @@ -965,7 +972,10 @@ wearer_move_delay += 2 return wearer.buckled.relaymove(wearer,direction) - cell.use(200) //Arbitrary, TODO + var/power_cost = 200 + if(!ai_moving) + power_cost = 20 + cell.use(power_cost) //Arbitrary, TODO wearer.Move(get_step(get_turf(wearer),direction),direction) // This returns the rig if you are contained inside one, but not if you are wearing it diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 67080dd1e0..656f2d19da 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -136,7 +136,7 @@ if("cell") - if(cell) + if(cell && !unremovable_cell) //CHOMP Edit - addition for living protean hardsuit to_chat(user, "You detach \the [cell] from \the [src]'s battery mount.") for(var/obj/item/rig_module/module in installed_modules) module.deactivate() diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 8ae8ca3674..cc76771d45 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -15,7 +15,7 @@ SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi' ) species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_TESHARI) //vox, diona, and zaddat can't use hardsuits not designed for them max_pressure_protection = null @@ -57,7 +57,7 @@ SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi' ) supporting_limbs = list() species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_PROMETHEAN, SPECIES_TESHARI) //vox, diona, and zaddat can't use hardsuits not designed for them diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm index bb6f6d1567..b9ca364883 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm @@ -12,7 +12,7 @@ SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet.dmi', SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', SPECIES_GREY_YW = 'icons/mob/species/grey/helmet.dmi' /*ywedit*/ ) @@ -32,7 +32,7 @@ SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit.dmi', SPECIES_PROMETHEAN = 'icons/mob/species/skrell/suit.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi' ) /obj/item/clothing/head/helmet/space/rig diff --git a/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm b/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm new file mode 100644 index 0000000000..b4cb198152 --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm @@ -0,0 +1,213 @@ +/* + proteans +*/ +/obj/item/weapon/rig/protean + name = "nanosuit control cluster" + suit_type = "nanomachine" + icon = 'icons/obj/rig_modules_ch.dmi' + icon_state = "nanomachine_rig" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 90) + siemens_coefficient= 0.5 + slowdown = 0 + offline_slowdown = 0 + seal_delay = 1 + var/mob/living/carbon/human/myprotean + initial_modules = list(/obj/item/rig_module/power_sink) + + helm_type = /obj/item/clothing/head/helmet/space/rig/protean //These are important for sprite pointers + boot_type = /obj/item/clothing/shoes/magboots/rig/protean + chest_type = /obj/item/clothing/suit/space/rig/protean + glove_type = /obj/item/clothing/gloves/gauntlets/rig/protean + +//I doooon't think I can get rig_back.dmi as a _ch file. That is part of /obj/item/weapon/rig/update_icon(var/update_mob_icon). + +/obj/item/weapon/rig/protean/relaymove(mob/user, var/direction) + if(user.stat || user.stunned) + return + forced_move(direction, user, FALSE) + +/obj/item/clothing/head/helmet/space/rig/protean + name = "mass" + desc = "A helmet-shaped clump of nanomachines." + siemens_coefficient= 0 + light_overlay = "should not use a light overlay" + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN) //CHOMPEDIT: adding more races to the proto rig + +/obj/item/clothing/gloves/gauntlets/rig/protean + name = "mass" + desc = "Glove-shaped clusters of nanomachines." + siemens_coefficient= 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN) //CHOMPEDIT: adding more races to the proto rig + +/obj/item/clothing/shoes/magboots/rig/protean + name = "mass" + desc = "Boot-shaped clusters of nanomachines." + siemens_coefficient= 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN) //CHOMPEDIT: adding more races to the proto rig + +/obj/item/clothing/suit/space/rig/protean + name = "mass" + desc = "A body-hugging mass of nanomachines." + siemens_coefficient= 0 + can_breach = 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN) + allowed = list( + /obj/item/weapon/gun, + /obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/melee/baton, + /obj/item/weapon/storage/backpack, + ) //Subspace radio is in for the citadel version. IDK if we have that and I don't think we need it so I removed it from this list. + + + + +//Backend stuff to make the sprites work. Copied and pasted from rig_pieces_vr.dm, but added ch to everything. Only reason for this to be touched is to add or remove species. This might just need to go in a new file named rig_pieces_ch.dm. +/obj/item/clothing/head/helmet/space/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/head_ch.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/helmet_ch.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/helmet_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet_ch.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/helmet_ch.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/helmet_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/helmet_ch.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/head_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/head_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/hats_ch.dmi' + ) + +/obj/item/clothing/suit/space/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/spacesuit_ch.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/suit_ch.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/suit_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_ch.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/suit_ch.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/suit_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/suit_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/suit_ch.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/suit_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/suit_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/spacesuits_ch.dmi' + ) + +/obj/item/clothing/gloves/gauntlets/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/hands_ch.dmi', + SPECIES_TAJ = 'icons/mob/hands_ch.dmi', + SPECIES_SKRELL = 'icons/mob/hands_ch.dmi', + SPECIES_UNATHI = 'icons/mob/hands_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/hands_ch.dmi', + SPECIES_AKULA = 'icons/mob/hands_ch.dmi', + SPECIES_SERGAL = 'icons/mob/hands_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/hands_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/hands_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/hands_ch.dmi', + SPECIES_FENNEC = 'icons/mob/hands_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/hands_ch.dmi', + SPECIES_TESHARI = 'icons/mob/hands_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/hands_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/gloves_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/gloves_ch.dmi' + ) + +/obj/item/clothing/shoes/magboots/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/feet_ch.dmi', + SPECIES_TAJ = 'icons/mob/feet_ch.dmi', + SPECIES_SKRELL = 'icons/mob/feet_ch.dmi', + SPECIES_UNATHI = 'icons/mob/feet_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/feet_ch.dmi', + SPECIES_AKULA = 'icons/mob/feet_ch.dmi', + SPECIES_SERGAL = 'icons/mob/feet_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/feet_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/feet_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/feet_ch.dmi', + SPECIES_FENNEC = 'icons/mob/feet_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/feet_ch.dmi', + SPECIES_TESHARI = 'icons/mob/feet_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/feet_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/shoes_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/shoes_ch.dmi' + ) diff --git a/code/modules/clothing/spacesuits/rig/suits/station_ch.dm b/code/modules/clothing/spacesuits/rig/suits/station_ch.dm index e4de77f8db..82653b3c21 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station_ch.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station_ch.dm @@ -64,7 +64,7 @@ SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/helmet_ch.dmi', SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_ch.dmi', SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet_ch.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/head_ch.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/head_ch.dmi' ) @@ -82,7 +82,7 @@ SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/suit_ch.dmi', SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_ch.dmi', SPECIES_PROMETHEAN = 'icons/mob/species/skrell/suit_ch.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/suit_ch.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/suit_ch.dmi' ) /* @@ -101,4 +101,4 @@ /obj/item/clothing/suit/space/rig/ch species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_GREY_YW/*ywedit*/) flags = PHORONGUARD //YAWN Edit -*/ \ No newline at end of file +*/ diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 1436f3d5cc..f481ee57b1 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -38,7 +38,7 @@ verbs |= /obj/item/clothing/head/helmet/space/proc/toggle_camera if(type == /obj/item/clothing/head/helmet/space) //VOREStation edit - use the specially refitted sprites by KBraid. Done this way to avoid breaking subtypes. - sprite_sheets[SPECIES_TESHARI] = 'icons/mob/species/seromi/helmet_vr.dmi' + sprite_sheets[SPECIES_TESHARI] = 'icons/mob/species/teshari/helmet_vr.dmi' /obj/item/clothing/head/helmet/space/proc/toggle_camera() set name = "Toggle Helmet Camera" @@ -96,7 +96,7 @@ /obj/item/clothing/suit/space/Initialize() . = ..() if(type == /obj/item/clothing/suit/space) - sprite_sheets[SPECIES_TESHARI] = 'icons/mob/species/seromi/suit_vr.dmi' + sprite_sheets[SPECIES_TESHARI] = 'icons/mob/species/teshari/suit_vr.dmi' //VOREStation edit end. /obj/item/clothing/suit/space/equipped(mob/M) diff --git a/code/modules/clothing/spacesuits/void/ert.dm b/code/modules/clothing/spacesuits/void/ert.dm index b9fe70383d..5bfdfb8c6b 100644 --- a/code/modules/clothing/spacesuits/void/ert.dm +++ b/code/modules/clothing/spacesuits/void/ert.dm @@ -56,31 +56,6 @@ ..() helmet = new /obj/item/clothing/head/helmet/space/void/responseteam/janitor //autoinstall the helmet -/obj/item/clothing/suit/space/void/responseteam - sprite_sheets = list( - SPECIES_HUMAN = 'icons/mob/spacesuit_vr.dmi', - SPECIES_TAJ = 'icons/mob/species/tajaran/suit_vr.dmi', - SPECIES_SKRELL = 'icons/mob/species/skrell/suit_vr.dmi', - SPECIES_UNATHI = 'icons/mob/species/unathi/suit_vr.dmi', - SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_vr.dmi', - SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi', - SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi', - SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi', - SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi', - SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi' - ) - sprite_sheets_obj = list( - SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_SKRELL = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_UNATHI = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_XENOHYBRID = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_AKULA = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_SERGAL = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_VULPKANIN = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_ZORREN_HIGH = 'icons/obj/clothing/suits_vr.dmi', - SPECIES_FENNEC = 'icons/obj/clothing/suits_vr.dmi' - ) - //override the attackby screwdriver proc so that people can't remove the helmet /obj/item/clothing/suit/space/void/responseteam/attackby(obj/item/W as obj, mob/user as mob) @@ -130,14 +105,40 @@ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100) siemens_coefficient = 0.5 icon = 'icons/obj/clothing/hats_vr.dmi' + enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_AUGMENTED) + var/away_planes = null + plane_slots = list(slot_head) + var/hud_active = 1 + var/activation_sound = 'sound/items/nif_click.ogg' + +/obj/item/clothing/head/helmet/space/void/responseteam/verb/toggle() + set category = "Object" + set name = "Toggle Mark 7 Suit HUD" + set src in usr + + if(usr.canmove && !usr.stat && !usr.restrained()) + if(src.hud_active) + away_planes = enables_planes + enables_planes = null + to_chat(usr, "You disable the inbuilt heads-up display.") + hud_active = 0 + else + enables_planes = away_planes + away_planes = null + to_chat(usr, "You enable the inbuilt heads-up display.") + hud_active = 1 + usr << activation_sound + usr.recalculate_vis() /obj/item/clothing/head/helmet/space/void/responseteam/command name = "Mark VII-C Emergency Response Team Commander Helmet" + enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_CH_WANTED,VIS_AUGMENTED) /obj/item/clothing/head/helmet/space/void/responseteam/medical name = "Mark VII-M Emergency Medical Response Helmet" icon_state = "erthelmet_m" item_state = "erthelmet_m" + enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED) /obj/item/clothing/head/helmet/space/void/responseteam/engineer name = "Mark VII-E Emergency Engineering Response Helmet" @@ -148,12 +149,50 @@ name = "Mark VII-S Emergency Security Response Helmet" icon_state = "erthelmet_s" item_state = "erthelmet_s" + enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_WANTED,VIS_AUGMENTED) /obj/item/clothing/head/helmet/space/void/responseteam/janitor name = "Mark VII-J Emergency Cleanup Response Helmet" icon_state = "erthelmet_j" item_state = "erthelmet_j" +/obj/item/clothing/suit/space/void/responseteam + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/spacesuit_vr.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/suit_vr.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/suit_vr.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/suit_vr.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_vr.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi', + SPECIES_SHADEKIN_CREW = 'icons/mob/species/vulpkanin/suit_vr.dmi', + SPECIES_VASILISSAN = 'icons/mob/spacesuit_vr.dmi', + SPECIES_NEVREAN = 'icons/mob/spacesuit_vr.dmi', + SPECIES_RAPALA = 'icons/mob/spacesuit_vr.dmi', + SPECIES_ALRAUNE = 'icons/mob/spacesuit_vr.dmi', + SPECIES_ZADDAT = 'icons/mob/spacesuit_vr.dmi' + ) + sprite_sheets_obj = list( + SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_AKULA = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_SHADEKIN_CREW = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_RAPALA = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_ALRAUNE = 'icons/obj/clothing/suits_vr.dmi', + SPECIES_ZADDAT = 'icons/obj/clothing/suits_vr.dmi' + ) + /obj/item/clothing/head/helmet/space/void/responseteam sprite_sheets = list( SPECIES_HUMAN = 'icons/mob/head_vr.dmi', @@ -165,7 +204,13 @@ SPECIES_SERGAL = 'icons/mob/species/unathi/helmet_vr.dmi', SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_vr.dmi', SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet_vr.dmi', - SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi' + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi', + SPECIES_SHADEKIN_CREW = 'icons/mob/species/vulpkanin/helmet_vr.dmi', + SPECIES_VASILISSAN = 'icons/mob/head_vr.dmi', + SPECIES_NEVREAN = 'icons/mob/head_vr.dmi', + SPECIES_RAPALA = 'icons/mob/head_vr.dmi', + SPECIES_ALRAUNE = 'icons/mob/head_vr.dmi', + SPECIES_ZADDAT = 'icons/mob/head_vr.dmi' ) sprite_sheets_obj = list( SPECIES_TAJ = 'icons/obj/clothing/hats_vr.dmi', @@ -176,6 +221,12 @@ SPECIES_SERGAL = 'icons/obj/clothing/hats_vr.dmi', SPECIES_VULPKANIN = 'icons/obj/clothing/hats_vr.dmi', SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats_vr.dmi', - SPECIES_FENNEC = 'icons/obj/clothing/hats_vr.dmi' + SPECIES_FENNEC = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_SHADEKIN_CREW = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_RAPALA = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_ALRAUNE = 'icons/obj/clothing/hats_vr.dmi', + SPECIES_ZADDAT = 'icons/obj/clothing/hats_vr.dmi' ) sprite_sheets_refit = list() //have to nullify this as well just to be thorough \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index 0dbce4a494..14ead552e2 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -186,7 +186,7 @@ /obj/item/clothing/head/helmet/space/void/medical/alt/tesh sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi' ) sprite_sheets_obj = list( SPECIES_TESHARI = 'icons/obj/clothing/hats.dmi' @@ -222,7 +222,7 @@ /obj/item/clothing/suit/space/void/medical/alt/tesh sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi' ) sprite_sheets_obj = list( SPECIES_TESHARI = 'icons/obj/clothing/spacesuits.dmi' diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 15aeb1f716..15b4135467 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -24,7 +24,7 @@ SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/hats.dmi', SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/hats.dmi', SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/hats.dmi', - SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/hats.dmi' + SPECIES_TESHARI = 'icons/obj/clothing/species/teshari/hats.dmi' ) light_overlay = "helmet_light" @@ -54,7 +54,7 @@ SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/suits.dmi', SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/suits.dmi', SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/suits.dmi', - SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/suits.dmi' + SPECIES_TESHARI = 'icons/obj/clothing/species/teshari/suits.dmi' ) //Breach thresholds, should ideally be inherited by most (if not all) voidsuits. diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index f9094e40fb..ba30534822 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -11,7 +11,7 @@ SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi', SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', SPECIES_AKULA = 'icons/mob/species/akula/helmet_vr.dmi', SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_vr.dmi', @@ -25,7 +25,7 @@ SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/hats.dmi', // Copied from void.dm SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/hats.dmi', // Copied from void.dm SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/hats.dmi', // Copied from void.dm - SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/hats.dmi', // Copied from void.dm + SPECIES_TESHARI = 'icons/obj/clothing/species/teshari/hats.dmi', // Copied from void.dm SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/hats.dmi', SPECIES_AKULA = 'icons/obj/clothing/species/akula/hats.dmi', SPECIES_SERGAL = 'icons/obj/clothing/species/sergal/hats.dmi', @@ -41,7 +41,7 @@ SPECIES_TAJ = 'icons/mob/species/tajaran/suit.dmi', SPECIES_SKRELL = 'icons/mob/species/skrell/suit.dmi', SPECIES_UNATHI = 'icons/mob/species/unathi/suit.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi', SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit.dmi', SPECIES_AKULA = 'icons/mob/species/akula/suit_vr.dmi', SPECIES_SERGAL = 'icons/mob/species/sergal/suit_vr.dmi', @@ -54,7 +54,7 @@ SPECIES_TAJ = 'icons/obj/clothing/species/tajaran/suits.dmi', // Copied from void.dm SPECIES_SKRELL = 'icons/obj/clothing/species/skrell/suits.dmi', // Copied from void.dm SPECIES_UNATHI = 'icons/obj/clothing/species/unathi/suits.dmi', // Copied from void.dm - SPECIES_TESHARI = 'icons/obj/clothing/species/seromi/suits.dmi', // Copied from void.dm + SPECIES_TESHARI = 'icons/obj/clothing/species/teshari/suits.dmi', // Copied from void.dm SPECIES_XENOHYBRID = 'icons/obj/clothing/species/unathi/suits.dmi', SPECIES_AKULA = 'icons/obj/clothing/species/akula/suits.dmi', SPECIES_SERGAL = 'icons/obj/clothing/species/sergal/suits.dmi', @@ -164,7 +164,7 @@ SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_vr.dmi', SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/suit_vr.dmi', SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_vr.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/suit_vr.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/suit_vr.dmi' ) sprite_sheets_obj = list( SPECIES_TAJ = 'icons/obj/clothing/suits_vr.dmi', @@ -180,7 +180,7 @@ ) /obj/item/clothing/suit/space/void/autolok/Initialize() - ..() + . = ..() helmet = new /obj/item/clothing/head/helmet/space/void/autolok //autoinstall the helmet //override the attackby screwdriver proc so that people can't remove the helmet @@ -243,7 +243,7 @@ SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_vr.dmi', SPECIES_ZORREN_HIGH = 'icons/mob/species/vulpkanin/helmet_vr.dmi', SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_vr.dmi', - SPECIES_TESHARI = 'icons/mob/species/seromi/helmet_vr.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/helmet_vr.dmi' ) sprite_sheets_obj = list( SPECIES_TAJ = 'icons/obj/clothing/hats_vr.dmi', diff --git a/code/modules/clothing/suits/aliens/seromi.dm b/code/modules/clothing/suits/aliens/teshari.dm similarity index 79% rename from code/modules/clothing/suits/aliens/seromi.dm rename to code/modules/clothing/suits/aliens/teshari.dm index bdfeb88ec0..98498dcffd 100644 --- a/code/modules/clothing/suits/aliens/seromi.dm +++ b/code/modules/clothing/suits/aliens/teshari.dm @@ -1,141 +1,141 @@ // Standard Cloaks -/obj/item/clothing/suit/storage/seromi/cloak +/obj/item/clothing/suit/storage/teshari/cloak name = "black cloak" desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets convienently placed inside." - icon = 'icons/mob/species/seromi/teshari_cloak.dmi' - icon_override = 'icons/mob/species/seromi/teshari_cloak.dmi' + icon = 'icons/mob/species/teshari/teshari_cloak.dmi' + icon_override = 'icons/mob/species/teshari/teshari_cloak.dmi' icon_state = "tesh_cloak_bn" item_state = "tesh_cloak_bn" species_restricted = list(SPECIES_TESHARI) body_parts_covered = UPPER_TORSO|ARMS -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_red +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_red name = "black and red cloak" icon_state = "tesh_cloak_br" item_state = "tesh_cloak_br" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_orange +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_orange name = "black and orange cloak" icon_state = "tesh_cloak_bo" item_state = "tesh_cloak_bo" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_yellow +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_yellow name = "black and yellow cloak" icon_state = "tesh_cloak_by" item_state = "tesh_cloak_by" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_green +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_green name = "black and green cloak" icon_state = "tesh_cloak_bgr" item_state = "tesh_cloak_bgr" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_blue +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_blue name = "black and blue cloak" icon_state = "tesh_cloak_bbl" item_state = "tesh_cloak_bbl" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_purple +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_purple name = "black and purple cloak" icon_state = "tesh_cloak_bp" item_state = "tesh_cloak_bp" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_pink +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_pink name = "black and pink cloak" icon_state = "tesh_cloak_bpi" item_state = "tesh_cloak_bpi" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_brown +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_brown name = "black and brown cloak" icon_state = "tesh_cloak_bbr" item_state = "tesh_cloak_bbr" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_grey name = "black and grey cloak" icon_state = "tesh_cloak_bg" item_state = "tesh_cloak_bg" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_white +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_white name = "black and white cloak" icon_state = "tesh_cloak_bw" item_state = "tesh_cloak_bw" -/obj/item/clothing/suit/storage/seromi/cloak/standard/white +/obj/item/clothing/suit/storage/teshari/cloak/standard/white name = "white cloak" icon_state = "tesh_cloak_wn" item_state = "tesh_cloak_wn" -/obj/item/clothing/suit/storage/seromi/cloak/standard/white_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/white_grey name = "white and grey cloak" icon_state = "tesh_cloak_wg" item_state = "tesh_cloak_wg" -/obj/item/clothing/suit/storage/seromi/cloak/standard/red_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/red_grey name = "red and grey cloak" icon_state = "tesh_cloak_rg" item_state = "tesh_cloak_rg" -/obj/item/clothing/suit/storage/seromi/cloak/standard/orange_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/orange_grey name = "orange and grey cloak" icon_state = "tesh_cloak_og" item_state = "tesh_cloak_og" -/obj/item/clothing/suit/storage/seromi/cloak/standard/yellow_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/yellow_grey name = "yellow and grey cloak" icon_state = "tesh_cloak_yg" item_state = "tesh_cloak_yg" -/obj/item/clothing/suit/storage/seromi/cloak/standard/green_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/green_grey name = "green and grey cloak" icon_state = "tesh_cloak_gg" item_state = "tesh_cloak_gg" -/obj/item/clothing/suit/storage/seromi/cloak/standard/blue_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/blue_grey name = "blue and grey cloak" icon_state = "tesh_cloak_blug" item_state = "tesh_cloak_blug" -/obj/item/clothing/suit/storage/seromi/cloak/standard/purple_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/purple_grey name = "purple and grey cloak" icon_state = "tesh_cloak_pg" item_state = "tesh_cloak_pg" -/obj/item/clothing/suit/storage/seromi/cloak/standard/pink_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/pink_grey name = "pink and grey cloak" icon_state = "tesh_cloak_pig" item_state = "tesh_cloak_pig" -/obj/item/clothing/suit/storage/seromi/cloak/standard/brown_grey +/obj/item/clothing/suit/storage/teshari/cloak/standard/brown_grey name = "brown and grey cloak" icon_state = "tesh_cloak_brg" item_state = "tesh_cloak_brg" -/obj/item/clothing/suit/storage/seromi/cloak/standard/rainbow +/obj/item/clothing/suit/storage/teshari/cloak/standard/rainbow name = "rainbow cloak" icon_state = "tesh_cloak_rainbow" item_state = "tesh_cloak_rainbow" -/obj/item/clothing/suit/storage/seromi/cloak/standard/orange +/obj/item/clothing/suit/storage/teshari/cloak/standard/orange name = "orange cloak" icon_state = "tesh_cloak_on" item_state = "tesh_cloak_on" -/obj/item/clothing/suit/storage/seromi/cloak/standard/dark_retrowave +/obj/item/clothing/suit/storage/teshari/cloak/standard/dark_retrowave name = "dark aesthetic cloak" icon_state = "tesh_cloak_dretrowave" item_state = "tesh_cloak_dretrowave" -/obj/item/clothing/suit/storage/seromi/cloak/standard/black_glow +/obj/item/clothing/suit/storage/teshari/cloak/standard/black_glow name = "black and glowing cloak" icon_state = "tesh_cloak_bglowing" item_state = "tesh_cloak_bglowing" // Job Cloaks -/obj/item/clothing/suit/storage/seromi/cloak/jobs - icon = 'icons/mob/species/seromi/deptcloak.dmi' - icon_override = 'icons/mob/species/seromi/deptcloak.dmi' +/obj/item/clothing/suit/storage/teshari/cloak/jobs + icon = 'icons/mob/species/teshari/deptcloak.dmi' + icon_override = 'icons/mob/species/teshari/deptcloak.dmi' -/obj/item/clothing/suit/storage/seromi/cloak/jobs/cap +/obj/item/clothing/suit/storage/teshari/cloak/jobs/cap name = "facility director cloak" desc = "A soft Teshari cloak made for the Facility Director" icon_state = "tesh_cloak_cap" @@ -143,19 +143,19 @@ //Cargo -/obj/item/clothing/suit/storage/seromi/cloak/jobs/qm +/obj/item/clothing/suit/storage/teshari/cloak/jobs/qm name = "quartermaster cloak" desc = "A soft Teshari cloak made for the Quartermaster" icon_state = "tesh_cloak_qm" item_state = "tesh_cloak_qm" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/cargo +/obj/item/clothing/suit/storage/teshari/cloak/jobs/cargo name = "cargo cloak" desc = "A soft Teshari cloak made for the Cargo department" icon_state = "tesh_cloak_car" item_state = "tesh_cloak_car" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/mining +/obj/item/clothing/suit/storage/teshari/cloak/jobs/mining name = "mining cloak" desc = "A soft Teshari cloak made for Mining" icon_state = "tesh_cloak_mine" @@ -163,19 +163,19 @@ //Engineering -/obj/item/clothing/suit/storage/seromi/cloak/jobs/ce +/obj/item/clothing/suit/storage/teshari/cloak/jobs/ce name = "cheif engineer cloak" desc = "A soft Teshari cloak made the Chief Engineer" icon_state = "tesh_cloak_ce" item_state = "tesh_cloak_ce" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/engineer +/obj/item/clothing/suit/storage/teshari/cloak/jobs/engineer name = "engineering cloak" desc = "A soft Teshari cloak made for the Engineering department" icon_state = "tesh_cloak_engie" item_state = "tesh_cloak_engie" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/atmos +/obj/item/clothing/suit/storage/teshari/cloak/jobs/atmos name = "atmospherics cloak" desc = "A soft Teshari cloak made for the Atmospheric Technician" icon_state = "tesh_cloak_atmos" @@ -183,37 +183,37 @@ //Medical -/obj/item/clothing/suit/storage/seromi/cloak/jobs/cmo +/obj/item/clothing/suit/storage/teshari/cloak/jobs/cmo name = "chief medical officer cloak" desc = "A soft Teshari cloak made the Cheif Medical Officer" icon_state = "tesh_cloak_cmo" item_state = "tesh_cloak_cmo" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/medical +/obj/item/clothing/suit/storage/teshari/cloak/jobs/medical name = "medical cloak" desc = "A soft Teshari cloak made for the Medical department" icon_state = "tesh_cloak_doc" item_state = "tesh_cloak_doc" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/chemistry +/obj/item/clothing/suit/storage/teshari/cloak/jobs/chemistry name = "chemist cloak" desc = "A soft Teshari cloak made for the Chemist" icon_state = "tesh_cloak_chem" item_state = "tesh_cloak_chem" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/viro +/obj/item/clothing/suit/storage/teshari/cloak/jobs/viro name = "virologist cloak" desc = "A soft Teshari cloak made for the Virologist" icon_state = "tesh_cloak_viro" item_state = "tesh_cloak_viro" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/para +/obj/item/clothing/suit/storage/teshari/cloak/jobs/para name = "paramedic cloak" desc = "A soft Teshari cloak made for the Paramedic" icon_state = "tesh_cloak_para" item_state = "tesh_cloak_para" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/psych +/obj/item/clothing/suit/storage/teshari/cloak/jobs/psych name = " psychiatrist cloak" desc = "A soft Teshari cloak made for the Psychiatrist" icon_state = "tesh_cloak_psych" @@ -221,19 +221,19 @@ //Science -/obj/item/clothing/suit/storage/seromi/cloak/jobs/rd +/obj/item/clothing/suit/storage/teshari/cloak/jobs/rd name = "research director cloak" desc = "A soft Teshari cloak made for the Research Director" icon_state = "tesh_cloak_rd" item_state = "tesh_cloak_rd" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/sci +/obj/item/clothing/suit/storage/teshari/cloak/jobs/sci name = "scientist cloak" desc = "A soft Teshari cloak made for the Science department" icon_state = "tesh_cloak_sci" item_state = "tesh_cloak_sci" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/robo +/obj/item/clothing/suit/storage/teshari/cloak/jobs/robo name = "roboticist cloak" desc = "A soft Teshari cloak made for the Roboticist" icon_state = "tesh_cloak_robo" @@ -241,7 +241,7 @@ //Security -/obj/item/clothing/suit/storage/seromi/cloak/jobs/hos +/obj/item/clothing/suit/storage/teshari/cloak/jobs/hos name = "head of security cloak" desc = "A soft Teshari cloak made for the Head of Security. This one is made with stronger fibers." //CHOMPedot icon_state = "tesh_cloak_hos" @@ -252,7 +252,7 @@ siemens_coefficient = 0.6 armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0) //CHOMPedit end -/obj/item/clothing/suit/storage/seromi/cloak/jobs/sec +/obj/item/clothing/suit/storage/teshari/cloak/jobs/sec name = "security cloak" desc = "A soft Teshari cloak made for the Security department. This one is made with stronger fibers." //CHOMPedit icon_state = "tesh_cloak_sec" @@ -263,7 +263,7 @@ siemens_coefficient = 0.6 armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0) //CHOMPedit end -/obj/item/clothing/suit/storage/seromi/cloak/jobs/iaa +/obj/item/clothing/suit/storage/teshari/cloak/jobs/iaa name = "internal affairs cloak" desc = "A soft Teshari cloak made for the Internal Affairs Agent" icon_state = "tesh_cloak_iaa" @@ -271,13 +271,13 @@ //Service -/obj/item/clothing/suit/storage/seromi/cloak/jobs/hop +/obj/item/clothing/suit/storage/teshari/cloak/jobs/hop name = "head of personnel cloak" desc = "A soft Teshari cloak made for the Head of Personnel" icon_state = "tesh_cloak_hop" item_state = "tesh_cloak_hop" -/obj/item/clothing/suit/storage/seromi/cloak/jobs/service +/obj/item/clothing/suit/storage/teshari/cloak/jobs/service name = "service cloak" desc = "A soft Teshari cloak made for the Service department" icon_state = "tesh_cloak_serv" @@ -288,16 +288,16 @@ /obj/item/clothing/suit/storage/toggle/labcoat/teshari name = "Teshari labcoat" desc = "A small suit that protects against minor chemical spills. This one is a good fit on Teshari." - icon = 'icons/obj/clothing/species/seromi/suits.dmi' - icon_override = 'icons/mob/species/seromi/suit.dmi' + icon = 'icons/obj/clothing/species/teshari/suits.dmi' + icon_override = 'icons/mob/species/teshari/suit.dmi' icon_state = "tesh_labcoat" species_restricted = list(SPECIES_TESHARI) /obj/item/clothing/suit/storage/toggle/tesharicoat name = "small black coat" desc = "A coat that seems too small to fit a human." - icon = 'icons/obj/clothing/species/seromi/suits.dmi' - icon_override = 'icons/mob/species/seromi/suit.dmi' + icon = 'icons/obj/clothing/species/teshari/suits.dmi' + icon_override = 'icons/mob/species/teshari/suit.dmi' icon_state = "tesharicoat" body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS species_restricted = list(SPECIES_TESHARI) @@ -305,8 +305,8 @@ /obj/item/clothing/suit/storage/toggle/tesharicoatwhite name = "small coat" desc = "A coat that seems too small to fit a human." - icon = 'icons/obj/clothing/species/seromi/suits.dmi' - icon_override = 'icons/mob/species/seromi/suit.dmi' + icon = 'icons/obj/clothing/species/teshari/suits.dmi' + icon_override = 'icons/mob/species/teshari/suit.dmi' icon_state = "tesharicoatwhite" body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS species_restricted = list(SPECIES_TESHARI) @@ -315,8 +315,8 @@ /obj/item/clothing/suit/storage/hooded/teshari name = "Hooded Teshari Cloak" desc = "A soft teshari cloak with an added hood." - icon_override = 'icons/mob/species/seromi/teshari_hood.dmi' - icon = 'icons/mob/species/seromi/teshari_hood.dmi' + icon_override = 'icons/mob/species/teshari/teshari_hood.dmi' + icon = 'icons/mob/species/teshari/teshari_hood.dmi' icon_state = "tesh_hcloak_bo" item_state_slots = list(slot_r_hand_str = "tesh_hcloak_bo", slot_l_hand_str = "tesh_hcloak_bo") body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -329,8 +329,8 @@ /obj/item/clothing/head/tesh_hood name = "Cloak Hood" desc = "A hood attached to a teshari cloak." - icon_override = 'icons/mob/species/seromi/teshari_hood.dmi' - icon = 'icons/mob/species/seromi/teshari_hood.dmi' + icon_override = 'icons/mob/species/teshari/teshari_hood.dmi' + icon = 'icons/mob/species/teshari/teshari_hood.dmi' icon_state = "tesh_hood_bo" item_state_slots = list(slot_r_hand_str = "tesh_hood_bo", slot_l_hand_str = "tesh_hood_bo") flags_inv = BLOCKHAIR @@ -613,225 +613,225 @@ item_state = "tesh_hood_brg" //Belted cloaks -/obj/item/clothing/suit/storage/seromi/beltcloak +/obj/item/clothing/suit/storage/teshari/beltcloak name = "belted cloak" desc = "A more ridged and stylized Teshari cloak." - icon = 'icons/mob/species/seromi/teshari_cloak.dmi' - icon_override = 'icons/mob/species/seromi/teshari_cloak.dmi' + icon = 'icons/mob/species/teshari/teshari_cloak.dmi' + icon_override = 'icons/mob/species/teshari/teshari_cloak.dmi' icon_state = "tesh_beltcloak_bo" item_state = "tesh_beltcloak_bo" species_restricted = list(SPECIES_TESHARI) body_parts_covered = UPPER_TORSO|ARMS -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_orange +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_orange name = "black belted cloak (orange)" icon_state = "tesh_beltcloak_bo" item_state = "tesh_beltcloak_bo" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_grey name = "black belted cloak" icon_state = "tesh_beltcloak_bg" item_state = "tesh_beltcloak_bg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_midgrey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_midgrey name = "black belted cloak (medium grey)" icon_state = "tesh_beltcloak_bmg" item_state = "tesh_beltcloak_bmg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_lightgrey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_lightgrey name = "black belted cloak (light grey)" icon_state = "tesh_beltcloak_blg" item_state = "tesh_beltcloak_blg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_white +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_white name = "black belted cloak (white)" icon_state = "tesh_beltcloak_bw" item_state = "tesh_beltcloak_bw" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_red +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_red name = "black belted cloak (red)" icon_state = "tesh_beltcloak_br" item_state = "tesh_beltcloak_br" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black name = "black simple belted cloak" icon_state = "tesh_beltcloak_bn" item_state = "tesh_beltcloak_bn" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_yellow +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_yellow name = "black belted cloak (yellow)" icon_state = "tesh_beltcloak_by" item_state = "tesh_beltcloak_by" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_green +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_green name = "black belted cloak (green)" icon_state = "tesh_beltcloak_bgr" item_state = "tesh_beltcloak_bgr" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_blue +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_blue name = "black belted cloak (blue)" icon_state = "tesh_beltcloak_bbl" item_state = "tesh_beltcloak_bbl" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_purple +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_purple name = "black belted cloak (purple)" icon_state = "tesh_beltcloak_bp" item_state = "tesh_beltcloak_bp" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_pink +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_pink name = "black belted cloak (pink)" icon_state = "tesh_beltcloak_bpi" item_state = "tesh_beltcloak_bpi" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/black_brown +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/black_brown name = "black belted cloak (brown)" icon_state = "tesh_beltcloak_bbr" item_state = "tesh_beltcloak_bbr" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/orange_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/orange_grey name = "orange belted cloak" icon_state = "tesh_beltcloak_og" item_state = "tesh_beltcloak_og" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/rainbow +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/rainbow name = "rainbow belted cloak" icon_state = "tesh_beltcloak_rainbow" item_state = "tesh_beltcloak_rainbow" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/lightgrey_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/lightgrey_grey name = "light grey belted cloak" icon_state = "tesh_beltcloak_lgg" item_state = "tesh_beltcloak_lgg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/white_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/white_grey name = "white belted cloak" icon_state = "tesh_beltcloak_wg" item_state = "tesh_beltcloak_wg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/red_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/red_grey name = "red belted cloak" icon_state = "tesh_beltcloak_rg" item_state = "tesh_beltcloak_rg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/orange +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/orange name = "orange simple belted cloak" icon_state = "tesh_beltcloak_on" item_state = "tesh_beltcloak_on" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/yellow_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/yellow_grey name = "yellow belted cloak" icon_state = "tesh_beltcloak_yg" item_state = "tesh_beltcloak_yg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/green_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/green_grey name = "green belted cloak" icon_state = "tesh_beltcloak_gg" item_state = "tesh_beltcloak_gg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/blue_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/blue_grey name = "blue belted cloak" icon_state = "tesh_beltcloak_blug" item_state = "tesh_beltcloak_blug" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/purple_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/purple_grey name = "purple belted cloak" icon_state = "tesh_beltcloak_pg" item_state = "tesh_beltcloak_pg" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/pink_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/pink_grey name = "pink belted cloak" icon_state = "tesh_beltcloak_pig" item_state = "tesh_beltcloak_pig" -/obj/item/clothing/suit/storage/seromi/beltcloak/standard/brown_grey +/obj/item/clothing/suit/storage/teshari/beltcloak/standard/brown_grey name = "brown belted cloak" icon_state = "tesh_beltcloak_brg" item_state = "tesh_beltcloak_brg" //Belted job cloaks -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs - icon = 'icons/mob/species/seromi/deptcloak.dmi' - icon_override = 'icons/mob/species/seromi/deptcloak.dmi' +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs + icon = 'icons/mob/species/teshari/deptcloak.dmi' + icon_override = 'icons/mob/species/teshari/deptcloak.dmi' -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cargo +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cargo name = "cargo belted cloak" desc = "A soft Teshari cloak made for the Cargo department" icon_state = "tesh_beltcloak_car" item_state = "tesh_beltcloak_car" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/mining +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/mining name = "mining belted cloak" desc = "A soft Teshari cloak made for Mining" icon_state = "tesh_beltcloak_mine" item_state = "tesh_beltcloak_mine" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/command +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/command name = "command belted cloak" desc = "A soft Teshari cloak made for the Command department" icon_state = "tesh_beltcloak_comm" item_state = "tesh_beltcloak_comm" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/ce +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/ce name = "chief engineer belted cloak" desc = "A soft Teshari cloak made the Chief Engineer" icon_state = "tesh_beltcloak_ce" item_state = "tesh_beltcloak_ce" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/engineer +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/engineer name = "engineering belted cloak" desc = "A soft Teshari cloak made for the Engineering department" icon_state = "tesh_beltcloak_engie" item_state = "tesh_beltcloak_engie" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/atmos +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/atmos name = "atmospherics belted cloak" desc = "A soft Teshari cloak made for the Atmospheric Technician" icon_state = "tesh_beltcloak_atmos" item_state = "tesh_beltcloak_atmos" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/cmo +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/cmo name = "chief medical officer belted cloak" desc = "A soft Teshari cloak made the Chief Medical Officer" icon_state = "tesh_beltcloak_cmo" item_state = "tesh_beltcloak_cmo" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/medical +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/medical name = "medical belted cloak" desc = "A soft Teshari cloak made for the Medical department" icon_state = "tesh_beltcloak_doc" item_state = "tesh_beltcloak_doc" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/chemistry +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/chemistry name = "chemist belted cloak" desc = "A soft Teshari cloak made for the Chemist" icon_state = "tesh_beltcloak_vrem" item_state = "tesh_beltcloak_vrem" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/viro +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/viro name = "virologist belted cloak" desc = "A soft Teshari cloak made for the Virologist" icon_state = "tesh_beltcloak_viro" item_state = "tesh_beltcloak_viro" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/para +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/para name = "paramedic belted cloak" desc = "A soft Teshari cloak made for the Paramedic" icon_state = "tesh_beltcloak_para" item_state = "tesh_beltcloak_para" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/sci +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/sci name = "scientist belted cloak" desc = "A soft Teshari cloak made for the Science department" icon_state = "tesh_beltcloak_sci" item_state = "tesh_beltcloak_sci" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/robo +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/robo name = "roboticist belted cloak" desc = "A soft Teshari cloak made for the Roboticist" icon_state = "tesh_beltcloak_robo" item_state = "tesh_beltcloak_robo" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/sec +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/sec name = "security belted cloak" desc = "A soft Teshari cloak made for the Security department. This one is made with stronger fibers." //CHOMPedit icon_state = "tesh_beltcloak_sec" @@ -842,31 +842,31 @@ siemens_coefficient = 0.6 armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0) //CHOMPedit end -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/qm +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/qm name = "quartermaster belted cloak" desc = "A soft Teshari cloak made for the Quartermaster" icon_state = "tesh_beltcloak_qm" item_state = "tesh_beltcloak_qm" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/service +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/service name = "service belted cloak" desc = "A soft Teshari cloak made for the Service department" icon_state = "tesh_beltcloak_serv" item_state = "tesh_beltcloak_serv" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/iaa +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/iaa name = "internal affairs belted cloak" desc = "A soft Teshari cloak made for the Internal Affairs Agent" icon_state = "tesh_beltcloak_iaa" item_state = "tesh_beltcloak_iaa" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/wrdn +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/wrdn name = "warden belted cloak" desc = "A soft Teshari cloak made for the Warden" icon_state = "tesh_beltcloak_wrdn" item_state = "tesh_beltcloak_wrdn" -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/hos +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/hos name = "security chief belted cloak" desc = "A soft Teshari cloak made for the Head of Security. This one is made with stronger fibers." //CHOMPedit icon_state = "tesh_beltcloak_hos" @@ -877,7 +877,7 @@ siemens_coefficient = 0.6 armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0) //CHOMPedit end -/obj/item/clothing/suit/storage/seromi/beltcloak/jobs/jani +/obj/item/clothing/suit/storage/teshari/beltcloak/jobs/jani name = "janitor belted cloak" desc = "A soft Teshari cloak made for the Janitor" icon_state = "tesh_beltcloak_jani" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 20f33104ca..450db31f36 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -353,6 +353,11 @@ icon_badge = "pcrcvest_badge" icon_nobadge = "pcrcvest_nobadge" +/obj/item/clothing/suit/storage/vest/solgov/hedberg + name = "Hedberg-Hammarstrom armor vest" + desc = "A simple kevlar plate carrier belonging to Hedberg-Hammarstrom. The company logo is clearly visible." + icon_state = "secwebvest" + /obj/item/clothing/suit/storage/vest/solgov name = "\improper Solar Confederate Government armored vest" desc = "A synthetic armor vest. This one is marked with the crest of the Solar Confederate Government." @@ -361,14 +366,9 @@ /obj/item/clothing/suit/storage/vest/solgov/heavy name = "\improper Solar Confederate Government heavy armored vest" - desc = "A synthetic armor vest with PEACEKEEPER printed in distinctive blue lettering on the chest. This one has added webbing and ballistic plates." + desc = "A synthetic armor vest with Solar Confederate Government printed in distinctive blue lettering on the chest. This one has added webbing and ballistic plates." icon_state = "solwebvest" -/obj/item/clothing/suit/storage/vest/solgov/security - name = "master at arms heavy armored vest" - desc = "A synthetic armor vest with MASTER AT ARMS printed in silver lettering on the chest. This one has added webbing and ballistic plates." - icon_state = "secwebvest" - /obj/item/clothing/suit/storage/vest/solgov/command name = "command heavy armored vest" desc = "A synthetic armor vest with Solar Confederate Government printed in detailed gold lettering on the chest. This one has added webbing and ballistic plates." @@ -539,6 +539,14 @@ return 0 return 1 +/obj/item/clothing/suit/armor/pcarrier/explorer + name = "explorer suit" + desc = "A lightweight explorer plate carrier. It can be equipped with armor plates, but only protects from the cold on it's own." + icon_state = "explorer" + flags = THICKMATERIAL + min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE + cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + /obj/item/clothing/suit/armor/pcarrier/light starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate) @@ -593,6 +601,30 @@ desc = "A lightweight tan plate carrier vest. It can be equipped with armor plates, but provides no protection of its own." icon_state = "pcarrier_tan" +/obj/item/clothing/suit/armor/pcarrier/laserproof + name = "ablative plate carrier" + desc = "A specialist laser resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own." + icon_state = "ablative" + armor = list(melee = 0, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0) + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/laserproof) + +/obj/item/clothing/suit/armor/pcarrier/bulletproof + name = "ballistic plate carrier" + desc = "A specialist bullet resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own." + icon_state = "ballistic" + armor = list(melee = 0, bullet = 5, laser = 0, energy = 0, bomb = 5, bio = 0, rad = 0) + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof) + +/obj/item/clothing/suit/armor/pcarrier/riot + name = "riot plate carrier" + desc = "A specialist melee resistant plate carrier. It can be equipped with armour plates, but provides very little protection of its own." + icon_state = "riot" + armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot) + +/obj/item/clothing/suit/armor/pcarrier/explorer/light + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/explorer, /obj/item/clothing/accessory/armor/armguards/explorer, /obj/item/clothing/accessory/armor/legguards/explorer, /obj/item/clothing/accessory/storage/pouches/green) + /obj/item/clothing/suit/armor/pcarrier/tan/tactical name = "tactical plate carrier" starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/tactical, /obj/item/clothing/accessory/storage/pouches/large/tan) @@ -600,3 +632,11 @@ /obj/item/clothing/suit/armor/pcarrier/merc starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/merc, /obj/item/clothing/accessory/armor/armguards/merc, /obj/item/clothing/accessory/armor/legguards/merc, /obj/item/clothing/accessory/storage/pouches/large) +/obj/item/clothing/suit/armor/pcarrier/laserproof/full + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/laserproof, /obj/item/clothing/accessory/armor/armguards/laserproof, /obj/item/clothing/accessory/armor/legguards/laserproof, /obj/item/clothing/accessory/storage/pouches/blue) + +/obj/item/clothing/suit/armor/pcarrier/bulletproof/full + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof, /obj/item/clothing/accessory/armor/armguards/bulletproof, /obj/item/clothing/accessory/armor/legguards/bulletproof, /obj/item/clothing/accessory/storage/pouches) + +/obj/item/clothing/suit/armor/pcarrier/riot/full + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot, /obj/item/clothing/accessory/armor/armguards/riot, /obj/item/clothing/accessory/armor/legguards/riot, /obj/item/clothing/accessory/storage/pouches) \ No newline at end of file diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 5fb635bca2..de610ca3ee 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -86,10 +86,10 @@ /obj/item/clothing/head/bio_hood/cmo icon_state = "bio_cmo" -//Plague Dr mask can be found in clothing/masks/gasmask.dm +//Plague Dr mask can be found in clothing/masks/gasmask.dm. Golden can be found in labcoat.dm. /obj/item/clothing/suit/bio_suit/plaguedoctorsuit - name = "Plague doctor suit" + name = "plague doctor suit" desc = "It protected doctors from the Black Death, back then. You bet your arse it's gonna help you against viruses." icon_state = "plaguedoctor" item_state_slots = list(slot_r_hand_str = "bio", slot_l_hand_str = "bio") - flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER + flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER \ No newline at end of file diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index cc7dfa3be5..2560692656 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -104,4 +104,10 @@ /obj/item/clothing/suit/storage/toggle/labcoat/blue_edge name = "blue-edged labcoat" desc = "A suit that protects against minor chemical spills. This one has blue trim." - icon_state = "blue_edge_labcoat" \ No newline at end of file + icon_state = "blue_edge_labcoat" + +/obj/item/clothing/suit/storage/toggle/labcoat/plaguedoctor + name = "golden plague doctor suit" + desc = "If it worked then, it works now. This classic design comes in gold." + icon_state = "plaguedoctor2" + index = 1 diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 1cf9a789a7..0031a6c55b 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -106,7 +106,9 @@ /obj/item/clothing/suit/syndicatefake name = "red space suit replica" icon = 'icons/obj/clothing/spacesuits.dmi' + icon_override = "icons/mob/spacesuit.dmi" //Chomp edit to fix its missing icon icon_state = "syndicate" + default_worn_icon = 'icons/mob/spacesuit.dmi' desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" w_class = ITEMSIZE_NORMAL allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen,/obj/item/toy) diff --git a/code/modules/clothing/suits/miscellaneous_vr.dm b/code/modules/clothing/suits/miscellaneous_vr.dm index 306dfc35db..2f4ae0c5a7 100644 --- a/code/modules/clothing/suits/miscellaneous_vr.dm +++ b/code/modules/clothing/suits/miscellaneous_vr.dm @@ -4,9 +4,16 @@ /obj/item/clothing/suit/chiton name = "chiton" desc = "A traditional piece of clothing from Greece." - icon = 'icons/mob/suit_vr.dmi' + icon = 'icons/obj/clothing/suits_vr.dmi' icon_state = "chiton" - icon_override = 'icons/obj/clothing/suits_vr.dmi' //why won't it work without this WHY GOD PLEASE + icon_override = 'icons/mob/suit_vr.dmi' + +/obj/item/clothing/suit/oversize + name = "oversized t-shirt" + desc = "This ain't your daddy's shirt! Well, it might be..." + icon = 'icons/obj/clothing/suits_vr.dmi' + icon_state = "oversize" + icon_override = 'icons/mob/suit_vr.dmi' //HERE BE TAUR RELATED CLOTHES diff --git a/code/modules/clothing/suits/solgov.dm b/code/modules/clothing/suits/solgov.dm index a0bb547f3e..73463c002c 100644 --- a/code/modules/clothing/suits/solgov.dm +++ b/code/modules/clothing/suits/solgov.dm @@ -23,19 +23,19 @@ /obj/item/clothing/suit/storage/solgov/service/sifguard name = "\improper SifGuard jacket" desc = "A uniform service jacket belonging to the Sif Defense Force." - icon_state = "ecservice_crew" + icon_state = "sgservice_crew" /obj/item/clothing/suit/storage/solgov/service/sifguard/medical starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) /obj/item/clothing/suit/storage/solgov/service/sifguard/medical/command - icon_state = "ecservice_officer" + icon_state = "sgservice_officer" /obj/item/clothing/suit/storage/solgov/service/sifguard/engineering starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) /obj/item/clothing/suit/storage/solgov/service/sifguard/engineering/command - icon_state = "ecservice_officer" + icon_state = "sgservice_officer" /obj/item/clothing/suit/storage/solgov/service/sifguard/supply starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) @@ -44,28 +44,28 @@ starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) /obj/item/clothing/suit/storage/solgov/service/sifguard/security/command - icon_state = "ecservice_officer" + icon_state = "sgservice_officer" /obj/item/clothing/suit/storage/solgov/service/sifguard/service starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) /obj/item/clothing/suit/storage/solgov/service/sifguard/service/command - icon_state = "ecservice_officer" + icon_state = "sgservice_officer" /obj/item/clothing/suit/storage/solgov/service/sifguard/exploration starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) /obj/item/clothing/suit/storage/solgov/service/sifguard/exploration/command - icon_state = "ecservice_officer" + icon_state = "sgservice_officer" /obj/item/clothing/suit/storage/solgov/service/sifguard/research starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) /obj/item/clothing/suit/storage/solgov/service/sifguard/research/command - icon_state = "ecservice_officer" + icon_state = "sgservice_officer" /obj/item/clothing/suit/storage/solgov/service/sifguard/command - icon_state = "ecservice_officer" + icon_state = "sgservice_officer" starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) /obj/item/clothing/suit/storage/solgov/service/fleet @@ -181,8 +181,8 @@ /obj/item/clothing/suit/storage/solgov/dress name = "dress jacket" desc = "A uniform dress jacket, fancy." - icon_state = "ecdress_xpl" - item_state = "ecdress_xpl" + icon_state = "sgdress_xpl" + item_state = "sgdress_xpl" body_parts_covered = UPPER_TORSO|ARMS armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 @@ -193,39 +193,39 @@ /obj/item/clothing/suit/storage/solgov/dress/sifguard name = "\improper SifGuard dress jacket" desc = "A silver and grey dress jacket belonging to the Sif Defense Force. Fashionable, for the 25th century at least." - icon_state = "ecdress_xpl" - item_state = "ecdress_xpl" + icon_state = "sgdress_xpl" + item_state = "sgdress_xpl" /obj/item/clothing/suit/storage/solgov/dress/sifguard/senior name = "\improper SifGuard senior's dress coat" - icon_state = "ecdress_sxpl" - item_state = "ecdress_sxpl" + icon_state = "sgdress_sxpl" + item_state = "sgdress_sxpl" /obj/item/clothing/suit/storage/solgov/dress/sifguard/chief name = "\improper SifGuard chief's dress coat" icon_state = "ecdress_cxpl" - item_state = "ecdress_cxpl" + item_state = "sgdress_cxpl" /obj/item/clothing/suit/storage/solgov/dress/sifguard/command name = "\improper SifGuard officer's dress coat" desc = "A gold and black dress peacoat belonging to the Sif Defense Force. The height of fashion." icon_state = "ecdress_ofcr" - item_state = "ecdress_ofcr" + item_state = "sgdress_ofcr" /obj/item/clothing/suit/storage/solgov/dress/sifguard/command/cdr name = "\improper SifGuard commander's dress coat" - icon_state = "ecdress_cdr" - item_state = "ecdress_cdr" + icon_state = "sgdress_cdr" + item_state = "sgdress_cdr" /obj/item/clothing/suit/storage/solgov/dress/sifguard/command/capt name = "\improper SifGuard captain's dress coat" - icon_state = "ecdress_capt" - item_state = "ecdress_capt" + icon_state = "sgdress_capt" + item_state = "sgdress_capt" /obj/item/clothing/suit/storage/solgov/dress/sifguard/command/adm name = "\improper SifGuard admiral's dress coat" - icon_state = "ecdress_adm" - item_state = "ecdress_adm" + icon_state = "sgdress_adm" + item_state = "sgdress_adm" /obj/item/clothing/suit/storage/solgov/dress/fleet name = "fleet dress jacket" @@ -328,36 +328,36 @@ item_state = "labcoat" blood_overlay_type = "coat" -/obj/item/clothing/suit/storage/marshal_jacket - name = "colonial marshal jacket" - desc = "A black synthleather jacket. The word 'MARSHAL' is stenciled onto the back in gold lettering." +/obj/item/clothing/suit/storage/eio_jacket + name = "EIO jacket" + desc = "A black synthleather jacket. The acronym 'EIO' of the Emergent Intelligence Oversight is stenciled onto the back in gold lettering." icon_state = "marshal_jacket" item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") body_parts_covered = UPPER_TORSO|ARMS -//Terrans +//SAARE Mercenaries //Service -/obj/item/clothing/suit/storage/terran/service/navy - name = "ICCGN coat" - desc = "A ICCG Navy service coat. Black and undecorated." +/obj/item/clothing/suit/storage/saare/service/ + name = "SAARE coat" + desc = "An Stealth Assault Enterprises . Black and undecorated." icon_state = "terranservice" item_state = "terranservice" icon = 'icons/obj/clothing/suits_solgov.dmi' icon_override = 'icons/mob/suit_solgov.dmi' -/obj/item/clothing/suit/storage/terran/service/navy/command - name = "indie command coat" - desc = "An ICCG Navy service command coat. White and undecorated." +/obj/item/clothing/suit/storage/saare/service/command + name = "SAARE command coat" + desc = "An Stealth Assault Enterprises command coat. White and undecorated." icon_state = "terranservice_comm" item_state = "terranservice_comm" //Dress -/obj/item/clothing/suit/dress/terran +/obj/item/clothing/suit/dress/saare name = "dress jacket" - desc = "A uniform dress jacket, fancy." + desc = "A Stealth Assault Enterprises uniform dress jacket, fancy." icon_state = "terrandress" item_state = "terrandress" icon = 'icons/obj/clothing/suits_solgov.dmi' @@ -369,19 +369,19 @@ valid_accessory_slots = (ACCESSORY_SLOT_MEDAL|ACCESSORY_SLOT_RANK) /obj/item/clothing/suit/dress/terran/navy - name = "ICCGN dress cloak" - desc = "A black ICCG Navy dress cloak with red detailing. So sexy it hurts." + name = "SAARE dress cloak" + desc = "A Stealth Assault Enterprises dress cloak with red detailing. So sexy it hurts." icon_state = "terrandress" item_state = "terrandress" /obj/item/clothing/suit/dress/terran/navy/officer - name = "ICCGN officer's dress cloak" - desc = "A black ICCG Navy dress cloak with gold detailing. Smells like ceremony." + name = "SAARE officer's dress cloak" + desc = "A black Stealth Assault Enterprises dress cloak with gold detailing. Smells like ceremony." icon_state = "terrandress_off" item_state = "terrandress_off" /obj/item/clothing/suit/dress/terran/navy/command - name = "ICCGN command dress cloak" - desc = "A black ICCG Navy dress cloak with royal detailing. Smells like ceremony." + name = "SAARE command dress cloak" + desc = "A black Stealth Assault Enterprises dress cloak with royal detailing. Smells like ceremony." icon_state = "terrandress_comm" item_state = "terrandress_comm" \ No newline at end of file diff --git a/code/modules/clothing/suits/utility_vr.dm b/code/modules/clothing/suits/utility_vr.dm index e225a53eee..529547469b 100644 --- a/code/modules/clothing/suits/utility_vr.dm +++ b/code/modules/clothing/suits/utility_vr.dm @@ -19,14 +19,14 @@ /obj/item/clothing/head/radiation sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/helmet_vr.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/helmet_vr.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/head.dmi' ) /obj/item/clothing/suit/radiation sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/suit_vr.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/suit_vr.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi' ) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 775e1e43bf..cbf0135845 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -15,7 +15,7 @@ var/concealed_holster = 0 var/mob/living/carbon/human/wearer = null // To check if the wearer changes, so species spritesheets change properly. var/list/on_rolled = list() // Used when jumpsuit sleevels are rolled ("rolled" entry) or it's rolled down ("down"). Set to "none" to hide in those states. - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ties.dmi') //Teshari can into webbing, too! + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/ties.dmi') //Teshari can into webbing, too! drop_sound = 'sound/items/drop/accessory.ogg' pickup_sound = 'sound/items/pickup/accessory.ogg' diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm index cf70eb3ac9..13f97cbb37 100644 --- a/code/modules/clothing/under/accessories/accessory_vr.dm +++ b/code/modules/clothing/under/accessories/accessory_vr.dm @@ -14,7 +14,7 @@ var/customized = 0 var/icon_previous_override sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/ties_vr.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/ties_vr.dmi' ) //Forces different sprite sheet on equip @@ -64,7 +64,7 @@ var/writtenon = 0 var/icon_previous_override sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/ties_vr.dmi' + SPECIES_TESHARI = 'icons/mob/species/teshari/ties_vr.dmi' ) //Forces different sprite sheet on equip @@ -165,7 +165,7 @@ var/datum/radio_frequency/radio_connection /obj/item/clothing/accessory/collar/shock/Initialize() - ..() + . = ..() radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) // Makes it so you don't need to change the frequency off of default for it to work. /obj/item/clothing/accessory/collar/shock/Destroy() //Clean up your toys when you're done. diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm index 9ef80846ee..e20fac493a 100644 --- a/code/modules/clothing/under/accessories/armor.dm +++ b/code/modules/clothing/under/accessories/armor.dm @@ -92,6 +92,12 @@ armor = list(melee = 30, bullet = 15, laser = 40, energy = 10, bomb = 25, bio = 0, rad = 0) slot = ACCESSORY_SLOT_ARMOR_C +/obj/item/clothing/accessory/armor/armorplate/explorer + name = "explorer armor plate" + desc = "A flexible plate made of synthetic fibers, designed to protect from the Sivian fauna. Attaches to a plate carrier." + icon_state = "armor_light" + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) + /obj/item/clothing/accessory/armor/armorplate/stab name = "mesh armor plate" desc = "A mesh armor plate made of steel-reinforced synthetic fibers, great for dealing with small blades. Attaches to a plate carrier." @@ -145,7 +151,7 @@ /obj/item/clothing/accessory/armor/armorplate/laserproof name = "ablative armor plate" desc = "A durasteel-scaled synthetic armor plate, providing good protection against lasers. Attaches to a plate carrier." - icon_state = "armor_medium" + icon_state = "armor_ablative" slowdown = 0.6 armor = list(melee = 10, bullet = 10, laser = 70, energy = 50, bomb = 0, bio = 0, rad = 0) armorsoak = list(melee = 0, bullet = 0, laser = 10, energy = 15, bomb = 0, bio = 0, rad = 0) @@ -203,6 +209,12 @@ desc = "A pair of tan arm pads reinforced with armor plating. Attaches to a plate carrier." icon_state = "armguards_tan" +/obj/item/clothing/accessory/armor/armguards/explorer + name = "explorer arm guards" + desc = "A pair of green arm pads reinforced with armor plating. Attaches to a plate carrier." + icon_state = "armguards_green" + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) + /obj/item/clothing/accessory/armor/armguards/merc name = "heavy arm guards" desc = "A pair of red-trimmed black arm pads reinforced with heavy armor plating. Attaches to a plate carrier." @@ -262,6 +274,12 @@ desc = "A pair of armored leg pads in tan. Attaches to a plate carrier." icon_state = "legguards_tan" +/obj/item/clothing/accessory/armor/legguards/explorer + name = "explorer leg guards" + desc = "A pair of armored leg pads in green. Attaches to a plate carrier." + icon_state = "legguards_green" + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) + /obj/item/clothing/accessory/armor/legguards/merc name = "heavy leg guards" desc = "A pair of heavily armored leg pads in red-trimmed black. Attaches to a plate carrier." diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index cac73a3b8d..683fa72118 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -57,21 +57,32 @@ siemens_coefficient = 0.9 w_class = ITEMSIZE_NORMAL slot = ACCESSORY_SLOT_OVER - sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/suit.dmi' - ) - + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi' + ) //YWEdit Start, Makes ponchos use teshari sprite /obj/item/clothing/accessory/poncho/get_worn_icon_file(var/body_type,var/slot_name,var/default_icon,var/inhands) if(body_type == SPECIES_TESHARI) if(!inhands) - return 'icons/mob/species/seromi/suit.dmi' + return 'icons/mob/species/teshari/suit.dmi' else return ..() //YWEdit end +/obj/item/clothing/accessory/poncho/equipped() //Solution for race-specific sprites for an accessory which is also a suit. Suit icons break if you don't use icon override which then also overrides race-specific sprites. + ..() + var/mob/living/carbon/human/H = loc + if(istype(H) && H.wear_suit == src) + if(H.species.name == SPECIES_TESHARI) + icon_override = 'icons/mob/species/teshari/suit.dmi' + else + icon_override = 'icons/mob/ties.dmi' + update_clothing_icon() + +/obj/item/clothing/accessory/poncho/dropped() //Resets the override to prevent the wrong .dmi from being used because equipped only triggers when wearing ponchos as suits. + icon_override = null + /obj/item/clothing/accessory/poncho/green name = "green poncho" desc = "A simple, comfortable cloak without sleeves. This one is green." diff --git a/code/modules/clothing/under/accessories/permits.dm b/code/modules/clothing/under/accessories/permits.dm index d7a5c3f396..c89d9ee019 100644 --- a/code/modules/clothing/under/accessories/permits.dm +++ b/code/modules/clothing/under/accessories/permits.dm @@ -3,8 +3,8 @@ /obj/item/clothing/accessory/permit name = "permit" desc = "A permit for something." - icon = 'icons/obj/card.dmi' - icon_state = "permit" + icon = 'icons/obj/card_new.dmi' + icon_state = "permit-generic" w_class = ITEMSIZE_TINY slot = ACCESSORY_SLOT_MEDAL var/owner = 0 //To prevent people from just renaming the thing if they steal it @@ -30,6 +30,7 @@ /obj/item/clothing/accessory/permit/gun name = "weapon permit" desc = "A card indicating that the owner is allowed to carry a firearm." + icon_state = "permit-security" /obj/item/clothing/accessory/permit/gun/bar name = "bar shotgun permit" @@ -38,8 +39,9 @@ /obj/item/clothing/accessory/permit/gun/planetside name = "planetside gun permit" desc = "A card indicating that the owner is allowed to carry a firearm while on the surface." + icon_state = "permit-science" /obj/item/clothing/accessory/permit/drone name = "drone identification card" desc = "A card issued by the EIO, indicating that the owner is a Drone Intelligence. Drones are mandated to carry this card within SolGov space, by law." - icon_state = "permit_drone" \ No newline at end of file + icon_state = "permit-drone" \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index f3fd40fa00..0bd0549e7a 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -12,7 +12,7 @@ var/hide_on_roll = FALSE /obj/item/clothing/accessory/storage/Initialize() - ..() + . = ..() hold = new/obj/item/weapon/storage/internal(src) hold.max_storage_space = slots * 2 hold.max_w_class = ITEMSIZE_SMALL @@ -95,7 +95,7 @@ slots = 2 /obj/item/clothing/accessory/storage/knifeharness/Initialize() - ..() + . = ..() hold.max_storage_space = ITEMSIZE_COST_SMALL * 2 hold.can_hold = list(/obj/item/weapon/material/knife/machete/hatchet/unathiknife,\ /obj/item/weapon/material/knife,\ diff --git a/code/modules/clothing/under/extrauniforms_yw.dm b/code/modules/clothing/under/extrauniforms_yw.dm index 612bcede4e..724848172f 100644 --- a/code/modules/clothing/under/extrauniforms_yw.dm +++ b/code/modules/clothing/under/extrauniforms_yw.dm @@ -24,7 +24,7 @@ desc = "Sturdy mess of black synthcotton belts and buckles." icon_state = "pilot_webbing2" sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/ties.dmi' + "Teshari" = 'icons/mob/species/teshari/ties.dmi' ) /obj/item/clothing/under/rank/khi/sec/pilot //yes, we're inheriting from the khi version; that one has full rolldown sprites diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 744c2a55c2..f77ec96a54 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -164,6 +164,7 @@ desc = "It's made of a special fiber that provides minor protection against biohazards" icon_state = "scrubs" item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white") + index = 1 /obj/item/clothing/under/rank/psych desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist." diff --git a/code/modules/clothing/under/jobs/security_vr.dm b/code/modules/clothing/under/jobs/security_vr.dm deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index fdc73151b0..80eba8000d 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -560,12 +560,18 @@ icon_state = "pentagram" index = 1 -obj/item/clothing/under/dress/yellowswoop +/obj/item/clothing/under/dress/yellowswoop name = "yellow swooped dress" desc = "A yellow dress that swoops to the side." icon_state = "yellowswoop" index = 1 +/obj/item/clothing/under/dress/countess + name = "countess dress" + desc = "A red and black dress fit for a countess." + icon_state = "countess" + index = 1 + /* * wedding stuff */ @@ -621,13 +627,13 @@ Uniforms and such */ /obj/item/clothing/under/sundress - name = "flowery white sundress" + name = "sundress" desc = "Makes you want to frolic in a field of daisies." icon_state = "sundress" body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/sundress_white - name = "white sundress" + name = "flowery white sundress" desc = "A white sundress decorated with purple lilies." icon_state = "sundress_white" body_parts_covered = UPPER_TORSO|LOWER_TORSO @@ -637,41 +643,48 @@ Uniforms and such desc = "A cute pink sundress." icon_state = "pinksun" body_parts_covered = UPPER_TORSO|LOWER_TORSO + index = 1 /obj/item/clothing/under/dress/sundress_white name = "white sundress" desc = "A white sundress, it's short." icon_state = "whitesun" body_parts_covered = UPPER_TORSO|LOWER_TORSO + index = 1 /obj/item/clothing/under/dress/sundress_pinkbow name = "bowed pink sundress" desc = "A cute pink sundress with a bow." icon_state = "bowsun" body_parts_covered = UPPER_TORSO|LOWER_TORSO + index = 1 /obj/item/clothing/under/dress/sundress_blue name = "long blue sundress" desc = "A long blue sun dress with white frills towards the bottom." icon_state = "bluesun" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS + index = 1 /obj/item/clothing/under/dress/sundress_pinkshort name = "short pink sundress" desc = "A very short pink sundress, it's more like a chemise." icon_state = "shortpink" body_parts_covered = UPPER_TORSO|LOWER_TORSO + index = 1 /obj/item/clothing/under/dress/twopiece name = "two-piece dress" desc = "A fancy two-piece dress, the pieces are sewn together." icon_state = "twopiece" body_parts_covered = UPPER_TORSO|LOWER_TORSO + index = 1 /obj/item/clothing/under/dress/gothic2 name = "lacey gothic dress" desc = "An elegant gothic dress with lace decorations." icon_state = "gothic2" + index = 1 /obj/item/clothing/under/captainformal name = "site manager's formal uniform" @@ -888,6 +901,12 @@ Uniforms and such icon_state = "disheveled" index = 1 +/obj/item/clothing/under/flower_skirt + name = "flower skirt" + desc = "A flowery skirt that comes in a variety of colors." + icon_state = "flowerskirt" + index = 1 + /* * swimsuit */ diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index 727e13bee6..075b3daece 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -16,51 +16,56 @@ item_state = "golem" //This is dumb and hacky but was here when I got here. worn_state = "golem" //It's basically just a coincidentally black iconstate in the file. -/obj/item/clothing/under/bluespace - name = "bluespace jumpsuit" - icon_state = "lingchameleon" +/obj/item/clothing/under/hyperfiber + name = "HYPER jumpsuit" + icon = 'icons/obj/clothing/uniforms_vr.dmi' + icon_override = 'icons/mob/uniform_vr.dmi' + icon_state = "hyper" item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', ) - item_state = "lingchameleon" - worn_state = "lingchameleon" - desc = "Do you feel like warping spacetime today? Because it seems like that's on the agenda, now. \ - Allows one to resize themselves at will, and conceals their true weight." + item_state = "hyper" + worn_state = "hyper" + desc = "Got a lot to hide on your body? Well, this Heavy Yield Protrusion Erasing and Retracting suit seems perfect for you. \ + Hides any bulges on your body, as well as conceals your true weight." hides_bulges = TRUE - var/original_size - - -/obj/item/clothing/under/bluespace/verb/toggle_fibers() +/obj/item/clothing/under/hyperfiber/verb/toggle_fibers() set category = "Object" - set name = "Adjust fibers" - set desc = "Adjust your suit fibers. This makes it so your stomach(s) will show or not." + set name = "Adjust Bluespace Fibers" + set desc = "Adjust your suit's HYPER fibers. Activating it hides your stomach(s) and your general body-build. Good if you have a lot to hide." set src in usr adjust_fibers(usr) ..() -/obj/item/clothing/under/bluespace/proc/adjust_fibers(mob/user) +/obj/item/clothing/under/hyperfiber/proc/adjust_fibers(mob/user) if(hides_bulges == FALSE) hides_bulges = TRUE - to_chat(user, "You tense the suit fibers, hiding your stomach(s).") + to_chat(user, "You tense the suit fibers, hiding your stomach(s) and weight.") else hides_bulges = FALSE - to_chat(user, "You relax the suit fibers, showing your stomach(s).") + to_chat(user, "You relax the suit fibers, revealing your stomach(s) and weight.") +/obj/item/clothing/under/hyperfiber/bluespace + name = "bluespace jumpsuit" + icon_state = "bluespace" + item_state = "bluespace" + worn_state = "bluespace" + desc = "Do you feel like warping spacetime today? Because it seems like that's on the agenda, now. \ + Allows one to resize themselves at will, and conceals their true weight as well as any bulges or protrusions on their body." + var/original_size - -/obj/item/clothing/under/bluespace/verb/resize() - set name = "Adjust Size" +/obj/item/clothing/under/hyperfiber/bluespace/verb/resize() + set name = "Adjust Bluespace Fibers" + set desc = "Adjust your suit's bluespace fibers. Activating it allows you to expand your own body or reduce it in size! Effect is limited to when you have the suit on." set category = "Object" set src in usr bluespace_size(usr) ..() - - -/obj/item/clothing/under/bluespace/proc/bluespace_size(mob/usr as mob) +/obj/item/clothing/under/hyperfiber/bluespace/proc/bluespace_size(mob/usr as mob) if (!ishuman(usr)) return @@ -73,7 +78,7 @@ to_chat(H,"You must be WEARING the uniform to change your size.") return - var/new_size = input("Put the desired size (25-200%)", "Set Size", 200) as num|null + var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null //Check AGAIN because we accepted user input which is blocking. if (src != H.w_uniform) @@ -89,7 +94,7 @@ H.update_icons() //Just want the matrix transform return - if (!ISINRANGE(new_size,25,200)) + if (!H.size_range_check(new_size)) to_chat(H,"The safety features of the uniform prevent you from choosing this size.") return @@ -102,7 +107,7 @@ else //They chose their current size. return -/obj/item/clothing/under/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0) +/obj/item/clothing/under/hyperfiber/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0) . = ..() if(. && ishuman(M) && original_size) var/mob/living/carbon/human/H = M diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index 815798f90d..cd2c111098 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -471,30 +471,30 @@ //Terrans -/obj/item/clothing/under/terran - name = "master ICCGN uniform" +/obj/item/clothing/under/saare + name = "master SAARE uniform" desc = "You shouldn't be seeing this." icon = 'icons/obj/clothing/uniforms_solgov.dmi' item_icons = list(slot_w_uniform_str = 'icons/mob/uniform_solgov.dmi') armor = list(melee = 5, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 5, rad = 5) siemens_coefficient = 0.8 -/obj/item/clothing/under/terran/navy/utility - name = "ICCGN utility uniform" - desc = "A comfortable black utility jumpsuit. Worn by the ICCG Navy." +/obj/item/clothing/under/saare/utility + name = "SAARE utility uniform" + desc = "A comfortable black utility jumpsuit. Worn by Stealth Assault Enterprises mercenaries." icon_state = "terranutility" worn_state = "terranutility" -/obj/item/clothing/under/terran/navy/service - name = "ICCGN service uniform" - desc = "The service uniform of the ICCG Navy, for low-ranking crew." +/obj/item/clothing/under/saare/service + name = "SAARE service uniform" + desc = "The service uniform of Stealth Assault Enterprises, for low-ranking mercenaries." icon_state = "terranservice" worn_state = "terranservice" armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 5, rad = 0) siemens_coefficient = 0.9 -/obj/item/clothing/under/terran/navy/service/command - name = "ICCGN command service uniform" - desc = "The service uniform of the ICCG Navy, for high-ranking crew." +/obj/item/clothing/under/saare/service/command + name = "SAARE command service uniform" + desc = "The service uniform of Stealth Assault Enterprises, for high-ranking mercenaries." icon_state = "terranservice_comm" worn_state = "terranservice_comm" \ No newline at end of file diff --git a/code/modules/clothing/under/xenos/seromi.dm b/code/modules/clothing/under/xenos/teshari.dm similarity index 67% rename from code/modules/clothing/under/xenos/seromi.dm rename to code/modules/clothing/under/xenos/teshari.dm index 36f4e24197..044559db26 100644 --- a/code/modules/clothing/under/xenos/seromi.dm +++ b/code/modules/clothing/under/xenos/teshari.dm @@ -1,285 +1,285 @@ -/obj/item/clothing/under/seromi - icon = 'icons/obj/clothing/species/seromi/uniform.dmi' +/obj/item/clothing/under/teshari + icon = 'icons/obj/clothing/species/teshari/uniform.dmi' icon_state = "seromi_grey" species_restricted = list(SPECIES_TESHARI) -/obj/item/clothing/under/seromi/smock +/obj/item/clothing/under/teshari/smock name = "small grey smock" desc = "It looks fitted to nonhuman proportions." icon_state = "seromi_grey" body_parts_covered = 0 // It's a thin piece of cloth with a neck hole. -/obj/item/clothing/under/seromi/smock/white +/obj/item/clothing/under/teshari/smock/white name = "small white smock" icon_state = "seromi_white" -/obj/item/clothing/under/seromi/smock/red +/obj/item/clothing/under/teshari/smock/red name = "small Security smock" icon_state = "seromi_red" -/obj/item/clothing/under/seromi/smock/yellow +/obj/item/clothing/under/teshari/smock/yellow name = "small Engineering smock" icon_state = "seromi_yellow" -/obj/item/clothing/under/seromi/smock/medical +/obj/item/clothing/under/teshari/smock/medical name = "small Medical uniform" icon_state = "seromi_medical" -/obj/item/clothing/under/seromi/smock/science +/obj/item/clothing/under/teshari/smock/science name = "small Research uniform" icon_state = "teshari_science" -/obj/item/clothing/under/seromi/smock/rainbow +/obj/item/clothing/under/teshari/smock/rainbow name = "small rainbow smock" icon_state = "seromi_rainbow" -/obj/item/clothing/under/seromi/smock/dress +/obj/item/clothing/under/teshari/smock/dress name = "small command dress" icon_state = "seromi_dress_cap" -/obj/item/clothing/under/seromi/smock/dress/science +/obj/item/clothing/under/teshari/smock/dress/science name = "small research dress" icon_state = "tesh_dress_science" -/obj/item/clothing/under/seromi/smock/dress/security +/obj/item/clothing/under/teshari/smock/dress/security name = "small security dress" icon_state = "tesh_dress_security" -/obj/item/clothing/under/seromi/smock/dress/engine +/obj/item/clothing/under/teshari/smock/dress/engine name = "small engineering dress" icon_state = "tesh_dress_engine" -/obj/item/clothing/under/seromi/smock/dress/medical +/obj/item/clothing/under/teshari/smock/dress/medical name = "small medical dress" icon_state = "tesh_dress_medical" -/obj/item/clothing/under/seromi/smock/uniform +/obj/item/clothing/under/teshari/smock/uniform name = "small command uniform" icon_state = "seromi_captain" -/obj/item/clothing/under/seromi/smock/formal +/obj/item/clothing/under/teshari/smock/formal name = "small formal uniform" icon_state = "seromi_captain_formal" -/obj/item/clothing/under/seromi/smock/blackutilitysmock +/obj/item/clothing/under/teshari/smock/blackutilitysmock name = "black utility smock" icon_state = "teshari_blackutility_com" -/obj/item/clothing/under/seromi/smock/greydress +/obj/item/clothing/under/teshari/smock/greydress name = "small grey dress" icon_state = "teshari_greydress" -/obj/item/clothing/under/seromi/smock/blackutility +/obj/item/clothing/under/teshari/smock/blackutility name = "Teshari utility uniform" icon_state = "teshari_blackutility" -/obj/item/clothing/under/seromi/smock/bluegreydress +/obj/item/clothing/under/teshari/smock/bluegreydress name = "small blue and grey dress" icon_state = "teshari_bluegreydress" // Worksuits -/obj/item/clothing/under/seromi/undercoat/standard/worksuit +/obj/item/clothing/under/teshari/undercoat/standard/worksuit name = "small black and red worksuit" icon_state = "teshari_black_red_worksuit" item_state = "teshari_black_red_worksuit" desc = "A small worksuit designed for a Teshari" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackpurple +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackpurple name = "small black and purple worksuit" icon_state = "teshari_black_purple_worksuit" item_state = "teshari_black_purple_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackorange +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackorange name = "small black and orange worksuit" icon_state = "teshari_black_orange_worksuit" item_state = "teshari_black_orange_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackblue +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackblue name = "small black and blue worksuit" icon_state = "teshari_black_blue_worksuit" item_state = "teshari_black_blue_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/blackgreen +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/blackgreen name = "small black and greeen worksuit" icon_state = "teshari_black_green_worksuit" item_state = "teshari_black_green_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitered +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/whitered name = "small white and red worksuit" icon_state = "teshari_white_red_worksuit" item_state = "teshari_white_red_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitepurple +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/whitepurple name = "small white and purple worksuit" icon_state = "teshari_white_purple_worksuit" item_state = "teshari_white_purple_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whiteorange +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/whiteorange name = "small white and orange worksuit" icon_state = "teshari_white_orange_worksuit" item_state = "teshari_white_orange_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whiteblue +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/whiteblue name = "small white and blue worksuit" icon_state = "teshari_white_blue_worksuit" item_state = "teshari_white_blue_worksuit" -/obj/item/clothing/under/seromi/undercoat/standard/worksuit/whitegreen +/obj/item/clothing/under/teshari/undercoat/standard/worksuit/whitegreen name = "small white and green worksuit" icon_state = "teshari_white_green_worksuit" item_state = "teshari_white_green_worksuit" //Standard Undercoats -/obj/item/clothing/under/seromi/undercoat +/obj/item/clothing/under/teshari/undercoat name = "Undercoat" desc = "A Teshari traditional garb, with a modern twist! Made of micro and nanofibres to make it light and billowy, perfect for going fast and stylishly!" - icon = 'icons/mob/species/seromi/teshari_uniform.dmi' - icon_override = 'icons/mob/species/seromi/teshari_uniform.dmi' + icon = 'icons/mob/species/teshari/teshari_uniform.dmi' + icon_override = 'icons/mob/species/teshari/teshari_uniform.dmi' icon_state = "tesh_uniform_bo" item_state = "tesh_uniform_bo" body_parts_covered = UPPER_TORSO|LOWER_TORSO -/obj/item/clothing/under/seromi/undercoat/standard/black_orange +/obj/item/clothing/under/teshari/undercoat/standard/black_orange name = "black and orange undercoat" icon_state = "tesh_uniform_bo" item_state = "tesh_uniform_bo" -/obj/item/clothing/under/seromi/undercoat/standard/black_grey +/obj/item/clothing/under/teshari/undercoat/standard/black_grey name = "black and grey undercoat" icon_state = "tesh_uniform_bg" item_state = "tesh_uniform_bg" -/obj/item/clothing/under/seromi/undercoat/standard/black_white +/obj/item/clothing/under/teshari/undercoat/standard/black_white name = "black and white undercoat" icon_state = "tesh_uniform_bw" item_state = "tesh_uniform_bw" -/obj/item/clothing/under/seromi/undercoat/standard/black_red +/obj/item/clothing/under/teshari/undercoat/standard/black_red name = "black and red undercoat" icon_state = "tesh_uniform_br" item_state = "tesh_uniform_br" -/obj/item/clothing/under/seromi/undercoat/standard/black +/obj/item/clothing/under/teshari/undercoat/standard/black name = "black undercoat" icon_state = "tesh_uniform_bn" item_state = "tesh_uniform_bn" -/obj/item/clothing/under/seromi/undercoat/standard/black_yellow +/obj/item/clothing/under/teshari/undercoat/standard/black_yellow name = "black and yellow undercoat" icon_state = "tesh_uniform_by" item_state = "tesh_uniform_by" -/obj/item/clothing/under/seromi/undercoat/standard/black_green +/obj/item/clothing/under/teshari/undercoat/standard/black_green name = "black and green undercoat" icon_state = "tesh_uniform_bgr" item_state = "tesh_uniform_bgr" -/obj/item/clothing/under/seromi/undercoat/standard/black_blue +/obj/item/clothing/under/teshari/undercoat/standard/black_blue name = "black and blue undercoat" icon_state = "tesh_uniform_bbl" item_state = "tesh_uniform_bbl" -/obj/item/clothing/under/seromi/undercoat/standard/black_purple +/obj/item/clothing/under/teshari/undercoat/standard/black_purple name = "black and purple undercoat" icon_state = "tesh_uniform_bp" item_state = "tesh_uniform_bp" -/obj/item/clothing/under/seromi/undercoat/standard/black_pink +/obj/item/clothing/under/teshari/undercoat/standard/black_pink name = "black and pink undercoat" icon_state = "tesh_uniform_bpi" item_state = "tesh_uniform_bpi" -/obj/item/clothing/under/seromi/undercoat/standard/black_brown +/obj/item/clothing/under/teshari/undercoat/standard/black_brown name = "black and brown undercoat" icon_state = "tesh_uniform_bbr" item_state = "tesh_uniform_bbr" -/obj/item/clothing/under/seromi/undercoat/standard/orange_grey +/obj/item/clothing/under/teshari/undercoat/standard/orange_grey name = "orange and grey undercoat" icon_state = "tesh_uniform_og" item_state = "tesh_uniform_og" -/obj/item/clothing/under/seromi/undercoat/standard/rainbow +/obj/item/clothing/under/teshari/undercoat/standard/rainbow name = "rainbow undercoat" icon_state = "tesh_uniform_rainbow" item_state = "tesh_uniform_rainbow" -/obj/item/clothing/under/seromi/undercoat/standard/lightgrey_grey +/obj/item/clothing/under/teshari/undercoat/standard/lightgrey_grey name = "light grey and grey undercoat" icon_state = "tesh_uniform_lgg" item_state = "tesh_uniform_lgg" -/obj/item/clothing/under/seromi/undercoat/standard/white_grey +/obj/item/clothing/under/teshari/undercoat/standard/white_grey name = "white and grey undercoat" icon_state = "tesh_uniform_wg" item_state = "tesh_uniform_wg" -/obj/item/clothing/under/seromi/undercoat/standard/red_grey +/obj/item/clothing/under/teshari/undercoat/standard/red_grey name = "red and grey undercoat" icon_state = "tesh_uniform_rg" item_state = "tesh_uniform_rg" -/obj/item/clothing/under/seromi/undercoat/standard/orange +/obj/item/clothing/under/teshari/undercoat/standard/orange name = "orange undercoat" icon_state = "tesh_uniform_on" item_state = "tesh_uniform_on" -/obj/item/clothing/under/seromi/undercoat/standard/yellow_grey +/obj/item/clothing/under/teshari/undercoat/standard/yellow_grey name = "yellow and grey undercoat" icon_state = "tesh_uniform_yg" item_state = "tesh_uniform_yg" -/obj/item/clothing/under/seromi/undercoat/standard/green_grey +/obj/item/clothing/under/teshari/undercoat/standard/green_grey name = "green and grey undercoat" icon_state = "tesh_uniform_gg" item_state = "tesh_uniform_gg" -/obj/item/clothing/under/seromi/undercoat/standard/blue_grey +/obj/item/clothing/under/teshari/undercoat/standard/blue_grey name = "blue and grey undercoat" icon_state = "tesh_uniform_blug" item_state = "tesh_uniform_blug" -/obj/item/clothing/under/seromi/undercoat/standard/purple_grey +/obj/item/clothing/under/teshari/undercoat/standard/purple_grey name = "purple and grey undercoat" icon_state = "tesh_uniform_pg" item_state = "tesh_uniform_pg" -/obj/item/clothing/under/seromi/undercoat/standard/pink_grey +/obj/item/clothing/under/teshari/undercoat/standard/pink_grey name = "pink and grey undercoat" icon_state = "tesh_uniform_pig" item_state = "tesh_uniform_pig" -/obj/item/clothing/under/seromi/undercoat/standard/brown_grey +/obj/item/clothing/under/teshari/undercoat/standard/brown_grey name = "brown and grey undercoat" icon_state = "tesh_uniform_brg" item_state = "tesh_uniform_brg" //Job Undercoats -/obj/item/clothing/under/seromi/undercoat/jobs - icon = 'icons/mob/species/seromi/deptjacket.dmi' - icon_override = 'icons/mob/species/seromi/deptjacket.dmi' +/obj/item/clothing/under/teshari/undercoat/jobs + icon = 'icons/mob/species/teshari/deptjacket.dmi' + icon_override = 'icons/mob/species/teshari/deptjacket.dmi' -/obj/item/clothing/under/seromi/undercoat/jobs/cap +/obj/item/clothing/under/teshari/undercoat/jobs/cap name = "facility director undercoat" desc = "A traditional Teshari garb made for the Facility Director" icon_state = "tesh_uniform_cap" item_state = "tesh_uniform_cap" -/obj/item/clothing/under/seromi/undercoat/jobs/hop +/obj/item/clothing/under/teshari/undercoat/jobs/hop name = "head of personnel undercoat" desc = "A traditional Teshari garb made for the Head of Personnel" icon_state = "tesh_uniform_hop" item_state = "tesh_uniform_hop" -/obj/item/clothing/under/seromi/undercoat/jobs/ce +/obj/item/clothing/under/teshari/undercoat/jobs/ce name = "cheif engineer undercoat" desc = "A traditional Teshari garb made for the Chief Engineer" icon_state = "tesh_uniform_ce" item_state = "tesh_uniform_ce" -/obj/item/clothing/under/seromi/undercoat/jobs/hos +/obj/item/clothing/under/teshari/undercoat/jobs/hos name = "head of security undercoat" desc = "A traditional Teshari garb made for the Head of Security. Made with slightly sturdier materials." //CHOMPedit icon_state = "tesh_uniform_hos" @@ -288,91 +288,91 @@ siemens_coefficient = 0.9 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS //CHOMPedit end -/obj/item/clothing/under/seromi/undercoat/jobs/rd +/obj/item/clothing/under/teshari/undercoat/jobs/rd name = "research director undercoat" desc = "A traditional Teshari garb made for the Research Director" icon_state = "tesh_uniform_rd" item_state = "tesh_uniform_rd" -/obj/item/clothing/under/seromi/undercoat/jobs/engineer +/obj/item/clothing/under/teshari/undercoat/jobs/engineer name = "engineering undercoat" desc = "A traditional Teshari garb made for the Engineering department" icon_state = "tesh_uniform_engie" item_state = "tesh_uniform_engie" -/obj/item/clothing/under/seromi/undercoat/jobs/atmos +/obj/item/clothing/under/teshari/undercoat/jobs/atmos name = "atmospherics undercoat" desc = "A traditional Teshari garb made for the Atmospheric Technician" icon_state = "tesh_uniform_atmos" item_state = "tesh_uniform_atmos" -/obj/item/clothing/under/seromi/undercoat/jobs/cmo +/obj/item/clothing/under/teshari/undercoat/jobs/cmo name = "chief medical officer undercoat" desc = "A traditional Teshari garb made for the Cheif Medical Officer" icon_state = "tesh_uniform_cmo" item_state = "tesh_uniform_cmo" -/obj/item/clothing/under/seromi/undercoat/jobs/qm +/obj/item/clothing/under/teshari/undercoat/jobs/qm name = "quartermaster undercoat" desc = "A traditional Teshari garb made for the Quartermaster" icon_state = "tesh_uniform_qm" item_state = "tesh_uniform_qm" -/obj/item/clothing/under/seromi/undercoat/jobs/cargo +/obj/item/clothing/under/teshari/undercoat/jobs/cargo name = "cargo undercoat" desc = "A traditional Teshari garb made for the Cargo department" icon_state = "tesh_uniform_car" item_state = "tesh_uniform_car" -/obj/item/clothing/under/seromi/undercoat/jobs/mining +/obj/item/clothing/under/teshari/undercoat/jobs/mining name = "mining undercoat" desc = "A traditional Teshari garb made for Mining" icon_state = "tesh_uniform_mine" item_state = "tesh_uniform_mine" -/obj/item/clothing/under/seromi/undercoat/jobs/medical +/obj/item/clothing/under/teshari/undercoat/jobs/medical name = "medical undercoat" desc = "A traditional Teshari garb made for the Medical department" icon_state = "tesh_uniform_doc" item_state = "tesh_uniform_doc" -/obj/item/clothing/under/seromi/undercoat/jobs/chemistry +/obj/item/clothing/under/teshari/undercoat/jobs/chemistry name = "chemist undercoat" desc = "A traditional Teshari garb made for the Chemist" icon_state = "tesh_uniform_chem" item_state = "tesh_uniform_chem" -/obj/item/clothing/under/seromi/undercoat/jobs/viro +/obj/item/clothing/under/teshari/undercoat/jobs/viro name = "virologist undercoat" desc = "A traditional Teshari garb made for the Virologist" icon_state = "tesh_uniform_viro" item_state = "tesh_uniform_viro" -/obj/item/clothing/under/seromi/undercoat/jobs/psych +/obj/item/clothing/under/teshari/undercoat/jobs/psych name = "psychiatrist undercoat" desc = "A traditional Teshari garb made for the Psychiatrist" icon_state = "tesh_uniform_psych" item_state = "tesh_uniform_psych" -/obj/item/clothing/under/seromi/undercoat/jobs/para +/obj/item/clothing/under/teshari/undercoat/jobs/para name = "paramedic undercoat" desc = "A traditional Teshari garb made for the Paramedic" icon_state = "tesh_uniform_para" item_state = "tesh_uniform_para" -/obj/item/clothing/under/seromi/undercoat/jobs/sci +/obj/item/clothing/under/teshari/undercoat/jobs/sci name = "scientist undercoat" desc = "A traditional Teshari garb made for the Science department" icon_state = "tesh_uniform_sci" item_state = "tesh_uniform_sci" -/obj/item/clothing/under/seromi/undercoat/jobs/robo +/obj/item/clothing/under/teshari/undercoat/jobs/robo name = "roboticist undercoat" desc = "A traditional Teshari garb made for the Roboticist" icon_state = "tesh_uniform_robo" item_state = "tesh_uniform_robo" -/obj/item/clothing/under/seromi/undercoat/jobs/sec +/obj/item/clothing/under/teshari/undercoat/jobs/sec name = "security undercoat" desc = "A traditional Teshari garb made for the Security department. Made with slightly sturdier materials." //CHOMPedit icon_state = "tesh_uniform_sec" @@ -381,13 +381,13 @@ siemens_coefficient = 0.9 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS //CHOMPedit end -/obj/item/clothing/under/seromi/undercoat/jobs/service +/obj/item/clothing/under/teshari/undercoat/jobs/service name = "service undercoat" desc = "A traditional Teshari garb made for the Service department" icon_state = "tesh_uniform_serv" item_state = "tesh_uniform_serv" -/obj/item/clothing/under/seromi/undercoat/jobs/iaa +/obj/item/clothing/under/teshari/undercoat/jobs/iaa name = "internal affairs undercoat" desc = "A traditional Teshari garb made for the Internal Affairs Agent" icon_state = "tesh_uniform_iaa" diff --git a/code/modules/clothing/under/xenos/vox.dm b/code/modules/clothing/under/xenos/vox.dm index 7e90ad4665..9897fa5c6d 100644 --- a/code/modules/clothing/under/xenos/vox.dm +++ b/code/modules/clothing/under/xenos/vox.dm @@ -28,6 +28,6 @@ slots = 3 /obj/item/clothing/accessory/storage/vox/Initialize() - ..() + . = ..() hold.max_storage_space = slots * ITEMSIZE_COST_NORMAL hold.max_w_class = ITEMSIZE_NORMAL \ No newline at end of file diff --git a/code/modules/compass/^compass.dm b/code/modules/compass/^compass.dm new file mode 100644 index 0000000000..7546d7a1e6 --- /dev/null +++ b/code/modules/compass/^compass.dm @@ -0,0 +1,3 @@ +#undef COMPASS_INTERVAL +#undef COMPASS_PERIOD +#undef COMPASS_LABEL_OFFSET \ No newline at end of file diff --git a/code/modules/compass/_compass.dm b/code/modules/compass/_compass.dm new file mode 100644 index 0000000000..08aa9fd393 --- /dev/null +++ b/code/modules/compass/_compass.dm @@ -0,0 +1,15 @@ +#define COMPASS_INTERVAL 3 +#define COMPASS_PERIOD 15 +#define COMPASS_LABEL_OFFSET 150 + +/* + This folder contains an abstract type (/obj/compass_holder) which contains a set of + waypoints (/datum/compass_waypoint) and generates a circular compass with markers for + mobs that have the object in their screen list. See GPS for an example implementation. +*/ + +/image/compass_marker + maptext_height = 64 + maptext_width = 128 + maptext_x = -48 + maptext_y = -32 diff --git a/code/modules/compass/compass_holder.dm b/code/modules/compass/compass_holder.dm new file mode 100644 index 0000000000..1a2148d5c4 --- /dev/null +++ b/code/modules/compass/compass_holder.dm @@ -0,0 +1,127 @@ +/obj/compass_holder + name = null + icon = null + icon_state = null + screen_loc = "CENTER,CENTER" + + var/show_heading = FALSE + var/numeric_directions = FALSE + + var/image/compass_heading_marker + var/list/compass_static_labels + var/list/compass_waypoints + var/list/compass_waypoint_markers + + var/static/list/angle_step_to_dir = list( + "N", + "NE", + "E", + "SE", + "S", + "SW", + "W", + "NW", + "N" + ) + +/obj/compass_holder/Initialize(mapload, ...) + . = ..() + if(show_heading) + compass_heading_marker = new /image/compass_marker + compass_heading_marker.maptext = "
â–³
" + compass_heading_marker.filters = filter(type="drop_shadow", color = "#00ffffaa", size = 2, offset = 1,x = 0, y = 0) + compass_heading_marker.layer = LAYER_HUD_UNDER + compass_heading_marker.plane = PLANE_PLAYER_HUD + + for(var/i in 0 to (360/(COMPASS_PERIOD))-1) + var/image/I = new /image/compass_marker + I.loc = src + var/str + var/str_col + if(i % COMPASS_INTERVAL == 0) + var/angle = (i * COMPASS_PERIOD) + if(numeric_directions) + str = "[angle]" + else + str = angle_step_to_dir[CLAMP(round(angle/45)+1, 1, length(angle_step_to_dir))] + str_col = "#ffffffaa" + else + str = "〡" + str_col = "#aaaaaa88" + I.maptext = "
[str]
" + var/matrix/M = matrix() + M.Translate(0, COMPASS_LABEL_OFFSET) + M.Turn(COMPASS_PERIOD * i) + I.transform = M + I.filters = filter(type="drop_shadow", color = "#77777777", size = 2, offset = 1,x = 0, y = 0) + I.layer = LAYER_HUD_UNDER + I.plane = PLANE_PLAYER_HUD + LAZYADD(compass_static_labels, I) + + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/Destroy() + QDEL_NULL_LIST(compass_waypoints) + . = ..() + +/obj/compass_holder/proc/get_heading() + var/atom/A = loc?.loc // is there a get_holder_recursive() equivalent on Polaris? + if(istype(A)) + . = dir2angle(A.dir) + else + . = 0 + +/obj/compass_holder/update_icon() + var/set_overlays = (compass_static_labels | compass_waypoint_markers) + if(show_heading) + set_overlays |= compass_heading_marker + overlays = set_overlays + +/obj/compass_holder/proc/clear_waypoint(var/id) + LAZYREMOVE(compass_waypoints, id) + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/proc/set_waypoint(var/id, var/label, var/heading_x, var/heading_y, var/heading_z, var/label_color) + var/datum/compass_waypoint/wp = LAZYACCESS(compass_waypoints, id) + if(!wp) + wp = new /datum/compass_waypoint() + wp.set_values(label, heading_x, heading_y, heading_z, label_color) + LAZYSET(compass_waypoints, id, wp) + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/proc/recalculate_heading(var/rebuild_icon = TRUE) + if(show_heading) + var/matrix/M = matrix() + M.Translate(0, round(COMPASS_LABEL_OFFSET - 35)) + M.Turn(get_heading()) + compass_heading_marker.transform = M + if(rebuild_icon) + update_icon() + +/obj/compass_holder/proc/show_waypoint(var/id) + var/datum/compass_waypoint/wp = compass_waypoints[id] + wp.hidden = FALSE + +/obj/compass_holder/proc/hide_waypoint(var/id) + var/datum/compass_waypoint/wp = compass_waypoints[id] + wp.hidden = TRUE + +/obj/compass_holder/proc/hide_waypoints(var/rebuild_overlays = FALSE) + for(var/id in compass_waypoints) + hide_waypoint(id) + if(rebuild_overlays) + rebuild_overlay_lists(TRUE) + +/obj/compass_holder/proc/rebuild_overlay_lists(var/update_icon = FALSE) + compass_waypoint_markers = null + var/turf/T = get_turf(src) + if(istype(T)) + for(var/id in compass_waypoints) + var/datum/compass_waypoint/wp = compass_waypoints[id] + if(!wp.hidden) + wp.recalculate_heading(T.x, T.y) + LAZYADD(compass_waypoint_markers, wp.compass_overlay) + if(show_heading) + recalculate_heading(FALSE) + if(update_icon) + update_icon() diff --git a/code/modules/compass/compass_waypoint.dm b/code/modules/compass/compass_waypoint.dm new file mode 100644 index 0000000000..2895d90096 --- /dev/null +++ b/code/modules/compass/compass_waypoint.dm @@ -0,0 +1,30 @@ +/datum/compass_waypoint + var/name + var/x + var/y + var/z + var/color + var/hidden = FALSE + var/image/compass_overlay + +/datum/compass_waypoint/proc/set_values(var/_name, var/_x, var/_y, var/_z, var/_color) + name = _name + x = _x + y = _y + z = _z + color = _color + compass_overlay = new /image/compass_marker + compass_overlay.loc = src + compass_overlay.maptext = "
|\n[name]
" + compass_overlay.filters = filter(type="drop_shadow", color = "[color]" + "aa", size = 2, offset = 1,x = 0, y = 0) + compass_overlay.layer = LAYER_HUD_UNDER + compass_overlay.plane = PLANE_PLAYER_HUD + +/datum/compass_waypoint/proc/recalculate_heading(var/cx, var/cy) + var/matrix/M = matrix() + M.Translate(0, (name ? COMPASS_LABEL_OFFSET-4 : COMPASS_LABEL_OFFSET)) + M.Turn(ATAN2(cy-y, cx-x)+180) + compass_overlay.transform = M + +#undef COMPASS_PERIOD +#undef COMPASS_INTERVAL diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 1dac4a0f58..b87639cce6 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -141,4 +141,4 @@ else if(bloodsamp) icon_state = "dnaclosed" else - icon_state = "dnaopen" + icon_state = "dnaopen" \ No newline at end of file diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm index e9c8b1372d..9e3fb438d8 100644 --- a/code/modules/economy/price_list.dm +++ b/code/modules/economy/price_list.dm @@ -504,6 +504,9 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/sake price_tag = 25 +/obj/item/weapon/reagent_containers/food/drinks/bottle/jager + price_tag = 25 + //***************// //---Foodstuff---// //***************// diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm index 6b3883afd7..b889ce2193 100644 --- a/code/modules/events/infestation.dm +++ b/code/modules/events/infestation.dm @@ -63,8 +63,14 @@ for(var/areapath in typesof(spawn_area_type)) var/area/A = locate(areapath) for(var/turf/simulated/floor/F in A.contents) - if(turf_clear(F)) + //VOREStation Edit - Fixes event + var/blocked = FALSE + for(var/atom/movable/AM in F) + if(AM.density) + blocked = TRUE + if(!blocked) turfs += F + //VOREStation Edit - Fixes event var/list/spawn_types = list() var/max_number diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index b3ff65753c..f428c20c83 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -76,10 +76,24 @@ stat(null,"[description_holders["antag"]]") //Red, malicious antag-related text //override examinate verb to update description holders when things are examined -/mob/examinate(atom/A as mob|obj|turf in view()) - if(..()) +//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine() +/mob/verb/examinate(atom/A as mob|obj|turf in _validate_atom(A)) + set name = "Examine" + set category = "IC" + + if((is_blind(src) || usr.stat) && !isobserver(src)) + to_chat(src, "Something is there but you can't see it.") return 1 + //Could be gone by the time they finally pick something + if(!A) + return 1 + + face_atom(A) + var/list/results = A.examine(src) + if(!results || !results.len) + results = list("You were unable to examine that. Tell a developer!") + to_chat(src, jointext(results, "
")) update_examine_panel(A) /mob/proc/update_examine_panel(var/atom/A) diff --git a/code/modules/fishing/fishing_net.dm b/code/modules/fishing/fishing_net.dm index 740e3a2a6d..ab1e35ea6a 100644 --- a/code/modules/fishing/fishing_net.dm +++ b/code/modules/fishing/fishing_net.dm @@ -23,7 +23,7 @@ var/list/accepted_mobs = list(/mob/living/simple_mob/animal/passive/fish) /obj/item/weapon/material/fishing_net/Initialize() - ..() + . = ..() update_icon() /obj/item/weapon/material/fishing_net/afterattack(var/atom/A, var/mob/user, var/proximity) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 52578a31c7..ea4571442f 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -47,7 +47,7 @@ ..() /obj/item/weapon/material/fishing_rod/Initialize() - ..() + . = ..() update_icon() /obj/item/weapon/material/fishing_rod/attackby(obj/item/I as obj, mob/user as mob) diff --git a/code/modules/food/drinkingglass/drinkingglass.dm b/code/modules/food/drinkingglass/drinkingglass.dm index c2c5dc4219..a83c869495 100644 --- a/code/modules/food/drinkingglass/drinkingglass.dm +++ b/code/modules/food/drinkingglass/drinkingglass.dm @@ -66,7 +66,7 @@ return 0 /obj/item/weapon/reagent_containers/food/drinks/glass2/Initialize() - ..() + . = ..() icon_state = base_icon /obj/item/weapon/reagent_containers/food/drinks/glass2/on_reagent_change() diff --git a/code/modules/food/food/cans.dm b/code/modules/food/food/cans.dm index b876a0e1d1..8f2e135d73 100644 --- a/code/modules/food/food/cans.dm +++ b/code/modules/food/food/cans.dm @@ -38,7 +38,7 @@ center_of_mass = list("x"=16, "y"=8) /obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind/Initialize() - ..() + . = ..() reagents.add_reagent("spacemountainwind", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko @@ -92,7 +92,7 @@ center_of_mass = list("x"=16, "y"=8) /obj/item/weapon/reagent_containers/food/drinks/cans/space_up/Initialize() - ..() + . = ..() reagents.add_reagent("space_up", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime @@ -103,7 +103,7 @@ center_of_mass = list("x"=16, "y"=8) /obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime/Initialize() - ..() + . = ..() reagents.add_reagent("lemon_lime", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea @@ -114,7 +114,7 @@ center_of_mass = list("x"=16, "y"=8) /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea/Initialize() - ..() + . = ..() reagents.add_reagent("icetea", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice @@ -125,7 +125,7 @@ center_of_mass = list("x"=16, "y"=8) /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice/Initialize() - ..() + . = ..() reagents.add_reagent("grapejuice", 30) /obj/item/weapon/reagent_containers/food/drinks/cans/tonic diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index 2723df7fe2..81c3e63c84 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -10,6 +10,7 @@ icon_state = null flags = OPENCONTAINER amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(5,10,15,25,30) volume = 50 var/trash = null @@ -237,7 +238,7 @@ pickup_sound = 'sound/items/pickup/papercup.ogg' /obj/item/weapon/reagent_containers/food/drinks/h_chocolate/Initialize() - ..() + . = ..() reagents.add_reagent("hot_coco", 30) /obj/item/weapon/reagent_containers/food/drinks/greentea @@ -296,7 +297,7 @@ pickup_sound = 'sound/items/pickup/papercup.ogg' /obj/item/weapon/reagent_containers/food/drinks/dry_ramen/Initialize() - ..() + . = ..() reagents.add_reagent("dry_ramen", 30) /obj/item/weapon/reagent_containers/food/drinks/sillycup diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index a5fd76417b..56d303371a 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -388,7 +388,7 @@ center_of_mass = list("x"=16, "y"=6) /obj/item/weapon/reagent_containers/food/drinks/bottle/space_up/Initialize() - ..() + . = ..() reagents.add_reagent("space_up", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind @@ -398,7 +398,7 @@ center_of_mass = list("x"=16, "y"=6) /obj/item/weapon/reagent_containers/food/drinks/bottle/space_mountain_wind/Initialize() - ..() + . = ..() reagents.add_reagent("spacemountainwind", 100) /obj/item/weapon/reagent_containers/food/drinks/bottle/pwine @@ -628,3 +628,13 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps/Initialize() . = ..() reagents.add_reagent("schnapps_lem", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/jager + name = "Schusskonig" + desc = "A complex tasting digestif. Thank god the original's trademark lapsed." + icon_state = "jager_bottle" + center_of_mass = list("x"=16, "y"=3) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/jager/Initialize() + . = ..() + reagents.add_reagent("jager", 100) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 60c1a6cb14..a00ec410a5 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -1760,20 +1760,6 @@ . = ..() bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/mashedpotato - name = "Mashed Potato" - desc = "Pillowy mounds of mashed potato." - icon_state = "mashedpotato" - trash = /obj/item/trash/plate - filling_color = "#EDDD00" - center_of_mass = list("x"=16, "y"=11) - nutriment_amt = 4 - nutriment_desc = list("fluffy mashed potatoes" = 4) - -/obj/item/weapon/reagent_containers/food/snacks/mashedpotato/Initialize() - . = ..() - bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/bangersandmash name = "Bangers and Mash" desc = "An English treat." @@ -1892,13 +1878,13 @@ trash = /obj/item/trash/plate filling_color = "#7A3D11" center_of_mass = list("x"=16, "y"=13) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/meatsteak/Initialize() . = ..() reagents.add_reagent("protein", 4) reagents.add_reagent("sodiumchloride", 1) reagents.add_reagent("blackpepper", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff name = "Spacy Liberty Duff" @@ -1909,11 +1895,11 @@ center_of_mass = list("x"=16, "y"=8) nutriment_amt = 6 nutriment_desc = list("mushroom" = 6) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff/Initialize() . = ..() reagents.add_reagent("psilocybin", 6) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/amanitajelly name = "Amanita Jelly" @@ -1924,12 +1910,12 @@ center_of_mass = list("x"=16, "y"=5) nutriment_amt = 6 nutriment_desc = list("jelly" = 3, "mushroom" = 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/amanitajelly/Initialize() . = ..() reagents.add_reagent("amatoxin", 6) reagents.add_reagent("psilocybin", 3) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/poppypretzel name = "Poppy pretzel" @@ -1952,24 +1938,24 @@ trash = /obj/item/trash/snack_bowl filling_color = "#785210" center_of_mass = list("x"=16, "y"=8) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/meatballsoup/Initialize() . = ..() reagents.add_reagent("protein", 8) reagents.add_reagent("water", 5) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/slimesoup name = "slime soup" desc = "If no water is available, you may substitute tears." icon_state = "slimesoup" //nonexistant? - 3/1/2020 FIXED. roro's live on. - 7/14/2020 - The fuck are you smoking, roro's is stupid, name it slimesoup so it's clear wtf it is. filling_color = "#C4DBA0" + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/slimesoup/Initialize() . = ..() reagents.add_reagent("slimejelly", 5) reagents.add_reagent("water", 10) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/bloodsoup name = "Tomato soup" @@ -1977,13 +1963,13 @@ icon_state = "tomatosoup" filling_color = "#FF0000" center_of_mass = list("x"=16, "y"=7) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/bloodsoup/Initialize() . = ..() reagents.add_reagent("protein", 2) reagents.add_reagent("blood", 10) reagents.add_reagent("water", 5) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/clownstears name = "Clown's Tears" @@ -1993,12 +1979,12 @@ center_of_mass = list("x"=16, "y"=7) nutriment_amt = 4 nutriment_desc = list("salt" = 1, "the worst joke" = 3) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/clownstears/Initialize() . = ..() reagents.add_reagent("banana", 5) reagents.add_reagent("water", 10) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup name = "Vegetable soup" @@ -2009,11 +1995,11 @@ center_of_mass = list("x"=16, "y"=8) nutriment_amt = 8 nutriment_desc = list("carrot" = 2, "corn" = 2, "eggplant" = 2, "potato" = 2) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup/Initialize() . = ..() reagents.add_reagent("water", 5) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/nettlesoup name = "Nettle soup" @@ -2024,12 +2010,12 @@ center_of_mass = list("x"=16, "y"=7) nutriment_amt = 8 nutriment_desc = list("salad" = 4, "egg" = 2, "potato" = 2) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/nettlesoup/Initialize() . = ..() reagents.add_reagent("water", 5) reagents.add_reagent("tricordrazine", 5) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/mysterysoup name = "Mystery soup" @@ -2040,6 +2026,7 @@ center_of_mass = list("x"=16, "y"=6) nutriment_amt = 1 nutriment_desc = list("backwash" = 1) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/mysterysoup/Initialize() . = ..() @@ -2079,7 +2066,6 @@ reagents.add_reagent("nutriment", 6) reagents.add_reagent("tomatojuice", 5) reagents.add_reagent("imidazoline", 5) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/wishsoup name = "Wish Soup" @@ -2088,11 +2074,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#D1F4FF" center_of_mass = list("x"=16, "y"=11) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/wishsoup/Initialize() . = ..() reagents.add_reagent("water", 10) - bitesize = 5 if(prob(25)) src.desc = "A wish come true!" reagents.add_reagent("nutriment", 8, list("something good" = 8)) @@ -2106,13 +2092,13 @@ center_of_mass = list("x"=15, "y"=9) nutriment_amt = 3 nutriment_desc = list("chilli peppers" = 3) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/hotchili/Initialize() . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent("capsaicin", 3) reagents.add_reagent("tomatojuice", 2) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/coldchili name = "Cold Chili" @@ -2123,13 +2109,13 @@ trash = /obj/item/trash/snack_bowl nutriment_amt = 3 nutriment_desc = list("ice peppers" = 3) + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/coldchili/Initialize() . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent("frostoil", 3) reagents.add_reagent("tomatojuice", 2) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/monkeycube name = "monkey cube" @@ -2233,11 +2219,11 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 4 nutriment_desc = list("buns" = 4) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger/Initialize() . = ..() reagents.add_reagent("protein", 10) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/enchiladas name = "Enchiladas" @@ -2248,12 +2234,12 @@ center_of_mass = list("x"=16, "y"=13) nutriment_amt = 2 nutriment_desc = list("tortilla" = 3, "corn" = 3) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/enchiladas/Initialize() . = ..() reagents.add_reagent("protein", 6) reagents.add_reagent("capsaicin", 6) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight name = "monkey's Delight" @@ -2262,6 +2248,7 @@ trash = /obj/item/trash/tray filling_color = "#5C3C11" center_of_mass = list("x"=16, "y"=13) + bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight/Initialize() . = ..() @@ -2269,7 +2256,6 @@ reagents.add_reagent("banana", 5) reagents.add_reagent("blackpepper", 1) reagents.add_reagent("sodiumchloride", 1) - bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/baguette name = "Baguette" @@ -2279,12 +2265,12 @@ center_of_mass = list("x"=18, "y"=12) nutriment_amt = 6 nutriment_desc = list("french bread" = 6) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/baguette/Initialize() . = ..() reagents.add_reagent("blackpepper", 1) reagents.add_reagent("sodiumchloride", 1) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/fishandchips name = "Fish and Chips" @@ -2294,11 +2280,11 @@ center_of_mass = list("x"=16, "y"=16) nutriment_amt = 3 nutriment_desc = list("salt" = 1, "chips" = 3) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/fishandchips/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sandwich name = "Sandwich" @@ -2309,11 +2295,11 @@ center_of_mass = list("x"=16, "y"=4) nutriment_amt = 3 nutriment_desc = list("bread" = 3, "cheese" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sandwich/Initialize() . = ..() reagents.add_reagent("protein", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich name = "Toasted Sandwich" @@ -2324,12 +2310,12 @@ center_of_mass = list("x"=16, "y"=4) nutriment_amt = 3 nutriment_desc = list("toasted bread" = 3, "cheese" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich/Initialize() . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent("carbon", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/grilledcheese name = "Grilled Cheese Sandwich" @@ -2339,11 +2325,11 @@ filling_color = "#D9BE29" nutriment_amt = 3 nutriment_desc = list("toasted bread" = 3, "cheese" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/grilledcheese/Initialize() . = ..() reagents.add_reagent("protein", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tomatosoup name = "Tomato Soup" @@ -2354,39 +2340,11 @@ center_of_mass = list("x"=16, "y"=7) nutriment_amt = 5 nutriment_desc = list("soup" = 5) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tomatosoup/Initialize() . = ..() reagents.add_reagent("tomatojuice", 10) - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/onionsoup - name = "Onion Soup" - desc = "A soup with layers." - icon_state = "onionsoup" - trash = /obj/item/trash/snack_bowl - filling_color = "#E0C367" - center_of_mass = list("x"=16, "y"=7) - nutriment_amt = 5 - nutriment_desc = list("onion" = 2, "soup" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/onionsoup/Initialize() - . = ..() - bitesize = 3 - -/obj/item/weapon/reagent_containers/food/snacks/onionrings - name = "Onion Rings" - desc = "Crispy rings." - icon_state = "onionrings" - trash = /obj/item/trash/plate - filling_color = "#E0C367" - center_of_mass = list("x"=16, "y"=7) - nutriment_amt = 5 - nutriment_desc = list("onion" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/onionrings/Initialize() - . = ..() - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles name = "Roffle Waffles" @@ -2397,11 +2355,11 @@ center_of_mass = list("x"=15, "y"=11) nutriment_amt = 8 nutriment_desc = list("waffle" = 7, "sweetness" = 1) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles/Initialize() . = ..() reagents.add_reagent("psilocybin", 8) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/stew name = "Stew" @@ -2413,6 +2371,7 @@ nutriment_desc = list("tomato" = 2, "potato" = 2, "carrot" = 2, "eggplant" = 2, "mushroom" = 2) drop_sound = 'sound/items/drop/shovel.ogg' pickup_sound = 'sound/items/pickup/shovel.ogg' + bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/stew/Initialize() . = ..() @@ -2420,7 +2379,6 @@ reagents.add_reagent("tomatojuice", 5) reagents.add_reagent("imidazoline", 5) reagents.add_reagent("water", 5) - bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast name = "Jellied Toast" @@ -2466,18 +2424,18 @@ reagents.add_reagent("cherryjelly", 5) /obj/item/weapon/reagent_containers/food/snacks/milosoup - name = "Milosoup" + name = "Miso soup" desc = "The universes best soup! Yum!!!" icon_state = "milosoup" trash = /obj/item/trash/snack_bowl center_of_mass = list("x"=16, "y"=7) nutriment_amt = 8 nutriment_desc = list("soy" = 8) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/milosoup/Initialize() . = ..() reagents.add_reagent("water", 5) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat name = "Stewed Soy Meat" @@ -2543,11 +2501,11 @@ center_of_mass = list("x"=17, "y"=11) nutriment_amt = 16 nutriment_desc = list("rice" = 2, "gauze" = 4, "fish" = 10) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/kudzudonburi/Initialize() . = ..() reagents.add_reagent("protein", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pastatomato name = "Spaghetti" @@ -2558,11 +2516,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 6 nutriment_desc = list("tomato" = 3, "noodles" = 3) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/pastatomato/Initialize() . = ..() reagents.add_reagent("tomatojuice", 10) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti name = "Spaghetti & Meatballs" @@ -2573,11 +2531,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 4 nutriment_desc = list("noodles" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti/Initialize() . = ..() reagents.add_reagent("protein", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spesslaw name = "Spesslaw" @@ -2587,11 +2545,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_amt = 4 nutriment_desc = list("noodles" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spesslaw/Initialize() . = ..() reagents.add_reagent("protein", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotfries name = "Carrot Fries" @@ -2602,11 +2560,11 @@ center_of_mass = list("x"=16, "y"=11) nutriment_amt = 3 nutriment_desc = list("carrot" = 3, "salt" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotfries/Initialize() . = ..() reagents.add_reagent("imidazoline", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/superbiteburger name = "Super Bite Burger" @@ -2616,11 +2574,11 @@ center_of_mass = list("x"=16, "y"=3) nutriment_amt = 25 nutriment_desc = list("buns" = 25) + bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/superbiteburger/Initialize() . = ..() reagents.add_reagent("protein", 25) - bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/candiedapple name = "Candied Apple" @@ -2709,11 +2667,11 @@ name = "Boiled Slime Core" desc = "A boiled red thing." icon_state = "boiledslimecore" + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/boiledslimecore/Initialize() . = ..() reagents.add_reagent("slimejelly", 5) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/mint name = "mint" @@ -2721,11 +2679,11 @@ icon_state = "mint" filling_color = "#F2F2F2" center_of_mass = list("x"=16, "y"=14) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/mint/Initialize() . = ..() reagents.add_reagent("mint", 1) - bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/mint/admints desc = "Spearmint, peppermint's non-festive cousin." @@ -2771,6 +2729,7 @@ center_of_mass = list("x"=16, "y"=13) nutriment_amt = 5 nutriment_desc = list("mushroom" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize() . = ..() @@ -2778,10 +2737,8 @@ name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" reagents.add_reagent("nutriment", 8) - bitesize = 2 else reagents.add_reagent("nutriment", 5) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/chawanmushi name = "chawanmushi" @@ -2790,11 +2747,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#F0F2E4" center_of_mass = list("x"=17, "y"=10) + bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/chawanmushi/Initialize() . = ..() reagents.add_reagent("protein", 5) - bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/beetsoup name = "beet soup" @@ -2805,11 +2762,11 @@ center_of_mass = list("x"=15, "y"=8) nutriment_amt = 8 nutriment_desc = list("tomato" = 4, "beet" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/beetsoup/Initialize() . = ..() name = pick(list("borsch","bortsch","borstch","borsh","borshch","borscht")) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tossedsalad name = "tossed salad" @@ -2834,11 +2791,11 @@ center_of_mass = list("x"=17, "y"=11) nutriment_amt = 6 nutriment_desc = list("100% real salad") + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/validsalad/Initialize() . = ..() reagents.add_reagent("protein", 2) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/appletart name = "golden apple streusel tart" @@ -2849,11 +2806,11 @@ center_of_mass = list("x"=16, "y"=18) nutriment_amt = 8 nutriment_desc = list("apple" = 8) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/appletart/Initialize() . = ..() reagents.add_reagent("gold", 5) - bitesize = 3 /////////////////////////////////////////////////Sliceable//////////////////////////////////////// // All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels @@ -3019,11 +2976,11 @@ center_of_mass = list("x"=16, "y"=10) nutriment_desc = list("cake" = 10, "sweetness" = 10, "carrot" = 15) nutriment_amt = 25 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake/Initialize() . = ..() reagents.add_reagent("imidazoline", 10) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/carrotcake name = "Carrot Cake slice" @@ -3048,12 +3005,12 @@ center_of_mass = list("x"=16, "y"=10) nutriment_desc = list("cake" = 10, "sweetness" = 10, "slime" = 15) nutriment_amt = 5 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake/Initialize() . = ..() reagents.add_reagent("protein", 25) reagents.add_reagent("alkysine", 10) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/braincake name = "Brain Cake slice" @@ -3465,32 +3422,35 @@ filled = TRUE /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple - name = "Hawaiian" - desc = "The accursed wheel from ancient times." - icon_state = "pizzamargherita" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/slice/pineapple + name = "ham & pineapple pizza" + desc = "One of the most debated pizzas in existence." + icon = 'icons/obj/food_syn.dmi' + icon_state = "pineapple_pizza" + slice_path = /obj/item/weapon/reagent_containers/food/snacks/pineappleslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 5, "tomato" = 5, "cheese" = 5, "pineapple" = 20) - nutriment_amt = 35 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "ham" = 10) + nutriment_amt = 30 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple/Initialize() . = ..() - reagents.add_reagent("protein", 5) - reagents.add_reagent("pineapplejuice", 6) - bitesize = 2 + reagents.add_reagent("protein", 4) + reagents.add_reagent("cheese", 5) + reagents.add_reagent("tomatojuice", 6) -/obj/item/weapon/reagent_containers/food/snacks/slice/pineapple - name = "Hawaiian slice" - desc = "A slice of the accursed pizza." - icon_state = "pizzamargheritaslice" +/obj/item/weapon/reagent_containers/food/snacks/pineappleslice + name = "ham & pineapple pizza slice" + desc = "A slice of contraband." + icon = 'icons/obj/food_syn.dmi' + icon_state = "pineapple_pizza_slice" filling_color = "#BAA14C" bitesize = 2 - center_of_mass = list("x"=16, "y"=13) - whole_path = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple + center_of_mass = list("x"=18, "y"=13) -/obj/item/weapon/reagent_containers/food/snacks/slice/pineapple/filled - filled = TRUE +/obj/item/weapon/reagent_containers/food/snacks/pineappleslice/filled + nutriment_desc = list("pizza crust" = 5, "tomato" = 5) + nutriment_amt = 5 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza name = "Meatpizza" @@ -3556,13 +3516,13 @@ center_of_mass = list("x"=16, "y"=11) nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "eggplant" = 5, "carrot" = 5, "corn" = 5) nutriment_amt = 25 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza/Initialize() . = ..() reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) reagents.add_reagent("imidazoline", 12) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/slice/vegetablepizza name = "Vegetable pizza slice" @@ -3766,26 +3726,32 @@ /obj/item/pizzabox/margherita/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita(src) boxtag = "Margherita Deluxe" + . = ..() /obj/item/pizzabox/vegetable/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza(src) boxtag = "Gourmet Vegatable" + . = ..() /obj/item/pizzabox/mushroom/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza(src) boxtag = "Mushroom Special" + . = ..() /obj/item/pizzabox/meat/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src) boxtag = "Meatlover's Supreme" + . = ..() /obj/item/pizzabox/pineapple/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple(src) boxtag = "Hawaiian Sunrise" + . = ..() /obj/item/pizzabox/old/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza(src) boxtag = "Deluxe Gourmet" + . = ..() /obj/item/weapon/reagent_containers/food/snacks/dionaroast name = "roast diona" @@ -3802,9 +3768,6 @@ reagents.add_reagent("radium", 2) bitesize = 2 -/////////////////////////////////////////// -// new old food stuff from bs12 -/////////////////////////////////////////// /obj/item/weapon/reagent_containers/food/snacks/dough name = "dough" desc = "A piece of dough." @@ -4072,12 +4035,12 @@ filling_color = "#5dadcf" center_of_mass = list("x"=16, "y"=12) do_coating_prefix = 0 + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bellefritter/Initialize() . = ..() reagents.add_reagent("batter", 10) reagents.add_reagent("sugar", 5) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roastedsunflower name = "sunflower seeds" @@ -4110,11 +4073,11 @@ center_of_mass = list("x"=16, "y"=15) nutriment_amt = 20 nutriment_desc = list("chalk" = 6) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/liquidfood/Initialize() . = ..() reagents.add_reagent("iron", 3) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/liquidprotein name = "\improper LiquidProtein Ration" @@ -4124,12 +4087,12 @@ filling_color = "#A8A8A8" survivalfood = TRUE center_of_mass = list("x"=16, "y"=15) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize() . = ..() reagents.add_reagent("protein", 30) reagents.add_reagent("iron", 3) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin name = "\improper VitaPaste Ration" @@ -4139,6 +4102,7 @@ filling_color = "#A8A8A8" survivalfood = TRUE center_of_mass = list("x"=16, "y"=15) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/liquidvitamin/Initialize() . = ..() @@ -4147,7 +4111,6 @@ reagents.add_reagent("paracetamol", 5) reagents.add_reagent("enzyme", 1) reagents.add_reagent("iron", 3) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/meatcube name = "cubed meat" @@ -4155,11 +4118,11 @@ icon_state = "meatcube" filling_color = "#7a3d11" center_of_mass = list("x"=16, "y"=16) + bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/meatcube/Initialize() . = ..() reagents.add_reagent("protein", 15) - bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tastybread name = "bread tube" @@ -4204,39 +4167,15 @@ center_of_mass = list("x"=15, "y"=9) drop_sound = 'sound/items/drop/soda.ogg' pickup_sound = 'sound/items/pickup/soda.ogg' + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/unajerky/Initialize() . =..() reagents.add_reagent("protein", 8) reagents.add_reagent("capsaicin", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/croissant - name = "croissant" - desc = "True French cuisine." - filling_color = "#E3D796" - icon_state = "croissant" - nutriment_amt = 6 - nutriment_desc = list("french bread" = 6) - -/obj/item/weapon/reagent_containers/food/snacks/croissant/Initialize() - . = ..() - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/meatbun - name = "meat bun" - desc = "Chinese street food, in neither China nor a street." - filling_color = "#DEDEAB" - icon_state = "meatbun" - nutriment_amt = 4 - -/obj/item/weapon/reagent_containers/food/snacks/meatbun/Initialize() - . = ..() - bitesize = 2 - reagents.add_reagent("protein", 4) /obj/item/weapon/reagent_containers/food/snacks/sashimi - name = "carp sashimi" + name = "sashimi" desc = "Expertly prepared. Hopefully the toxins got removed." filling_color = "#FFDEFE" icon_state = "sashimi" @@ -4352,12 +4291,12 @@ center_of_mass = list("x"=17, "y"=16) nutriment_amt = 8 nutriment_desc = list("egg" = 4, "chili" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/devilledegg/Initialize() . = ..() reagents.add_reagent("nutriment", 6) reagents.add_reagent("capsaicin", 2) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fruitsalad name = "fruit salad" @@ -4373,7 +4312,7 @@ bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/flowerchildsalad - name = "flowerchild salad" + name = "flowerchild poppy salad" desc = "A fragrant salad." icon_state = "flowerchildsalad" filling_color = "#FF3867" @@ -4386,18 +4325,18 @@ bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/rosesalad - name = "flowerchild salad" + name = "flowerchild rose salad" desc = "A fragrant salad." icon_state = "rosesalad" filling_color = "#FF3867" nutriment_amt = 5 nutriment_desc = list("bittersweet" = 10, "iron" = 5) + bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/rosesalad/Initialize() . = ..() reagents.add_reagent("nutriment", 10) reagents.add_reagent("stoxin", 2) - bitesize = 4 /obj/item/weapon/reagent_containers/food/snacks/eggbowl name = "egg bowl" @@ -4414,21 +4353,6 @@ reagents.add_reagent("protein", 4) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/porkbowl - name = "pork bowl" - desc = "A bowl of fried rice with cuts of meat." - icon_state = "porkbowl" - trash = /obj/item/trash/snack_bowl - filling_color = "#FFFBDB" - nutriment_amt = 6 - nutriment_desc = list("rice" = 2, "meat" = 4) - -/obj/item/weapon/reagent_containers/food/snacks/porkbowl/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("protein", 4) - bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/tortilla name = "tortilla" desc = "The base for all your burritos." @@ -4441,81 +4365,18 @@ reagents.add_reagent("nutriment", 2) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/meatburrito - name = "carne asada burrito" - desc = "The best burrito for meat lovers." - icon_state = "carneburrito" - nutriment_amt = 6 - nutriment_desc = list("tortilla" = 3, "meat" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/meatburrito/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/cheeseburrito - name = "Cheese burrito" - desc = "It's a burrito filled with cheese." - icon_state = "cheeseburrito" - nutriment_amt = 6 - nutriment_desc = list("tortilla" = 3, "cheese" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/cheeseburrito/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("protein", 2) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/fuegoburrito - name = "fuego phoron burrito" - desc = "A super spicy burrito." - icon_state = "fuegoburrito" - nutriment_amt = 6 - nutriment_desc = list("chili peppers" = 5, "tortilla" = 1) - -/obj/item/weapon/reagent_containers/food/snacks/fuegoburrito/Initialize() - . = ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("capsaicin", 4) - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/nachos - name = "nachos" - desc = "Chips from Old Mexico." - icon_state = "nachos" - nutriment_amt = 2 - nutriment_desc = list("salt" = 1) - -/obj/item/weapon/reagent_containers/food/snacks/nachos/Initialize() - . = ..() - reagents.add_reagent("nutriment", 1) - bitesize = 1 - -/obj/item/weapon/reagent_containers/food/snacks/cheesenachos - name = "cheesy nachos" - desc = "The delicious combination of nachos and melting cheese." - icon_state = "cheesenachos" - nutriment_amt = 5 - nutriment_desc = list("salt" = 2, "cheese" = 3) - -/obj/item/weapon/reagent_containers/food/snacks/cheesenachos/Initialize() - . = ..() - reagents.add_reagent("nutriment", 5) - reagents.add_reagent("protein", 2) - bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/cubannachos name = "cuban nachos" desc = "That's some dangerously spicy nachos." icon_state = "cubannachos" nutriment_amt = 6 nutriment_desc = list("salt" = 1, "cheese" = 2, "chili peppers" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cubannachos/Initialize() . = ..() reagents.add_reagent("nutriment", 5) reagents.add_reagent("capsaicin", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/curryrice name = "curry rice" @@ -4523,12 +4384,12 @@ icon_state = "curryrice" nutriment_amt = 6 nutriment_desc = list("salt" = 1, "rice" = 2, "chili peppers" = 3) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/curryrice/Initialize() . = ..() reagents.add_reagent("nutriment", 5) reagents.add_reagent("capsaicin", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/piginblanket name = "pig in a blanket" @@ -4563,11 +4424,11 @@ nutriment_amt = 1 nutriment_desc = list("bugflesh" = 1) w_class = ITEMSIZE_TINY + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/wormsickly/Initialize() . = ..() reagents.add_reagent("fishbait", 10) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/worm name = "strange worm" @@ -4576,11 +4437,11 @@ nutriment_amt = 1 nutriment_desc = list("bugflesh" = 1) w_class = ITEMSIZE_TINY + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/worm/Initialize() . = ..() reagents.add_reagent("fishbait", 20) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/wormdeluxe name = "deluxe worm" @@ -4589,11 +4450,11 @@ nutriment_amt = 5 nutriment_desc = list("bugflesh" = 1) w_class = ITEMSIZE_TINY + bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/wormdeluxe/Initialize() . = ..() reagents.add_reagent("fishbait", 40) - bitesize = 5 /obj/item/weapon/reagent_containers/food/snacks/siffruit name = "pulsing fruit" @@ -4624,11 +4485,11 @@ icon_state = "bagelplain" nutriment_amt = 3 nutriment_desc = list("bread" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelplain/Initialize() . = ..() reagents.add_reagent("nutriment", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelsunflower name = "sunflower seed bagel" @@ -4636,11 +4497,11 @@ icon_state = "bagelsunflower" nutriment_amt = 4 nutriment_desc = list("bread" = 1, "sunflower seeds" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelsunflower/Initialize() . = ..() reagents.add_reagent("nutriment", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelcheese name = "cheese bagel" @@ -4648,12 +4509,12 @@ icon_state = "bagelcheese" nutriment_amt = 4 nutriment_desc = list("bread" = 1, "cheese" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelcheese/Initialize() . = ..() reagents.add_reagent("protein", 4) reagents.add_reagent("nutriment", 4) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelraisin name = "cinnamon raisin bagel" @@ -4661,11 +4522,11 @@ icon_state = "bagelraisin" nutriment_amt = 5 nutriment_desc = list("bread" = 1, "sweetness" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelraisin/Initialize() . = ..() reagents.add_reagent("nutriment", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelpoppy name = "poppy seed bagel" @@ -4673,24 +4534,24 @@ icon_state = "bagelpoppy" nutriment_amt = 5 nutriment_desc = list("bread" = 1, "sweetness" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bagelpoppy/Initialize() . = ..() reagents.add_reagent("nutriment", 3) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bageleverything name = "everything bagel" desc = "Mmm... Immeasurably unfathomable!" icon_state = "bageleverything" - nutriment_amt = 40 + nutriment_amt = 20 nutriment_desc = list("life" = 1, "death" = 1, "entropy" = 1) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bageleverything/Initialize() . = ..() reagents.add_reagent("phoron", 5) reagents.add_reagent("defective_nanites", 5) - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bageltwo name = "two bagels" @@ -4698,7 +4559,7 @@ icon_state = "bagelplain" /obj/item/weapon/reagent_containers/food/snacks/bageltwo/Initialize() - ..() //Not returning . because asking to be qdel'd below. + ..() spawn_bagels() spawn_bagels() return INITIALIZE_HINT_QDEL @@ -4719,11 +4580,9 @@ center_of_mass = list("x"=16, "y"=16) nutriment_amt = 9 nutriment_desc = list("Cheese" = 5, "pasta" = 4, "happiness" = 1) - -/obj/item/weapon/reagent_containers/food/snacks/macncheese/Initialize() - . = ..() bitesize = 3 + //Code for dipping food in batter /obj/item/weapon/reagent_containers/food/snacks/afterattack(obj/O as obj, mob/user as mob, proximity) if(O.is_open_container() && O.reagents && !(istype(O, /obj/item/weapon/reagent_containers/food)) && proximity) @@ -4862,9 +4721,6 @@ /mob/living/simple_mob/adultslime composition_reagent = "slimejelly" -/mob/living/carbon/slime - composition_reagent = "slimejelly" - /mob/living/carbon/alien/diona composition_reagent = "nutriment"//Dionae are plants, so eating them doesn't give animal protein @@ -4874,9 +4730,6 @@ /mob/living/simple_mob var/kitchen_tag = "animal" //Used for cooking with animals -/mob/living/simple_mob/mouse - kitchen_tag = "rodent" - /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel slices_num = 8 @@ -4928,29 +4781,29 @@ /obj/item/weapon/reagent_containers/food/snacks/chickenkatsu name = "chicken katsu" - desc = "A Terran delicacy consisting of chicken fried in a light beer batter." + desc = "An Earth delicacy consisting of chicken fried in a light beer batter." icon = 'icons/obj/food_syn.dmi' icon_state = "katsu" trash = /obj/item/trash/plate filling_color = "#E9ADFF" center_of_mass = list("x"=16, "y"=16) do_coating_prefix = 0 + bitesize = 1.5 /obj/item/weapon/reagent_containers/food/snacks/chickenkatsu/Initialize() . = ..() reagents.add_reagent("protein", 6) reagents.add_reagent("beerbatter", 2) reagents.add_reagent("oil", 1) - bitesize = 1.5 /obj/item/weapon/reagent_containers/food/snacks/fries nutriment_amt = 4 nutriment_desc = list("fries" = 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fries/Initialize() . = ..() reagents.add_reagent("oil", 1.2)//This is mainly for the benefit of adminspawning - bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/microchips name = "micro chips" @@ -4982,14 +4835,6 @@ . = ..() bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/meatsteak/Initialize() - . = ..() - reagents.add_reagent("protein", 6) - reagents.add_reagent("triglyceride", 2) - reagents.add_reagent("sodiumchloride", 1) - reagents.add_reagent("blackpepper", 1) - bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/crunch name = "pizza crunch" desc = "This was once a normal pizza, but it has been coated in batter and deep-fried. Whatever toppings it once had are a mystery, but they're still under there, somewhere..." @@ -5109,7 +4954,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bacon_stick name = "eggpop" - desc = "A bacon wrapped boiled egg, conviently skewered on a wooden stick." + desc = "A bacon wrapped boiled egg, conveniently skewered on a wooden stick." icon = 'icons/obj/food_syn.dmi' icon_state = "bacon_stick" @@ -5119,8 +4964,8 @@ reagents.add_reagent("egg", 1) /obj/item/weapon/reagent_containers/food/snacks/chilied_eggs - name = "chilied eggs" - desc = "Three deviled eggs floating in a bowl of meat chili. A popular lunchtime meal for Unathi in Ouerea." + name = "Redeemed eggs" + desc = "Three deviled eggs floating in a bowl of meat chili. A popular lunchtime meal for Unathi, with mild religious undertones." icon_state = "chilied_eggs" trash = /obj/item/trash/snack_bowl @@ -5129,7 +4974,6 @@ reagents.add_reagent("egg", 6) reagents.add_reagent("protein", 2) - /obj/item/weapon/reagent_containers/food/snacks/cheese_cracker name = "supreme cheese toast" desc = "A piece of toast lathered with butter, cheese, spices, and herbs." @@ -5221,7 +5065,7 @@ reagents.add_reagent("protein", 3) /obj/item/weapon/reagent_containers/food/snacks/fish_taco - name = "carp taco" + name = "fish taco" desc = "A questionably cooked fish taco decorated with herbs, spices, and special sauce." icon = 'icons/obj/food_syn.dmi' icon_state = "fish_taco" @@ -5233,8 +5077,8 @@ reagents.add_reagent("seafood",3) /obj/item/weapon/reagent_containers/food/snacks/nt_muffin - name = "\improper NtMuffin" - desc = "A NanoTrasen sponsered biscuit with egg, cheese, and sausage." + name = "breakfast muffin" + desc = "An english muffin with egg, cheese, and sausage, as sold in fast food joints galaxy-wide." icon = 'icons/obj/food_syn.dmi' icon_state = "nt_muffin" nutriment_desc = list("biscuit" = 3) @@ -5246,7 +5090,7 @@ /obj/item/weapon/reagent_containers/food/snacks/pineapple_ring name = "pineapple ring" - desc = "What the hell is this?" + desc = "So retro." icon = 'icons/obj/food_syn.dmi' icon_state = "pineapple_ring" nutriment_desc = list("sweetness" = 2) @@ -5256,36 +5100,6 @@ . = ..() reagents.add_reagent("pineapplejuice",3) -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple - name = "ham & pineapple pizza" - desc = "One of the most debated pizzas in existence." - icon = 'icons/obj/food_syn.dmi' - icon_state = "pineapple_pizza" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/pineappleslice - slices_num = 6 - center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "ham" = 10) - nutriment_amt = 30 - bitesize = 2 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("cheese", 5) - reagents.add_reagent("tomatojuice", 6) - -/obj/item/weapon/reagent_containers/food/snacks/pineappleslice - name = "ham & pineapple pizza slice" - desc = "A slice of contraband." - icon = 'icons/obj/food_syn.dmi' - icon_state = "pineapple_pizza_slice" - filling_color = "#BAA14C" - bitesize = 2 - center_of_mass = list("x"=18, "y"=13) - -/obj/item/weapon/reagent_containers/food/snacks/pineappleslice/filled - nutriment_desc = list("pizza crust" = 5, "tomato" = 5) - nutriment_amt = 5 /obj/item/weapon/reagent_containers/food/snacks/burger/bacon name = "bacon burger" @@ -5329,17 +5143,6 @@ nutriment_amt = 5 bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/berrymuffin - name = "berry muffin" - desc = "A delicious and spongy little cake, with berries." - icon = 'icons/obj/food_syn.dmi' - icon_state = "berrymuffin" - filling_color = "#E0CF9B" - center_of_mass = list("x"=17, "y"=4) - nutriment_amt = 5 - nutriment_desc = list("sweetness" = 1, "muffin" = 2, "berries" = 2) - bitesize = 2 - /obj/item/weapon/reagent_containers/food/snacks/soup/onion name = "onion soup" desc = "A soup with layers." @@ -5691,8 +5494,8 @@ //burritos /obj/item/weapon/reagent_containers/food/snacks/burrito - name = "meat burrito" - desc = "Meat wrapped in a flour tortilla. It's a burrito by definition." + name = "chilli burrito" + desc = "Minced meat wrapped in a flour tortilla. It's a burrito by definition." icon = 'icons/obj/food_syn.dmi' icon_state = "burrito" bitesize = 4 @@ -5719,22 +5522,12 @@ . = ..() reagents.add_reagent("tofu", 6) -/obj/item/weapon/reagent_containers/food/snacks/burrito_spicy - name = "spicy meat burrito" - desc = "Meat and chilis wrapped in a flour tortilla." - icon = 'icons/obj/food_syn.dmi' - icon_state = "burrito_spicy" - bitesize = 4 - center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("tortilla" = 6) - nutriment_amt = 6 - /obj/item/weapon/reagent_containers/food/snacks/burrito_spicy/Initialize() . = ..() reagents.add_reagent("protein", 6) /obj/item/weapon/reagent_containers/food/snacks/burrito_cheese - name = "meat cheese burrito" + name = "carne queso burrito" desc = "Meat and melted cheese wrapped in a flour tortilla." icon = 'icons/obj/food_syn.dmi' icon_state = "burrito_cheese" @@ -5747,9 +5540,45 @@ . = ..() reagents.add_reagent("protein", 6) +/obj/item/weapon/reagent_containers/food/snacks/burrito_hell + name = "el diablo" + desc = "Meat and an insane amount of chillis packed in a flour tortilla. The Chaplain will see you now." + icon = 'icons/obj/food_syn.dmi' + icon_state = "burrito_hell" + bitesize = 4 + center_of_mass = list("x"=16, "y"=16) + nutriment_desc = list("hellfire" = 6) + nutriment_amt = 24// 10 Chilis is a lot. + +/obj/item/weapon/reagent_containers/food/snacks/meatburrito + name = "carne asada burrito" + desc = "Sliced meat and beans, it's another basic burrito!" + icon_state = "carneburrito" + nutriment_amt = 6 + nutriment_desc = list("tortilla" = 3, "meat" = 3) + +/obj/item/weapon/reagent_containers/food/snacks/meatburrito/Initialize() + . = ..() + reagents.add_reagent("protein", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/cheeseburrito + name = "Cheese burrito" + desc = "It's a burrito filled with beans and cheese." + icon_state = "cheeseburrito" + nutriment_amt = 6 + nutriment_desc = list("tortilla" = 3, "cheese" = 3) + +/obj/item/weapon/reagent_containers/food/snacks/cheeseburrito/Initialize() + . = ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("protein", 2) + bitesize = 2 + /obj/item/weapon/reagent_containers/food/snacks/burrito_cheese_spicy - name = "spicy cheese meat burrito" - desc = "Meat, melted cheese, and chilis wrapped in a flour tortilla." + name = "spicy cheese burrito" + desc = "Melted cheese, beans and chillis wrapped in a flour tortilla." + icon = 'icons/obj/food_syn.dmi' icon_state = "burrito_cheese_spicy" bitesize = 4 center_of_mass = list("x"=16, "y"=16) @@ -5760,18 +5589,21 @@ . = ..() reagents.add_reagent("protein", 6) -/obj/item/weapon/reagent_containers/food/snacks/burrito_hell - name = "el diablo" - desc = "Meat and an insane amount of chilis packed in a flour tortilla. The Chaplain will see you now." - icon = 'icons/obj/food_syn.dmi' - icon_state = "burrito_hell" - bitesize = 4 - center_of_mass = list("x"=16, "y"=16) - nutriment_desc = list("hellfire" = 6) - nutriment_amt = 24// 10 Chilis is a lot. +/obj/item/weapon/reagent_containers/food/snacks/fuegoburrito + name = "fuego phoron burrito" + desc = "A super spicy vegetarian burrito." + icon_state = "fuegoburrito" + nutriment_amt = 6 + nutriment_desc = list("chilli peppers" = 5, "tortilla" = 1) + +/obj/item/weapon/reagent_containers/food/snacks/fuegoburrito/Initialize() + . = ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("capsaicin", 4) + bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/breakfast_wrap - name = "breakfast wrap" + name = "breakfast burrito" desc = "Bacon, eggs, cheese, and tortilla grilled to perfection." icon = 'icons/obj/food_syn.dmi' icon_state = "breakfast_wrap" @@ -5783,7 +5615,7 @@ /obj/item/weapon/reagent_containers/food/snacks/burrito_hell/Initialize() . = ..() reagents.add_reagent("protein", 9) - reagents.add_reagent("condensedcapsaicin", 20) //what could possibly go wrong + reagents.add_reagent("condensedcapsaicin", 10) //what could possibly go wrong /obj/item/weapon/reagent_containers/food/snacks/burrito_mystery name = "mystery meat burrito" @@ -5809,7 +5641,7 @@ /obj/item/weapon/reagent_containers/food/snacks/red_sun_special name = "red sun special" - desc = "One lousy piece of sausage sitting on melted cheese curds. A cheap meal for the Unathi peasants of Moghes." + desc = "One lousy piece of sausage sitting on melted cheese curds. A popular utilitarian meal for the Unathi of Moghes." icon = 'icons/obj/food_syn.dmi' icon_state = "red_sun_special" trash = /obj/item/trash/plate @@ -5864,8 +5696,8 @@ reagents.add_reagent("egg", 2) /obj/item/weapon/reagent_containers/food/snacks/sliceable/grilled_carp - name = "korlaaskak" - desc = "A well-dressed carp, seared to perfection and adorned with herbs and spices. Can be sliced into proper serving sizes." + name = "Njarir Merana Grill" + desc = "A well-dressed fish, seared to perfection and adorned with herbs and spices in a traditional Nerahni Tajaran style. Can be sliced into proper serving sizes." icon = 'icons/obj/food_syn.dmi' icon_state = "grilled_carp" slice_path = /obj/item/weapon/reagent_containers/food/snacks/grilled_carp_slice @@ -6059,24 +5891,7 @@ name = "chicken noodle soup" gender = PLURAL desc = "A bright bowl of yellow broth with cuts of meat, noodles and carrots." - icon = 'icons/obj/food_custom.dmi' - icon_state = "chickennoodlesoup" - filling_color = "#ead90c" - nutriment_amt = 6 - nutriment_desc = list("warm soup" = 6) - center_of_mass = list("x"=16, "y"=5) - -/obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup/Initialize() - . = ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("water", 5) - bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup - name = "chicken noodle soup" - gender = PLURAL - desc = "A bright bowl of yellow broth with cuts of meat, noodles and carrots." - icon = 'icons/obj/food_custom.dmi' + icon = 'icons/obj/food_syn.dmi' icon_state = "chickennoodlesoup" filling_color = "#ead90c" nutriment_amt = 6 @@ -6140,16 +5955,31 @@ bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/meatbun - name = "meat bun" - desc = "A soft, fluffy flour bun also known as baozi. This one is filled with a spiced meat filling." + name = "meat and leaf bun" + desc = "A soft, fluffy flour bun also known as baozi. This one is filled with a meat and cabbage filling." + filling_color = "#DEDEAB" + icon = 'icons/obj/food_syn.dmi' + icon_state = "meatbun" + nutriment_amt = 5 + nutriment_desc = list("fried meat" = 5) + center_of_mass = list("x"=16, "y"=11) + +/obj/item/weapon/reagent_containers/food/snacks/meatbun/Initialize() + . = ..() + bitesize = 2 + reagents.add_reagent("protein", 4) + +/obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun + name = "char sui meat bun" + desc = "A soft, fluffy flour bun also known as baozi. This one is filled with a traditionally spiced meat filling." icon = 'icons/obj/food_syn.dmi' icon_state = "meatbun" filling_color = "#edd7d7" nutriment_amt = 5 - nutriment_desc = list("spice" = 5) + nutriment_desc = list("char sui" = 5) center_of_mass = list("x"=16, "y"=11) -/obj/item/weapon/reagent_containers/food/snacks/meatbun/Initialize() +/obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun/Initialize() . = ..() reagents.add_reagent("protein", 3) bitesize = 5 @@ -6287,7 +6117,7 @@ reagents.add_reagent("honey", 5) bitesize = 4 -// SLICEABLE FOODS - SYNNONO MEME FOOD EXPANSION - Credit to Synnono from Aurorastation (again) +//Sliceables /obj/item/weapon/reagent_containers/food/snacks/sliceable/keylimepie name = "key lime pie" @@ -6440,7 +6270,7 @@ nutriment_desc = list("tomato" = 4, "meat" = 2) /obj/item/weapon/reagent_containers/food/snacks/lasagna/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 2) //For meaty things. /obj/item/weapon/reagent_containers/food/snacks/gigapuddi diff --git a/code/modules/food/food/snacks_ch.dm b/code/modules/food/food/snacks_ch.dm index 96c0625057..5278cc2d8e 100644 --- a/code/modules/food/food/snacks_ch.dm +++ b/code/modules/food/food/snacks_ch.dm @@ -248,4 +248,22 @@ nutriment_amt = 1 //Todo - Change numbers. nutriment_desc = list("a precious sweetness that needs protecting" = 2) //This is a WIP flavour, Could keep it if you don't mind the "gotta protect the precious cinnamon roll" joke -//TODO: Maybe butterscotch candies? \ No newline at end of file +//TODO: Maybe butterscotch candies? + +//So what if like yknow, you buy a bread tube and wow you actually get to test the new and improved producct. +/obj/item/weapon/reagent_containers/food/snacks/tastybread/sequel + name = "bread tube 2" + desc = "Bread in a tube. Chewy...and surprisingly tasty. Now with twice the bread to tube!" + filling_color = "#75491c" + nutriment_amt = 12 + nutriment_desc = list("bread" = 4, "sweetness" = 6) + +/obj/item/weapon/reagent_containers/food/snacks/tastybread/New() + ..() + if(prob(1)) + new /obj/item/weapon/reagent_containers/food/snacks/tastybread/sequel(src) + qdel(src) //Dispose of the body, let no one find it. + +/obj/item/weapon/reagent_containers/food/snacks/tastybread/sequel/Initialize() + . = ..() + bitesize = 4 diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index f881d9e43c..d28ea98bef 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -1,21 +1,4 @@ //I guess we're not always eating PEOPLE. -/* -/obj/item/weapon/reagent_containers/food/snacks/my_new_food - name = "cheesemeaties" - desc = "The cheese adds a good flavor. Not great. Just good" - icon = 'icons/obj/food_vr.dmi' - icon_state = "cheesemeaties" - trash = /obj/item/trash/plate //What I leave behind when eaten (waffles instead of plate = bigsquareplate) - center_of_mass = list("x"=16, "y"=16) //If your thing is too huge and you don't want it in the center. - nutriment_amt = 5 - nutriment_desc = list("gargonzola" = 2, "burning" = 2) - -/obj/item/weapon/reagent_containers/food/snacks/my_new_food/Initialize() - ..() - reagents.add_reagent("protein", 2) //For meaty things. - bitesize = 3 //How many reagents to transfer per bite? -*/ - /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi name = "sushi roll" desc = "A whole sushi roll! Slice it up and enjoy with some soy sauce and wasabi." @@ -27,7 +10,7 @@ nutriment_amt = 15 /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 10) bitesize = 5 @@ -52,7 +35,7 @@ nutriment_desc = list("meat" = 2, "vegetables" = 2, "seasoning" = 5) /obj/item/weapon/reagent_containers/food/snacks/goulash/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 3) //For meaty things. reagents.add_reagent("water", 5) @@ -66,7 +49,7 @@ nutriment_desc = list("vegetables" = 2, "seasoned meat" = 5) /obj/item/weapon/reagent_containers/food/snacks/donerkebab/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 2) //For meaty things. @@ -80,7 +63,7 @@ nutriment_desc = list("cooked meat" = 5) /obj/item/weapon/reagent_containers/food/snacks/roastbeef/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 4) //For meaty things. bitesize = 2 @@ -94,7 +77,7 @@ nutriment_desc = list("chocolate" = 4, "colors" = 2) /obj/item/weapon/reagent_containers/food/snacks/reishicup/Initialize() - ..() + . = ..() reagents.add_reagent("psilocybin", 3) bitesize = 6 @@ -113,8 +96,7 @@ foldable = null /obj/item/weapon/storage/box/wings/Initialize() - ..() - for(var/i=1 to startswith) + . = ..() update_icon() return @@ -126,14 +108,14 @@ /obj/item/weapon/reagent_containers/food/snacks/chickenwing name = "chicken wing" - desc = "What flavor even is this? Buffalo? Barbeque? Or something more exotic?" + desc = "What flavor even is this? Buffalo? Barbecue? Or something more exotic?" icon = 'icons/obj/food_vr.dmi' icon_state = "wing" nutriment_amt = 2 nutriment_desc = list("chicken" = 2, "unplacable flavor sauce" = 4) /obj/item/weapon/reagent_containers/food/snacks/chickenwing/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 1) bitesize = 3 @@ -148,7 +130,7 @@ nutriment_desc = list("spicyness" = 4, "sourness" = 4, "tofu" = 1) /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup/Initialize() - ..() + . = ..() bitesize = 2 @@ -162,7 +144,7 @@ nutriment_desc = list("fried egg" = 2, "egg noodles" = 4) /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon/Initialize() - ..() + . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/generalschicken @@ -175,7 +157,7 @@ nutriment_desc = list("sweet and spicy sauce" = 5, "chicken" = 3) /obj/item/weapon/reagent_containers/food/snacks/generalschicken/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 4) bitesize = 2 @@ -187,7 +169,7 @@ center_of_mass = list("x"=16, "y"=10) /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 1) reagents.add_reagent("shockchem", 6) bitesize = 6 @@ -204,7 +186,7 @@ nutriment_desc = list("crunchy shell bits" = 5) /obj/item/weapon/reagent_containers/food/snacks/bugball/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 1) reagents.add_reagent("carbon", 5) bitesize = 7 @@ -219,7 +201,7 @@ nutriment_desc = list("sparkles" = 5, "ancient inca culture" =3) /obj/item/weapon/reagent_containers/food/snacks/pillbug/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 3) reagents.add_reagent("shockchem", 6) bitesize = 6 @@ -233,7 +215,7 @@ nutriment_desc = list("crunchy shell bits" = 5) /obj/item/weapon/reagent_containers/food/snacks/pillbug/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 1) reagents.add_reagent("carbon", 5) bitesize = 3 @@ -248,7 +230,7 @@ nutriment_desc = list("brothy sweet goodness" = 5) /obj/item/weapon/reagent_containers/food/snacks/mammi/Initialize() - ..() + . = ..() bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/makaroni @@ -261,7 +243,7 @@ nutriment_desc = list("Cheese" = 5, "eggs" = 3, "pasta" = 4, "sparkles" = 3) /obj/item/weapon/reagent_containers/food/snacks/makaroni/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 1) reagents.add_reagent("shockchem", 6) bitesize = 7 @@ -274,7 +256,7 @@ nutriment_amt = 5 /obj/item/weapon/reagent_containers/food/snacks/lobster/Initialize() - ..() + . = ..() bitesize = 0.1 /obj/item/weapon/reagent_containers/food/snacks/lobstercooked @@ -287,7 +269,7 @@ nutriment_desc = list("lemon" = 2, "lobster" = 5, "salad" = 2) /obj/item/weapon/reagent_containers/food/snacks/lobstercooked/Initialize() - ..() + . = ..() bitesize = 5 reagents.add_reagent("protein", 20) reagents.add_reagent("tricordrazine", 5) @@ -301,7 +283,7 @@ nutriment_amt = 5 /obj/item/weapon/reagent_containers/food/snacks/cuttlefish/Initialize() - ..() + . = ..() bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked @@ -313,7 +295,7 @@ nutriment_desc = list("cuttlefish" = 5, "rubber" = 5, "grease" = 1) /obj/item/weapon/reagent_containers/food/snacks/cuttlefishcooked/Initialize() - ..() + . = ..() bitesize = 5 reagents.add_reagent("protein", 10) @@ -329,7 +311,7 @@ trash = /obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains /obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfish/Initialize() - ..() + . = ..() bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/monkfishfillet @@ -340,7 +322,7 @@ nutriment_amt = 5 /obj/item/weapon/reagent_containers/food/snacks/monkfishfillet/Initialize() - ..() + . = ..() bitesize = 3 reagents.add_reagent("protein", 1) @@ -354,7 +336,7 @@ trash = /obj/item/trash/fancyplate /obj/item/weapon/reagent_containers/food/snacks/monkfishcooked/Initialize() - ..() + . = ..() bitesize = 4 reagents.add_reagent("protein", 5) @@ -369,7 +351,7 @@ slices_num = 1 /obj/item/weapon/reagent_containers/food/snacks/sliceable/monkfishremains/Initialize() - ..() + . = ..() bitesize = 0.01 //impossible to eat reagents.add_reagent("carbon", 5) @@ -384,7 +366,7 @@ slices_num = 5 /obj/item/weapon/reagent_containers/food/snacks/sliceable/sharkchunk/Initialize() - ..() + . = ..() bitesize = 3 reagents.add_reagent("protein", 20) @@ -397,7 +379,7 @@ toxin_amount = null /obj/item/weapon/reagent_containers/food/snacks/sharkmeat/Initialize() - ..() + . = ..() bitesize = 3 reagents.add_reagent("protein", 2) @@ -411,7 +393,7 @@ nutriment_desc = list("manliness" = 1, "fish oil" = 2, "shark" = 2) /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcooked/Initialize() - ..() + . = ..() bitesize = 3 reagents.add_reagent("protein", 8) @@ -425,7 +407,7 @@ nutriment_desc = list("salt" = 1, "fish oil" = 2, "spicy shark" = 2) /obj/item/weapon/reagent_containers/food/snacks/sharkmeatdip/Initialize() - ..() + . = ..() bitesize = 3 reagents.add_reagent("capsaicin", 4) reagents.add_reagent("protein", 4) @@ -440,7 +422,7 @@ nutriment_desc = list("viking spirit" = 1, "rot" = 2, "fermented sauce" = 2) /obj/item/weapon/reagent_containers/food/snacks/sharkmeatcubes/Initialize() - ..() + . = ..() bitesize = 10 reagents.add_reagent("potatojuice", 30) // for people who want to get fat, FAST. @@ -476,188 +458,6 @@ name = "wolpin cube" monkey_type = "Wolpin" -/* -/obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen - name = "frozen margherita pizza" - desc = "It's frozen rock solid, better thaw it in a microwave." - icon = 'icons/obj/food_vr.dmi' - icon_state = "margharita_pizza_frozen" - center_of_mass = list("x"=16, "y"=11) - nutriment_amt = 15 - nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen cheese" = 5, "frozen tomato" = 5) - -/obj/item/weapon/reagent_containers/food/snacks/pizza/margfrozen/Initialize() - ..() - bitesize = 20 - //reagents.add_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margcargo - name = "Margherita" - desc = "The golden standard of pizzas, it looks drowned in tomato sauce." - icon = 'icons/obj/food_vr.dmi' - icon_state = "margharita_pizza_cargo" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/slice/margcargo - slices_num = 6 - center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 15, "cheese" = 5) - nutriment_amt = 10 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margcargo/Initialize() - ..() - reagents.add_reagent("protein", 2) - reagents.add_reagent("tomatojuice", 10) - bitesize = 2 - //reagents.remove_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/slice/margcargo - name = "Margherita slice" - desc = "A slice of the classic pizza, it's hard not to spill any tomato juice on yourself." - icon = 'icons/obj/food_vr.dmi' - icon_state = "margharita_pizza_slice_cargo" - filling_color = "#BAA14C" - bitesize = 2 - center_of_mass = list("x"=16, "y"=13) - whole_path = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margcargo - -/obj/item/weapon/reagent_containers/food/snacks/slice/margcargo/filled - filled = TRUE - -/obj/item/weapon/reagent_containers/food/snacks/pizza/meatfrozen - name = "frozen meat pizza" - desc = "It's frozen rock solid, better thaw it in a microwave." - icon = 'icons/obj/food_vr.dmi' - icon_state = "meat_pizza_frozen" - center_of_mass = list("x"=16, "y"=11) - nutriment_amt = 15 - nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen meat" = 5, "frozen cow screams" = 5) - -/obj/item/weapon/reagent_containers/food/snacks/pizza/meatfrozen/Initialize() - ..() - bitesize = 20 - //reagents.add_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo - name = "Meatpizza" - desc = "A pizza with meat topping, some of it suspiciously pink." - icon = 'icons/obj/food_vr.dmi' - icon_state = "meat_pizza_cargo" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/slice/meatcargo - slices_num = 6 - center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("meat" = 10, "beef" = 10, "squeaky pork" = 15, "longpig" = 5) - nutriment_amt = 10 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo/Initialize() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("tomatojuice", 6) - bitesize = 2 - //reagents.remove_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/slice/meatcargo - name = "Meatpizza slice" - desc = "A slice of a meaty pizza, there are some bits of supiciously pink meat." - icon = 'icons/obj/food_vr.dmi' - icon_state = "meat_pizza_slice_cargo" - filling_color = "#BAA14C" - bitesize = 2 - center_of_mass = list("x"=16, "y"=13) - whole_path = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo - -/obj/item/weapon/reagent_containers/food/snacks/slice/meatcargo/filled - filled = TRUE - -/obj/item/weapon/reagent_containers/food/snacks/pizza/mushfrozen - name = "frozen mushroom pizza" - desc = "It's frozen rock solid, better thaw it in a microwave." - icon = 'icons/obj/food_vr.dmi' - icon_state = "mushroom_pizza_frozen" - center_of_mass = list("x"=16, "y"=11) - nutriment_amt = 15 - nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen mushrooms" = 5, "frozen cream" = 5) - -/obj/item/weapon/reagent_containers/food/snacks/pizza/mushfrozen/Initialize() - ..() - bitesize = 20 - //reagents.add_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushcargo - name = "Mushroompizza" - desc = "Very special pizza, it looks to be drowned in cream." - icon = 'icons/obj/food_vr.dmi' - icon_state = "mushroom_pizza_cargo" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/slice/mushcargo - slices_num = 6 - center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "cheese" = 5, "creamy sauce" = 5, "mushroom" = 5) - nutriment_amt = 10 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushcargo/Initialize() - ..() - reagents.add_reagent("protein", 4) - bitesize = 2 - //reagents.remove_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/slice/mushcargo - name = "Mushroompizza slice" - desc = "Very special pizza slice, it looks to be drowned in cream." - icon = 'icons/obj/food_vr.dmi' - icon_state = "mushroom_pizza_slice_cargo" - filling_color = "#BAA14C" - bitesize = 2 - center_of_mass = list("x"=16, "y"=13) - whole_path = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushcargo - -/obj/item/weapon/reagent_containers/food/snacks/slice/mushcargp/filled - filled = TRUE - -/obj/item/weapon/reagent_containers/food/snacks/pizza/vegfrozen - name = "frozen vegtable pizza" - desc = "It's frozen rock solid, better thaw it in a microwave." - icon = 'icons/obj/food_vr.dmi' - icon_state = "vegetable_pizza_frozen" - center_of_mass = list("x"=16, "y"=11) - nutriment_amt = 15 - nutriment_desc = list("ice" = 5, "toothache" = 1, "frozen vegtable chunks" = 5) - -/obj/item/weapon/reagent_containers/food/snacks/pizza/vegfrozen/Initialize() - ..() - bitesize = 20 - //reagents.add_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegcargo - name = "Vegetablepizza" - desc = "At least 10 of Tomato Sapiens were harmed during making this pizza." - icon = 'icons/obj/food_vr.dmi' - icon_state = "vegetable_pizza_cargo" - slice_path = /obj/item/weapon/reagent_containers/food/snacks/slice/vegcargo - slices_num = 6 - center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 20, "cheese" = 5, "eggplant" = 5, "carrot" = 5, "corn" = 5) - nutriment_amt = 5 - -/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegcargo/Initialize() - ..() - reagents.add_reagent("protein", 4) - reagents.add_reagent("tomatojuice", 15) - reagents.add_reagent("imidazoline", 10) - bitesize = 2 - //reagents.remove_reagent("frostoil",3) - -/obj/item/weapon/reagent_containers/food/snacks/slice/vegcargo - name = "Vegtablepizza slice" - desc = "At least 10 of Tomato Sapiens were harmed during making this pizza." - icon = 'icons/obj/food_vr.dmi' - icon_state = "vegetable_pizza_slice_cargo" - filling_color = "#BAA14C" - bitesize = 2 - center_of_mass = list("x"=16, "y"=13) - whole_path = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegcargo - -/obj/item/weapon/reagent_containers/food/snacks/slice/vegcargo/filled - filled = TRUE -*/ - // food cubes /obj/item/weapon/reagent_containers/food/snacks/cube name = "protein cube" @@ -700,7 +500,7 @@ nutriment_desc = list("bitter chyme" = 50) /obj/item/weapon/reagent_containers/food/snacks/proteinslab/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 30) /obj/item/weapon/reagent_containers/food/snacks/cube/nutriment @@ -759,3 +559,45 @@ /obj/item/weapon/reagent_containers/food/snacks/bun/Initialize() . = ..() + +//Readded Polaris Foods +/obj/item/weapon/reagent_containers/food/snacks/nachos + name = "nachos" + desc = "Chips from Old Mexico." + icon_state = "nachos" + nutriment_amt = 2 + nutriment_desc = list("salt" = 1) + +/obj/item/weapon/reagent_containers/food/snacks/nachos/Initialize() + . = ..() + reagents.add_reagent("nutriment", 1) + bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/cheesenachos + name = "cheesy nachos" + desc = "The delicious combination of nachos and melting cheese." + icon_state = "cheesenachos" + nutriment_amt = 5 + nutriment_desc = list("salt" = 2, "cheese" = 3) + +/obj/item/weapon/reagent_containers/food/snacks/cheesenachos/Initialize() + . = ..() + reagents.add_reagent("nutriment", 5) + reagents.add_reagent("protein", 2) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/onionsoup + name = "Onion Soup" + desc = "A soup with layers." + icon_state = "onionsoup" + trash = /obj/item/trash/snack_bowl + filling_color = "#E0C367" + center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 5 + nutriment_desc = list("onion" = 2, "soup" = 2) + +/obj/item/weapon/reagent_containers/food/snacks/onionsoup/Initialize() + . = ..() + bitesize = 3 + + diff --git a/code/modules/food/food/thecake.dm b/code/modules/food/food/thecake.dm index 05f5ef6440..491e6dca9c 100644 --- a/code/modules/food/food/thecake.dm +++ b/code/modules/food/food/thecake.dm @@ -183,7 +183,7 @@ volume = 80 /obj/item/weapon/reagent_containers/food/snacks/chaoscakeslice/Initialize() - ..() + . = ..() var/i = rand(1,6) icon_state = "chaoscake_slice-[i]" switch(i) diff --git a/code/modules/food/kitchen/cooking_machines/oven.dm b/code/modules/food/kitchen/cooking_machines/oven.dm index ddb8372252..d58df7e6f6 100644 --- a/code/modules/food/kitchen/cooking_machines/oven.dm +++ b/code/modules/food/kitchen/cooking_machines/oven.dm @@ -1,156 +1,155 @@ -/obj/machinery/appliance/cooker/oven - name = "oven" - desc = "Cookies are ready, dear." - icon = 'icons/obj/cooking_machines.dmi' - icon_state = "ovenopen" - cook_type = "baked" - appliancetype = OVEN - food_color = "#A34719" - can_burn_food = TRUE - var/datum/looping_sound/oven/oven_loop - circuit = /obj/item/weapon/circuitboard/oven - cooked_sound = 'sound/machines/ding.ogg' - active_power_usage = 6 KILOWATTS - heating_power = 6 KILOWATTS - //Based on a double deck electric convection oven - - resistance = 12 KILOWATTS // Approx. 12 minutes to heat up. - idle_power_usage = 2 KILOWATTS - //uses ~30% power to stay warm - optimal_power = 0.8 // Oven cooks .2 faster than the default speed. - - light_x = 3 - light_y = 4 - max_contents = 5 - container_type = /obj/item/weapon/reagent_containers/cooking_container/oven - - stat = POWEROFF //Starts turned off - - var/open = FALSE // Start closed just so people don't try to preheat with it open, lol. - - output_options = list( - "Pizza" = /obj/item/weapon/reagent_containers/food/snacks/variable/pizza, - "Bread" = /obj/item/weapon/reagent_containers/food/snacks/variable/bread, - "Pie" = /obj/item/weapon/reagent_containers/food/snacks/variable/pie, - "Cake" = /obj/item/weapon/reagent_containers/food/snacks/variable/cake, - "Hot Pocket" = /obj/item/weapon/reagent_containers/food/snacks/variable/pocket, - "Kebab" = /obj/item/weapon/reagent_containers/food/snacks/variable/kebab, - "Waffles" = /obj/item/weapon/reagent_containers/food/snacks/variable/waffles, - "Cookie" = /obj/item/weapon/reagent_containers/food/snacks/variable/cookie, - "Donut" = /obj/item/weapon/reagent_containers/food/snacks/variable/donut, - ) - -/obj/machinery/appliance/cooker/oven/Initialize() - . = ..() - - oven_loop = new(list(src), FALSE) - -/obj/machinery/appliance/cooker/oven/Destroy() - QDEL_NULL(oven_loop) - return ..() - -/obj/machinery/appliance/cooker/oven/update_icon() - if(!open) - if(!stat) - icon_state = "ovenclosed_on" - if(cooking == TRUE) - icon_state = "ovenclosed_cooking" - if(oven_loop) - oven_loop.start(src) - else - icon_state = "ovenclosed_on" - if(oven_loop) - oven_loop.stop(src) - else - icon_state = "ovenclosed_off" - if(oven_loop) - oven_loop.stop(src) - else - icon_state = "ovenopen" - if(oven_loop) - oven_loop.stop(src) - ..() - -/obj/machinery/appliance/cooker/oven/AltClick(var/mob/user) - try_toggle_door(user) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - -/obj/machinery/appliance/cooker/oven/verb/toggle_door() - set src in oview(1) - set category = "Object" - set name = "Open/close oven door" - - try_toggle_door(usr) - -/obj/machinery/appliance/cooker/oven/proc/try_toggle_door(mob/user) - if(!isliving(usr) || isAI(user)) - return - - if(!usr.IsAdvancedToolUser()) - to_chat(user, "You lack the dexterity to do that.") - return - - if(!Adjacent(usr)) - to_chat(user, "You can't reach the [src] from there, get closer!") - return - - if(open) - open = FALSE - loss = (heating_power / resistance) * 0.5 - cooking = TRUE - else - open = TRUE - loss = (heating_power / resistance) * 2 // Halve oven heat loss. - //When the oven door is opened, heat is lost MUCH faster and you stop cooking (because the door is open) - cooking = FALSE - - playsound(src, 'sound/machines/hatch_open.ogg', 20, 1) - to_chat(user, "You [open ? "open" : "close"] the oven door.") - update_icon() - -/obj/machinery/appliance/cooker/oven/proc/manip(var/obj/item/I) - // check if someone's trying to manipulate the machine - - if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer)) - return TRUE - else - return FALSE - -/obj/machinery/appliance/cooker/oven/can_insert(var/obj/item/I, var/mob/user) - if(!open && !manip(I)) - to_chat(user, "You can't put anything in while the door is closed!") - return 0 - - else - return ..() - - -//If an oven's door is open it will lose heat every proc, even if it also gained it -//But dont call equalize twice in one stack. A return value of -1 from the parent indicates equalize was already called -/obj/machinery/appliance/cooker/oven/heat_up() - .=..() - if(open && . != -1) - var/turf/T = get_turf(src) - if(temperature > T.temperature) - equalize_temperature() - -/obj/machinery/appliance/cooker/oven/can_remove_items(var/mob/user, show_warning = TRUE) - if(!open) - if(show_warning) - to_chat(user, "You can't take anything out while the door is closed!") - return 0 - - else - return ..() - - -//Oven has lots of recipes and combine options. The chance for interference is high, so -//If a combine target is set the oven will do it instead of checking recipes -/obj/machinery/appliance/cooker/oven/finish_cooking(var/datum/cooking_item/CI) - if(CI.combine_target) - CI.result_type = 3//Combination type. We're making something out of our ingredients - visible_message("\The [src] pings!") - combination_cook(CI) - return - else - ..() \ No newline at end of file +/obj/machinery/appliance/cooker/oven + name = "oven" + desc = "Cookies are ready, dear." + icon = 'icons/obj/cooking_machines.dmi' + icon_state = "ovenopen" + cook_type = "baked" + appliancetype = OVEN + food_color = "#A34719" + can_burn_food = TRUE + var/datum/looping_sound/oven/oven_loop + circuit = /obj/item/weapon/circuitboard/oven + active_power_usage = 6 KILOWATTS + heating_power = 6 KILOWATTS + //Based on a double deck electric convection oven + + resistance = 12 KILOWATTS // Approx. 12 minutes to heat up. + idle_power_usage = 2 KILOWATTS + //uses ~30% power to stay warm + optimal_power = 0.8 // Oven cooks .2 faster than the default speed. + + light_x = 3 + light_y = 4 + max_contents = 5 + container_type = /obj/item/weapon/reagent_containers/cooking_container/oven + + stat = POWEROFF //Starts turned off + + var/open = FALSE // Start closed just so people don't try to preheat with it open, lol. + + output_options = list( + "Pizza" = /obj/item/weapon/reagent_containers/food/snacks/variable/pizza, + "Bread" = /obj/item/weapon/reagent_containers/food/snacks/variable/bread, + "Pie" = /obj/item/weapon/reagent_containers/food/snacks/variable/pie, + "Cake" = /obj/item/weapon/reagent_containers/food/snacks/variable/cake, + "Hot Pocket" = /obj/item/weapon/reagent_containers/food/snacks/variable/pocket, + "Kebab" = /obj/item/weapon/reagent_containers/food/snacks/variable/kebab, + "Waffles" = /obj/item/weapon/reagent_containers/food/snacks/variable/waffles, + "Cookie" = /obj/item/weapon/reagent_containers/food/snacks/variable/cookie, + "Donut" = /obj/item/weapon/reagent_containers/food/snacks/variable/donut, + ) + +/obj/machinery/appliance/cooker/oven/Initialize() + . = ..() + + oven_loop = new(list(src), FALSE) + +/obj/machinery/appliance/cooker/oven/Destroy() + QDEL_NULL(oven_loop) + return ..() + +/obj/machinery/appliance/cooker/oven/update_icon() + if(!open) + if(!stat) + icon_state = "ovenclosed_on" + if(cooking == TRUE) + icon_state = "ovenclosed_cooking" + if(oven_loop) + oven_loop.start(src) + else + icon_state = "ovenclosed_on" + if(oven_loop) + oven_loop.stop(src) + else + icon_state = "ovenclosed_off" + if(oven_loop) + oven_loop.stop(src) + else + icon_state = "ovenopen" + if(oven_loop) + oven_loop.stop(src) + ..() + +/obj/machinery/appliance/cooker/oven/AltClick(var/mob/user) + try_toggle_door(user) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + +/obj/machinery/appliance/cooker/oven/verb/toggle_door() + set src in oview(1) + set category = "Object" + set name = "Open/close oven door" + + try_toggle_door(usr) + +/obj/machinery/appliance/cooker/oven/proc/try_toggle_door(mob/user) + if(!isliving(usr) || isAI(user)) + return + + if(!usr.IsAdvancedToolUser()) + to_chat(user, "You lack the dexterity to do that.") + return + + if(!Adjacent(usr)) + to_chat(user, "You can't reach the [src] from there, get closer!") + return + + if(open) + open = FALSE + loss = (heating_power / resistance) * 0.5 + cooking = TRUE + else + open = TRUE + loss = (heating_power / resistance) * 4 + //When the oven door is opened, heat is lost MUCH faster and you stop cooking (because the door is open) + cooking = FALSE + + playsound(src, 'sound/machines/hatch_open.ogg', 20, 1) + to_chat(user, "You [open? "open":"close"] the oven door") + update_icon() + +/obj/machinery/appliance/cooker/oven/proc/manip(var/obj/item/I) + // check if someone's trying to manipulate the machine + + if(I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/weapon/storage/part_replacer)) + return TRUE + else + return FALSE + +/obj/machinery/appliance/cooker/oven/can_insert(var/obj/item/I, var/mob/user) + if(!open && !manip(I)) + to_chat(user, "You can't put anything in while the door is closed!") + return 0 + + else + return ..() + + +//If an oven's door is open it will lose heat every proc, even if it also gained it +//But dont call equalize twice in one stack. A return value of -1 from the parent indicates equalize was already called +/obj/machinery/appliance/cooker/oven/heat_up() + .=..() + if(open && . != -1) + var/turf/T = get_turf(src) + if(temperature > T.temperature) + equalize_temperature() + +/obj/machinery/appliance/cooker/oven/can_remove_items(var/mob/user, show_warning = TRUE) + if(!open) + if(show_warning) + to_chat(user, "You can't take anything out while the door is closed!") + return 0 + + else + return ..() + + +//Oven has lots of recipes and combine options. The chance for interference is high, so +//If a combine target is set the oven will do it instead of checking recipes +/obj/machinery/appliance/cooker/oven/finish_cooking(var/datum/cooking_item/CI) + if(CI.combine_target) + CI.result_type = 3//Combination type. We're making something out of our ingredients + visible_message("\The [src] pings!") + combination_cook(CI) + return + else + ..() diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index 5a499ae846..6b866d23ba 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -586,7 +586,7 @@ item_level = 1 /obj/machinery/microwave/advanced/Initialize() - ..() + . = ..() reagents.maximum_volume = 1000 /datum/recipe/splat // We use this to handle cooking micros (or mice, etc) in a microwave. Janky but it works better than snowflake code to handle the same thing. diff --git a/code/modules/food/recipes_fryer.dm b/code/modules/food/recipes_fryer.dm index 1d739ec69d..ba6884b10b 100644 --- a/code/modules/food/recipes_fryer.dm +++ b/code/modules/food/recipes_fryer.dm @@ -29,10 +29,17 @@ /datum/recipe/bellefritter appliance = FRYER - reagents = list("sugar" = 5, "batter" = 10) + coating = /datum/reagent/nutriment/coating/batter + reagents = list("sugar" = 5) items = list(/obj/item/weapon/reagent_containers/food/snacks/frostbelle) result = /obj/item/weapon/reagent_containers/food/snacks/bellefritter +/datum/recipe/onionrings + appliance = FRYER + coating = /datum/reagent/nutriment/coating/batter + fruit = list("onion" = 1) + result = /obj/item/weapon/reagent_containers/food/snacks/onionrings + //Meaty Recipes //==================== /datum/recipe/cubancarp @@ -86,6 +93,31 @@ reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/weapon/reagent_containers/food/snacks/friedmushroom +/datum/recipe/fishfingers + items = list( + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + ) + coating = /datum/reagent/nutriment/coating/batter + result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers + reagent_mix = RECIPE_REAGENT_REPLACE + +/datum/recipe/corn_dog + appliance = FRYER + items = list( + /obj/item/weapon/reagent_containers/food/snacks/sausage + ) + fruit = list("corn" = 1) + coating = /datum/reagent/nutriment/coating/batter + result = /obj/item/weapon/reagent_containers/food/snacks/corn_dog + +/datum/recipe/sweet_and_sour + appliance = FRYER + items = list( + /obj/item/weapon/reagent_containers/food/snacks/bacon, + /obj/item/weapon/reagent_containers/food/snacks/cutlet + ) + reagents = list("soysauce" = 5, "batter" = 10) + result = /obj/item/weapon/reagent_containers/food/snacks/sweet_and_sour //Sweet Recipes. //================== @@ -145,24 +177,7 @@ result = /obj/item/weapon/reagent_containers/food/snacks/pisanggoreng coating = /datum/reagent/nutriment/coating/batter -/datum/recipe/corn_dog - appliance = FRYER - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sausage - ) - fruit = list("corn" = 1) - coating = /datum/reagent/nutriment/coating/batter - result = /obj/item/weapon/reagent_containers/food/snacks/corn_dog - -/datum/recipe/sweet_and_sour - appliance = FRYER - items = list( - /obj/item/weapon/reagent_containers/food/snacks/bacon, - /obj/item/weapon/reagent_containers/food/snacks/cutlet - ) - reagents = list("soysauce" = 5, "batter" = 10) - result = /obj/item/weapon/reagent_containers/food/snacks/sweet_and_sour - +//VOREStation Add Start /datum/recipe/generalschicken appliance = FRYER reagents = list("capsaicin" = 2, "sugar" = 2, "batter" = 10) @@ -182,3 +197,4 @@ /obj/item/weapon/reagent_containers/food/snacks/meat ) result = /obj/item/weapon/storage/box/wings //This is kinda like the donut box. +//VOREStation Add End diff --git a/code/modules/food/recipes_fryer_vr.dm b/code/modules/food/recipes_fryer_vr.dm new file mode 100644 index 0000000000..a9a4bb3e71 --- /dev/null +++ b/code/modules/food/recipes_fryer_vr.dm @@ -0,0 +1,19 @@ +/datum/recipe/generalschicken + appliance = FRYER + reagents = list("capsaicin" = 2, "sugar" = 2, "batter" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/generalschicken + +/datum/recipe/chickenwings + appliance = FRYER + reagents = list("capsaicin" = 5, "batter" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat + ) + result = /obj/item/weapon/storage/box/wings //This is kinda like the donut box. diff --git a/code/modules/food/recipes_grill.dm b/code/modules/food/recipes_grill.dm index 1198660ee7..e51aca24cc 100644 --- a/code/modules/food/recipes_grill.dm +++ b/code/modules/food/recipes_grill.dm @@ -13,7 +13,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat //do not place this recipe before /datum/recipe/humanburger ) result = /obj/item/weapon/reagent_containers/food/snacks/monkeyburger - + /datum/recipe/syntiburger appliance = GRILL items = list( @@ -85,7 +85,7 @@ /obj/item/clothing/head/beret ) result = /obj/item/weapon/reagent_containers/food/snacks/mimeburger - + /datum/recipe/mouseburger appliance = GRILL items = list( @@ -93,7 +93,7 @@ /obj/item/weapon/holder/mouse ) result = /obj/item/weapon/reagent_containers/food/snacks/mouseburger - + /datum/recipe/bunbun appliance = GRILL items = list( @@ -109,7 +109,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sausage ) result = /obj/item/weapon/reagent_containers/food/snacks/hotdog - + /datum/recipe/humankabob appliance = GRILL items = list( @@ -127,7 +127,7 @@ /obj/item/weapon/reagent_containers/food/snacks/meat, ) result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob - + /datum/recipe/monkeykabob appliance = GRILL items = list( @@ -154,7 +154,7 @@ /obj/item/weapon/reagent_containers/food/snacks/tofu, ) result = /obj/item/weapon/reagent_containers/food/snacks/tofukabob - + /datum/recipe/fakespellburger appliance = GRILL items = list( @@ -182,7 +182,7 @@ reagents = list("egg" = 3) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger - + /datum/recipe/superbiteburger appliance = GRILL fruit = list("tomato" = 1) @@ -195,7 +195,7 @@ /obj/item/weapon/reagent_containers/food/snacks/boiledegg, ) result = /obj/item/weapon/reagent_containers/food/snacks/superbiteburger - + /datum/recipe/slimeburger appliance = GRILL reagents = list("slimejelly" = 5) @@ -211,7 +211,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun ) result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry - + /datum/recipe/bearburger appliance = GRILL items = list( @@ -229,7 +229,17 @@ /obj/item/weapon/reagent_containers/food/snacks/bacon ) result = /obj/item/weapon/reagent_containers/food/snacks/burger/bacon - + +/datum/recipe/omelette + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + ) + reagents = list("egg" = 6) + reagent_mix = RECIPE_REAGENT_REPLACE + result = /obj/item/weapon/reagent_containers/food/snacks/omelette + /datum/recipe/omurice appliance = GRILL reagents = list("rice" = 5, "ketchup" = 5, "egg" = 3) @@ -244,3 +254,75 @@ appliance = GRILL reagents = list("rice" = 5, "ketchup" = 5, "sodiumchloride" = 5, "egg" = 3) result = /obj/item/weapon/reagent_containers/food/snacks/omurice/face + +/datum/recipe/meatsteak + appliance = GRILL + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list(/obj/item/weapon/reagent_containers/food/snacks/meat) + result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak + +/datum/recipe/honeytoast + appliance = GRILL + reagents = list("honey" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/slice/bread + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/weapon/reagent_containers/food/snacks/honeytoast + +/datum/recipe/grilled_carp + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat + ) + reagents = list("spacespice" = 1) + fruit = list("cabbage" = 1, "lime" = 1) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/grilled_carp + +/datum/recipe/grilledcheese + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/slice/bread, + /obj/item/weapon/reagent_containers/food/snacks/slice/bread, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/grilledcheese + +/datum/recipe/toastedsandwich + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/sandwich + ) + result = /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich + +/datum/recipe/cheese_cracker + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/spreads/butter, + /obj/item/weapon/reagent_containers/food/snacks/slice/bread, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge + ) + reagents = list("spacespice" = 1) + result = /obj/item/weapon/reagent_containers/food/snacks/cheese_cracker + result_quantity = 4 + +/datum/recipe/bacongrill + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/spreads, + /obj/item/weapon/reagent_containers/food/snacks/rawbacon + ) + result = /obj/item/weapon/reagent_containers/food/snacks/bacon + +/datum/recipe/chickenfillet //Also just combinable, like burgers and hot dogs. + appliance = GRILL + items = list( + /obj/item/weapon/reagent_containers/food/snacks/chickenkatsu, + /obj/item/weapon/reagent_containers/food/snacks/bun + ) + result = /obj/item/weapon/reagent_containers/food/snacks/chickenfillet diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 216eb0303c..6780a72fe4 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -43,14 +43,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/devilledegg -/datum/recipe/waffles - reagents = list("sugar" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/waffles - /datum/recipe/donkpocket items = list( /obj/item/weapon/reagent_containers/food/snacks/dough, @@ -72,15 +64,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL -/datum/recipe/omelette - items = list( - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - ) - reagents = list("egg" = 6) - reagent_mix = RECIPE_REAGENT_REPLACE - result = /obj/item/weapon/reagent_containers/food/snacks/omelette - /datum/recipe/muffin reagents = list("milk" = 5, "sugar" = 5) reagent_mix = RECIPE_REAGENT_REPLACE @@ -145,10 +128,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/microchips -/datum/recipe/mashedpotato - fruit = list("potato" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/mashedpotato - /datum/recipe/bangersandmash items = list( /obj/item/weapon/reagent_containers/food/snacks/mashedpotato, @@ -182,25 +161,11 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie -/datum/recipe/meatsteak - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list(/obj/item/weapon/reagent_containers/food/snacks/meat) - result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak - /datum/recipe/syntisteak reagents = list("sodiumchloride" = 1, "blackpepper" = 1) items = list(/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh) result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak -/datum/recipe/pizzahawaiian - fruit = list("tomato" = 1, "pineapple" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/weapon/reagent_containers/food/snacks/cutlet, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/pineapple - /datum/recipe/spacylibertyduff reagents = list("water" = 5, "vodka" = 5, "psilocybin" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff @@ -260,12 +225,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/sandwich -/datum/recipe/toastedsandwich - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sandwich - ) - result = /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich - /datum/recipe/peanutbutterjellysandwich reagents = list("cherryjelly" = 5, "peanutbutter" = 5) items = list( @@ -274,13 +233,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/peanutbutter -/datum/recipe/grilledcheese - items = list( - /obj/item/weapon/reagent_containers/food/snacks/slice/bread, - /obj/item/weapon/reagent_containers/food/snacks/slice/bread, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/grilledcheese /datum/recipe/tomatosoup fruit = list("tomato" = 2) @@ -379,11 +331,6 @@ I said no! reagents = list("water" = 5, "sugar" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/candiedapple -/datum/recipe/applepie - fruit = list("apple" = 1) - items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) - result = /obj/item/weapon/reagent_containers/food/snacks/applepie - /datum/recipe/twobread reagents = list("wine" = 5) items = list( @@ -439,30 +386,6 @@ I said no! result = /obj/item/weapon/reagent_containers/food/snacks/sausage result_quantity = 2 -/datum/recipe/fishfingers - reagents = list("flour" = 10, "egg" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers - reagent_mix = RECIPE_REAGENT_REPLACE - -/datum/recipe/zestfish - fruit = list("lemon" = 1) - reagents = list("sodiumchloride" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/carpmeat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/zestfish - -/datum/recipe/limezestfish - fruit = list("lime" = 1) - reagents = list("sodiumchloride" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/carpmeat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/zestfish - /datum/recipe/kudzudonburi fruit = list("kudzu" = 1) reagents = list("rice" = 10) @@ -494,11 +417,7 @@ I said no! /datum/recipe/chawanmushi fruit = list("mushroom" = 1) - reagents = list("water" = 5, "soysauce" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/egg - ) + reagents = list("water" = 5, "soysauce" = 5, "egg" = 6) result = /obj/item/weapon/reagent_containers/food/snacks/chawanmushi /datum/recipe/beetsoup @@ -545,17 +464,9 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/stuffing -/datum/recipe/tofurkey - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tofu, - /obj/item/weapon/reagent_containers/food/snacks/tofu, - /obj/item/weapon/reagent_containers/food/snacks/stuffing, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/tofurkey - /datum/recipe/mashedpotato items = list( - /obj/item/weapon/reagent_containers/food/snacks/spreads/butter // to prevent conflicts with yellow curry + /obj/item/weapon/reagent_containers/food/snacks/spreads ) fruit = list("potato" = 1) result = /obj/item/weapon/reagent_containers/food/snacks/mashedpotato @@ -574,27 +485,11 @@ I said no! ) result = /obj/item/weapon/ruinedvirusdish -/datum/recipe/onionrings - fruit = list("onion" = 1) - reagents = list("flour" = 5) - result = /obj/item/weapon/reagent_containers/food/snacks/onionrings /datum/recipe/onionsoup fruit = list("onion" = 1) reagents = list("water" = 10) - result = /obj/item/weapon/reagent_containers/food/snacks/onionsoup - -////////////////////////////////////////// -// bs12 food port stuff -////////////////////////////////////////// - -/datum/recipe/taco - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice, - /obj/item/weapon/reagent_containers/food/snacks/cutlet, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/weapon/reagent_containers/food/snacks/taco + result = /obj/item/weapon/reagent_containers/food/snacks/soup/onion /datum/recipe/microwavebun items = list( @@ -643,18 +538,6 @@ I said no! reagents = list("sugar" = 5, "frostoil" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/mint -//////////////////////// -// TGstation food ports -//////////////////////// - -/datum/recipe/meatbun - fruit = list("cabbage" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meatball, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/meatbun - /datum/recipe/sashimi reagents = list("soysauce" = 5) items = list( @@ -739,53 +622,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/porkbowl -/datum/recipe/microwavetortilla - reagents = list("flour" = 5, "water" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/tortilla - -/datum/recipe/meatburrito - fruit = list("soybeans" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tortilla, - /obj/item/weapon/reagent_containers/food/snacks/cutlet, - /obj/item/weapon/reagent_containers/food/snacks/cutlet - ) - result = /obj/item/weapon/reagent_containers/food/snacks/meatburrito - -/datum/recipe/cheeseburrito - fruit = list("soybeans" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tortilla, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito - -/datum/recipe/fuegoburrito - fruit = list("soybeans" = 1, "chili" = 2) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tortilla - ) - result = /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito - -/datum/recipe/nachos - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tortilla - ) - result = /obj/item/weapon/reagent_containers/food/snacks/nachos - -/datum/recipe/cheesenachos - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tortilla, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cheesenachos - /datum/recipe/cubannachos fruit = list("chili" = 1) reagents = list("ketchup" = 5) @@ -861,15 +697,10 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/bageltwo -///////////////////////////////////////////////////////////// -//Synnono Meme Foods -// -//Most recipes replace reagents with RECIPE_REAGENT_REPLACE -//to simplify the end product and balance the amount of reagents +//Recipes that use RECIPE_REAGENT_REPLACE will +//simplify the end product and balance the amount of reagents //in some foods. Many require the space spice reagent/condiment //to reduce the risk of future recipe conflicts. -///////////////////////////////////////////////////////////// - /datum/recipe/redcurry reagents = list("cream" = 5, "spacespice" = 2, "rice" = 5) @@ -934,13 +765,6 @@ I said no! reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/weapon/reagent_containers/food/snacks/lomein -/datum/recipe/chickenfillet //Also just combinable, like burgers and hot dogs. - items = list( - /obj/item/weapon/reagent_containers/food/snacks/chickenkatsu, - /obj/item/weapon/reagent_containers/food/snacks/bun - ) - result = /obj/item/weapon/reagent_containers/food/snacks/chickenfillet - /datum/recipe/chickennoodlesoup fruit = list("carrot" = 1) reagents = list("water" = 10) @@ -964,45 +788,6 @@ I said no! reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product result = /obj/item/weapon/reagent_containers/food/snacks/chilicheesefries -/datum/recipe/meatbun - reagents = list("spacespice" = 1, "water" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice, - /obj/item/weapon/reagent_containers/food/snacks/rawcutlet - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Water used up in cooking - result = /obj/item/weapon/reagent_containers/food/snacks/meatbun - -/datum/recipe/custardbun - reagents = list("spacespice" = 1, "water" = 5, "egg" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Water, egg used up in cooking - result = /obj/item/weapon/reagent_containers/food/snacks/custardbun - -/datum/recipe/chickenmomo - reagents = list("spacespice" = 2, "water" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice, - /obj/item/weapon/reagent_containers/food/snacks/doughslice, - /obj/item/weapon/reagent_containers/food/snacks/doughslice, - /obj/item/weapon/reagent_containers/food/snacks/meat/chicken - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/weapon/reagent_containers/food/snacks/chickenmomo - -/datum/recipe/veggiemomo - reagents = list("spacespice" = 2, "water" = 5) - fruit = list("carrot" = 1, "cabbage" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice, - /obj/item/weapon/reagent_containers/food/snacks/doughslice, - /obj/item/weapon/reagent_containers/food/snacks/doughslice - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Get that water outta here - result = /obj/item/weapon/reagent_containers/food/snacks/veggiemomo - /datum/recipe/risotto reagents = list("wine" = 5, "rice" = 10, "spacespice" = 1) fruit = list("mushroom" = 1) @@ -1017,32 +802,6 @@ I said no! reagent_mix = RECIPE_REAGENT_REPLACE //Get that water outta here result = /obj/item/weapon/reagent_containers/food/snacks/poachedegg -/datum/recipe/honeytoast - reagents = list("honey" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/slice/bread - ) - reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product - result = /obj/item/weapon/reagent_containers/food/snacks/honeytoast - - -/datum/recipe/donerkebab - fruit = list("tomato" = 1, "cabbage" = 1) - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab - - -/datum/recipe/sashimi - reagents = list("soysauce" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/carpmeat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sashimi - /datum/recipe/nugget reagents = list("flour" = 5) items = list( @@ -1052,12 +811,15 @@ I said no! result = /obj/item/weapon/reagent_containers/food/snacks/nugget // Chip update -/datum/recipe/tortila - reagents = list("flour" = 5,"water" = 5) +/datum/recipe/microwavetortilla + reagents = list("flour" = 5, "water" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough + ) result = /obj/item/weapon/reagent_containers/food/snacks/tortilla reagent_mix = RECIPE_REAGENT_REPLACE //no gross flour or water -/datum/recipe/taconew +/datum/recipe/taco items = list( /obj/item/weapon/reagent_containers/food/snacks/tortilla, /obj/item/weapon/reagent_containers/food/snacks/cutlet, @@ -1119,36 +881,61 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/burrito_vegan -/datum/recipe/burrito_spicy - fruit = list("chili" = 2) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/burrito - ) - result = /obj/item/weapon/reagent_containers/food/snacks/burrito_spicy - /datum/recipe/burrito_cheese items = list( - /obj/item/weapon/reagent_containers/food/snacks/burrito, + /obj/item/weapon/reagent_containers/food/snacks/tortilla, + /obj/item/weapon/reagent_containers/food/snacks/meatball, + /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge ) result = /obj/item/weapon/reagent_containers/food/snacks/burrito_cheese /datum/recipe/burrito_cheese_spicy - fruit = list("chili" = 2) + fruit = list("chili" = 2, "soybeans" = 1) items = list( - /obj/item/weapon/reagent_containers/food/snacks/burrito, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge + /obj/item/weapon/reagent_containers/food/snacks/tortilla, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, ) result = /obj/item/weapon/reagent_containers/food/snacks/burrito_cheese_spicy /datum/recipe/burrito_hell - fruit = list("chili" = 10) + fruit = list("soybeans" = 1, "chili" = 10) + reagents = list("spacespice" = 1) items = list( - /obj/item/weapon/reagent_containers/food/snacks/burrito_spicy + /obj/item/weapon/reagent_containers/food/snacks/tortilla, + /obj/item/weapon/reagent_containers/food/snacks/meatball, + /obj/item/weapon/reagent_containers/food/snacks/meatball ) + result result = /obj/item/weapon/reagent_containers/food/snacks/burrito_hell reagent_mix = RECIPE_REAGENT_REPLACE //Already hot sauce +/datum/recipe/meatburrito + fruit = list("soybeans" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/tortilla, + /obj/item/weapon/reagent_containers/food/snacks/cutlet, + /obj/item/weapon/reagent_containers/food/snacks/cutlet + ) + result = /obj/item/weapon/reagent_containers/food/snacks/meatburrito + +/datum/recipe/cheeseburrito + fruit = list("soybeans" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/tortilla, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito + +/datum/recipe/fuegoburrito + fruit = list("soybeans" = 1, "chili" = 2) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/tortilla + ) + result = /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito + /datum/recipe/breakfast_wrap items = list( /obj/item/weapon/reagent_containers/food/snacks/bacon, @@ -1160,18 +947,16 @@ I said no! /datum/recipe/burrito_mystery items = list( - /obj/item/weapon/reagent_containers/food/snacks/burrito, + /obj/item/weapon/reagent_containers/food/snacks/tortilla, /obj/item/weapon/reagent_containers/food/snacks/mysterysoup ) result = /obj/item/weapon/reagent_containers/food/snacks/burrito_mystery -//Ligger food, and also bacon. - -/datum/recipe/bacon +/datum/recipe/baconmicrowave items = list( /obj/item/weapon/reagent_containers/food/snacks/rawbacon ) - result = /obj/item/weapon/reagent_containers/food/snacks/bacon + result = /obj/item/weapon/reagent_containers/food/snacks/bacon/microwave /datum/recipe/chilied_eggs items = list( @@ -1212,9 +997,9 @@ I said no! /datum/recipe/father_breakfast items = list( /obj/item/weapon/reagent_containers/food/snacks/sausage, - /obj/item/weapon/reagent_containers/food/snacks/omelette, /obj/item/weapon/reagent_containers/food/snacks/meatsteak ) + reagents = list("egg" = 6) result = /obj/item/weapon/reagent_containers/food/snacks/father_breakfast /datum/recipe/stuffed_meatball @@ -1229,24 +1014,11 @@ I said no! items = list( /obj/item/weapon/reagent_containers/food/snacks/meatball, /obj/item/weapon/reagent_containers/food/snacks/meatball, - /obj/item/weapon/reagent_containers/food/snacks/meatball, - /obj/item/weapon/reagent_containers/food/snacks/omelette + /obj/item/weapon/reagent_containers/food/snacks/meatball ) + reagents = list("egg" = 6) result = /obj/item/weapon/reagent_containers/food/snacks/egg_pancake -/datum/recipe/grilled_carp - items = list( - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat, - /obj/item/weapon/reagent_containers/food/snacks/carpmeat - ) - reagents = list("spacespice" = 1) - fruit = list("cabbage" = 1, "lime" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/grilled_carp - /datum/recipe/bacon_stick items = list( /obj/item/weapon/reagent_containers/food/snacks/bacon, @@ -1254,16 +1026,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/bacon_stick -/datum/recipe/cheese_cracker - items = list( - /obj/item/weapon/reagent_containers/food/snacks/spreads/butter, - /obj/item/weapon/reagent_containers/food/snacks/slice/bread, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - reagents = list("spacespice" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/cheese_cracker - result_quantity = 4 - /datum/recipe/bacon_and_eggs items = list( /obj/item/weapon/reagent_containers/food/snacks/bacon, @@ -1298,114 +1060,6 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/blt -/datum/recipe/onionrings - fruit = list("onion" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/doughslice - ) - result = /obj/item/weapon/reagent_containers/food/snacks/onionrings - -/datum/recipe/berrymuffin - reagents = list("milk" = 5, "sugar" = 5) - reagent_mix = RECIPE_REAGENT_REPLACE - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - fruit = list("berries" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/muffin - -/datum/recipe/onionsoup - fruit = list("onion" = 1) - reagents = list("water" = 10) - result = /obj/item/weapon/reagent_containers/food/snacks/soup/onion - -/datum/recipe/porkbowl - reagents = list("water" = 5, "rice" = 10) - reagent_mix = RECIPE_REAGENT_REPLACE - items = list( - /obj/item/weapon/reagent_containers/food/snacks/bacon - ) - result = /obj/item/weapon/reagent_containers/food/snacks/porkbowl - -/datum/recipe/sushi - fruit = list("cabbage" = 1) - reagents = list("rice" = 20) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi - -/datum/recipe/goulash - fruit = list("tomato" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/cutlet, - /obj/item/weapon/reagent_containers/food/snacks/spagetti - ) - result = /obj/item/weapon/reagent_containers/food/snacks/goulash - -/datum/recipe/donerkebab - fruit = list("tomato" = 1, "cabbage" = 1) - reagents = list("sodiumchloride" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meatsteak, - /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab - -/datum/recipe/roastbeef - fruit = list("carrot" = 2, "potato" = 2) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/roastbeef - -/datum/recipe/reishicup - reagents = list("psilocybin" = 3, "sugar" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/chocolatebar - ) - result = /obj/item/weapon/reagent_containers/food/snacks/reishicup - -/datum/recipe/hotandsoursoup - fruit = list("cabbage" = 1, "mushroom" = 1) - reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/tofu - ) - result = /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup - -/datum/recipe/kitsuneudon - reagents = list("egg" = 3) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/spagetti, - /obj/item/weapon/reagent_containers/food/snacks/tofu - ) - result = /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon - -/datum/recipe/pillbugball - reagents = list("carbon" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat - ) - result = /obj/item/weapon/reagent_containers/food/snacks/bugball - -/datum/recipe/mammi - fruit = list("orange" = 1) - reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1) - result = /obj/item/weapon/reagent_containers/food/snacks/mammi - -/datum/recipe/makaroni - reagents = list("flour" = 15, "milk" = 5) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat, - /obj/item/weapon/reagent_containers/food/snacks/egg, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, - /obj/item/weapon/reagent_containers/food/snacks/cheesewedge - ) - result = /obj/item/weapon/reagent_containers/food/snacks/makaroni - /datum/recipe/gigapuddi reagents = list("milk" = 15) items = list( @@ -1429,25 +1083,3 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/egg ) result = /obj/item/weapon/reagent_containers/food/snacks/gigapuddi/anger - -/datum/recipe/buchedenoel - fruit = list("berries" = 2) - reagents = list("milk" = 5, "flour" = 15, "cream" = 10, "coco" = 5, "egg" = 6) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/buchedenoel - -/datum/recipe/turkey - fruit = list("carrot" = 2) - reagents = list("sodiumchloride" = 1, "blackpepper" = 1) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat/chicken, - /obj/item/weapon/reagent_containers/food/snacks/slice/bread, - ) - result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey - -/datum/recipe/cinnamonbun - reagents = list("sugar" = 15, "cream" = 10) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/dough - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cinnamonbun - result_quantity = 4 diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm index 8a4d88fc2a..6db92d6b01 100644 --- a/code/modules/food/recipes_microwave_vr.dm +++ b/code/modules/food/recipes_microwave_vr.dm @@ -10,6 +10,85 @@ */ // All of this shit needs to be gone through and reorganized into different recipes per machine - Rykka 7/16/2020 +/datum/recipe/sushi + fruit = list("cabbage" = 1) + reagents = list("rice" = 20) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/meat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi + +/datum/recipe/goulash + fruit = list("tomato" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/cutlet, + /obj/item/weapon/reagent_containers/food/snacks/spagetti + ) + result = /obj/item/weapon/reagent_containers/food/snacks/goulash + +/datum/recipe/donerkebab + fruit = list("tomato" = 1, "cabbage" = 1) + reagents = list("sodiumchloride" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meatsteak, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough + ) + result = /obj/item/weapon/reagent_containers/food/snacks/donerkebab + +/datum/recipe/roastbeef + fruit = list("carrot" = 2, "potato" = 2) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/roastbeef + +/datum/recipe/reishicup + reagents = list("psilocybin" = 3, "sugar" = 3) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar + ) + result = /obj/item/weapon/reagent_containers/food/snacks/reishicup + +/datum/recipe/hotandsoursoup + fruit = list("cabbage" = 1, "mushroom" = 1) + reagents = list("sodiumchloride" = 2, "blackpepper" = 2, "water" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/tofu + ) + result = /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup + +/datum/recipe/kitsuneudon + reagents = list("egg" = 3) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/spagetti, + /obj/item/weapon/reagent_containers/food/snacks/tofu + ) + result = /obj/item/weapon/reagent_containers/food/snacks/kitsuneudon + +/datum/recipe/pillbugball + reagents = list("carbon" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/bugball + +/datum/recipe/mammi + fruit = list("orange" = 1) + reagents = list("water" = 10, "flour" = 10, "milk" = 5, "sodiumchloride" = 1) + result = /obj/item/weapon/reagent_containers/food/snacks/mammi + +/datum/recipe/makaroni + reagents = list("flour" = 15, "milk" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat, + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, + /obj/item/weapon/reagent_containers/food/snacks/cheesewedge + ) + result = /obj/item/weapon/reagent_containers/food/snacks/makaroni + /datum/recipe/carpsushi fruit = list("cabbage" = 1) reagents = list("rice" = 20) diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm index b92f04b09e..e04d437982 100644 --- a/code/modules/food/recipes_oven.dm +++ b/code/modules/food/recipes_oven.dm @@ -5,7 +5,8 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/ovenchips - +//Roasts +//--------------- /datum/recipe/dionaroast appliance = OVEN @@ -15,15 +16,59 @@ result = /obj/item/weapon/reagent_containers/food/snacks/dionaroast reagent_mix = RECIPE_REAGENT_REPLACE //No eating polyacid +/datum/recipe/monkeysdelight + appliance = OVEN + fruit = list("banana" = 1) + reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/monkeycube + ) + result = /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight + reagent_mix = RECIPE_REAGENT_REPLACE -/datum/recipe/ribplate //Putting this here for not seeing a roast section. +/datum/recipe/ribplate appliance = OVEN reagents = list("honey" = 5, "spacespice" = 2, "blackpepper" = 1) items = list(/obj/item/weapon/reagent_containers/food/snacks/meat) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/ribplate +/datum/recipe/turkey + appliance = OVEN + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meat/chicken, + /obj/item/weapon/reagent_containers/food/snacks/stuffing + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey +/datum/recipe/tofurkey + appliance = OVEN + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/tofu, + /obj/item/weapon/reagent_containers/food/snacks/stuffing + ) + result = /obj/item/weapon/reagent_containers/food/snacks/tofurkey + +/datum/recipe/zestfish + appliance = OVEN + fruit = list("lemon" = 1) + reagents = list("sodiumchloride" = 3) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/carpmeat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/zestfish + +/datum/recipe/limezestfish + appliance = OVEN + fruit = list("lime" = 1) + reagents = list("sodiumchloride" = 3) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/carpmeat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/zestfish //Predesigned breads @@ -197,7 +242,6 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/cherrypie - /datum/recipe/amanita_pie appliance = OVEN reagents = list("amatoxin" = 5) @@ -210,18 +254,24 @@ items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) result = /obj/item/weapon/reagent_containers/food/snacks/plump_pie +/datum/recipe/applepie + appliance = OVEN + fruit = list("apple" = 1) + items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) + result = /obj/item/weapon/reagent_containers/food/snacks/applepie /datum/recipe/pumpkinpie appliance = OVEN fruit = list("pumpkin" = 1) - reagents = list("milk" = 5, "sugar" = 5, "egg" = 3, "flour" = 10) + reagents = list("sugar" = 5) + items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie - reagent_mix = RECIPE_REAGENT_REPLACE //We dont want raw egg in the result /datum/recipe/appletart appliance = OVEN fruit = list("goldapple" = 1) - reagents = list("sugar" = 5, "milk" = 5, "flour" = 10, "egg" = 3) + reagents = list("sugar" = 10) + items = list(/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough) result = /obj/item/weapon/reagent_containers/food/snacks/appletart reagent_mix = RECIPE_REAGENT_REPLACE @@ -292,7 +342,20 @@ reagent_mix = RECIPE_REAGENT_REPLACE //No egg or mix in final recipe result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/cosmicbrownies +/datum/recipe/buchedenoel + appliance = OVEN + fruit = list("berries" = 2) + reagents = list("milk" = 5, "flour" = 15, "cream" = 10, "coco" = 5, "egg" = 6) + result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/buchedenoel +/datum/recipe/cinnamonbun + appliance = OVEN + reagents = list("sugar" = 15, "cream" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/dough + ) + result = /obj/item/weapon/reagent_containers/food/snacks/cinnamonbun + result_quantity = 4 //Pizzas @@ -366,24 +429,15 @@ //Spicy //================ + /datum/recipe/enchiladas appliance = OVEN - fruit = list("chili" = 2, "corn" = 1) - items = list(/obj/item/weapon/reagent_containers/food/snacks/cutlet) - result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas - -/datum/recipe/monkeysdelight - appliance = OVEN - fruit = list("banana" = 1) - reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10) + fruit = list("chili" = 2) items = list( - /obj/item/weapon/reagent_containers/food/snacks/monkeycube + /obj/item/weapon/reagent_containers/food/snacks/cutlet, + /obj/item/weapon/reagent_containers/food/snacks/tortilla ) - result = /obj/item/weapon/reagent_containers/food/snacks/monkeysdelight - reagent_mix = RECIPE_REAGENT_REPLACE - - - + result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas // Cakes. @@ -485,15 +539,6 @@ reagents = list("milk" = 5, "egg" = 3,"honey" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/honeybun -/datum/recipe/enchiladas_new - appliance = OVEN - fruit = list("chili" = 2) - items = list( - /obj/item/weapon/reagent_containers/food/snacks/cutlet, - /obj/item/weapon/reagent_containers/food/snacks/tortilla - ) - result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas - //Bacon /datum/recipe/bacon_oven appliance = OVEN @@ -558,7 +603,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesewedge ) result = /obj/item/weapon/reagent_containers/food/snacks/macncheese - + /datum/recipe/suppermatter appliance = OVEN reagents = list("radium" = 5, "milk" = 5) @@ -576,3 +621,72 @@ ) reagent_mix = RECIPE_REAGENT_REPLACE result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/excitingsuppermatter + +/datum/recipe/waffles + appliance = OVEN + reagents = list("sugar" = 10) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/dough, + /obj/item/weapon/reagent_containers/food/snacks/dough + ) + result = /obj/item/weapon/reagent_containers/food/snacks/waffles + +/datum/recipe/loadedbakedpotatooven + appliance = OVEN + fruit = list("potato" = 1) + items = list(/obj/item/weapon/reagent_containers/food/snacks/cheesewedge) + result = /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato + +/datum/recipe/meatbun + appliance = OVEN + fruit = list("cabbage" = 1) + reagents = list("water" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/meatball, + /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Water used up in cooking + result = /obj/item/weapon/reagent_containers/food/snacks/meatbun + +/datum/recipe/spicedmeatbun + appliance = OVEN + reagents = list("spacespice" = 2, "water" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice, + /obj/item/weapon/reagent_containers/food/snacks/rawcutlet + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Water used up in cooking + result = /obj/item/weapon/reagent_containers/food/snacks/spicedmeatbun + +/datum/recipe/custardbun + appliance = OVEN + reagents = list("spacespice" = 1, "water" = 5, "egg" = 3) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Water, egg used up in cooking + result = /obj/item/weapon/reagent_containers/food/snacks/custardbun + +/datum/recipe/chickenmomo + appliance = OVEN + reagents = list("spacespice" = 2, "water" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice, + /obj/item/weapon/reagent_containers/food/snacks/doughslice, + /obj/item/weapon/reagent_containers/food/snacks/doughslice, + /obj/item/weapon/reagent_containers/food/snacks/meat/chicken + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/weapon/reagent_containers/food/snacks/chickenmomo + +/datum/recipe/veggiemomo + appliance = OVEN + reagents = list("spacespice" = 2, "water" = 5) + fruit = list("carrot" = 1, "cabbage" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/doughslice, + /obj/item/weapon/reagent_containers/food/snacks/doughslice, + /obj/item/weapon/reagent_containers/food/snacks/doughslice + ) + reagent_mix = RECIPE_REAGENT_REPLACE //Get that water outta here + result = /obj/item/weapon/reagent_containers/food/snacks/veggiemomo \ No newline at end of file diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index bfa684f4e6..8a9e0c2dda 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -63,6 +63,7 @@ "Meetinghall" = new/datum/holodeck_program(/area/holodeck/source_meetinghall), "Courtroom" = new/datum/holodeck_program(/area/holodeck/source_courtroom, list('sound/music/traitor.ogg')), "Chessboard" = new/datum/holodeck_program(/area/holodeck/source_chess), + "Micro Building Area" = new/datum/holodeck_program(/area/holodeck/source_smoleworld), //VOREStation add "Turn Off" = new/datum/holodeck_program(/area/holodeck/source_plating, list()) ) diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index e91624724f..dcef997e36 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -244,8 +244,8 @@ pass_color = TRUE strict_color_stacking = TRUE -/obj/item/stack/material/wax/New() - ..() +/obj/item/stack/material/wax/Initialize() + . = ..() recipes = wax_recipes /datum/material/wax diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index cecc455328..30b5c69fef 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -219,6 +219,11 @@ new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src)) qdel(src) return + else if(!isnull(seed.chems["pineapplejuice"])) + to_chat(user, "You slice \the [src] into rings.") + new /obj/item/weapon/reagent_containers/food/snacks/pineapple_ring(get_turf(src)) + qdel(src) + return else if(!isnull(seed.chems["soymilk"])) to_chat(user, "You roughly chop up \the [src].") new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src)) diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index 0413fe50ac..3d096c7c37 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -8,13 +8,11 @@ var/plantname var/potency = 1 -/obj/item/weapon/grown/New(newloc,planttype) +/obj/item/weapon/grown/Initialize(ml, planttype) - ..() + . = ..() - var/datum/reagents/R = new/datum/reagents(50) - reagents = R - R.my_atom = src + create_reagents(50) //Handle some post-spawn var stuff. if(planttype) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 53a31a8a2b..9ceb81fd37 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -170,9 +170,11 @@ if(!body_coverage) return - if (fruit) + + var/obj/item/organ/external/E = target.get_organ(target.hand ? BP_L_HAND : BP_R_HAND) + if(istype(E) && E.robotic < ORGAN_ROBOT && fruit) var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5)) - to_chat(target, "You are stung by \the [fruit]!") + to_chat(target, SPAN_DANGER("You are stung by \the [fruit]!")) for(var/chem in chems) target.reagents.add_reagent(chem,injecting) if (fruit.reagents) diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 35e84e150d..cb5bb5c68f 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -320,8 +320,8 @@ GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds) /obj/item/seeds/eggyplant seed_type = "egg-plant" -/obj/item/seeds/spineapple - seed_type = "spineapple" +/obj/item/seeds/pineapple + seed_type = "pineapple" /obj/item/seeds/durian seed_type = "durian" diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index f75d17f63e..96132945b6 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -127,7 +127,7 @@ /obj/item/seeds/riceseed = 3, /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, + /obj/item/seeds/pineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, @@ -185,7 +185,7 @@ /obj/item/seeds/riceseed = 3, /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, + /obj/item/seeds/pineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, diff --git a/code/modules/hydroponics/seed_storage_vr.dm b/code/modules/hydroponics/seed_storage_vr.dm index 3ba578e8c8..cf7a856d85 100644 --- a/code/modules/hydroponics/seed_storage_vr.dm +++ b/code/modules/hydroponics/seed_storage_vr.dm @@ -33,7 +33,7 @@ /obj/item/seeds/riceseed = 3, /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, + /obj/item/seeds/pineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, @@ -46,6 +46,7 @@ /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3, + /obj/item/seeds/wurmwoad = 3, /obj/item/seeds/shrinkshroom = 3, /obj/item/seeds/megashroom = 3) @@ -92,7 +93,7 @@ /obj/item/seeds/riceseed = 3, /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, - /obj/item/seeds/spineapple = 3, + /obj/item/seeds/pineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, @@ -105,6 +106,7 @@ /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3, + /obj/item/seeds/wurmwoad = 3, /obj/item/seeds/shrinkshroom = 3, /obj/item/seeds/megashroom = 3, /obj/item/seeds/lustflower = 2, diff --git a/code/modules/hydroponics/seedtypes/pineapple.dm b/code/modules/hydroponics/seedtypes/pineapple.dm new file mode 100644 index 0000000000..9e14b244dc --- /dev/null +++ b/code/modules/hydroponics/seedtypes/pineapple.dm @@ -0,0 +1,49 @@ +//pineapple and variants + +/datum/seed/pineapple + name = "pineapple" + seed_name = "pineapple" + display_name = "pineapple" + kitchen_tag = "pineapple" + mutants = list("spineapple") + chems = list("nutriment" = list(1,5), "pineapplejuice" = list(1, 20)) + +/datum/seed/pineapple/New() + ..() + set_trait(TRAIT_HARVEST_REPEAT,1) + set_trait(TRAIT_MATURATION,10) + set_trait(TRAIT_PRODUCTION,6) + set_trait(TRAIT_YIELD,1) + set_trait(TRAIT_POTENCY,13) + set_trait(TRAIT_PRODUCT_ICON,"pineapple") + set_trait(TRAIT_PRODUCT_COLOUR,"#FFF23B") + set_trait(TRAIT_PLANT_COLOUR,"#87C969") + set_trait(TRAIT_PLANT_ICON,"corn") + set_trait(TRAIT_IDEAL_HEAT, 298) + set_trait(TRAIT_IDEAL_LIGHT, 4) + set_trait(TRAIT_WATER_CONSUMPTION, 8) + +//A pineapple that stings and produces enzymes. + +/datum/seed/spineapple + name = "spineapple" + seed_name = "spineapple" + display_name = "spineapple" + kitchen_tag = "spineapple" + chems = list("nutriment" = list(1,5), "enzyme" = list(1,5), "pineapplejuice" = list(1, 20)) + +/datum/seed/spineapple/New() + ..() + set_trait(TRAIT_HARVEST_REPEAT,1) + set_trait(TRAIT_MATURATION,10) + set_trait(TRAIT_PRODUCTION,6) + set_trait(TRAIT_YIELD,1) + set_trait(TRAIT_POTENCY,13) + set_trait(TRAIT_PRODUCT_ICON,"pineapple") + set_trait(TRAIT_PRODUCT_COLOUR,"#FFF23B") + set_trait(TRAIT_PLANT_COLOUR,"#87C969") + set_trait(TRAIT_PLANT_ICON,"corn") + set_trait(TRAIT_IDEAL_HEAT, 298) + set_trait(TRAIT_IDEAL_LIGHT, 4) + set_trait(TRAIT_WATER_CONSUMPTION, 6) + set_trait(TRAIT_STINGS,1) \ No newline at end of file diff --git a/code/modules/hydroponics/seedtypes/spineapple.dm b/code/modules/hydroponics/seedtypes/spineapple.dm deleted file mode 100644 index b8ff58f597..0000000000 --- a/code/modules/hydroponics/seedtypes/spineapple.dm +++ /dev/null @@ -1,22 +0,0 @@ -/datum/seed/spineapple - name = "spineapple" - seed_name = "spineapple" - display_name = "spineapple" - kitchen_tag = "pineapple" - chems = list("nutriment" = list(1,5), "enzyme" = list(1,5), "pineapplejuice" = list(1, 20)) - -/datum/seed/spineapple/New() - ..() - set_trait(TRAIT_HARVEST_REPEAT,1) - set_trait(TRAIT_MATURATION,10) - set_trait(TRAIT_PRODUCTION,6) - set_trait(TRAIT_YIELD,1) - set_trait(TRAIT_POTENCY,13) - set_trait(TRAIT_PRODUCT_ICON,"pineapple") - set_trait(TRAIT_PRODUCT_COLOUR,"#FFF23B") - set_trait(TRAIT_PLANT_COLOUR,"#87C969") - set_trait(TRAIT_PLANT_ICON,"corn") - set_trait(TRAIT_IDEAL_HEAT, 298) - set_trait(TRAIT_IDEAL_LIGHT, 4) - set_trait(TRAIT_WATER_CONSUMPTION, 8) - set_trait(TRAIT_STINGS,1) \ No newline at end of file diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index eb5d6aba26..2e06a8c51c 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -184,9 +184,9 @@ return /obj/machinery/portable_atmospherics/hydroponics/Initialize() - . = ..() - if(!ov_lowhealth) - setup_overlays() + ..() + if(!ov_lowhealth) //VOREStation Add + setup_overlays() //VOREStation Add temp_chem_holder = new() temp_chem_holder.create_reagents(10) create_reagents(200) diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index 8823007967..afd8d7c089 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -292,7 +292,6 @@ new /obj/item/weapon/storage/bag/circuits/mini/transfer(src) new /obj/item/weapon/storage/bag/circuits/mini/converter(src) new /obj/item/weapon/storage/bag/circuits/mini/power(src) - new /obj/item/device/electronic_assembly(src) new /obj/item/device/assembly/electronic_assembly(src) new /obj/item/device/assembly/electronic_assembly(src) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 9c140cedae..855c01c539 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -356,11 +356,9 @@ /obj/item/integrated_circuit/input/signaler/Initialize() . = ..() - set_frequency(frequency) - // Set the pins so when someone sees them, they won't show as null set_pin_data(IC_INPUT, 1, frequency) set_pin_data(IC_INPUT, 2, code) - push_data() + addtimer(CALLBACK(src, .proc/set_frequency, frequency), 40) /obj/item/integrated_circuit/input/signaler/Destroy() if(radio_controller) @@ -574,7 +572,7 @@ ) /obj/item/integrated_circuit/input/microphone/sign/Initialize() - ..() + . = ..() for(var/lang in readable_langs) var/datum/language/newlang = GLOB.all_languages[lang] my_langs |= newlang diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index fbeaf29f05..e12f8d1615 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -154,7 +154,7 @@ var/mob/living/voice/my_voice /obj/item/integrated_circuit/output/text_to_speech/advanced/Initialize() - ..() + . = ..() my_voice = new (src) mob_list -= my_voice // no life() ticks my_voice.name = "TTS Circuit" diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index bd6fe27a94..5b70b4985f 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -147,7 +147,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f var/static/list/base_genre_books /obj/machinery/librarycomp/Initialize() - ..() + . = ..() if(!base_genre_books || !base_genre_books.len) base_genre_books = list( diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index f4565329bb..3a89f5cf6e 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -1,9 +1,24 @@ /datum/lore/codex/category/main_news // The top-level categories for the news thing name = "Index" - data = "Below you'll find a list of articles relevant to the current (as of 2564) political climate, especially concerning the Almach Rim \ + data = "Below you'll find a list of articles relevant to the current (as of 2565) political climate, especially concerning the local \ region. Each is labeled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \ articles. You are encouraged to check back frequently." children = list( + /datum/lore/codex/page/article103, + /datum/lore/codex/page/article102, + /datum/lore/codex/page/article101, + /datum/lore/codex/page/article100, + /datum/lore/codex/page/article99, + /datum/lore/codex/page/article98, + /datum/lore/codex/page/article97, + /datum/lore/codex/page/article96, + /datum/lore/codex/page/article95, + /datum/lore/codex/page/article94, + /datum/lore/codex/page/article93, + /datum/lore/codex/page/article92, + /datum/lore/codex/page/article91, + /datum/lore/codex/page/article90, + /datum/lore/codex/page/article89, /datum/lore/codex/page/article88, /datum/lore/codex/page/article87, /datum/lore/codex/page/article86, @@ -321,7 +336,7 @@

\ Sources within the Vir Governmental Authority have reported that a full scale recall of remote drone craft under their operation has been initiated in order to improve security measures and prevent future exploitation of government systems, statements that eerily echo those of Occulum Broadcast following emergent drone attacks earlier this year. Investigations are reportedly \"well underway\" to determine the whereabouts of those responsible for the apparent manual modification of these short-range remote craft.\

\ - Erkki Laukkanen, Chief of Fleet Staff for the Vir Defense Force has commended all patrol crews involved, and has promised \"swift retribution\" for the attempted bombings." + Erkki Laukkanen, Chief of Fleet Staff for the Sif Defense Force has commended all patrol crews involved, and has promised \"swift retribution\" for the attempted bombings." /datum/lore/codex/page/article26 name = "11/24/62 - Boiling Point Stronghold Seized in Vir" data = "Combined forces from the SCG Fleet and Almach Militia have today struck a powerful blow to Boiling Point terrorist operations in the Vir system. With close cooperation from the crew of NanoTrasen facilities in the region, special forces were able to infiltrate what is believed to have been a major stronghold for the radical Mercurial group, located deep in the remote Ullran Expanse region of Sif. The raid closely follows the thwarted Boiling Point attack on the Radiance Energy Chain, a major energy collection array in the system which is now known to have been masterminded from the concealed bunker complex on Sif.\ @@ -354,7 +369,7 @@

\ No more! Shall the people of this great nation have to fear the machinations of radicals! No more! Shall these twisted minds impose their perversion of humanity through violence! No more!\

\ - This Assembly... Nay, this nation expresses its thanks the noble members of our military who joined together to make this outcome possible. We thank the Fleet, of course for their tireless action hunting down these killers, and their heroic action over this past weekend. We thank the Vir Defense Force, without whom we could never have located the intelligence that led to these decisive victories... The Almach Militia, for their cooperation in the apprehension of these so-called \"revolutionaries\". \[West clears their throat\] And of course, we thank the local forces - the police and reserves who dealt firsthand with the chaos sewn by Boiling Point in their vicious crusade.\ + This Assembly... Nay, this nation expresses its thanks the noble members of our military who joined together to make this outcome possible. We thank the Fleet, of course for their tireless action hunting down these killers, and their heroic action over this past weekend. We thank the Sif Defense Force, without whom we could never have located the intelligence that led to these decisive victories... The Almach Militia, for their cooperation in the apprehension of these so-called \"revolutionaries\". \[West clears their throat\] And of course, we thank the local forces - the police and reserves who dealt firsthand with the chaos sewn by Boiling Point in their vicious crusade.\

\ \[Mackenzie West shifts at the podium, setting down the List of Dissidents.\]\

\ @@ -1006,3 +1021,137 @@ Make no mistake, that is what our agreement today symbolizes. A new era of peace for us, where we no longer have to worry about the threat of piracy or invasion. We can return to our homes, rebuild our stations, and forge a new future for ourselves and our children'\

\ It was also announced that though the work of restoring order to the system is ongoing, they expect elections will be held for a new Assembly and President within the next few months, with the exact date announced once violence on the major stations has ceased and cooperation from the insubordinate stations is secured. Yong will head an interim government in the meantime." + +/datum/lore/codex/page/article89 + name = "08/15/64 - Almach Permits First Solar Inspection" + data = "Almost four months since its establishment as a Skrellian territory, the Almach Protectorate Government has extended its first formal invitation to Solar Confederate Government inspectors to ensure the fledgling state is complying with restrictions imposed by the Treaty of Whythe.\ +

\ + The composition of the official Solar Inspection Group has been a matter of much deliberation over the past several months, and owing to the ground to be covered now includes over 3,500 experts from a wide variety of fields. The bulk of the Group is comprised of Transgressive Technologies Commission agents, including the EIO, but also includes military officials, independent observers, and corporate representatives. The inclusion of the latter group spurred heated debate in the Colonial Assembly, but ultimately 'thought-leaders' from Ward-Takahashi, NanoTrasen, and Hephaestus Industries were admitted, while other interests will have to be satisfied to be represented by Sol Economic Organization liaisons.\ +

\ + The APG, currently based out of what is to be a neutral embassy on Carter in Relan pending the completion of the new government centre of Vigilance Station in Whythe, is not legally required to fully comply with Five Points regulation, though the Whythe terms ensure that any transgressive research is undertaken under the strictest guidelines. The Skrell have amiably agreed to ensure that any innovation by the protectorate is safe, controlled, and does not enter Solar territory. These terms are similar to those applied to such technologies developed by and for the Skrell themselves, whose expertise is considered unrivalled in the field, but has been widely criticised by certain human bioconservative groups.\ +

\ + The inspection is expected to take several weeks, and will begin tomorrow." + +/datum/lore/codex/page/article90 + name = "08/29/64 - Kaleidoscope Cosmetics Goes Trans-Stellar After Genix Merger" + data = "Personal care giant Kaleidoscope Cosmetics has been officially recognised by the Solar Galactic Exchange as a true Trans-stellar Corporation today, following a controversial merger with Genix Therapeutic Systems and expanding its corporate assets to over 20 key systems.\ +

\ + Genix, which will now be operating under the Kaleidoscope name while retaining some corporate autonomy, has come under some scrutiny from the Transgressive Technologies Commission in recent months following its aggressive acquisition of liquidated Almachi assets in the aftermath of the Association's dissolution in April. The company was cleared of suspected Five Points violations without fanfare just two weeks ago, and allowed to resume work on the development a variety of previously approved commercial genetic modification products.\ +

\ + Many cosmetic gene-modification products have been available for some time - primarily in the Almach Rim - but have remained targeted at a relatively niche market. These treatments, ranging from cosmetic anti-aging to 'fantasy' body features are now set to be marketed and available in 'hundreds' of Kaleidoscope clinics galaxy-wide in the coming months. The TTC has reported that they are 'Confident that no transgressive modification is being provided and that these modifications are strictly superficial'. They have officially wished Kaleidoscope's directors well in their ascent to the galactic stage." + +/datum/lore/codex/page/article91 + name = "09/21/64 - Almach Passes Inspection - Concerns Raised" + data = "The Solar Inspection Group has granted the Almach Protectorate a passing grade in the first official inspection of the territory under Skrellian rule, though ethical concerns have been raised by a number of independent observers involved in the process.\ +

\ + During the course of the month-long inspection, Skrell facilitators were cooperative in ensuring the SIG were given 'unlimited' access to all research and development facilities requested by Sol, as well as informing the group of numerous previously unidentified locations that had been flagged by the Almach Protectorate Government since assuming control of the region in April. Critics of protectorate have suggested that the 'official list' may not be as comprehensive as stated, but the SIG has stated that they are 'confident that no deception has been undertaken by the APG. We have observed no evidence of research being concealed from our teams, and to the best of our knowledge the only locations left undisturbed are those few still occupied by Association holdouts, beyond the control of either inspecting government.'\ +

\ + Also as a result of the inspection, concerns have been raised regarding the treatment of ex-Association citizens, particularly the often genetically modified residents of Angessa's Pearl. While Angessa Martei's location is still unknown, her legacy - a society described by some as a cult of personality with emphasis on the cult - poses a significant threat to Skrellian control of the Exalt's Light system, and the clash of 'strong ideologies' has allegedly resulted in mistreatment of detainees that, according to the official report 'would not be permitted in Solar jurisdictions'.\ +

\ + The Protectorate's passing grade opens the door for interstellar trade to resume between the two nations for the first time in several years. Manufacturing giant Ward-Takahashi has already released a public statement on its intent to deal with the APG, and several other trans-stellars are expected to follow suit." + +/datum/lore/codex/page/article92 + name = "09/24/64 - Kaleidoscope Announce Exclusive Almach Deal" + data = "Mere days after the announcement of the reopening of Almachi-Solar trade, the Kaleidoscope Cosmetics corporation has confirmed that they have secured 'exclusive rights' to genetic products produced by several major manufacturers in the Angessa's Pearl system formerly owned by The Exalt - the insular mercurial theocracy of Exalt's Light - and recently handed over to the Almach Protectorate Government.\ +

\ + The details of the company's trade agreement have not been made public, but have reportedly already been approved by both the APG and SCG. The promptness of the agreement suggests to some that negotitations had been underway well before the announcement of the Protectorate's passing grade. Though cooperation between trans-stellar interests and government entities is far from unusual, such dealings with foreign governments - such as those widely made as 'open secrets' with Eutopia - are considered distasteful by many within the Icarus Front.\ +

\ + The Angessan products Kaleidoscope intends to offer have also not been made public, but are all to be thoroughly screened by the Transgressive Technologies Commission before being made available, though 'failing' proposals may be approved for use exclusively within Protectorate territory." + +/datum/lore/codex/page/article93 + name = "10/04/64 - Yong Wins Relani Elections" + data = "Despite concerns about domestic unrest and potential Skrellian interference, elections in Relan have gone ahead, selecting a new President and System Assembly. Francis Harp Yong, leader of the interim government and previous governor of the city-station Ithaca, known for his leading role in negotiating the end of Skrellian occupation and calming riots and rebellions earlier this year, has won the Presidency in a landslide, receiving nearly seventy percent of the vote. His party, the Spacer Union, has secured a narrow majority in the Assembly. The New Federalists, led by former member of the Harper government Odoacer Mieville, are the largest opposition party.\ +

\ + Yong has promised to reinforce Relani neutrality and rebuild the pre-war social system, forming a coalition of labor, technoprogressives, and anti-war activists. His victory likely means an end to the unrest that has plagued Relan since the end of the war with Almach." + +/datum/lore/codex/page/article94 + name = "12/23/64 - Two Vessels Feared Lost In Isavau's Gamble" + data = "Two Solar salvage vessels have been declared missing this week while undertaking operations in the remote Isavau's Gamble system. Locals also report that several smaller craft from the Eutopia system have 'vanished' under similar circumstances. Authorities are treating the disappearances as potential pirate attacks.\ +

\ + The XIV Sri Chamarajendra with crew of 32, and IIV Reimarus with 9 are both reported to have lost contact with the system's spaceport while undertaking far-orbit salvage operations on decommissioned and abandoned facilities, including the ILS Harvest Moon which detonated with all hands earlier this year. The disappearances have spurred the system government to request greater anti-piracy support from the SCG, which has been much reduced since the Almach War and increased tensions on the Hegemony border.\ +

\ + While Proximal to the independent and often 'lawless' Eutopia system, as well as the Rarkajar Rift, infamous prowl of the human-tajaran Jaguar Gang, the Isavau's System has rarely been a direct target for such large-scale apparent hijackings, and no group has yet claimed credit or demanded ransom." + +/datum/lore/codex/page/article95 + name = "12/27/64 - NanoTrasen Accused In Satisfaction Poll Fixing" + data = "The results of an annual system-wide corporate employee satisfaction poll in Vir have been called into question after a leak of internal employee contracts by an anonymous whistle blower. According to verified documents provided to the Vir News Network, NanoTrasen employees on annual employment contracts up for renewal are instructed to fill out an appended form expressing 'Extremely High' satisfaction with their employment at the company, or the contract will be deemed 'incomplete' and thus invalid.\ +

\ + NanoTrasen have been winners of the Vir Happy Employee Award for the 7 years running as of this year, and as such the legitimacy of the award, which has been run in major systems by the Sol Economic Organization since 2503, has been called seriously into question. The SEO has expressed regrets regarding the alleged fixing, but has stated that participating corporations are within their right to encourage employees to vote in a particular way.\ +

\ + According to NanoTrasen, the so-called 'Satisfaction Clause' in their contract renewal process is entirely permissible from a legal standpoint, and the company has no plans to make any changes at this time. When approached for comment, one anonymous employee stated that they 'had never even heard of' the award." + +/datum/lore/codex/page/article96 + name = "01/03/65 - VirGov Seals Security Deal With Local Firm" + data = "Governor Lusia Hainirsdottir has announced sweeping changes to government law enforcement in Vir, lynchpinned by the signing of a five-year contract with home-grown independent security and arms firm, Hedberg-Hammarstrom. The private enterprise will be assuming 'key duties' in local law enforcement and system security, in a move that Hainirsdottir says 'will save millions in taxpayer money, and encourages local, Virite businesses that we trust them every step of the way'.\ +

\ + While many colonies and facilities in Vir rely wholly on in-house security forces and will continue to do so, Hedberg-Hammarstrom is set to take over government patrol duties throughout the system, as well as administrating a large portion of previously government-run local law enforcement agencies including policing and wilderness garrisons.\ +

\ + CEO Gunnar Hammarstrom has reassured current SifGuard members at all levels that they need not fear for their jobs, and that for many the changes will be as simple as a slight change in uniform and a different name on their paychecks, but that H-H agents will be assuming managerial roles in most locations." + +/datum/lore/codex/page/article97 + name = "01/05/65 - Top NanoTrasen Executive Injured In Sif Bombing" + data = "Calvert Moravec, Chief Operations Officer for NanoTrasen Vir remains in a critical condition following a suspected assassination attempt on Saturday. The former gubernatorial candidate had been making a speech at a small NanoTrasen facility known for a prior terrorist attack by Boiling Point forces two years ago, when a small explosive device detonated close to the executive's leg, rendering him unconcious.\ +

\ + NanoTrasen security have elected to investigate the bombing internally, refusing to cooperate with SifGuard authorities on the grounds of disagreements with newly established Hedberg-Hammarstrom management. Mr. Moravec, nephew of NanoTrasen CEO Albary Moravec had reportedly been speaking out against H-H's involvement in national policing when the blast occurred.\ +

\ + Commander Spradling of NanoTrasen Internal Security has issued a company-wide active search order for one member of the audience who remains unaccounted for named 'Lae Vu', who is believed to be a journalist or posing as such, accompanied by images from communicator footage taken at the event.\ +

\ + This amateur footage also shows one member of the audience shouting an anti-corporate slogan and throwing a small electronic device at Moravec before being escorted from the room, just moments prior to the explosion. Spradling has stated that this individual, who is believed to be a disgruntled veteran of the Sif Defense Force, remains one of several persons of interest, but that the thrown item does not appear to be connected directly with the explosive device.\ +

\ + Reports from witnesses suggest that Mr. Moravec made a temporary recovery thanks to the fast action of medical staff aboard the NLS Southern Cross, but that a few hours later he appeared to suffer from a seizure, after which he was placed into a medically induced coma that he is yet to recover from. Unverified images from the Cross appear to show a disoriented individual resembling Moravec self-medicating with a cocktail of prescribed painkillers and alcoholic beverages, though the company strongly denies their veracity." + +/datum/lore/codex/page/article98 + name = "02/02/65 - NanoTrasen Announces Employee-Led Advisement Scheme" + data = "Trans-stellar giant NanoTrasen has today announced the launch of their brand-new 'NanoTrasen Employee Representation Committee' scheme, which will allow employee-selected representatives to have a say in company policy on a local basis. Initially launching as a pilot in 'a few key regions', the NERC is intended to provide an in-house method for those working for NanoTrasen to 'address grievances and provide valuable input without resorting to radical means'.\ +

\ + Vir is one of three size regions of varying scale but similar company presence selected for the pilot program, alongside the 'Deep Bowl' - including Stove, Viola and New Singapore, and 'South America', on Earth. Elections are expected to take place over the coming weeks, with each region electing representatives from core facilities in their locale. The Vir Branch will be expected to select five employees, one from each of; their New Reykjavik Head Office (Colloquially know as 'CentComm'), Karan colony the NCS Northern Star, Kalmar-based NMB Gullstrand medical research center, Sivian way-station NLS Southern Cross, and the company's sprawling Ekmanshalvo Fabrication Plant.\ +

\ + The Representation Committee is set to have quite significant powers over their region's day-to-day operations, ranging from Standard Operation Procedure, to security enforcement, to interior design." + +/datum/lore/codex/page/article99 + name = "02/06/65 - Calvert Moravec Dead At 58, Announces Withdrawal From Public Life" + data = "Just over a month since his injury in a brazen assassination attempt, NanoTrasen Vir's Chief Operations Officer Calvert Moravec has announced his 'temporary withdrawal' from public and corporate matters, in an inspiring speech given from his post-cloning recovery ward. The noted corporate executive passed away on Friday, following a long comatose period, but is expected to make a full recovery.\ +

\ + Mr. Moravec has stated that he believes a spell 'away from the public eye' will do wonders for his recovery, and 'expects to make a return some time in the coming years'. However, Moravec has reaffirmed that his stance on corporate policing, which is believed to have been the reason for the January bombing, remains unchanged; 'The refusal of Hedberg-Hammarstrom to allow our security teams to access government criminal records has been a significant hindrance to the investigation into my death. Allowing just one corporation exclusive access to this data is unequivocally wrong.'" + +/datum/lore/codex/page/article100 + name = "02/08/65 - NERC Campaigning Begins in Vir" + data = "NanoTrasen's latest employee initiative, the NanoTrasen Employee Representation Committee is set to hold their first in-house election this coming weekend, after 'respectable' signup rates for the positions across all participating Vir-based facilities.\ +

\ + According to those interviewed at a few sites, campaigning may be mixed. One potential committee member for the Gullstrand Medical Center described the competition as 'cut-throat' with staff looking to be split between the selection of already respected chief medical experts, and 'more represenative' service staff. Conversely, one worker at the Ekmanshalvo Fabrication Plant complex stated that he 'would probably just vote for whoever I've heard of.'\ +

\ + Final voting will take place on Saturday the 13th of February, with results announced by the following Monday." + +/datum/lore/codex/page/article101 + name = "02/11/65 - Top Astronomers Announce 'Alarming' Tachyon Downtick" + data = "The Galactic Survey Administration has today released a 'high priority' report on what is being described as a 'significant decline in core tachyon density' throughout the known galaxy. According to recent findings tachyon deterioration, which had previously been 'negligible' has undergone a 'rapid acceleration' which could begin to seriously affect interstellar transit in as soon as 30 to 50 years.\ +

\ + Tachyons are a naturally occurring particle present in varying density which form the primary mechanism for bluespace drive operation. In simple terms, the higher the density of tachyons, the more efficiently starship engines are capable of operating. Low-density regions such as the Rarkajar Rift have long posed a challenge to interstellar trade, and the expansion of such regions could prove devastating to galactic unity.\ +

\ + FTL industry leaders Focal Point Energistics have already announced 'immediate investigation' into the GSA's findings after taking a blow on the stock exchange, and have guaranteed a 'commitment to future-proofing' in all forthcoming products." + +/datum/lore/codex/page/article102 + name = "02/15/65 - NanoTrasen Announces First NERC Members" + data = "Following Saturday's internal election, NanoTrasen Vir has elected the first five members for its new Employee Representation Committee. These individuals are expected to hold the position for one month:\ +

\ + For the New Reykjavik Head Office Iraluq James, a remote personnel operative, won the position on a platform of employee morale, team-building and employee-employer conflict resolution.\ +

\ + On the NCS Northern Star, NanoTrasen's main colony station in Vir Victoria Bell, a cybernetic chef and hardshell operator won her place with promises of increased regulatory transparency and clarity, including the publication of an in-house magazine.\ +

\ + At the NMB Gullstrand medical science center in Kalmar, a close race between top doctors was upset by the election of a station security commander, Wish Elara-Voight who promises 'improvements to the safety and security of NanoTrasen facilities with a focus on enforcing current SoP and CorpReg policies and placing new procedure in the handbooks.'\ +

\ + The waypoint station NLS Southern Cross selected a cybernetic Unathi candidate, researcher Dr. Haven Rasikl to represent them on the basis of encouraging interdepartmental cooperation and communication.\ +

\ + Finally, the Ekmanshalvo Fabrication Plant has selected fabrication programmer Terazon Norddahl, who promises to push for overhauls and modernization of the company's internal transport and support systems, including shuttle scheduling." + +/datum/lore/codex/page/article103 + name = "03/10/65 - GSA Confirms Presence Of 'New' Deep-Space Threat" + data = "This morning the Galactic Survey Administration released confirmation that a previously unknown deep-space dwelling species was indeed responsible for the disappearance of five Extraplanar Discovery Division vessels early last year, three of which have returned adrift over the past several days. The species, colloquially dubbed the 'Bluespace Bugs' after initial reports from the recovered EDD ships, are believed to be capable of manipulating matter in a manner reminicent of experimental bluespace technology.\ +

\ + The three 'returning' vessels are said to have been 'significantly off-course', with their points of galactic re-entry differing vastly from their initial points of egress, and final programmed return routes. Each ship having departed on routes from Sol, the SCG-E Bungaree was reported adrift by Almach Protectorate officials close to the Vounna system, the SCG-E Ketumati severely damaged on a collision course with the Erebus star, in the Nyx system, and the SCG-E Mag Mell collided with the garden world of Sif, in Vir. The Gagarin and Xu Fu remain unaccounted for, but due to the proximity of final contact, their disappearance has also been ascribed to the 'bugs'.\ +

\ + Investigation of the recovered vessels each indicated signs of a brief struggle, always following reports of unexplained equipment disappearances and equipment failure. No crew, or crew remains have been found, with the exception of a single unidentified human thumb aboard the Bungaree.\ +

\ + Additionally, each ship has been identified as having undergone some degree of material alteration, with elements ranging from hull plating to crew belongings having taken on a crystaline form dubbed 'Magmellite' after the ship most thoroughly 'reconstructed'. It is unclear whether the mineral is somehow secreted by the alien species, or merely a product of the same environment.\ +

\ + GSA sources have stated that there is no current evidence that the insectoid creatures - identified only from scattered descriptions left from missing EDD personnel - are in any way sapient or malicious, and the lost vessels are thought to have merely disturbed a scattered array of endemic populations far from the galactic plane. Precisely why the species has only been encountered in the past year, and now all at once, is not yet known." \ No newline at end of file diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index 3a2f284fd6..019dff407a 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -9,8 +9,8 @@ var/annihilate = FALSE // If true, all (movable) atoms at the location where the map is loaded will be deleted before the map is loaded in. var/fixed_orientation = FALSE // If true, the submap will not be rotated randomly when loaded. - var/cost = null /*The map generator has a set 'budget' it spends to place down different submaps. It will pick available submaps randomly until - it runs out. The cost of a submap should roughly corrispond with several factors such as size, loot, difficulty, desired scarcity, etc. + var/cost = null /* The map generator has a set 'budget' it spends to place down different submaps. It will pick available submaps randomly until + it runs out. The cost of a submap should roughly corrispond with several factors such as size, loot, difficulty, desired scarcity, etc. Set to -1 to force the submap to always be made. */ var/allow_duplicates = FALSE // If false, only one map template will be spawned by the game. Doesn't affect admins spawning then manually. var/discard_prob = 0 // If non-zero, there is a chance that the map seeding algorithm will skip this template when selecting potential templates to use. diff --git a/code/modules/materials/fifty_spawner_mats.dm b/code/modules/materials/fifty_spawner_mats.dm index 50d4184ebf..af2e3703e8 100644 --- a/code/modules/materials/fifty_spawner_mats.dm +++ b/code/modules/materials/fifty_spawner_mats.dm @@ -28,6 +28,10 @@ name = "stack of plastic" type_to_spawn = /obj/item/stack/material/plastic +/obj/fiftyspawner/copper + name = "stack of copper" + type_to_spawn = /obj/item/stack/material/copper + /obj/fiftyspawner/graphite name = "stack of graphite" type_to_spawn = /obj/item/stack/material/graphite @@ -92,7 +96,7 @@ name = "stack of logs" type_to_spawn = /obj/item/stack/material/log -/obj/fiftyspawner/log +/obj/fiftyspawner/log/sif name = "stack of alien logs" type_to_spawn = /obj/item/stack/material/log/sif diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 4278436a97..bc6b382ae2 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -11,6 +11,7 @@ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] armor plate insert", /obj/item/weapon/material/armor_plating/insert, 2, time = 40, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) @@ -33,168 +34,169 @@ /datum/material/steel/generate_recipes() ..() recipes += new/datum/stack_recipe_list("office chairs",list( \ - new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1) \ + new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") \ )) recipes += new/datum/stack_recipe_list("comfy chairs", list( \ - new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("yellow comfy chair", /obj/structure/bed/chair/comfy/yellow, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("orange comfy chair", /obj/structure/bed/chair/comfy/orange, 2, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ )) - recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0) - recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20) - recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20) - recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60) - recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1) - recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1) + recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("bench frame", /obj/structure/table/bench, 1, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]") + recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]") + recipes += new/datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]") + recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]") + recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1, recycle_material = "[name]") //recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1) - recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1) - recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1) + recipes += new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 50, one_per_turf = 0, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") recipes += new/datum/stack_recipe_list("airlock assemblies", list( \ - new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("eng atmos airlock assembly", /obj/structure/door_assembly/door_assembly_eat, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("voidcraft airlock assembly horizontal", /obj/structure/door_assembly/door_assembly_voidcraft, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("voidcraft airlock assembly vertical", /obj/structure/door_assembly/door_assembly_voidcraft/vertical, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ )) - //recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1)//VOREStation Removal - recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1)//VOREStation Replacement - recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade) - recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2) - recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1) - recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2) - recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2) + //recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Removal + recipes += new/datum/stack_recipe("medical stand", /obj/structure/medical_stand, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]")//VOREStation Replacement + recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade, recycle_material = "[name]") + recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2, recycle_material = "[name]") + recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("floor lamp fixture frame", /obj/machinery/light_construct/flamp, 2, recycle_material = "[name]") + recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2, recycle_material = "[name]") recipes += new/datum/stack_recipe_list("modular computer frames", list( \ - new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20),\ - new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10),\ - new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10),\ - new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5),\ + new/datum/stack_recipe("modular console frame", /obj/item/modular_computer/console, 20, recycle_material = "[name]"),\ + new/datum/stack_recipe("modular telescreen frame", /obj/item/modular_computer/telescreen, 10, recycle_material = "[name]"),\ + new/datum/stack_recipe("modular laptop frame", /obj/item/modular_computer/laptop, 10, recycle_material = "[name]"),\ + new/datum/stack_recipe("modular tablet frame", /obj/item/modular_computer/tablet, 5, recycle_material = "[name]"),\ )) recipes += new/datum/stack_recipe_list("filing cabinets", list( \ - new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ + new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"), \ )) recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]") /datum/material/plasteel/generate_recipes() ..() - recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1) - recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1) + recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1, recycle_material = "[name]") recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20) - recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1) - recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10) + recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/dark, 1, 4, 20, recycle_material = "[name]") + recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1, recycle_material = "[name]") + recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10, recycle_material = "[name]") /datum/material/stone/generate_recipes() ..() - recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1) + recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") /datum/material/stone/marble/generate_recipes() ..() - recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20) - recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20) + recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20, recycle_material = "[name]") + recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20, recycle_material = "[name]") /datum/material/plastic/generate_recipes() ..() - recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE) // 500u - recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE) // 250u - recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE) // 100u - recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS) - recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("Feeder", /obj/machinery/feeder, 4, time = 20, one_per_turf = 1, on_floor = 1) //CHOMP Addition + recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 500u + recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 250u + recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]") // 100u + recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("plastic fishtank", /obj/item/glass_jar/fish/plastic, 2, time = 30 SECONDS, recycle_material = "[name]") + recipes += new/datum/stack_recipe("reagent tubing", /obj/item/stack/hose, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("Feeder", /obj/machinery/feeder, 4, time = 20, one_per_turf = 1, on_floor = 1, recycle_material = "[name]") //CHOMP Addition + /datum/material/wood/generate_recipes() ..() recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE) //VOREStation Add - recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1) + recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") //VOREStation Add + recipes += new/datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]") /datum/material/wood/log/generate_recipes() recipes = list() - recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]") /datum/material/cardboard/generate_recipes() ..() - recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE, recycle_material = "[name]") recipes += new/datum/stack_recipe_list("folders",list( \ - new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \ - new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \ - new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \ - new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \ - new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \ + new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue, recycle_material = "[name]"), \ + new/datum/stack_recipe("grey folder", /obj/item/weapon/folder, recycle_material = "[name]"), \ + new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red, recycle_material = "[name]"), \ + new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white, recycle_material = "[name]"), \ + new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow, recycle_material = "[name]"), \ )) /datum/material/snow/generate_recipes() recipes = list() - recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10) - recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10) - recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15) - recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10) - recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20) + recipes += new/datum/stack_recipe("snowball", /obj/item/weapon/material/snow/snowball, 1, time = 10, recycle_material = "[name]") + recipes += new/datum/stack_recipe("snow brick", /obj/item/stack/material/snowbrick, 2, time = 10, recycle_material = "[name]") + recipes += new/datum/stack_recipe("snowman", /obj/structure/snowman, 2, time = 15, recycle_material = "[name]") + recipes += new/datum/stack_recipe("snow robot", /obj/structure/snowman/borg, 2, time = 10, recycle_material = "[name]") + recipes += new/datum/stack_recipe("snow spider", /obj/structure/snowman/spider, 3, time = 20, recycle_material = "[name]") /datum/material/snowbrick/generate_recipes() recipes = list() @@ -220,54 +222,54 @@ /datum/material/supermatter/generate_recipes() recipes = list() - recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1) + recipes += new/datum/stack_recipe("supermatter shard", /obj/machinery/power/supermatter/shard, 30 , one_per_turf = 1, time = 600, on_floor = 1, recycle_material = "[name]") /datum/material/cloth/generate_recipes() recipes = list() recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]") - recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]") /datum/material/resin/generate_recipes() recipes = list() recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]") recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS) + recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS, recycle_material = "[name]") /datum/material/leather/generate_recipes() recipes = list() - recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE) - recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]") + recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]") recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) diff --git a/code/modules/materials/material_recipes_vr.dm b/code/modules/materials/material_recipes_vr.dm index 3dc6975a04..bf5b54d853 100644 --- a/code/modules/materials/material_recipes_vr.dm +++ b/code/modules/materials/material_recipes_vr.dm @@ -31,7 +31,7 @@ recipes += new/datum/stack_recipe("dropship seat", /obj/structure/bed/chair/bay/shuttle, 4, one_per_turf = 1, on_floor = 1, time = 20) recipes += new/datum/stack_recipe("small teshari nest", /obj/structure/bed/chair/bay/chair/padded/red/smallnest, 2, one_per_turf = 1, on_floor = 1, time = 10) recipes += new/datum/stack_recipe("large teshari nest", /obj/structure/bed/chair/bay/chair/padded/red/bignest, 4, one_per_turf = 1, on_floor = 1, time = 20) - + recipes += new/datum/stack_recipe("dance pole", /obj/structure/dancepole, 2, one_per_turf = 1, on_floor = 1, time = 20) recipes += new/datum/stack_recipe("light switch frame", /obj/item/frame/lightswitch, 2) recipes += new/datum/stack_recipe_list("sofas", list( new/datum/stack_recipe("red sofa middle", /obj/structure/bed/chair/sofa, 1, one_per_turf = 1, on_floor = 1), \ diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 2a17e05d36..3fd995378c 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -20,16 +20,16 @@ drop_sound = 'sound/items/drop/axe.ogg' pickup_sound = 'sound/items/pickup/axe.ogg' -/obj/item/stack/material/New() - ..() +/obj/item/stack/material/Initialize() + . = ..() + randpixel_xy() if(!default_type) default_type = DEFAULT_WALL_MATERIAL material = get_material_by_name("[default_type]") if(!material) - qdel(src) - return 0 + return INITIALIZE_HINT_QDEL recipes = material.get_recipes() stacktype = material.stack_type @@ -44,7 +44,6 @@ matter = material.get_matter() update_strings() - return 1 /obj/item/stack/material/get_material() return material @@ -103,14 +102,14 @@ /obj/item/stack/material/iron name = "iron" - icon_state = "sheet-silver" + icon_state = "sheet-ingot" default_type = "iron" apply_colour = 1 no_variants = FALSE /obj/item/stack/material/lead name = "lead" - icon_state = "sheet-adamantine" + icon_state = "sheet-ingot" default_type = "lead" apply_colour = 1 no_variants = FALSE @@ -160,22 +159,24 @@ /obj/item/stack/material/graphite name = "graphite" - icon_state = "sheet-silver" + icon_state = "sheet-puck" default_type = MAT_GRAPHITE apply_colour = 1 no_variants = FALSE /obj/item/stack/material/gold name = "gold" - icon_state = "sheet-gold" + icon_state = "sheet-ingot" default_type = "gold" no_variants = FALSE + apply_colour = TRUE /obj/item/stack/material/silver name = "silver" - icon_state = "sheet-silver" + icon_state = "sheet-ingot" default_type = "silver" no_variants = FALSE + apply_colour = TRUE //Valuable resource, cargo can sell it. /obj/item/stack/material/platinum @@ -183,6 +184,7 @@ icon_state = "sheet-adamantine" default_type = "platinum" no_variants = FALSE + apply_colour = TRUE //Extremely valuable to Research. /obj/item/stack/material/mhydrogen @@ -194,14 +196,14 @@ //Fuel for MRSPACMAN generator. /obj/item/stack/material/tritium name = "tritium" - icon_state = "sheet-silver" + icon_state = "sheet-puck" default_type = "tritium" - apply_colour = 1 + apply_colour = TRUE no_variants = FALSE /obj/item/stack/material/osmium name = "osmium" - icon_state = "sheet-silver" + icon_state = "sheet-ingot" default_type = "osmium" apply_colour = 1 no_variants = FALSE @@ -210,16 +212,17 @@ // Fusion fuel. /obj/item/stack/material/deuterium name = "deuterium" - icon_state = "sheet-silver" + icon_state = "sheet-puck" default_type = "deuterium" apply_colour = 1 no_variants = FALSE /obj/item/stack/material/steel name = DEFAULT_WALL_MATERIAL - icon_state = "sheet-metal" + icon_state = "sheet-refined" default_type = DEFAULT_WALL_MATERIAL no_variants = FALSE + apply_colour = TRUE /obj/item/stack/material/steel/hull name = MAT_STEELHULL @@ -227,9 +230,10 @@ /obj/item/stack/material/plasteel name = "plasteel" - icon_state = "sheet-plasteel" + icon_state = "sheet-reinforced" default_type = "plasteel" no_variants = FALSE + apply_colour = TRUE /obj/item/stack/material/plasteel/hull name = MAT_PLASTEELHULL @@ -237,17 +241,19 @@ /obj/item/stack/material/durasteel name = "durasteel" - icon_state = "sheet-durasteel" + icon_state = "sheet-reinforced" item_state = "sheet-metal" default_type = "durasteel" no_variants = FALSE + apply_colour = TRUE /obj/item/stack/material/durasteel/hull name = MAT_DURASTEELHULL /obj/item/stack/material/titanium name = MAT_TITANIUM - icon_state = "sheet-silver" + icon_state = "sheet-refined" + apply_colour = TRUE item_state = "sheet-silver" default_type = MAT_TITANIUM no_variants = FALSE @@ -346,8 +352,10 @@ icon_state = "sheet-wood" default_type = MAT_WOOD strict_color_stacking = TRUE + apply_colour = 1 drop_sound = 'sound/items/drop/wooden.ogg' pickup_sound = 'sound/items/pickup/wooden.ogg' + no_variants = FALSE /obj/item/stack/material/wood/sif name = "alien wooden plank" @@ -432,6 +440,8 @@ name = "snow" desc = "The temptation to build a snowman rises." icon_state = "sheet-snow" + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' default_type = "snow" /obj/item/stack/material/snowbrick @@ -439,6 +449,8 @@ desc = "For all of your igloo building needs." icon_state = "sheet-snowbrick" default_type = "packed snow" + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' /obj/item/stack/material/leather name = "leather" @@ -464,30 +476,90 @@ /obj/item/stack/material/glass name = "glass" - icon_state = "sheet-glass" + icon_state = "sheet-transparent" default_type = "glass" no_variants = FALSE drop_sound = 'sound/items/drop/glass.ogg' pickup_sound = 'sound/items/pickup/glass.ogg' + apply_colour = TRUE /obj/item/stack/material/glass/reinforced name = "reinforced glass" - icon_state = "sheet-rglass" + icon_state = "sheet-rtransparent" default_type = "rglass" no_variants = FALSE + apply_colour = TRUE /obj/item/stack/material/glass/phoronglass name = "borosilicate glass" desc = "This sheet is special platinum-glass alloy designed to withstand large temperatures" singular_name = "borosilicate glass sheet" - icon_state = "sheet-phoronglass" + icon_state = "sheet-transparent" default_type = "borosilicate glass" no_variants = FALSE + apply_colour = TRUE /obj/item/stack/material/glass/phoronrglass name = "reinforced borosilicate glass" desc = "This sheet is special platinum-glass alloy designed to withstand large temperatures. It is reinforced with few rods." singular_name = "reinforced borosilicate glass sheet" - icon_state = "sheet-phoronrglass" + icon_state = "sheet-rtransparent" default_type = "reinforced borosilicate glass" no_variants = FALSE + apply_colour = TRUE + +/obj/item/stack/material/bronze + name = "bronze" + icon_state = "sheet-ingot" + singular_name = "bronze ingot" + default_type = "bronze" + apply_colour = 1 + no_variants = FALSE + +/obj/item/stack/material/tin + name = "tin" + icon_state = "sheet-ingot" + singular_name = "tin ingot" + default_type = "tin" + apply_colour = 1 + no_variants = FALSE + +/obj/item/stack/material/copper + name = "copper" + icon_state = "sheet-ingot" + singular_name = "copper ingot" + default_type = "copper" + apply_colour = 1 + no_variants = FALSE + +/obj/item/stack/material/painite + name = "painite" + icon_state = "sheet-gem" + singular_name = "painite gem" + default_type = "painite" + apply_colour = 1 + no_variants = FALSE + +/obj/item/stack/material/void_opal + name = "void opal" + icon_state = "sheet-void_opal" + singular_name = "void opal" + default_type = "void opal" + apply_colour = 1 + no_variants = FALSE + +/obj/item/stack/material/quartz + name = "quartz" + icon_state = "sheet-gem" + singular_name = "quartz gem" + default_type = "quartz" + apply_colour = 1 + no_variants = FALSE + +/obj/item/stack/material/aluminium + name = "aluminium" + icon_state = "sheet-ingot" + singular_name = "aluminium ingot" + default_type = "aluminium" + apply_colour = 1 + no_variants = FALSE diff --git a/code/modules/materials/material_synth.dm b/code/modules/materials/material_synth.dm index f7088839ff..972b8b61ed 100644 --- a/code/modules/materials/material_synth.dm +++ b/code/modules/materials/material_synth.dm @@ -6,11 +6,11 @@ gender = NEUTER matter = null // Don't shove it in the autholathe. -/obj/item/stack/material/cyborg/New() - if(..()) - name = "[material.display_name] synthesiser" - desc = "A device that synthesises [material.display_name]." - matter = null +/obj/item/stack/material/cyborg/Initialize() + . = ..() + name = "[material.display_name] synthesiser" + desc = "A device that synthesises [material.display_name]." + matter = null /obj/item/stack/material/cyborg/update_strings() return diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 2bac6e23d0..005b461679 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -486,6 +486,7 @@ var/list/name_to_material door_icon_base = "metal" icon_colour = "#D1E6E3" icon_reinf = "reinf_metal" + composite_material = null /datum/material/plasteel/titanium/hull name = MAT_TITANIUMHULL @@ -637,7 +638,7 @@ var/list/name_to_material hardness = 40 weight = 30 stack_origin_tech = list(TECH_MATERIAL = 2) - composite_material = list() //todo + composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 2, "borosilicate glass" = SHEET_MATERIAL_AMOUNT) rod_product = null /datum/material/plastic @@ -1007,6 +1008,7 @@ var/list/name_to_material protectiveness = 1 // 4% flags = MATERIAL_PADDING conductive = 0 + integrity = 40 pass_stack_colors = TRUE supply_conversion_value = 2 @@ -1055,9 +1057,10 @@ var/list/name_to_material icon_base = "solid" icon_reinf = "reinf_mesh" integrity = 60 + weight = 10 ignition_point = T0C+400 melting_point = T0C+500 - protectiveness = 25 + protectiveness = 20 conductive = 0 supply_conversion_value = 4 @@ -1073,6 +1076,7 @@ var/list/name_to_material melting_point = T0C+300 protectiveness = 3 // 13% conductive = 0 + integrity = 40 supply_conversion_value = 3 //CHOMPstation Removal Start: Moved to materials_ch and changed to allow for material var @@ -1214,3 +1218,81 @@ var/list/name_to_material weight = 1 protectiveness = 0 // 0% conductive = 0 + +/datum/material/void_opal + name = "void opal" + display_name = "void opal" + use_name = "void opal" + icon_colour = "#0f0f0f" + stack_type = /obj/item/stack/material/void_opal + flags = MATERIAL_UNMELTABLE + cut_delay = 60 + reflectivity = 0 + conductivity = 1 + shard_type = SHARD_SHARD + tableslam_noise = 'sound/effects/Glasshit.ogg' + hardness = 100 + stack_origin_tech = list(TECH_ARCANE = 1, TECH_MATERIAL = 6) + sheet_singular_name = "gem" + sheet_plural_name = "gems" + supply_conversion_value = 30 // These are hilariously rare. + +/datum/material/painite + name = "painite" + display_name = "painite" + use_name = "painite" + icon_colour = "#6b4947" + stack_type = /obj/item/stack/material/painite + flags = MATERIAL_UNMELTABLE + reflectivity = 0.3 + tableslam_noise = 'sound/effects/Glasshit.ogg' + sheet_singular_name = "gem" + sheet_plural_name = "gems" + supply_conversion_value = 4 + +/datum/material/tin + name = "tin" + display_name = "tin" + use_name = "tin" + stack_type = /obj/item/stack/material/tin + icon_colour = "#b2afaf" + sheet_singular_name = "ingot" + sheet_plural_name = "ingots" + supply_conversion_value = 1 + hardness = 50 + weight = 13 + +/datum/material/copper + name = "copper" + display_name = "copper" + use_name = "copper" + stack_type = /obj/item/stack/material/copper + conductivity = 52 + icon_colour = "#af633e" + sheet_singular_name = "ingot" + sheet_plural_name = "ingots" + supply_conversion_value = 1 + weight = 13 + hardness = 50 + +/datum/material/quartz + name = "quartz" + display_name = "quartz" + use_name = "quartz" + icon_colour = "#e6d7df" + stack_type = /obj/item/stack/material/quartz + tableslam_noise = 'sound/effects/Glasshit.ogg' + sheet_singular_name = "crystal" + sheet_plural_name = "crystals" + supply_conversion_value = 4 + +/datum/material/aluminium + name = "aluminium" + display_name = "aluminium" + use_name = "aluminium" + icon_colour = "#e5e2d0" + stack_type = /obj/item/stack/material/aluminium + sheet_singular_name = "ingot" + sheet_plural_name = "ingots" + supply_conversion_value = 2 + weight = 10 diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm index ed1b88636e..5601a586a1 100644 --- a/code/modules/mining/alloys.dm +++ b/code/modules/mining/alloys.dm @@ -43,4 +43,12 @@ "platinum" = 1, "sand" = 2 ) - product = /obj/item/stack/material/glass/phoronglass \ No newline at end of file + product = /obj/item/stack/material/glass/phoronglass + +/datum/alloy/bronze + metaltag = "bronze" + requires = list( + "copper" = 2, + "tin" = 1 + ) + product = /obj/item/stack/material/bronze diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm index ad16122b3f..dd30cc24b6 100644 --- a/code/modules/mining/coins.dm +++ b/code/modules/mining/coins.dm @@ -46,6 +46,18 @@ name = "platinum coin" icon_state = "coin_adamantine" +/obj/item/weapon/coin/morphium + name = "morphium coin" + icon_state = "coin_morphium" + +/obj/item/weapon/coin/aluminium + name = "aluminium coin" + icon_state = "coin_aluminium" + +/obj/item/weapon/coin/verdantium + name = "verdantium coin" + icon_state = "coin_verdantium" + /obj/item/weapon/coin/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/CC = W diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 569b9605f2..f57ec998c5 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -27,7 +27,11 @@ "osmium" = /obj/item/weapon/ore/osmium, "hydrogen" = /obj/item/weapon/ore/hydrogen, "silicates" = /obj/item/weapon/ore/glass, - "carbon" = /obj/item/weapon/ore/coal + "carbon" = /obj/item/weapon/ore/coal, + "copper" = /obj/item/weapon/ore/copper, + "tin" = /obj/item/weapon/ore/tin, + "bauxite" = /obj/item/weapon/ore/bauxite, + "rutile" = /obj/item/weapon/ore/rutile ) //Upgrades @@ -40,11 +44,14 @@ // Found with an advanced laser. exotic_drilling >= 1 var/list/ore_types_uncommon = list( MAT_MARBLE = /obj/item/weapon/ore/marble, + "painite" = /obj/item/weapon/ore/painite, + "quartz" = /obj/item/weapon/ore/quartz, MAT_LEAD = /obj/item/weapon/ore/lead ) // Found with an ultra laser. exotic_drilling >= 2 var/list/ore_types_rare = list( + "void opal" = /obj/item/weapon/ore/void_opal, MAT_VERDANTIUM = /obj/item/weapon/ore/verdantium ) @@ -187,7 +194,7 @@ if (panel_open && cell && user.Adjacent(src)) to_chat(user, "You take out \the [cell].") - cell.forceMove(get_turf(user)) + user.put_in_hands(cell) component_parts -= cell cell = null return diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 50bf8bdd35..ef113ca7b7 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -1,12 +1,14 @@ /obj/item/weapon/mining_scanner - name = "ore detector" + name = "deep scan device" desc = "A complex device used to locate ore deep underground." icon = 'icons/obj/device.dmi' - icon_state = "forensic0-old" //GET A BETTER SPRITE. + icon_state = "deep_scan_device" item_state = "electronic" origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 150) var/scan_time = 2 SECONDS + var/range = 2 + var/exact = FALSE /obj/item/weapon/mining_scanner/attack_self(mob/user as mob) to_chat(user, "You begin sweeping \the [src] about, scanning for metal deposits.") @@ -17,9 +19,10 @@ ScanTurf(get_turf(user), user) -/obj/item/weapon/mining_scanner/proc/ScanTurf(var/atom/target, var/mob/user, var/exact = FALSE) +/obj/item/weapon/mining_scanner/proc/ScanTurf(var/atom/target, var/mob/user) var/list/metals = list( "surface minerals" = 0, + "industrial metals" = 0, "precious metals" = 0, "precious gems" = 0, "nuclear fuel" = 0, @@ -29,7 +32,7 @@ var/turf/Turf = get_turf(target) - for(var/turf/simulated/T in range(2, Turf)) + for(var/turf/simulated/T in range(range, Turf)) if(!T.has_resources) continue @@ -38,12 +41,13 @@ var/ore_type switch(metal) - if("silicates", "carbon", "hematite", "marble") ore_type = "surface minerals" - if("gold", "silver", "lead") ore_type = "precious metals" - if("diamond") ore_type = "precious gems" + if("silicates", "carbon", "marble", "quartz") ore_type = "surface minerals" + if("hematite", "tin", "copper", "bauxite", "lead") ore_type = "industrial metals" + if("gold", "silver", "rutile") ore_type = "precious metals" + if("diamond", "painite") ore_type = "precious gems" if("uranium") ore_type = "nuclear fuel" if("phoron", "osmium", "hydrogen") ore_type = "exotic matter" - if("verdantium") ore_type = "anomalous matter" + if("verdantium", "void opal") ore_type = "anomalous matter" if(ore_type) metals[ore_type] += T.resources[metal] @@ -64,3 +68,23 @@ message += "
- [result] of [ore_type]." to_chat(user, message) + +/obj/item/weapon/mining_scanner/advanced + name = "advanced ore detector" + desc = "An advanced device used to locate ore deep underground." + description_info = "This scanner has variable range, you can use the Set Scanner Range verb, or alt+click the device. Drills dig in 5x5." + origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 4) + matter = list(DEFAULT_WALL_MATERIAL = 150) + scan_time = 0.5 SECONDS + exact = TRUE + +/obj/item/weapon/mining_scanner/advanced/AltClick(mob/user) + change_size() + +/obj/item/weapon/mining_scanner/advanced/verb/change_size() + set name = "Set Scanner Range" + set category = "Object" + var/custom_range = input("Scanner Range","Pick a range to scan. ") as null|anything in list(0,1,2,3,4,5,6,7) + if(custom_range) + range = custom_range + to_chat(usr, "Scanner will now look up to [range] tile(s) away.") \ No newline at end of file diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index c78520121e..dbd9c960e6 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -168,10 +168,17 @@ "sand" = 1, "hematite" = 1, "carbon" = 1, + "raw copper" = 1, + "raw tin" = 1, + "void opal" = 3, + "painite" = 3, + "quartz" = 3, + "raw bauxite" = 5, "phoron" = 15, "silver" = 16, "gold" = 18, "marble" = 20, + "rutile" = 20, "uranium" = 30, "diamond" = 50, "platinum" = 40, diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index edd065d5a4..b88511bbe7 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -87,18 +87,11 @@ /obj/machinery/mineral/stacking_machine/New() ..() - for(var/stacktype in typesof(/obj/item/stack/material)-/obj/item/stack/material) - var/obj/item/stack/S = new stacktype(src) - stack_storage[S.name] = 0 - stack_paths[S.name] = stacktype - qdel(S) - - stack_storage["glass"] = 0 - stack_paths["glass"] = /obj/item/stack/material/glass - stack_storage[DEFAULT_WALL_MATERIAL] = 0 - stack_paths[DEFAULT_WALL_MATERIAL] = /obj/item/stack/material/steel - stack_storage["plasteel"] = 0 - stack_paths["plasteel"] = /obj/item/stack/material/plasteel + for(var/stacktype in (subtypesof(/obj/item/stack/material) - typesof(/obj/item/stack/material/cyborg))) + var/obj/item/stack/material/S = stacktype + var/s_matname = initial(S.default_type) + stack_storage[s_matname] = 0 + stack_paths[s_matname] = stacktype spawn( 5 ) for (var/dir in cardinal) @@ -127,10 +120,12 @@ var/turf/T = get_turf(input) for(var/obj/item/O in T.contents) if(!O) return - if(istype(O,/obj/item/stack)) - if(!isnull(stack_storage[O.name])) - stack_storage[O.name]++ - O.loc = null + if(istype(O,/obj/item/stack/material)) + var/obj/item/stack/material/S = O + var/matname = S.material.name + if(!isnull(stack_storage[matname])) + stack_storage[matname] += S.amount + qdel(S) else O.loc = output.loc else diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index c4415fd5da..2c784ad886 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -158,9 +158,10 @@ var/upright = 0 var/base_state -/obj/item/stack/flag/New() - ..() +/obj/item/stack/flag/Initialize() + . = ..() base_state = icon_state + update_icon() /obj/item/stack/flag/blue name = "blue flags" diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index ec07f71980..ee3c514ade 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -49,6 +49,29 @@ var/list/mining_overlay_cache = list() var/datum/artifact_find/artifact_find var/ignore_mapgen + var/ore_types = list( + "hematite" = /obj/item/weapon/ore/iron, + "uranium" = /obj/item/weapon/ore/uranium, + "gold" = /obj/item/weapon/ore/gold, + "silver" = /obj/item/weapon/ore/silver, + "diamond" = /obj/item/weapon/ore/diamond, + "phoron" = /obj/item/weapon/ore/phoron, + "osmium" = /obj/item/weapon/ore/osmium, + "hydrogen" = /obj/item/weapon/ore/hydrogen, + "silicates" = /obj/item/weapon/ore/glass, + "carbon" = /obj/item/weapon/ore/coal, + "verdantium" = /obj/item/weapon/ore/verdantium, + "marble" = /obj/item/weapon/ore/marble, + "lead" = /obj/item/weapon/ore/lead, + "copper" = /obj/item/weapon/ore/copper, + "tin" = /obj/item/weapon/ore/tin, + "bauxite" = /obj/item/weapon/ore/bauxite, +// "void opal" = /obj/item/weapon/ore/void_opal, +// "painite" = /obj/item/weapon/ore/painite, +// "quartz" = /obj/item/weapon/ore/quartz, + "rutile" = /obj/item/weapon/ore/rutile + ) + has_resources = 1 // Alternative rock wall sprites. @@ -636,10 +659,10 @@ turf/simulated/mineral/floor/light_corner var/mineral_name if(rare_ore) - mineral_name = pickweight(list("marble" = 5, "uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 5, "verdantium" = 1, "rutile" = 4)) //VOREStation Edit + mineral_name = pickweight(list("marble" = 5,/* "quartz" = 15,*/ "copper" = 10, "tin" = 5, "bauxite" = 5, "uranium" = 15, "platinum" = 20, "hematite" = 15, "rutile" = 20, "carbon" = 15, "diamond" = 3, "gold" = 15, "silver" = 15, "phoron" = 25, "lead" = 5,/* "void opal" = 1,*/ "verdantium" = 2/*, "painite" = 1*/)) else - mineral_name = pickweight(list("marble" = 3, "uranium" = 10, "platinum" = 10, "hematite" = 70, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 2, "verdantium" = 1, "rutile" = 4)) //VOREStation Edit + mineral_name = pickweight(list("marble" = 3,/* "quartz" = 10,*/ "copper" = 20, "tin" = 15, "bauxite" = 15, "uranium" = 10, "platinum" = 10, "hematite" = 70, "rutile" = 15, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 3,/* "void opal" = 1,*/ "verdantium" = 1/*, "painite" = 1*/)) if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] diff --git a/code/modules/mining/mineral_effect.dm b/code/modules/mining/mineral_effect.dm index 9406231c56..12781a7ea4 100644 --- a/code/modules/mining/mineral_effect.dm +++ b/code/modules/mining/mineral_effect.dm @@ -1,6 +1,6 @@ /obj/effect/mineral name = "mineral vein" - icon = 'icons/obj/mining_vr.dmi' //VOREStation Edit + icon = 'icons/obj/mining.dmi' desc = "Shiny." mouse_opacity = 0 density = 0 diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index b067a35633..dc95d0e082 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -107,13 +107,49 @@ material = MAT_LEAD origin_tech = list(TECH_MATERIAL = 3) +/obj/item/weapon/ore/copper + name = "raw copper" + icon_state = "ore_copper" + material = "copper" + +/obj/item/weapon/ore/tin + name = "raw tin" + icon_state = "ore_tin" + material = "tin" + +/obj/item/weapon/ore/bauxite + name = "raw bauxite" + icon_state = "ore_bauxite" + material = "bauxite" + +/obj/item/weapon/ore/rutile + name = "raw rutile" + icon_state = "ore_rutile" + material = "rutile" + +/obj/item/weapon/ore/void_opal + name = "raw void opal" + icon_state = "ore_void_opal" + material = "void opal" + +/obj/item/weapon/ore/painite + name = "raw painite" + icon_state = "ore_painite" + material = "painite" + +/obj/item/weapon/ore/quartz + name = "raw quartz" + icon_state = "ore_quartz" + material = "quartz" + /obj/item/weapon/ore/slag name = "Slag" desc = "Someone screwed up..." icon_state = "slag" material = null -/obj/item/weapon/ore/New() +/obj/item/weapon/ore/Initialize() + . = ..() randpixel_xy() /obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob) diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index 0bca24db1f..0e125bee74 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -177,3 +177,71 @@ var/global/list/ore_data = list() ore = /obj/item/weapon/ore/lead scan_icon = "mineral_rare" reagent = "lead" + +/ore/copper + name = "copper" + display_name = "copper" + smelts_to = "copper" + alloy = 1 + result_amount = 5 + spread_chance = 15 + ore = /obj/item/weapon/ore/copper + scan_icon = "mineral_common" + reagent = "copper" + +/ore/tin + name = "tin" + display_name = "tin" + smelts_to = "tin" + alloy = 1 + result_amount = 5 + spread_chance = 10 + ore = /obj/item/weapon/ore/tin + scan_icon = "mineral_common" + +/ore/quartz + name = "quartz" + display_name = "unrefined quartz" + compresses_to = "quartz" + result_amount = 5 + spread_chance = 5 + ore = /obj/item/weapon/ore/quartz + scan_icon = "mineral_common" + +/ore/bauxite + name = "bauxite" + display_name = "bauxite" + smelts_to = "aluminium" + result_amount = 5 + spread_chance = 25 + ore = /obj/item/weapon/ore/bauxite + scan_icon = "mineral_common" + reagent = "aluminum" + +/ore/rutile + name = "rutile" + display_name = "rutile" + smelts_to = "titanium" + result_amount = 5 + spread_chance = 12 + alloy = 1 + ore = /obj/item/weapon/ore/rutile + scan_icon = "mineral_uncommon" + +/ore/painite + name = "painite" + display_name = "rough painite" + compresses_to = "painite" + result_amount = 5 + spread_chance = 3 + ore = /obj/item/weapon/ore/painite + scan_icon = "mineral_rare" + +/ore/void_opal + name = "void opal" + display_name = "rough void opal" + compresses_to = "void opal" + result_amount = 5 + spread_chance = 1 + ore = /obj/item/weapon/ore/void_opal + scan_icon = "mineral_rare" diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index ccdb94b09d..1641a39c8d 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -51,7 +51,7 @@ EQUIPMENT("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), EQUIPMENT("Mini-Translocator", /obj/item/device/perfect_tele/one_beacon, 1200), EQUIPMENT("Survival Equipment - Insulated Poncho", /obj/random/thermalponcho, 750), - + EQUIPMENT("Large Mining Satchel", /obj/item/weapon/storage/bag/ore/large, 1000), //CHOMPstation addition ) prize_list["Consumables"] = list( EQUIPMENT("1 Marker Beacon", /obj/item/stack/marker_beacon, 1), @@ -75,6 +75,7 @@ EQUIPMENT("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), EQUIPMENT("KA Efficiency Increase", /obj/item/borg/upgrade/modkit/efficiency, 1200), EQUIPMENT("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), + EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), EQUIPMENT("KA Holster", /obj/item/clothing/accessory/holster/waist/kinetic_accelerator, 350), EQUIPMENT("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), EQUIPMENT("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), @@ -82,7 +83,7 @@ EQUIPMENT("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 125), ) prize_list["Digging Tools"] = list( - // EQUIPMENT("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), + EQUIPMENT("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), //CHOMPstation re-addition // EQUIPMENT("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), EQUIPMENT("Resonator", /obj/item/resonator, 900), EQUIPMENT("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1200), diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 70efa94b82..f914f9a760 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -8,14 +8,11 @@ desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/ghost.dmi' icon_state = "ghost" - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 stat = DEAD canmove = 0 blinded = 0 anchored = 1 // don't get pushed around - invisibility = INVISIBILITY_OBSERVER + var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 @@ -90,27 +87,22 @@ var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns /mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - plane = PLANE_GHOSTS //Why doesn't the var above work...??? verbs += /mob/observer/dead/proc/dead_tele var/turf/T if(ismob(body)) T = get_turf(body) //Where is the body located? attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - - if (ishuman(body)) - var/mob/living/carbon/human/H = body - icon = H.icon - icon_state = H.icon_state - add_overlay(H.overlays_standing) //All our equipment sprites - else - icon = body.icon - icon_state = body.icon_state - add_overlay(body.overlays) - gender = body.gender if(body.mind && body.mind.name) name = body.mind.name @@ -125,6 +117,12 @@ mind = body.mind //we don't transfer the mind but we keep a reference to it. + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + add_overlay(H.overlays_standing) + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position forceMove(T) @@ -913,3 +911,8 @@ mob/observer/dead/MayRespawn(var/feedback = 0) to_chat(src, "(Click to re-enter)") if(sound) SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index bff705d0c5..2a8af56080 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -37,14 +37,15 @@ var/mob/M = mob spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes. if(M) - //VOREStation edit - if(istype(M, /mob/observer/dead/)) + if(isobserver(M)) + //VOREStation Edit Start var/mob/observer/dead/D = M if(ckey || (src in view(D))) M.show_message(message, m_type) + message = "[src] ([ghost_follow_link(src, M)]) [input]" else M.show_message(message, m_type) - //End VOREStation edit + //VOREStation Edit End for(var/obj in o_viewers) var/obj/O = obj diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 67a1b810d7..711dbd3085 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -12,11 +12,11 @@ visualnet = cameranet /mob/observer/eye/aiEye/Destroy() - if(owner) - var/mob/living/silicon/ai/ai = owner - ai.all_eyes -= src - owner = null - . = ..() + if(owner) + var/mob/living/silicon/ai/ai = owner + ai.all_eyes -= src + owner = null + . = ..() /mob/observer/eye/aiEye/setLoc(var/T, var/cancel_tracking = 1) if(owner) diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm index e6d1976fad..a678ff319c 100644 --- a/code/modules/mob/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/update_triggers.dm @@ -38,8 +38,8 @@ updateVisibility(src) return ..() -/obj/effect/New() - ..() +/obj/effect/Initialize() + . = ..() updateVisibility(src) // DOORS diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 8aad27762b..6813ae45e9 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -11,7 +11,7 @@ var/list/holder_mob_icon_cache = list() show_messages = 1 sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/head.dmi', SPECIES_VOX = 'icons/mob/species/vox/head.dmi' ) @@ -135,6 +135,18 @@ var/list/holder_mob_icon_cache = list() /obj/item/weapon/holder/mouse w_class = ITEMSIZE_TINY +/obj/item/weapon/holder/possum + origin_tech = list(TECH_BIO = 2) + +/obj/item/weapon/holder/possum/poppy + origin_tech = list(TECH_BIO = 2, TECH_ENGINEERING = 4) + +/obj/item/weapon/holder/cat + origin_tech = list(TECH_BIO = 2) + +/obj/item/weapon/holder/cat/runtime + origin_tech = list(TECH_BIO = 2, TECH_DATA = 4) + /obj/item/weapon/holder/borer origin_tech = list(TECH_BIO = 6) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 376a1fafa7..35df5ef8a1 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -244,11 +244,10 @@ var/list/slot_equipment_priority = list( \ if(hasvar(src,"wear_id")) if(src:wear_id) items += src:wear_id if(hasvar(src,"wear_mask")) if(src:wear_mask) items += src:wear_mask if(hasvar(src,"wear_suit")) if(src:wear_suit) items += src:wear_suit -// if(hasvar(src,"w_radio")) if(src:w_radio) items += src:w_radio commenting this out since headsets go on your ears now PLEASE DON'T BE MAD KEELIN if(hasvar(src,"w_uniform")) if(src:w_uniform) items += src:w_uniform - //if(hasvar(src,"l_hand")) if(src:l_hand) items += src:l_hand - //if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand + if(hasvar(src,"l_hand")) if(src:l_hand) items += src:l_hand + if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand return items diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index 649c9814d6..c2417a3b40 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -86,9 +86,9 @@ flags = RESTRICTED | HIVEMIND /datum/language/xenocommon - name = "Xenomorph" + name = "Xenolingua" //CHOMPedit colour = "alien" - desc = "The common tongue of the xenomorphs." + desc = "The common tongue of both the xenomorphs and the Genaprawns." //CHOMPedit speech_verb = "hisses" ask_verb = "hisses" exclaim_verb = "hisses" @@ -98,7 +98,7 @@ /datum/language/xenos name = "Hivemind" - desc = "Xenomorphs have the strange ability to commune over a psychic hivemind." + desc = "Some aliens have the strange ability to commune over a psychic hivemind." //CHOMPedit speech_verb = "hisses" ask_verb = "hisses" exclaim_verb = "hisses" diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index bf0bf3dd3a..08457ad628 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -187,7 +187,7 @@ else return pick(ai_names) -/datum/language/seromi +/datum/language/teshari name = LANGUAGE_SCHECHI desc = "A trilling language spoken by the diminutive Teshari." speech_verb = "chirps" @@ -203,9 +203,9 @@ "ci", "ri", "mi", "si", "ni", "ti", "li", "shi", "schi", "i", "i" ) -/datum/language/seromi/get_random_name(gender) - return ..(gender, 1, 4, 1.5) - +/datum/language/teshari/get_random_name(gender) + return ..(gender, 1, 4, 1.5) //CHOMPedit: Keep "1" as the second argument because tesharii here typically omit the pack name (thus only use 1 name). This is because + //CHOMPedit: there are very few packs and thus most tesharii would have the same first name. /datum/language/zaddat name = LANGUAGE_ZADDAT diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm index a68a94bf25..af7545e0a9 100644 --- a/code/modules/mob/language/station_vr.dm +++ b/code/modules/mob/language/station_vr.dm @@ -119,6 +119,20 @@ "ver", "stv", "pro", "ski" ) +/datum/language/clownish + name = LANGUAGE_CLOWNISH + desc = "A special elective language course for those studying at the Clown Planet Institute." + speech_verb = "honks" + ask_verb = "seins" + exclaim_verb = "crenks" + whisper_verb = "squeaks" + colour = "#F785F2" // Pink for the clown. + key = "<" + flags = WHITELISTED | CLOWN + syllables = list( + "honk", "knock", "salt", "slip", "lube", "banana", "flower", "pie", "did you hear", "🅱ï¸", "haha", "bully", "going up", + ) + /datum/language/drudakar name = LANGUAGE_DRUDAKAR desc = "The native language of the D'Rudak'Ar, a loosely tied together community of dragons and demi-dragons based in the Diul system. Features include many hard consonants and rolling 'r's." @@ -150,7 +164,7 @@ flags = 0 /datum/language/skrell flags = 0 -/datum/language/seromi +/datum/language/teshari flags = 0 /datum/language/zaddat flags = 0 diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index a7bd8ccbba..8e83063820 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -55,7 +55,7 @@ /mob/living/carbon/alien/get_default_language() if(default_language) return default_language - return GLOB.all_languages["Xenomorph"] + return GLOB.all_languages["Xenolingua"] //CHOMPedit /mob/living/carbon/alien/say_quote(var/message, var/datum/language/speaking = null) var/verb = "hisses" diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index fb49502d74..6582b5f6a8 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -12,5 +12,5 @@ /mob/living/carbon/alien/larva/Initialize() . = ..() - add_language("Xenomorph") //Bonus language. + add_language("Xenolingua") //Bonus language. CHOMPedit internal_organs |= new /obj/item/organ/internal/xenos/hivenode(src) diff --git a/code/modules/mob/living/carbon/alien/larva/progression.dm b/code/modules/mob/living/carbon/alien/larva/progression.dm index ada8f937a5..8232cff363 100644 --- a/code/modules/mob/living/carbon/alien/larva/progression.dm +++ b/code/modules/mob/living/carbon/alien/larva/progression.dm @@ -9,9 +9,9 @@ to_chat(src, "There are three to choose from:") to_chat(src, "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.") to_chat(src, "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.") - to_chat(src, "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.") + to_chat(src, "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded Genaprawn queen.") //CHOMPedit var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone") - return alien_caste ? "Xenomorph [alien_caste]" : null + return alien_caste ? "Genaprawn [alien_caste]" : null //CHOMPedit /mob/living/carbon/alien/larva/show_evolution_blurb() return diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 52d0a839e2..89ff4151fb 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -54,9 +54,7 @@ return if(!typing_indicator) - typing_indicator = new - typing_indicator.icon = 'icons/mob/talk_vr.dmi' //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons - typing_indicator.icon_state = "[speech_bubble_appearance()]_typing" + init_typing_indicator("[speech_bubble_appearance()]_typing") if(state && !typing) loc.add_overlay(typing_indicator, TRUE) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index fa55f0c087..d5ee2f52ce 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -465,3 +465,82 @@ clear_alert("handcuffed") update_action_buttons() //some of our action buttons might be unusable when we're handcuffed. update_inv_handcuffed() + +// Clears blood overlays +/mob/living/carbon/clean_blood() + . = ..() + if(src.r_hand) + src.r_hand.clean_blood() + if(src.l_hand) + src.l_hand.clean_blood() + if(src.back) + if(src.back.clean_blood()) + src.update_inv_back(0) + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + var/washgloves = 1 + var/washshoes = 1 + var/washmask = 1 + var/washears = 1 + var/washglasses = 1 + + if(H.wear_suit) + washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES) + washshoes = !(H.wear_suit.flags_inv & HIDESHOES) + + if(H.head) + washmask = !(H.head.flags_inv & HIDEMASK) + washglasses = !(H.head.flags_inv & HIDEEYES) + washears = !(H.head.flags_inv & HIDEEARS) + + if(H.wear_mask) + if (washears) + washears = !(H.wear_mask.flags_inv & HIDEEARS) + if (washglasses) + washglasses = !(H.wear_mask.flags_inv & HIDEEYES) + + if(H.head) + if(H.head.clean_blood()) + H.update_inv_head() + + if(H.wear_suit) + if(H.wear_suit.clean_blood()) + H.update_inv_wear_suit() + + else if(H.w_uniform) + if(H.w_uniform.clean_blood()) + H.update_inv_w_uniform() + + if(H.gloves && washgloves) + if(H.gloves.clean_blood()) + H.update_inv_gloves(0) + + if(H.shoes && washshoes) + if(H.shoes.clean_blood()) + H.update_inv_shoes(0) + + if(H.wear_mask && washmask) + if(H.wear_mask.clean_blood()) + H.update_inv_wear_mask(0) + + if(H.glasses && washglasses) + if(H.glasses.clean_blood()) + H.update_inv_glasses(0) + + if(H.l_ear && washears) + if(H.l_ear.clean_blood()) + H.update_inv_ears(0) + + if(H.r_ear && washears) + if(H.r_ear.clean_blood()) + H.update_inv_ears(0) + + if(H.belt) + if(H.belt.clean_blood()) + H.update_inv_belt(0) + + else + if(src.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags + if(src.wear_mask.clean_blood()) + src.update_inv_wear_mask(0) diff --git a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm index 7b222d8a61..1f15f6a07a 100644 --- a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm +++ b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm @@ -140,6 +140,6 @@ to_wear_r_hand = null /mob/living/carbon/human/ai_controlled/replicant/Initialize() - ..() + . = ..() name = species.get_random_name(gender) add_modifier(/datum/modifier/homeothermic, 0, null) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 5ca8530208..81a49ae6fe 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -91,6 +91,16 @@ message = "squishes." m_type = 1 + if("chirp") + /* VOREStation Removal Start - Eh. People can chirp maybe. + if ((species.bump_flag != SLIME) && (species.name != SPECIES_DIONA)) + to_chat(src, "You are not a diona or slime!") + return + */ //VOREStation Removal End + playsound(src, 'sound/misc/nymphchirp.ogg', 50, 0) + message = "chirps." + m_type = 2 + //Skrell-only emotes if("warble") if(species.name != SPECIES_SKRELL) @@ -255,7 +265,7 @@ var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs robotic = 1 - if(!robotic) + if(!robotic && !isSynthetic()) message = "coughs!" if(get_gender() == FEMALE) if(species.female_cough_sounds) @@ -490,7 +500,7 @@ message = "points to [M]." else m_type = 1 - + if("crack") if(!restrained()) message = "cracks [T.his] knuckles." @@ -550,7 +560,7 @@ var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs robotic = 1 - if(!robotic) + if(!robotic && !isSynthetic()) message = "sneezes." if(get_gender() == FEMALE) playsound(src, species.female_sneeze_sound, 70, preference = /datum/client_preference/emote_noises) //VOREStation Add @@ -747,23 +757,99 @@ if("whistle" || "whistles") if(!muzzled) - message = "whistles a tune." - playsound(src, 'sound/misc/longwhistle.ogg', preference = /datum/client_preference/emote_noises) //VOREStation Add + if(!isSynthetic()) + message = "whistles a tune." + playsound(src, 'sound/voice/longwhistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) //praying this doesn't get abused + else + message = "whistles a robotic tune." + playsound(src, 'sound/voice/longwhistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) else message = "makes a light spitting noise, a poor attempt at a whistle." if("qwhistle") if(!muzzled) - message = "whistles quietly." - playsound(src, 'sound/misc/shortwhistle.ogg', preference = /datum/client_preference/emote_noises) //VOREStation Add + if(!isSynthetic()) + message = "whistles quietly." + playsound(src, 'sound/voice/shortwhistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) + else + message = "whistles robotically." + playsound(src, 'sound/voice/shortwhistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) else message = "makes a light spitting noise, a poor attempt at a whistle." + if("wwhistle") + if(!muzzled) + if(!isSynthetic()) + message = "whistles inappropriately." + playsound(src, 'sound/voice/wolfwhistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) + else + message = "beeps inappropriately." + playsound(src, 'sound/voice/wolfwhistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) + else + message = "makes a light spitting noise, a poor attempt at a whistle." + + if("swhistle") + if(!muzzled) + if(!isSynthetic()) + message = "summon whistles." + playsound(src, 'sound/voice/summon_whistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) + else + message = "summon whistles robotically." + playsound(src, 'sound/voice/summon_whistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) + else + message = "makes a light spitting noise, a poor attempt at a whistle." + + if("flip") + m_type = 1 + if (!src.restrained()) + //message = "performs an amazing, gravity-defying backflip before landing skillfully back to the ground." + playsound(src.loc, 'sound/effects/bodyfall4.ogg', 50, 1) + src.SpinAnimation(7,1) + else + to_chat(usr, "You can't quite do something as difficult as a backflip while so... restricted.") + + if("spin") + m_type = 1 + if (!src.restrained()) + //message = "spins in a dance smoothly on their feet. Wow!" + src.spin(20, 1) + else + to_chat(usr, "You can't quite do something as difficult as a spin while so... restricted.") + + if("floorspin") + m_type = 1 + if (!src.restrained()) + //message = "gets down on the floor and spins their entire body around!" + spawn(0) + for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) + set_dir(i) + sleep(1) + src.SpinAnimation(20,1) + else + to_chat(usr, "You can't quite do something as difficult as a spin while so... restricted.") + + if("sidestep") + m_type = 1 + if (!src.restrained()) + //message = "steps rhymatically and conservatively as they move side to side." + playsound(src.loc, 'sound/effects/bodyfall4.ogg', 50, 1) + var/default_pixel_x = initial(pixel_x) + var/default_pixel_y = initial(pixel_y) + default_pixel_x = src.default_pixel_x + default_pixel_y = src.default_pixel_y + + animate(src, pixel_x = 5, time = 20) + sleep(3) + animate(src, pixel_x = -5, time = 20) + animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, time = 2) + else + to_chat(usr, "Sidestepping sure seems unachieveable when you're this restricted.") + if("help") to_chat(src, "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cross, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \ frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, \ - raise, salute, scream, sneeze, shake, shiver, shrug, sigh, signal-#1-10, slap-(none)/mob, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch, \ - twitch_v, vomit, whimper, wink, yawn. Prometheans: squish Synthetics: beep, buzz, dwoop, yes, no, rcough, rsneeze, ping. Skrell: warble") + qwhistle, raise, salute, scream, sneeze, shake, shiver, shrug, sigh, signal-#1-10, slap-(none)/mob, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, swhistle, \ + tremble, twitch, twitch_v, vomit, whimper, wink, whistle, wwhistle, yawn. Prometheans: squish Synthetics: beep, buzz, dwoop, yes, no, rcough, rsneeze, ping. Skrell: warble") else to_chat(src, "Unusable emote '[act]'. Say *help or *vhelp for a list.") //VOREStation Edit, mention *vhelp for Virgo-specific emotes located in emote_vr.dm. @@ -820,3 +906,27 @@ HTML +="\[Done\]" HTML += "" src << browse(HTML, "window=flavor_changes;size=430x300") + +/mob/living/carbon/human/proc/toggle_tail(var/setting,var/message = 0) + if(!tail_style || !tail_style.ani_state) + if(message) + to_chat(src, "You don't have a tail that supports this.") + return 0 + + var/new_wagging = isnull(setting) ? !wagging : setting + if(new_wagging != wagging) + wagging = new_wagging + update_tail_showing() + return 1 + +/mob/living/carbon/human/proc/toggle_wing(var/setting,var/message = 0) + if(!wing_style || !wing_style.ani_state) + if(message) + to_chat(src, "You don't have a wingtype that supports this.") + return 0 + + var/new_flapping = isnull(setting) ? !flapping : setting + if(new_flapping != flapping) + flapping = setting + update_wing_showing() + return 1 diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index bd9e2dae7f..5eeda3a8e4 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -9,13 +9,13 @@ switch(act) if("vwag") - if(toggle_tail_vr(message = 1)) + if(toggle_tail(message = 1)) m_type = 1 message = "[wagging ? "starts" : "stops"] wagging their tail." else return 1 if("vflap") - if(toggle_wing_vr(message = 1)) + if(toggle_wing(message = 1)) m_type = 1 message = "[flapping ? "starts" : "stops"] flapping their wings." else @@ -193,8 +193,12 @@ handle_flip_vr() message = "does a flip!" m_type = 1 + if("roarbark") //Roarbark is CHOMP Addition + message = "lets out a roar-bark!" + m_type = 2 //Also full disclosure this sounds AWFUL with the normal pitch shifting + playsound(loc, 'sound/voice/roarbark.ogg', 50, 0, preference = /datum/client_preference/emote_noises) if("vhelp") //Help for Virgo-specific emotes. - to_chat(src, "vwag, vflap, mlem, blep, awoo, awoo2, growl, nya, peep, chirp, hoot, weh, merp, myarp, bark, bork, mrow, mrowl, hypno, howl, hiss, rattle, squeak, geck, baa, baa2, mar, wurble, snort, meow, moo, croak, gao, cackle, nsay, nme, flip") //CHOMP Addition: adds howl to list since YW didn't + to_chat(src, "vwag, vflap, mlem, blep, awoo, awoo2, growl, nya, peep, chirp, hoot, weh, merp, myarp, bark, bork, mrow, mrowl, hypno, howl, hiss, rattle, squeak, geck, baa, baa2, mar, wurble, snort, meow, moo, croak, gao, cackle, nsay, nme, flip, roarbark") //CHOMP Addition: adds howl to list since YW didn't return TRUE if(message) @@ -203,6 +207,14 @@ return FALSE +/mob/living/carbon/human/verb/toggle_resizing_immunity() + set name = "Toggle Resizing Immunity" + set desc = "Toggles your ability to resist resizing attempts" + set category = "IC" + + resizable = !resizable + to_chat(src, "You are now [resizable ? "susceptible" : "immune"] to being resized.") + /mob/living/carbon/human/proc/handle_flip_vr() var/original_density = density @@ -229,30 +241,6 @@ density = original_density pass_flags = original_passflags -/mob/living/carbon/human/proc/toggle_tail_vr(var/setting,var/message = 0) - if(!tail_style || !tail_style.ani_state) - if(message) - to_chat(src, "You don't have a tail that supports this.") - return 0 - - var/new_wagging = isnull(setting) ? !wagging : setting - if(new_wagging != wagging) - wagging = new_wagging - update_tail_showing() - return 1 - -/mob/living/carbon/human/proc/toggle_wing_vr(var/setting,var/message = 0) - if(!wing_style || !wing_style.ani_state) - if(message) - to_chat(src, "You don't have a tail that supports this.") - return 0 - - var/new_flapping = isnull(setting) ? !flapping : setting - if(new_flapping != flapping) - flapping = setting - update_wing_showing() - return 1 - /mob/living/carbon/human/verb/toggle_gender_identity_vr() set name = "Set Gender Identity" set desc = "Sets the pronouns when examined and performing an emote." diff --git a/code/modules/mob/living/carbon/human/gradient.dm b/code/modules/mob/living/carbon/human/gradient.dm index 7a0e1d37f1..d7513f38f8 100644 --- a/code/modules/mob/living/carbon/human/gradient.dm +++ b/code/modules/mob/living/carbon/human/gradient.dm @@ -2,5 +2,13 @@ GLOBAL_LIST_INIT(hair_gradients, list( "None" = "none", "Fade (Up)" = "fadeup", "Fade (Down)" = "fadedown", - "Vertical Split" = "vsplit" + "Fade Low (Up)" = "fadeup_low", + "Bottom Flat" = "bottomflat", + "Fade Low (Down)" = "fadedown_low", + "Vertical Split" = "vsplit", + "Reflected" = "reflected", + "Reflected (Inverted)" = "reflected_inverse", + "Reflected High" = "reflected_high", + "Reflected High (Inverted)" = "reflected_inverse_high", + "Wavy" = "wavy" )) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c4480cf5ae..d0ddfa70d3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1076,7 +1076,7 @@ if(species) - if(species.name && species.name == new_species) + if(species.name && species.name == new_species && species.name != "Custom Species") //VOREStation Edit return if(species.language) remove_language(species.language) @@ -1097,8 +1097,8 @@ if(species.default_language) add_language(species.default_language) - //if(species.icon_scale_x != 1 || species.icon_scale_y != 1) //VOREStation Removal - // update_transform() //VOREStation Removal + if(species.icon_scale_x != 1 || species.icon_scale_y != 1) + update_transform() if(example) //VOREStation Edit begin if(!(example == src)) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 208e1e1ffc..34b93b2573 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -118,3 +118,42 @@ inventory_panel_type = /datum/inventory_panel/human butchery_loot = list(/obj/item/stack/animalhide/human = 1) + + // Horray Furries! + var/datum/sprite_accessory/ears/ear_style = null + var/r_ears = 30 + var/g_ears = 30 + var/b_ears = 30 + var/r_ears2 = 30 + var/g_ears2 = 30 + var/b_ears2 = 30 + var/r_ears3 = 30 //Trust me, we could always use more colour. No japes. + var/g_ears3 = 30 + var/b_ears3 = 30 + var/datum/sprite_accessory/tail/tail_style = null + var/r_tail = 30 + var/g_tail = 30 + var/b_tail = 30 + var/r_tail2 = 30 + var/g_tail2 = 30 + var/b_tail2 = 30 + var/r_tail3 = 30 + var/g_tail3 = 30 + var/b_tail3 = 30 + var/datum/sprite_accessory/wing/wing_style = null + var/r_wing = 30 + var/g_wing = 30 + var/b_wing = 30 + var/r_wing2 = 30 + var/g_wing2 = 30 + var/b_wing2 = 30 + var/r_wing3 = 30 + var/g_wing3 = 30 + var/b_wing3 = 30 + + var/wagging = 0 //UGH. + var/flapping = 0 + + // Custom Species Name + var/custom_species + diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm index d95a49da1b..0ac1b641d3 100644 --- a/code/modules/mob/living/carbon/human/human_defines_vr.dm +++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm @@ -3,12 +3,11 @@ g_skin = 206 b_skin = 179 - var/wagging = 0 //UGH. - var/flapping = 0 var/vantag_pref = VANTAG_NONE //What's my status? var/impersonate_bodytype //For impersonating a bodytype var/ability_flags = 0 //Shadekin abilities/potentially other species-based? var/sensorpref = 5 //Suit sensor loadout pref + var/unnaturally_resized = FALSE //If one became larger than 200%, or smaller than 25%. This flag is needed for the case when admins want someone to be very big or very small outside of dorms. var/wings_hidden = FALSE var/nutrition_hidden = FALSE // Chomp Edit diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 9b334429d8..d956a8e4af 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -209,6 +209,20 @@ plane_holder.set_vis(vis,FALSE) vis_enabled -= vis +/mob/living/carbon/human/get_restraining_bolt() + var/obj/item/weapon/implant/restrainingbolt/RB + + for(var/obj/item/organ/external/EX in organs) + RB = locate() in EX + if(istype(RB) && !(RB.malfunction)) + break + + if(RB) + if(!RB.malfunction) + return TRUE + + return FALSE + #undef HUMAN_EATING_NO_ISSUE #undef HUMAN_EATING_NO_MOUTH #undef HUMAN_EATING_BLOCKED_MOUTH diff --git a/code/modules/mob/living/carbon/human/human_modular_limbs.dm b/code/modules/mob/living/carbon/human/human_modular_limbs.dm new file mode 100644 index 0000000000..471e8a42cd --- /dev/null +++ b/code/modules/mob/living/carbon/human/human_modular_limbs.dm @@ -0,0 +1,196 @@ +/* + A system for easily and quickly removing your own bodyparts, with a view towards + swapping them out for new ones, or just doing it as a party trick to horrify an + audience. Current implementation only supports robolimbs and uses a modular_bodypart + value on the manufacturer datum, but I have tried to keep it generic for future work. + PS. jesus christ this was meant to be a half an hour port +*/ + +// External organ procs: +// Does this bodypart count as a modular limb, and if so, what kind? +/obj/item/organ/external/proc/get_modular_limb_category() + . = MODULAR_BODYPART_INVALID + if(robotic >= ORGAN_ROBOT && model) + var/datum/robolimb/manufacturer = all_robolimbs[model] + if(!isnull(manufacturer?.modular_bodyparts)) + . = manufacturer.modular_bodyparts + +// Checks if a limb could theoretically be removed. +// Note that this does not currently bother checking if a child or internal organ is vital. +/obj/item/organ/external/proc/can_remove_modular_limb(var/mob/living/carbon/human/user) + if(vital || cannot_amputate) + return FALSE + var/bodypart_cat = get_modular_limb_category() + if(bodypart_cat == MODULAR_BODYPART_CYBERNETIC) + if(!parent_organ) + return FALSE + var/obj/item/organ/external/parent = user?.get_organ(parent_organ) + if(!parent || parent.get_modular_limb_category(user) < MODULAR_BODYPART_CYBERNETIC) + return FALSE + . = (bodypart_cat != MODULAR_BODYPART_INVALID) + +// Note that this proc is checking if the organ can be attached -to-, not attached itself. +/obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/carbon/human/user) + var/list/limb_data = user?.species?.has_limbs[organ_tag] + if(islist(limb_data) && limb_data["has_children"] > 0) + . = (length(children) < limb_data["has_children"]) + +/obj/item/organ/external/proc/can_be_attached_modular_limb(var/mob/living/carbon/user) + var/bodypart_cat = get_modular_limb_category() + if(bodypart_cat == MODULAR_BODYPART_INVALID) + return FALSE + if(!parent_organ) + return FALSE + var/obj/item/organ/external/parent = user?.get_organ(parent_organ) + if(!parent) + return FALSE + if(!parent.can_attach_modular_limb_here(user)) + return FALSE + if(bodypart_cat == MODULAR_BODYPART_CYBERNETIC && parent.get_modular_limb_category(src) < MODULAR_BODYPART_CYBERNETIC) + return FALSE + return TRUE + +// Checks if an organ (or the parent of one) is in a fit state for modular limb stuff to happen. +/obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/carbon/human/user) + . = damage >= min_broken_damage || (status & ORGAN_BROKEN) || is_stump() // can't use is_broken() as the limb has ORGAN_CUT_AWAY + +// Human mob procs: +// Checks the organ list for limbs meeting a predicate. Way overengineered for such a limited use +// case but I can see it being expanded in the future if meat limbs or doona limbs use it. +/mob/living/carbon/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc) + for(var/bp in organs) + var/obj/item/organ/external/E = bp + if(!validate_proc || call(E, validate_proc)(src) > MODULAR_BODYPART_INVALID) + LAZYADD(., E) + if(return_first_found) + return + // Prune children so we can't remove every individual component of an entire prosthetic arm + // piece by piece. Technically a circular dependency here would remove the limb entirely but + // if there's a parent whose child is also its parent, there's something wrong regardless. + for(var/bp in .) + var/obj/item/organ/external/E = bp + if(length(E.children)) + . -= E.children + +// Called in robotize(), replaced() and removed() to update our modular limb verbs. +/mob/living/carbon/human/proc/refresh_modular_limb_verbs() + if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_attach_modular_limb_here))) + verbs |= .proc/attach_limb_verb + else + verbs -= .proc/attach_limb_verb + if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb))) + verbs |= .proc/detach_limb_verb + else + verbs -= .proc/detach_limb_verb + +// Proc helper for attachment verb. +/mob/living/carbon/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E) + if(world.time < last_special + (2 SECONDS) || get_active_hand() != E) + return FALSE + if(incapacitated() || restrained()) + to_chat(src, SPAN_WARNING("You can't do that in your current state!")) + return FALSE + if(QDELETED(E) || !istype(E)) + to_chat(src, SPAN_WARNING("You are not holding a compatible limb to attach.")) + return FALSE + if(!E.can_be_attached_modular_limb(src)) + to_chat(src, SPAN_WARNING("\The [E] cannot be attached to your current body.")) + return FALSE + if(E.get_modular_limb_category() <= MODULAR_BODYPART_INVALID) + to_chat(src, SPAN_WARNING("\The [E] cannot be attached by your own hand.")) + return FALSE + var/install_to_zone = E.organ_tag + if(!isnull(get_organ(install_to_zone))) + to_chat(src, SPAN_WARNING("There is already a limb attached at that part of your body.")) + return FALSE + if(E.check_modular_limb_damage(src)) + to_chat(src, SPAN_WARNING("\The [E] is too damaged to be attached.")) + return FALSE + var/obj/item/organ/external/parent = E.parent_organ && get_organ(E.parent_organ) + if(!parent) + to_chat(src, SPAN_WARNING("\The [E] needs an existing limb to be attached to.")) + return FALSE + if(parent.check_modular_limb_damage(src)) + to_chat(src, SPAN_WARNING("Your [parent.name] is too damaged to have anything attached.")) + return FALSE + return TRUE + +// Proc helper for detachment verb. +/mob/living/carbon/human/proc/check_can_detach_modular_limb(var/obj/item/organ/external/E) + if(world.time < last_special + (2 SECONDS)) + return FALSE + if(incapacitated() || restrained()) + to_chat(src, SPAN_WARNING("You can't do that in your current state!")) + return FALSE + if(!istype(E) || QDELETED(src) || QDELETED(E) || E.owner != src || E.loc != src) + return FALSE + if(E.check_modular_limb_damage(src)) + to_chat(src, SPAN_WARNING("That limb is too damaged to be removed!")) + return FALSE + var/obj/item/organ/external/parent = E.parent_organ && get_organ(E.parent_organ) + if(!parent) + return FALSE + if(parent.check_modular_limb_damage(src)) + to_chat(src, SPAN_WARNING("Your [parent.name] is too damaged to detach anything from it.")) + return FALSE + return (E in get_modular_limbs(return_first_found = FALSE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb)) + +// Verbs below: +// Add or remove robotic limbs; check refresh_modular_limb_verbs() above. +/mob/living/carbon/human/proc/attach_limb_verb() + set name = "Attach Limb" + set category = "Object" + set desc = "Attach a replacement limb." + set usr = src + + var/obj/item/organ/external/E = get_active_hand() + if(!check_can_attach_modular_limb(E)) + return FALSE + if(!do_after(src, 2 SECONDS, src)) + return FALSE + if(!check_can_attach_modular_limb(E)) + return FALSE + + last_special = world.time + drop_from_inventory(E) + E.replaced(src) + + // Reconnect the organ and children as normally this is done with surgery. + E.status &= ~ORGAN_CUT_AWAY + for(var/obj/item/organ/external/child in E.children) + child.status &= ~ORGAN_CUT_AWAY + + var/datum/gender/G = gender_datums[gender] + visible_message( + SPAN_NOTICE("\The [src] attaches \the [E] to [G.his] body!"), + SPAN_NOTICE("You attach \the [E] to your body!")) + regenerate_icons() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance. + return TRUE + +/mob/living/carbon/human/proc/detach_limb_verb() + set name = "Remove Limb" + set category = "Object" + set desc = "Detach one of your limbs." + set usr = src + + var/list/detachable_limbs = get_modular_limbs(return_first_found = FALSE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb) + if(!length(detachable_limbs)) + to_chat(src, SPAN_WARNING("You have no detachable limbs.")) + return FALSE + var/obj/item/organ/external/E = input(usr, "Which limb do you wish to detach?", "Limb Removal") as null|anything in detachable_limbs + if(!check_can_detach_modular_limb(E)) + return FALSE + if(!do_after(src, 2 SECONDS, src)) + return FALSE + if(!check_can_detach_modular_limb(E)) + return FALSE + + last_special = world.time + E.removed(src) + E.dropInto(loc) + put_in_hands(E) + var/datum/gender/G = gender_datums[gender] + visible_message( + SPAN_NOTICE("\The [src] detaches [G.his] [E.name]!"), + SPAN_NOTICE("You detach your [E.name]!")) + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 831ec542fc..cc48565ff4 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -196,3 +196,11 @@ var/list/all_bits = internal_organs|organs for(var/obj/item/organ/O in all_bits) O.set_dna(dna) + +/mob/living/carbon/human/proc/set_gender(var/g) + if(g != gender) + gender = g + + if(dna.GetUIState(DNA_UI_GENDER) ^ gender == FEMALE) // XOR will catch both cases where they do not match + dna.SetUIState(DNA_UI_GENDER, gender == FEMALE) + sync_organ_dna(dna) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index d63b866e6f..d7c66d5289 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -366,7 +366,7 @@ return var/datum/robolimb/robohead = all_robolimbs[E.model] if(!robohead.monitor_styles || !robohead.monitor_icon) - to_chat(src,"Your head doesn't have a monitor or it doens't support to be changed!") + to_chat(src,"Your head doesn't have a monitor, or it doesn't support being changed!") return var/list/states if(!states) diff --git a/code/modules/mob/living/carbon/human/human_powers_vr.dm b/code/modules/mob/living/carbon/human/human_powers_vr.dm index d21fbfeb05..72eda2e609 100644 --- a/code/modules/mob/living/carbon/human/human_powers_vr.dm +++ b/code/modules/mob/living/carbon/human/human_powers_vr.dm @@ -22,7 +22,7 @@ if(stat) to_chat(src, "You must be awake and standing to perform this action!") return - var/obj/item/organ/external/head/vr/H = organs_by_name[BP_HEAD] + var/obj/item/organ/external/head/H = organs_by_name[BP_HEAD] if(!H) to_chat(src, "You don't seem to have a head!") return @@ -30,8 +30,9 @@ H.eyes_over_markings = !H.eyes_over_markings update_icons_body() - var/datum/robolimb/robohead = all_robolimbs[H.model] - if(robohead.monitor_styles && robohead.monitor_icon) - to_chat(src, "You reconfigure the rendering order of your facial display.") + if(H.robotic) + var/datum/robolimb/robohead = all_robolimbs[H.model] + if(robohead.monitor_styles && robohead.monitor_icon) + to_chat(src, "You reconfigure the rendering order of your facial display.") return TRUE diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 379dfd4b8f..4a7e731be1 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -215,7 +215,6 @@ This saves us from having to call add_fingerprint() any time something is put in if(slot_back) src.back = W W.equipped(src, slot) - worn_clothing += back update_inv_back() if(slot_wear_mask) src.wear_mask = W @@ -223,7 +222,6 @@ This saves us from having to call add_fingerprint() any time something is put in update_hair() //rebuild hair update_inv_ears() W.equipped(src, slot) - worn_clothing += wear_mask update_inv_wear_mask() if(slot_handcuffed) src.handcuffed = W @@ -243,7 +241,6 @@ This saves us from having to call add_fingerprint() any time something is put in if(slot_belt) src.belt = W W.equipped(src, slot) - worn_clothing += belt update_inv_belt() if(slot_wear_id) src.wear_id = W @@ -272,11 +269,11 @@ This saves us from having to call add_fingerprint() any time something is put in if(slot_glasses) src.glasses = W W.equipped(src, slot) + worn_clothing += glasses update_inv_glasses() if(slot_gloves) src.gloves = W W.equipped(src, slot) - worn_clothing += glasses update_inv_gloves() if(slot_head) src.head = W @@ -287,22 +284,18 @@ This saves us from having to call add_fingerprint() any time something is put in if(istype(W,/obj/item/clothing/head/kitty)) W.update_icon(src) W.equipped(src, slot) - worn_clothing += head update_inv_head() if(slot_shoes) src.shoes = W W.equipped(src, slot) - worn_clothing += shoes update_inv_shoes() if(slot_wear_suit) src.wear_suit = W W.equipped(src, slot) - worn_clothing += wear_suit update_inv_wear_suit() if(slot_w_uniform) src.w_uniform = W W.equipped(src, slot) - worn_clothing += w_uniform update_inv_w_uniform() if(slot_l_store) src.l_store = W @@ -405,4 +398,4 @@ This saves us from having to call add_fingerprint() any time something is put in if(l_hand) . += l_hand if(r_hand) - . += r_hand \ No newline at end of file + . += r_hand diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bce7209e18..2aa278df11 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -62,6 +62,8 @@ //No need to update all of these procs if the guy is dead. fall() //VORESTATION EDIT. Prevents people from floating + if(unnaturally_resized) //VORESTATION EDIT. + handle_unnatural_size() if(stat != DEAD && !stasis) //Updates the number of stored chemicals for powers handle_changeling() @@ -69,7 +71,8 @@ //Organs and blood handle_organs() stabilize_body_temperature() //Body temperature adjusts itself (self-regulation) - weightgain() //VORESTATION EDIT + weightgain() //VOREStation Addition + process_weaver_silk() //VOREStation Addition handle_shock() handle_pain() @@ -77,7 +80,7 @@ handle_medical_side_effects() handle_heartbeat() - handle_nif() //VOREStation Add + handle_nif() //VOREStation Addition if(!client) species.handle_npc(src) @@ -1306,7 +1309,7 @@ clear_alert("blind") var/apply_nearsighted_overlay = FALSE - if(disabilities & NEARSIGHTED) + if(disabilities & NEARSIGHTED) apply_nearsighted_overlay = TRUE if(glasses) @@ -1569,7 +1572,8 @@ custom_pain("[pick("It hurts so much", "You really need some painkillers", "Dear god, the pain")]!", 40) if(shock_stage >= 30) - if(shock_stage == 30) emote("me",1,"is having trouble keeping their eyes open.") + if(shock_stage == 30 && !isbelly(loc)) //VOREStation Edit + emote("me",1,"is having trouble keeping their eyes open.") eye_blurry = max(2, eye_blurry) stuttering = max(stuttering, 5) @@ -1577,7 +1581,8 @@ to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") if (shock_stage >= 60) - if(shock_stage == 60) emote("me",1,"'s body becomes limp.") + if(shock_stage == 60 && !isbelly(loc)) //VOREStation Edit + emote("me",1,"'s body becomes limp.") if (prob(2)) to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") Weaken(20) @@ -1593,7 +1598,8 @@ Paralyse(5) if(shock_stage == 150) - emote("me",1,"can no longer stand, collapsing!") + if(!isbelly(loc)) //VOREStation Edit + emote("me",1,"can no longer stand, collapsing!") Weaken(20) if(shock_stage >= 150) diff --git a/code/modules/mob/living/carbon/human/life_vr.dm b/code/modules/mob/living/carbon/human/life_vr.dm index a513fc3df0..2440a1ab74 100644 --- a/code/modules/mob/living/carbon/human/life_vr.dm +++ b/code/modules/mob/living/carbon/human/life_vr.dm @@ -6,6 +6,14 @@ else if (nutrition <= MAX_NUTRITION_TO_LOSE && stat != 2 && weight > MIN_MOB_WEIGHT && weight_loss) weight -= species.metabolism*(0.01*weight_loss) // starvation weight loss +/mob/living/carbon/human/proc/process_weaver_silk() + if(!species || !(species.is_weaver)) + return + + if(species.silk_reserve < species.silk_max_reserve && species.silk_production == TRUE && nutrition > 100) + species.silk_reserve = min(species.silk_reserve + 2, species.silk_max_reserve) + adjust_nutrition(-0.4) + /mob/living/carbon/human/proc/handle_hud_list_vr() //Right-side status hud updates with left side one. @@ -60,13 +68,20 @@ //Overriding carbon move proc that forces default hunger factor /mob/living/carbon/Moved(atom/old_loc, direction, forced = FALSE) . = ..() - + // Technically this does mean being dragged takes nutrition if(stat != DEAD) adjust_nutrition(hunger_rate/-10) if(m_intent == "run") adjust_nutrition(hunger_rate/-10) - + // Moving around increases germ_level faster if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8)) - germ_level++ \ No newline at end of file + germ_level++ + +/mob/living/carbon/human/proc/handle_unnatural_size() + if(!in_dorms()) + if(src.size_multiplier > 2) + src.resize(2) + else if (src.size_multiplier < 0.25) + src.resize(0.25) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index b96c22e207..e4303081e3 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -184,7 +184,7 @@ /mob/living/carbon/human/handle_speech_sound() var/list/returns[2] - if(species.speech_sounds && prob(species.speech_chance)) + if(species.speech_sounds && species.speech_sounds.len && prob(species.speech_chance)) //VOREStation Edit: Sanity Check returns[1] = sound(pick(species.speech_sounds)) returns[2] = 50 return returns diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm index 3566010050..3604e201f3 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/event.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm @@ -122,7 +122,7 @@ Variables you may want to make use of are: has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head), + BP_HEAD = list("path" = /obj/item/organ/external/head), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), diff --git a/code/modules/mob/living/carbon/human/species/shadekin/_defines.dm b/code/modules/mob/living/carbon/human/species/shadekin/_defines.dm index f24544e0b2..e8574bf5eb 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/_defines.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/_defines.dm @@ -3,4 +3,12 @@ #define SHIFTED_OR_NOT 3 #define AB_PHASE_SHIFTED 0x1 -#define AB_SHADE_REGEN 0x2 \ No newline at end of file +#define AB_SHADE_REGEN 0x2 + +//Porting over the type system of the mobs +#define BLUE_EYES 1 +#define RED_EYES 2 +#define PURPLE_EYES 3 +#define YELLOW_EYES 4 +#define GREEN_EYES 5 +#define ORANGE_EYES 6 diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index c7871db8aa..5cf9fa8f73 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -25,7 +25,7 @@ male_scream_sound = null //CHOMPedit female_scream_sound = null //CHOMPedit - siemens_coefficient = 0 + siemens_coefficient = 1 darksight = 10 slowdown = -0.5 @@ -58,7 +58,7 @@ base_color = "#f0f0f0" color_mult = 1 - has_glowing_eyes = TRUE + // has_glowing_eyes = TRUE //Applicable through neutral taits. death_message = "phases to somewhere far away!" male_cough_sounds = null @@ -94,7 +94,7 @@ has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/shadekin), + BP_HEAD = list("path" = /obj/item/organ/external/head/shadekin), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), @@ -110,6 +110,9 @@ /datum/power/shadekin/regenerate_other, /datum/power/shadekin/create_shade) var/list/shadekin_ability_datums = list() + var/kin_type + var/energy_light = 0.25 + var/energy_dark = 0.75 /datum/species/shadekin/New() ..() @@ -166,18 +169,21 @@ var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0 darkness = 1-brightness //Invert + var/is_dark = (darkness >= 0.5) if(H.ability_flags & AB_PHASE_SHIFTED) dark_gains = 0 else //Heal (very) slowly in good darkness - if(darkness >= 0.75) - H.adjustFireLoss(-0.05) - H.adjustBruteLoss(-0.05) - H.adjustToxLoss(-0.05) - dark_gains = 0.75 + if(is_dark) + H.adjustFireLoss((-0.10)*darkness) + H.adjustBruteLoss((-0.10)*darkness) + H.adjustToxLoss((-0.10)*darkness) + //energy_dark and energy_light are set by the shadekin eye traits. + //These are balanced around their playstyles and 2 planned new aggressive abilities + dark_gains = energy_dark else - dark_gains = 0.25 + dark_gains = energy_light set_energy(H, get_energy(H) + dark_gains) diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index c1c9ad064b..a05fc63175 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -33,6 +33,28 @@ var/ability_cost = 100 + var/darkness = 1 + var/turf/T = get_turf(src) + if(!T) + to_chat(src,"You can't use that here!") + return FALSE + + var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0 + darkness = 1-brightness //Invert + + var/watcher = 0 + for(var/mob/living/carbon/human/watchers in oview(7,src )) // If we can see them... + if(watchers in oviewers(7,src)) // And they can see us... + if(!(watchers.stat) && !isbelly(watchers.loc) && !istype(watchers.loc, /obj/item/weapon/holder)) // And they are alive and not being held by someone... + watcher++ // They are watching us! + + ability_cost = CLAMP(ability_cost/(0.01+darkness*2),50, 80)//This allows for 1 watcher in full light + if(watcher>0) + ability_cost = ability_cost + ( 15 * watcher ) + if(!(ability_flags & AB_PHASE_SHIFTED)) + log_debug("[src] attempted to shift with [watcher] visible Carbons with a cost of [ability_cost] in a darkness level of [darkness]") + + var/datum/species/shadekin/SK = species if(!istype(SK)) to_chat(src, "Only a shadekin can use that!") @@ -40,6 +62,7 @@ else if(stat) to_chat(src, "Can't use that ability in your state!") return FALSE + else if(shadekin_get_energy() < ability_cost && !(ability_flags & AB_PHASE_SHIFTED)) to_chat(src, "Not enough energy for that ability!") return FALSE @@ -48,7 +71,6 @@ shadekin_adjust_energy(-ability_cost) playsound(src, 'sound/effects/stealthoff.ogg', 75, 1) - var/turf/T = get_turf(src) if(!T.CanPass(src,T) || loc != T) to_chat(src,"You can't use that here!") return FALSE @@ -270,4 +292,4 @@ holder.glow_intensity = initial(holder.glow_intensity) holder.glow_color = initial(holder.glow_color) holder.set_light(0) - my_kin = null \ No newline at end of file + my_kin = null diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_trait.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_trait.dm new file mode 100644 index 0000000000..75a0846ebc --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_trait.dm @@ -0,0 +1,91 @@ +/datum/trait/kintype + allowed_species = list(SPECIES_SHADEKIN) + var/color = BLUE_EYES + name = "Shadekin Blue Adaptation" + desc = "Makes your shadekin adapted as a Blue eyed kin! This gives you decreased energy regeneration in darkness, decreased regeneration in the light amd unchanged health!" + cost = 0 + var_changes = list( "total_health" = 100, + "energy_light" = 0.5, + "energy_dark" = 0.5, + "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) + custom_only = FALSE + +/datum/trait/kintype/red + name = "Shadekin Red Adaptation" + color = RED_EYES + desc = "Makes your shadekin adapted as a Red eyed kin! This gives you minimal energy regeneration in darkness, moderate regeneration in the light amd increased health!" + var_changes = list( "total_health" = 200, + "energy_light" = -1, + "energy_dark" = 0.1, + "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) + +/datum/trait/kintype/purple + name = "Shadekin Purple Adaptation" + color = PURPLE_EYES + desc = "Makes your shadekin adapted as a Purple eyed kin! This gives you moderate energy regeneration in darkness, minor degeneration in the light amd increased health!" + var_changes = list( "total_health" = 150, + "energy_light" = 1, + "energy_dark" = -0.5, + "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) + +/datum/trait/kintype/yellow + name = "Shadekin Yellow Adaptation" + color = YELLOW_EYES + desc = "Makes your shadekin adapted as a Yellow eyed kin! This gives you the highest energy regeneration in darkness, high degeneration in the light amd unchanged health!" + var_changes = list( "total_health" = 100, + "energy_light" = 3, + "energy_dark" = -2, + "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) + +/datum/trait/kintype/green + name = "Shadekin Green Adaptation" + color = GREEN_EYES + desc = "Makes your shadekin adapted as a Green eyed kin! This gives you high energy regeneration in darkness, minor regeneration in the light amd unchanged health!" + var_changes = list( "total_health" = 100, + "energy_light" = 2, + "energy_dark" = 0.125, + "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) + +/datum/trait/kintype/orange + name = "Shadekin Orange Adaptation" + color = ORANGE_EYES + desc = "Makes your shadekin adapted as a Orange eyed kin! This gives you minor energy regeneration in darkness, modeate degeneration in the light amd increased health!" + var_changes = list( "total_health" = 175, + "energy_light" = 0.25, + "energy_dark" = -0.5, + "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) + +/datum/trait/kintype/apply(var/datum/species/shadekin/S,var/mob/living/carbon/human/H) + if(color && istype(S)) //Sanity check to see if they're actually a shadekin, otherwise just don't do anything. They shouldn't be able to spawn with the trait. + S.kin_type = color + ..(S,H) + switch(color) + if(BLUE_EYES) + H.shapeshifter_set_eye_color("0000FF") + if(RED_EYES) + H.shapeshifter_set_eye_color("FF0000") + if(GREEN_EYES) + H.shapeshifter_set_eye_color("00FF00") + if(PURPLE_EYES) + H.shapeshifter_set_eye_color("FF00FF") + if(YELLOW_EYES) + H.shapeshifter_set_eye_color("FFFF00") + if(ORANGE_EYES) + H.shapeshifter_set_eye_color("FFA500") + + +/datum/unarmed_attack/shadekinharmbap + attack_name = "syphon strike" + attack_verb = list("hit", "clawed", "slashed", "scratched") + attack_sound = 'sound/weapons/slice.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + shredding = 0 + +/datum/unarmed_attack/shadekinharmbap/apply_effects(var/mob/living/carbon/human/shadekin/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone) + ..() + if(user == target) //Prevent self attack to gain energy + return + var/obj/item/organ/internal/brain/shadekin/shade_organ = user.internal_organs_by_name[O_BRAIN] + if(!istype(shade_organ)) + return + shade_organ.dark_energy = CLAMP(shade_organ.dark_energy + attack_damage,0,shade_organ.max_dark_energy) //Convert Damage done to Energy Gained \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_zz_ch.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_zz_ch.dm new file mode 100644 index 0000000000..3bdc315600 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_zz_ch.dm @@ -0,0 +1,19 @@ +//This file is so i can make upates to shadekin and easily push to vorestation, just a main override file + +/datum/species/shadekin/handle_environment_special(var/mob/living/carbon/human/H) + handle_shade(H) + handle_phased(H) + +//Slippery fingers, if we ever make some update that makes all held items non useable for kins we can remove this. +/datum/species/shadekin/proc/handle_phased(var/mob/living/carbon/human/shadekin/H) + if(H.ability_flags & AB_PHASE_SHIFTED) + if(H.l_hand) + H.drop_l_hand() + + if(H.r_hand) + H.drop_r_hand() + + return 1 //we are phased and applied all handling + + else + return 0 //we aren't phased ignore all \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 15757d2d2b..e4b3ed606e 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -54,7 +54,11 @@ var/hunger_factor = 0.05 // Multiplier for hunger. var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm - var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes. + var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes. + var/allergens = null // Things that will make this species very sick + var/allergen_reaction = AG_TOX_DMG|AG_OXY_DMG|AG_EMOTE|AG_PAIN|AG_WEAKEN // What type of reactions will you have? These the 'main' options and are intended to approximate anaphylactic shock at high doses. + var/allergen_damage_severity = 1.2 // How bad are reactions to the allergen? Touch with extreme caution. + var/allergen_disable_severity = 3 // Whilst this determines how long nonlethal effects last and how common emotes are. var/min_age = 17 var/max_age = 70 @@ -254,6 +258,27 @@ /datum/mob_descriptor/build ) + //This is used in character setup preview generation (prefences_setup.dm) and human mob + //rendering (update_icons.dm) + var/color_mult = 0 + + //This is for overriding tail rendering with a specific icon in icobase, for static + //tails only, since tails would wag when dead if you used this + var/icobase_tail = 0 + + var/wing_hair + var/wing + var/wing_animation + var/icobase_wing + var/wikilink = null //link to wiki page for species + var/icon_height = 32 + var/agility = 20 //prob() to do agile things + +/datum/species/proc/update_attack_types() + unarmed_attacks = list() + for(var/u_type in unarmed_types) + unarmed_attacks += new u_type() + /datum/species/New() if(hud_type) hud = new hud_type() @@ -350,6 +375,9 @@ var/limb_path = organ_data["path"] var/obj/item/organ/O = new limb_path(H) organ_data["descriptor"] = O.name + if(O.parent_organ) + organ_data = has_limbs[O.parent_organ] + organ_data["has_children"] = organ_data["has_children"]+1 for(var/organ_tag in has_organ) var/organ_type = has_organ[organ_tag] @@ -394,8 +422,9 @@ "[H] boops [target]'s nose.", \ "You boop [target] on the nose.", ) //VOREStation Edit End - else H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ - "You hug [target] to make [t_him] feel better!") //End VOREStation Edit + else + H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ + "You hug [target] to make [t_him] feel better!") /datum/species/proc/remove_inherent_verbs(var/mob/living/carbon/human/H) if(inherent_verbs) diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 7c62d02b25..fb9beed574 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -1,33 +1,29 @@ /datum/species - //This is used in character setup preview generation (prefences_setup.dm) and human mob - //rendering (update_icons.dm) - var/color_mult = 0 - - //This is for overriding tail rendering with a specific icon in icobase, for static - //tails only, since tails would wag when dead if you used this - var/icobase_tail = 0 - //This is so that if a race is using the chimera revive they can't use it more than once. //Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race. //var/reviving = 0 //commented out 'cause moved to mob holder_type = /obj/item/weapon/holder/micro //This allows you to pick up crew min_age = 18 descriptors = list() - var/wing_hair - var/wing - var/wing_animation - var/icobase_wing - var/wikilink = null //link to wiki page for species - var/icon_height = 32 - var/agility = 20 //prob() to do agile things + + var/organic_food_coeff = 1 + var/synthetic_food_coeff = 0 + //var/vore_numbing = 0 + var/metabolism = 0.0015 + var/lightweight = FALSE //Oof! Nonhelpful bump stumbles. + var/trashcan = FALSE //It's always sunny in the wrestling ring. + var/eat_minerals = FALSE //HEAVY METAL DIET + var/base_species = null // Unused outside of a few species + var/selects_bodytype = FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect. + + var/is_weaver = FALSE + var/silk_production = FALSE + var/silk_reserve = 100 + var/silk_max_reserve = 500 + var/silk_color = "#FFFFFF" var/list/traits = list() -/datum/species/proc/update_attack_types() - unarmed_attacks = list() - for(var/u_type in unarmed_types) - unarmed_attacks += new u_type() - /datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane. unarmed_attacks = list() unarmed_types += /datum/unarmed_attack/bite/sharp/numbing diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 84b3a6c948..9a418e271b 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -1,13 +1,7 @@ - -/datum/species - //var/vore_numbing = 0 - var/gets_food_nutrition = TRUE // If this is set to 0, the person can't get nutrition from food. - var/metabolism = 0.0015 - var/lightweight = FALSE //Oof! Nonhelpful bump stumbles. - var/trashcan = FALSE //It's always sunny in the wrestling ring. - var/eat_minerals = FALSE //HEAVY METAL DIET - var/base_species = null // Unused outside of a few species - var/selects_bodytype = FALSE // Allows the species to choose from body types intead of being forced to be just one. +/datum/species/New() + if(!base_species) + base_species = name + ..() /datum/species/custom name = SPECIES_CUSTOM diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index cb0b86abe8..d0a51db43e 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -19,7 +19,6 @@ color_mult = 1 mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping - trashcan = 1 //They have goopy bodies. They can just dissolve things within them. appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 253f3d2f59..c15b14686b 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -17,13 +17,13 @@ // ai_inactive = TRUE //Always off //VORESTATION AI TEMPORARY REMOVAL show_stat_health = FALSE //We will do it ourselves - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help = "pets the" //CHOMP Edit + response_disarm = "gently pushes aside the " //CHOMP Edit + response_harm = "hits the" //CHOMP Edit - harm_intent_damage = 2 - melee_damage_lower = 10 - melee_damage_upper = 10 + harm_intent_damage = 3 + melee_damage_lower = 5 //CHOMP Edit + melee_damage_upper = 5 //CHOMP Edit attacktext = list("slashed") min_oxy = 0 @@ -36,7 +36,7 @@ max_n2 = 0 minbodytemp = 0 maxbodytemp = 900 - movement_cooldown = 3 + movement_cooldown = 2 //CHOMP Edit var/mob/living/carbon/human/humanform var/obj/item/organ/internal/nano/refactory/refactory @@ -48,7 +48,7 @@ var/human_brute = 0 var/human_burn = 0 - player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you, and you can ventcrawl!" + player_msg = "In this form, your health will regenerate as long as you have metal in you." //CHOMP Edit removed ventcrawl can_buckle = TRUE //Blobsurfing @@ -64,8 +64,10 @@ humanform = H updatehealth() refactory = locate() in humanform.internal_organs - verbs |= /mob/living/proc/ventcrawl +// verbs |= /mob/living/proc/ventcrawl //CHOMP Removal verbs |= /mob/living/proc/hide + verbs |= /mob/living/simple_mob/protean_blob/proc/rig_transform //CHOMP Addition + verbs |= /mob/living/proc/usehardsuit //CHOMP Addition else update_icon() @@ -267,14 +269,31 @@ if(refactory && istype(A,/obj/item/stack/material)) var/obj/item/stack/material/S = A var/substance = S.material.name - var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. - var allowed = FALSE + var/list/edible_materials = list(MAT_STEEL) //Can't eat all materials, just useful ones. + var/allowed = FALSE //CHOMP Edit for(var/material in edible_materials) - if(material == substance) allowed = TRUE + if(material == substance) + allowed = TRUE if(!allowed) return if(refactory.add_stored_material(S.material.name,1*S.perunit) && S.use(1)) visible_message("[name] gloms over some of \the [S], absorbing it.") + else if(isitem(A) && a_intent == "grab") //CHOMP Add all this block, down to I.forceMove. + var/obj/item/I = A + if(!vore_selected) + to_chat(src,"You either don't have a belly selected, or don't have a belly!") + return FALSE + if(is_type_in_list(I,item_vore_blacklist) || I.anchored) + to_chat(src, "You can't eat this.") + return + + if(is_type_in_list(I,edible_trash) | adminbus_trash) + if(I.hidden_uplink) + to_chat(src, "You really should not be eating this.") + message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? "JMP" : "null"])") + return + visible_message("[name] stretches itself over the [I], engulfing it whole!") + I.forceMove(vore_selected) else return ..() @@ -283,7 +302,7 @@ var/obj/item/stack/material/S = O var/substance = S.material.name var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. - var allowed = FALSE + var/allowed = FALSE //CHOMP Edit for(var/material in edible_materials) if(material == substance) allowed = TRUE if(!allowed) @@ -292,7 +311,20 @@ visible_message("[name] gloms over some of \the [S], absorbing it.") else return ..() - + +/mob/living/simple_mob/protean_blob/attack_hand(mob/living/L) //CHOMP Add this whole block. + if(L.get_effective_size() >= (src.get_effective_size() + 0.5) ) + src.get_scooped(L) + else + ..() + +/mob/living/simple_mob/protean_blob/MouseDrop(var/atom/over_object) //CHOMP Add this whole block. + if(ishuman(over_object) && usr == src && src.Adjacent(over_object)) + var/mob/living/carbon/human/H = over_object + get_scooped(H, TRUE) + else + return ..() + /mob/living/simple_mob/protean_blob/MouseEntered(location,control,params) if(resting) return @@ -306,6 +338,8 @@ var/global/list/disallowed_protean_accessories = list( // Helpers - Unsafe, WILL perform change. /mob/living/carbon/human/proc/nano_intoblob() + if(loc == /obj/item/weapon/rig/protean) + return var/panel_was_up = FALSE if(client?.statpanel == "Protean") panel_was_up = TRUE @@ -341,6 +375,8 @@ var/global/list/disallowed_protean_accessories = list( things_to_drop -= things_to_not_drop //Crunch the lists things_to_drop -= organs //Mah armbs things_to_drop -= internal_organs //Mah sqeedily spooch + for(var/obj/item/weapon/rig/protean/O in things_to_drop) //CHOMP Add + things_to_drop -= O //CHOMP Add for(var/obj/item/I in things_to_drop) //rip hoarders drop_from_inventory(I) @@ -397,10 +433,44 @@ var/global/list/disallowed_protean_accessories = list( remove_micros(I, root) //Recursion. I'm honestly depending on there being no containment loop, but at the cost of performance that can be fixed too. if(istype(I, /obj/item/weapon/holder)) root.remove_from_mob(I) + +//CHOMP Add start +/mob/living/simple_mob/protean_blob/proc/rig_transform() //CHOMP Add this whole block. + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean blob to solidify its form into one extremely similar to a hardsuit." + set category = "Abilities" + + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + src.forceMove(get_turf(prig)) + qdel(prig) + return + + if(isturf(loc)) + var/obj/item/weapon/rig/protean/prig = new(loc) + if(prig) + prig.forceMove(get_turf(src)) + src.forceMove(prig) + return + +/mob/living/proc/usehardsuit() + set name = "Utilize Hardsuit Interface" + set desc = "Allows a protean blob to open hardsuit interface." + set category = "Abilities" + + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + to_chat(src, "You attempt to interface with the [prig].") + prig.ui_interact(src, nano_state = interactive_state) + else + to_chat(src, "You are not in RIG form.") +//CHOMP Add end /mob/living/carbon/human/proc/nano_outofblob(var/mob/living/simple_mob/protean_blob/blob) if(!istype(blob)) return + if(blob.loc == /obj/item/weapon/rig/protean) + return var/panel_was_up = FALSE if(client?.statpanel == "Protean") diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index ba4b3ee92a..0580096bc7 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -1,3 +1,4 @@ +//TODO: Replace ventcrawl with morphing. /mob/living/simple_mob/vore/hostile/morph #define PER_LIMB_STEEL_COST SHEET_MATERIAL_AMOUNT //// // One-part Refactor @@ -18,7 +19,6 @@ to_chat(src,"You don't have a working refactory module!") return - var/choice = input(src,"Pick the bodypart to change:", "Refactor - One Bodypart") as null|anything in species.has_limbs if(!choice) return @@ -81,12 +81,108 @@ //// // Full Refactor //// +/* +/mob/living/carbon/human/proc/nano_regenerate() + set name = "Regenerate" + set desc = "Allows you to regrow limbs and replace organs." + set category = "Abilities" + set hidden = TRUE + + if(nutrition < 250) + to_chat(src, "You lack the energy to begin regeneration!") + return + + if(active_regen) + to_chat(src, "You are already regenerating!") + return + else + active_regen = TRUE + src.visible_message("[src]'s nanites begin to regenerate...") + + + var/mob/living/simple_mob/protean_blob/blob = nano_intoblob() + var/delay_length = round(active_regen_delay * species.active_regen_mult) + if(do_after(blob, delay_length, null, 0)) + if(stat != DEAD) + adjust_nutrition(-200) + species.create_organs(src) + var/obj/item/organ/external/torso = organs_by_name[BP_TORSO] + torso.robotize() //synthetic wasn't defined here. + LAZYCLEARLIST(blood_DNA) + LAZYCLEARLIST(feet_blood_DNA) + blood_color = null + feet_blood_color = null + regenerate_icons() //Probably worth it, yeah. + to_chat(src, "Your regeneration is complete.") //Guarantees the message shows no matter how bad the timing. + to_chat(blob, "Your regeneration is complete!") + else + to_chat(src, "Your regeneration has failed.") + to_chat(blob, "Your regeneration has failed!") + else + to_chat(src, "Your regeneration is interrupted.") + to_chat(blob, "Your regeneration is interrupted!") + active_regen = FALSE + nano_outofblob(blob) + + + + var/delay_length = round(active_regen_delay * species.active_regen_mult) + if(do_after(src,delay_length)) + adjust_nutrition(-200) + + for(var/obj/item/organ/I in internal_organs) + if(I.robotic >= ORGAN_ROBOT) // No free robofix. + continue + if(I.damage > 0) + I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ. + I.status = 0 // Wipe status, as it's being regenerated from possibly dead. + to_chat(src, "You feel a soothing sensation within your [I.name]...") + + // Replace completely missing limbs. + for(var/limb_type in src.species.has_limbs) + var/obj/item/organ/external/E = src.organs_by_name[limb_type] + + if(E && E.disfigured) + E.disfigured = 0 + if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) + E.removed() + qdel(E) + E = null + if(!E) + var/list/organ_data = src.species.has_limbs[limb_type] + var/limb_path = organ_data["path"] + var/obj/item/organ/O = new limb_path(src) + organ_data["descriptor"] = O.name + to_chat(src, "You feel a slithering sensation as your [O.name] reform.") + + var/agony_to_apply = round(0.66 * O.max_damage) // 66% of the limb's health is converted into pain. + src.apply_damage(agony_to_apply, HALLOSS) + + for(var/organtype in species.has_organ) // Replace completely missing internal organs. -After- external ones, so they all should exist. + if(!src.internal_organs_by_name[organtype]) + var/organpath = species.has_organ[organtype] + var/obj/item/organ/Int = new organpath(src, TRUE) + + Int.rejuvenate(TRUE) + + handle_organs() // Update everything + + update_icons_body() + active_regen = FALSE + else + to_chat(src, "Your regeneration is interrupted!") + adjust_nutrition(-75) + active_regen = FALSE +*/ + /mob/living/carbon/human/proc/nano_regenerate() //fixed the proc, it used to leave active_regen true. set name = "Ref - Whole Body" set desc = "Allows you to regrow limbs and replace organs, given you have enough materials." set category = "Abilities" set hidden = TRUE + + if(stat) to_chat(src,"You must be awake and standing to perform this action!") return @@ -178,7 +274,6 @@ active_regen = FALSE nano_outofblob(blob) - //// // Storing metal //// @@ -223,7 +318,7 @@ visible_message("[src] devours some of the [substance] right off the stack!") else to_chat(src,"You're completely capped out on [substance]!") - + //// // Blob Form //// @@ -269,6 +364,7 @@ //// // Change size //// +/*CHOMP Removal start - I am replacing this with the OG set size. No more metal requirement. /mob/living/carbon/human/proc/nano_set_size() set name = "Adjust Volume" set category = "Abilities" @@ -282,9 +378,9 @@ to_chat(user,"You don't have a working refactory module!") return - var/nagmessage = "Adjust your mass to be a size between 25 to 200%. Up-sizing consumes metal, downsizing returns metal." + var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or between 1 to 600% in dorms area). Up-sizing consumes metal, downsizing returns metal." var/new_size = input(user, nagmessage, "Pick a Size", user.size_multiplier*100) as num|null - if(!new_size || !ISINRANGE(new_size,25,200)) + if(!new_size || !size_range_check(new_size)) return var/size_factor = new_size/100 @@ -312,6 +408,7 @@ to_chat(user,"Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.") user.visible_message("Black mist swirls around [user] as they change size.") +CHOMP Removal end*/ /// /// /// A helper to reuse /mob/living/proc/nano_get_refactory(obj/item/organ/internal/nano/refactory/R) @@ -369,11 +466,13 @@ icon_state = "blob" to_call = /mob/living/carbon/human/proc/nano_blobform -/obj/effect/protean_ability/change_volume +/*CHOMP removal start - This doesn't do anything at all now. Normal resize proc is being used instead. +/obj/effect/protean_ability/change_volume //CHOMP Edit ability_name = "Change Volume" - desc = "Alter your size by consuming steel to produce additional nanites, or regain steel by reducing your size and reclaiming them." + desc = "Alter your size between 25% and 200%." //CHOMP Edit - Removed talk about requiring metal icon_state = "volume" to_call = /mob/living/carbon/human/proc/nano_set_size +CHOMP removal end*/ /obj/effect/protean_ability/reform_limb ability_name = "Ref - Single Limb" @@ -386,11 +485,11 @@ desc = "Rebuild your entire body into whatever design you want, assuming you have 10,000 metal." icon_state = "body" to_call = /mob/living/carbon/human/proc/nano_regenerate - + /obj/effect/protean_ability/metal_nom ability_name = "Ref - Store Metals" desc = "Store the metal you're holding. Your refactory can only store steel, and all other metals will be converted into nanites ASAP for various effects." icon_state = "metal" to_call = /mob/living/carbon/human/proc/nano_metalnom -#undef PER_LIMB_STEEL_COST +#undef PER_LIMB_STEEL_COST \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index cc5fc9cd33..202ca5da07 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -17,7 +17,7 @@ flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS - spawn_flags = SPECIES_IS_RESTRICTED //SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE CHOMPedit: disabled probably forever + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE health_hud_intensity = 2 num_alternate_languages = 3 assisted_langs = list(LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) @@ -67,7 +67,7 @@ has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, - O_FACT = /obj/item/organ/internal/nano/refactory + O_FACT = /obj/item/organ/internal/nano/refactory, ) has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/nano), @@ -91,8 +91,8 @@ /mob/living/carbon/human/proc/nano_regenerate, //These verbs are hidden so you can macro them, /mob/living/carbon/human/proc/nano_partswap, /mob/living/carbon/human/proc/nano_metalnom, - /mob/living/carbon/human/proc/nano_blobform, - /mob/living/carbon/human/proc/nano_set_size, + /mob/living/carbon/human/proc/nano_blobform, + /mob/living/proc/set_size, /mob/living/carbon/human/proc/nano_change_fitting, //These verbs are displayed normally, /mob/living/carbon/human/proc/shapeshifter_select_hair, /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, @@ -101,9 +101,14 @@ /mob/living/carbon/human/proc/shapeshifter_select_gender, /mob/living/carbon/human/proc/shapeshifter_select_wings, /mob/living/carbon/human/proc/shapeshifter_select_tail, - /mob/living/carbon/human/proc/shapeshifter_select_ears - ) - + /mob/living/carbon/human/proc/shapeshifter_select_ears, + /mob/living/carbon/human/proc/succubus_drain, + /mob/living/carbon/human/proc/slime_feed, + /mob/living/carbon/human/proc/succubus_drain_finalize, + /mob/living/carbon/human/proc/succubus_drain_lethal, + /mob/living/proc/eat_trash + ) //CHOMP Edit - Added succ stuff that promies have too. Also changed nano_set_size to standard set_size so there is no metal cost. + var/global/list/abilities = list() var/monochromatic = FALSE //IGNORE ME @@ -135,8 +140,8 @@ /datum/species/protean/equip_survival_gear(var/mob/living/carbon/human/H) var/obj/item/stack/material/steel/metal_stack = new() - metal_stack.amount = 3 - + metal_stack.amount = 5 //CHOMP Edit + var/obj/item/clothing/accessory/permit/nanotech/permit = new() permit.set_name(H.real_name) @@ -155,6 +160,9 @@ new_nif.quick_implant(H) else H.nif.durability = rand(21,25) + + var/obj/item/weapon/rig/protean/prig = new /obj/item/weapon/rig/protean(H) + prig.myprotean = H /datum/species/protean/hug(var/mob/living/carbon/human/H, var/mob/living/target) return ..() //Wut @@ -174,7 +182,7 @@ H.ckey = H.temporary_form.ckey QDEL_NULL(H.temporary_form) - to_chat(H, "You died as a Protean. Please sit out of the round for at least 60 minutes before respawning, to represent the time it would take to ship a new-you to the station.") + to_chat(H, "You died as a Protean. Please sit out of the round for at least 5 or 10 minutes before respawning, to represent the time it would take to ship a new-you to the station, depending on how you died.") for(var/obj/item/organ/I in H.internal_organs) I.removed() @@ -189,6 +197,7 @@ H.nano_intoblob() return ..() //Any instakill shot runtimes since there are no organs after this. No point to not skip these checks, going to nullspace anyway. +/*CHOMP Station removal start var/obj/item/organ/internal/nano/refactory/refactory = locate() in H.internal_organs if(refactory && !(refactory.status & ORGAN_DEAD)) @@ -209,6 +218,7 @@ H.add_modifier(/datum/modifier/protean/silver, origin = refactory) return ..() +CHOMP Station removal end*/ /datum/species/protean/get_additional_examine_text(var/mob/living/carbon/human/H) return ..() //Hmm, what could be done here? @@ -230,7 +240,7 @@ for(var/ability in abilities) var/obj/effect/protean_ability/A = ability stat("[A.ability_name]",A.atom_button_text()) - + // Various modifiers /datum/modifier/protean stacks = MODIFIER_STACK_FORBID @@ -261,6 +271,7 @@ if(!refactory.use_stored_material(material_name,material_use)) expire() +/*CHOMP Removal start /datum/modifier/protean/mhydrogen name = "Protean Effect - M.Hydrogen" desc = "You're affected by the presence of metallic hydrogen." @@ -305,6 +316,7 @@ accuracy = 30 evasion = 30 +CHOMP Removal end*/ /datum/modifier/protean/steel name = "Protean Effect - Steel" @@ -328,6 +340,7 @@ else if(O.status & ORGAN_DEAD) O.status &= ~ORGAN_DEAD //Unset dead if we repaired it entirely + // PAN Card /obj/item/clothing/accessory/permit/nanotech name = "\improper P.A.N. card" @@ -349,6 +362,28 @@ . = ..() . += validstring . += registring + +//CHOMP Add start +/mob/living/carbon/human/proc/rig_transform() + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean to solidify its form into one extremely similar to a hardsuit." + set category = "Abilities" + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + src.forceMove(get_turf(prig)) + prig.forceMove(src) + return + + if(isturf(loc)) + var/obj/item/weapon/rig/protean/prig + for(var/obj/item/weapon/rig/protean/O in contents) + prig = O + break + if(prig) + prig.forceMove(get_turf(src)) + src.forceMove(prig) + return +//CHOMP Add end #undef DAM_SCALE_FACTOR #undef METAL_PER_TICK \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index d290c0c42f..f38c8844e7 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -231,6 +231,7 @@ base_color = "#333333" reagent_tag = IS_TAJARA + allergens = COFFEE move_trail = /obj/effect/decal/cleanable/blood/tracks/paw @@ -321,6 +322,7 @@ breath_heat_level_3 = 1350 //Default 1250 reagent_tag = IS_SKRELL + allergens = MEAT|FISH|DAIRY|EGGS has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), diff --git a/code/modules/mob/living/carbon/human/species/station/station_ch.dm b/code/modules/mob/living/carbon/human/species/station/station_ch.dm index 95970a1a64..77e80b2be9 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_ch.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_ch.dm @@ -23,7 +23,7 @@ spawn_flags = SPECIES_IS_RESTRICTED /datum/species/shadekin - spawn_flags = SPECIES_IS_RESTRICTED + //spawn_flags = SPECIES_IS_RESTRICTED //datum/species/protean // spawn_flags = SPECIES_IS_RESTRICTED diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm index 97354d7abb..6206b1c978 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_ch.dm @@ -169,4 +169,29 @@ var/eggs = 0 layeggs-- return -*/ \ No newline at end of file +*/ + +/mob/living/proc/insect_sting() + set name = "Insect Sting" + set desc = "Sting a target and inject a small amount of toxin" + set category = "Abilities" + + if(last_special > world.time) + return + + var/list/victims = list() + for(var/mob/living/carbon/C in oview(1)) + victims += C + var/mob/living/carbon/T = input(src, "Who will we sting?") as null|anything in victims + + if(!T) + return + if(T.isSynthetic()) + to_chat(src, "We are unable to pierce the outer shell of [T].") + return + + to_chat(src, "You jab your stinger into [T].") + to_chat(T, "You feel a stabbing pain as you are stung!") + src.visible_message("[src] sinks their stinger into [T]!") + T.bloodstr.add_reagent("condensedcapsaicin_v",3) + last_special = world.time + 50 // Many little jabs instead of one big one diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 7db7e140b5..3ec39f0b1c 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -850,3 +850,150 @@ set category = "Abilities" pass_flags ^= PASSTABLE //I dunno what this fancy ^= is but Aronai gave it to me. to_chat(src, "You [pass_flags&PASSTABLE ? "will" : "will NOT"] move over tables/railings/trays!") + +/mob/living/carbon/human/proc/check_silk_amount() + set name = "Check Silk Amount" + set category = "Abilities" + + if(species.is_weaver) + to_chat(src, "Your silk reserves are at [species.silk_reserve]/[species.silk_max_reserve].") + else + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") + +/mob/living/carbon/human/proc/toggle_silk_production() + set name = "Toggle Silk Production" + set category = "Abilities" + + if(species.is_weaver) + species.silk_production = !(species.silk_production) + to_chat(src, "You are [species.silk_production ? "now" : "no longer"] producing silk.") + else + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") + +/mob/living/carbon/human/proc/weave_structure() + set name = "Weave Structure" + set category = "Abilities" + + if(!(species.is_weaver)) + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") + return + + var/choice + var/datum/weaver_recipe/structure/desired_result + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = input(src,"What would you like to weave?") as null|anything in weavable_structures + desired_result = weavable_structures[choice] + if(!desired_result || !istype(desired_result)) + return + + if(choice) + finalized = alert(src, "Are you sure you want to weave [desired_result.title]? It will cost you [desired_result.cost] silk.","Confirmation","Yes","No") + + if(!desired_result || !istype(desired_result)) + return + + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(stat) + to_chat(src, "You can't do that in your current state!") + return + + if(locate(desired_result.result_type) in src.loc) + to_chat(src, "You can't create another weaversilk [desired_result.title] here!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + if(do_after(src, desired_result.time, exclusive = TRUE)) + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(locate(desired_result.result_type) in src.loc) + to_chat(src, "You can't create another weaversilk [desired_result.title] here!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + species.silk_reserve = max(species.silk_reserve - desired_result.cost, 0) + + //new desired_result.result_type(src.loc) + var/atom/O = new desired_result.result_type(src.loc) + O.color = species.silk_color + + +/mob/living/carbon/human/proc/weave_item() + set name = "Weave Item" + set category = "Abilities" + + if(!(species.is_weaver)) + return + + var/choice + var/datum/weaver_recipe/item/desired_result + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = input(src,"What would you like to weave?") as null|anything in weavable_items + desired_result = weavable_items[choice] + if(!desired_result || !istype(desired_result)) + return + + if(choice) + finalized = alert(src, "Are you sure you want to weave [desired_result.title]? It will cost you [desired_result.cost] silk.","Confirmation","Yes","No") + + if(!desired_result || !istype(desired_result)) + return + + if(!(species.is_weaver)) + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") + return + + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(stat) + to_chat(src, "You can't do that in your current state!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + if(do_after(src, desired_result.time, exclusive = TRUE)) + if(desired_result.cost > species.silk_reserve) + to_chat(src, "You don't have enough silk to weave that!") + return + + if(!isturf(src.loc)) + to_chat(src, "You can't weave here!") + return + + species.silk_reserve = max(species.silk_reserve - desired_result.cost, 0) + + //new desired_result.result_type(src.loc) + var/atom/O = new desired_result.result_type(src.loc) + O.color = species.silk_color + +/mob/living/carbon/human/proc/set_silk_color() + set name = "Set Silk Color" + set category = "Abilities" + + if(!(species.is_weaver)) + to_chat(src, "You are not a weaver! How are you doing this? Tell a developer!") + return + + var/new_silk_color = input("Pick a color for your woven products:","Silk Color", species.silk_color) as null|color + if(new_silk_color) + species.silk_color = new_silk_color + + diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index bed18e0924..31f6638e83 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -383,7 +383,11 @@ icobase_tail = 1 inherent_verbs = list( - /mob/living/proc/weaveWebBindings) + /mob/living/carbon/human/proc/check_silk_amount, + /mob/living/carbon/human/proc/toggle_silk_production, + /mob/living/carbon/human/proc/weave_structure, + /mob/living/carbon/human/proc/weave_item, + /mob/living/carbon/human/proc/set_silk_color) min_age = 18 max_age = 80 @@ -419,6 +423,10 @@ base_color = "#333333" //Blackish-gray blood_color = "#0952EF" //Spiders have blue blood. + is_weaver = TRUE + silk_reserve = 500 + silk_max_reserve = 1000 + /datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H) if(H.stat == DEAD) // If they're dead they won't need anything. return @@ -489,7 +497,7 @@ has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/werebeast), + BP_HEAD = list("path" = /obj/item/organ/external/head/werebeast), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 44ce2dfe45..b5c8d39469 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -55,7 +55,7 @@ has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/sergal), + BP_HEAD = list("path" = /obj/item/organ/external/head/sergal), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), @@ -246,7 +246,7 @@ dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \ culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \ to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ - which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." + which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." //CHOMPStation Removal TFF 12/24/19 - Wikilinks removed // wikilink="https://www.yawn.ocry.com/Vulpkanin" @@ -289,6 +289,7 @@ tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi' color_mult = 1 min_age = 18 + allergens = null gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds) heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c @@ -305,6 +306,7 @@ color_mult = 1 min_age = 18 reagent_tag = null + allergens = null assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) //CHOMPedit: link to our wiki @@ -339,8 +341,8 @@ /datum/species/teshari mob_size = MOB_SMALL //YW Edit: changed from MOB_MEDIUM to MOB_SMALL spawn_flags = SPECIES_CAN_JOIN - icobase = 'icons/mob/human_races/r_seromi_vr.dmi' - deform = 'icons/mob/human_races/r_seromi_vr.dmi' + icobase = 'icons/mob/human_races/r_teshari_vr.dmi' + deform = 'icons/mob/human_races/r_teshari_vr.dmi' icobase_tail = 1 color_mult = 1 min_age = 18 @@ -354,6 +356,9 @@ wikilink="https://wiki.chompstation13.net/index.php?title=Teshari" agility = 90 + male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg') + female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg') + inherent_verbs = list( /mob/living/carbon/human/proc/sonar_ping, /mob/living/proc/hide, @@ -499,7 +504,7 @@ datum/species/harpy base_color = "#f0f0f0" color_mult = 1 - has_glowing_eyes = TRUE + //has_glowing_eyes = TRUE // Applicable through traits. male_cough_sounds = null female_cough_sounds = null @@ -531,7 +536,7 @@ datum/species/harpy has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest/crewkin), BP_GROIN = list("path" = /obj/item/organ/external/groin/crewkin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/crewkin), + BP_HEAD = list("path" = /obj/item/organ/external/head/crewkin), BP_L_ARM = list("path" = /obj/item/organ/external/arm/crewkin), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/crewkin), BP_L_LEG = list("path" = /obj/item/organ/external/leg/crewkin), diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm similarity index 93% rename from code/modules/mob/living/carbon/human/species/station/seromi.dm rename to code/modules/mob/living/carbon/human/species/station/teshari.dm index 5749e4ee61..55569135a9 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm @@ -49,12 +49,12 @@ move_trail = /obj/effect/decal/cleanable/blood/tracks/paw - icobase = 'icons/mob/human_races/r_seromi.dmi' - deform = 'icons/mob/human_races/r_seromi.dmi' - damage_overlays = 'icons/mob/human_races/masks/dam_seromi.dmi' - damage_mask = 'icons/mob/human_races/masks/dam_mask_seromi.dmi' - blood_mask = 'icons/mob/human_races/masks/blood_seromi.dmi' - suit_storage_icon = 'icons/mob/species/seromi/belt_mirror.dmi' + icobase = 'icons/mob/human_races/r_teshari.dmi' + deform = 'icons/mob/human_races/r_teshari.dmi' + damage_overlays = 'icons/mob/human_races/masks/dam_teshari.dmi' + damage_mask = 'icons/mob/human_races/masks/dam_mask_teshari.dmi' + blood_mask = 'icons/mob/human_races/masks/blood_teshari.dmi' + suit_storage_icon = 'icons/mob/species/teshari/belt_mirror.dmi' fire_icon_state = "generic" // Humanoid is too big for them and spriting a new one is really annoying. @@ -118,15 +118,15 @@ has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/seromi), + BP_HEAD = list("path" = /obj/item/organ/external/head/teshari), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/seromi), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/seromi), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/seromi), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/seromi) + BP_L_HAND = list("path" = /obj/item/organ/external/hand/teshari), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/teshari), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/teshari), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/teshari) ) has_organ = list( diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm index 1fa2796d0b..6fc26b12a9 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm @@ -1,3 +1,6 @@ +#define ORGANICS 1 +#define SYNTHETICS 2 + /datum/trait/speed_slow name = "Slowdown" desc = "Allows you to move slower on average than baseline." @@ -142,10 +145,10 @@ */ /datum/trait/haemophilia name = "Haemophilia - Organics only" - desc = "When you bleed, you bleed a LOT. This trait is only for organics, buggy with synths!" + desc = "When you bleed, you bleed a LOT." cost = -2 var_changes = list("bloodloss_rate" = 2) - not_for_synths = 1 + can_take = ORGANICS /datum/trait/hollow name = "Hollow Bones/Aluminum Alloy" diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm index 2da688c4cb..e40f427b9b 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_ch.dm @@ -18,7 +18,7 @@ cost = -3 var_changes = list("blood_volume" = 375) excludes = list(/datum/trait/less_blood_extreme,/datum/trait/more_blood,/datum/trait/more_blood_extreme) - not_for_synths = TRUE + can_take = ORGANICS /datum/trait/less_blood_extreme name = "Extremely low blood volume" @@ -26,7 +26,7 @@ cost = -5 var_changes = list("blood_volume" = 224) excludes = list(/datum/trait/less_blood,/datum/trait/more_blood,/datum/trait/more_blood_extreme) - not_for_synths = TRUE + can_take = ORGANICS /datum/trait/scrawny name = "Scrawny" @@ -42,33 +42,33 @@ /datum/trait/deep_sleeper name = "Deep Sleeper" - desc = "When you fall asleep, it takes you twice as long to wake up." + desc = "When you fall asleep, it takes you four times as long to wake up." cost = -1 - var_changes = list("waking_speed" = 0.5) + var_changes = list("waking_speed" = 0.25) /datum/trait/low_blood_sugar name = "Low blood sugar" desc = "If you let your nutrition get too low, you will start to experience adverse affects including hallucinations, unconsciousness, and weakness" - cost = -2 + cost = -1 special_env = TRUE /datum/trait/low_blood_sugar/handle_environment_special(var/mob/living/carbon/human/H) if(H.nutrition > 200) //Sanity check because stupid bugs >:v return if((H.nutrition < 200) && prob(5)) - if(H.nutrition > 150) + if(H.nutrition > 100) to_chat(H,"You start to feel noticeably weak as your stomach rumbles, begging for more food. Maybe you should eat something to keep your blood sugar up") - else if(H.nutrition > 100) - to_chat(H,"You begin to feel rather weak, and your stomach rumbles loudly. You feel lightheaded and it's getting harder to think. You really need to eat something.") else if(H.nutrition > 50) + to_chat(H,"You begin to feel rather weak, and your stomach rumbles loudly. You feel lightheaded and it's getting harder to think. You really need to eat something.") + else if(H.nutrition > 25) to_chat(H,"You're feeling very weak and lightheaded, and your stomach continously rumbles at you. You really need to eat something!") else to_chat(H,"You're feeling extremely weak and lightheaded. You feel as though you might pass out any moment and your stomach is screaming for food by now! You should really find something to eat!") - if((H.nutrition < 150) && prob(15)) - H.Confuse(20) - if((H.nutrition < 100) && prob(30)) - H.hallucination = max(50,H.hallucination+10) - if((H.nutrition < 50) && prob(10)) + if((H.nutrition < 100) && prob(10)) + H.Confuse(10) + if((H.nutrition < 50) && prob(25)) + H.hallucination = max(30,H.hallucination+8) + if((H.nutrition < 25) && prob(5)) H.drowsyness = max(100,H.drowsyness+30) /datum/trait/blindness @@ -85,7 +85,7 @@ desc = "You have a condition which causes you to spontaneously have hallucinations! Luckily for you, in the modern space age, our doctors have solutions for you, just make sure you don't forget to take your pills." cost = -3 special_env = TRUE - not_for_synths = TRUE + can_take = ORGANICS var/hallucination_max = 60 var/hallucination_increase = 3 var/episode_length_nomeds_avg = 4000 @@ -228,11 +228,11 @@ /datum/trait/agoraphobia/proc/check_mob_company(var/mob/living/carbon/human/H,var/mob/living/M,var/invis_matters = TRUE) var/list/in_range = list() + if(!istype(M)) + return in_range var/social_check = !istype(M, /mob/living/carbon) && !istype(M, /mob/living/silicon/robot) var/ckey_check = !M.ckey var/overall_checks = M == H || M.stat == DEAD || social_check || ckey_check - if(!istype(M)) - return in_range if(invis_matters && M.invisibility > H.see_invisible) return in_range if(!overall_checks) @@ -286,6 +286,8 @@ H.next_loneliness_time = world.time+500 /datum/trait/lonely/proc/check_mob_company(var/mob/living/carbon/human/H,var/mob/living/M) + if(!istype(M)) + return 0 var/social_check = only_people && !istype(M, /mob/living/carbon) && !istype(M, /mob/living/silicon/robot) var/self_invisible_check = M == H || M.invisibility > H.see_invisible var/ckey_check = only_people && !M.ckey diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index 709e5f53e3..f6f94c8b53 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -1,3 +1,6 @@ +#define ORGANICS 1 +#define SYNTHETICS 2 + /datum/trait/metabolism_up name = "Fast Metabolism" desc = "You process ingested and injected reagents faster, but get hungry faster (Teshari speed)." @@ -70,7 +73,7 @@ name = "Cold-Adapted" desc = "You are able to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations." cost = 0 - var_changes = list("cold_level_1" = 200, "cold_level_2" = 150, "cold_level_3" = 90, "breath_cold_level_1" = 180, "breath_cold_level_2" = 100, "breath_cold_level_3" = 60, "cold_discomfort_level" = 210, "heat_level_1" = 305, "heat_level_2" = 360, "heat_level_3" = 700, "breath_heat_level_1" = 345, "breath_heat_level_2" = 380, "breath_heat_level_3" = 780, "heat_discomfort_level" = 295, "body_temperature" = 290) + var_changes = list("cold_level_1" = 200, "cold_level_2" = 150, "cold_level_3" = 90, "breath_cold_level_1" = 180, "breath_cold_level_2" = 100, "breath_cold_level_3" = 60, "cold_discomfort_level" = 210, "heat_level_1" = 330, "heat_level_2" = 380, "heat_level_3" = 700, "breath_heat_level_1" = 360, "breath_heat_level_2" = 400, "breath_heat_level_3" = 850, "heat_discomfort_level" = 295, "body_temperature" = 290) excludes = list(/datum/trait/hotadapt) /datum/trait/hotadapt @@ -129,8 +132,8 @@ YW change end */ desc = "Makes you unable to gain nutrition from anything but blood. To compensate, you get fangs that can be used to drain blood from prey." cost = 0 custom_only = FALSE - var_changes = list("gets_food_nutrition" = 0) //The verb is given in human.dm - excludes = list(/datum/trait/bloodsucker_plus) + var_changes = list("organic_food_coeff" = 0) //The verb is given in human.dm + excludes = list(/datum/trait/bloodsucker_plus) //YW edit /datum/trait/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) @@ -184,11 +187,19 @@ YW change end */ desc = "You only gain nutrition from raw ore and refined minerals. There's nothing that sates the appetite better than precious gems, exotic or rare minerals and you have damn fine taste. Anything else is beneath you." cost = 0 custom_only = FALSE - var_changes = list("gets_food_nutrition" = 0, "eat_minerals" = 1) + var_changes = list("organic_food_coeff" = 0, "eat_minerals" = 1) /datum/trait/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) H.verbs |= /mob/living/proc/eat_minerals + +/datum/trait/synth_chemfurnace + name = "Biofuel Processor" + desc = "You are able to gain energy through consuming and processing normal food. Energy-dense foods such as protein bars and survival food will yield the best results." + cost = 0 + custom_only = FALSE + can_take = SYNTHETICS + var_changes = list("organic_food_coeff" = 0, "synthetic_food_coeff" = 0.25) /datum/trait/glowing_eyes name = "Glowing Eyes" @@ -208,6 +219,89 @@ YW change end */ H.verbs |= /mob/living/proc/glow_toggle H.verbs |= /mob/living/proc/glow_color + +//Allergen traits! Not available to any species with a base allergens var. +/datum/trait/allergy + name = "Allergy: Gluten" + desc = "You're highly allergic to gluten proteins, which are found in most common grains." + cost = 0 + custom_only = FALSE + var/allergen = GRAINS + +/datum/trait/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H) + S.allergens |= allergen + ..(S,H) + +/datum/trait/allergy/meat + name = "Allergy: Meat" + desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = MEAT + +/datum/trait/allergy/fish + name = "Allergy: Fish" + desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = FISH + +/datum/trait/allergy/fruit + name = "Allergy: Fruit" + desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = FRUIT + +/datum/trait/allergy/vegetable + name = "Allergy: Vegetable" + desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = VEGETABLE + +/datum/trait/allergy/nuts + name = "Allergy: Nuts" + desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = SEEDS + +/datum/trait/allergy/soy + name = "Allergy: Soy" + desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = BEANS + +/datum/trait/allergy/dairy + name = "Allergy: Lactose" + desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = DAIRY + +/datum/trait/allergy/fungi + name = "Allergy: Fungi" + desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = FUNGI + +/datum/trait/allergy/coffee + name = "Allergy: Coffee" + desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." + cost = 0 + custom_only = FALSE + allergen = COFFEE + +/datum/trait/allergen_reduced_effect + name = "Reduced Allergen Reaction" + desc = "This trait halves the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)." + cost = 0 + custom_only = FALSE + var_changes = list("allergen_damage_severity" = 0.6) + // Spicy Food Traits, from negative to positive. /datum/trait/spice_intolerance_extreme name = "Extreme Spice Intolerance" @@ -296,3 +390,100 @@ YW change end */ var_changes = list("alcohol_mod" = 0.25) // 25% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this! // Alcohol Traits End Here. YW CHANGE STOP*/ + +// Body shape traits +/datum/trait/taller + name = "Tall" + desc = "Your body is taller than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_y" = 1.09) + excludes = list(/datum/trait/tall, /datum/trait/short, /datum/trait/shorter) + +/datum/trait/taller/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() + +/datum/trait/tall + name = "Slightly Tall" + desc = "Your body is a bit taller than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_y" = 1.05) + excludes = list(/datum/trait/taller, /datum/trait/short, /datum/trait/shorter) + +/datum/trait/tall/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() + +/datum/trait/short + name = "Slightly Short" + desc = "Your body is a bit shorter than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_y" = 0.95) + excludes = list(/datum/trait/taller, /datum/trait/tall, /datum/trait/shorter) + +/datum/trait/short/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() + +/datum/trait/shorter + name = "Short" + desc = "Your body is shorter than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_y" = 0.915) + excludes = list(/datum/trait/taller, /datum/trait/tall, /datum/trait/short) + +/datum/trait/shorter/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() + +/datum/trait/obese + name = "Very Bulky" + desc = "Your body is much wider than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_x" = 1.095) + excludes = list(/datum/trait/fat, /datum/trait/thin, /datum/trait/thinner) + +/datum/trait/obese/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() + +/datum/trait/fat + name = "Bulky" + desc = "Your body is wider than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_x" = 1.054) + excludes = list(/datum/trait/obese, /datum/trait/thin, /datum/trait/thinner) + +/datum/trait/fat/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() + +/datum/trait/thin + name = "Thin" + desc = "Your body is thinner than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_x" = 0.945) + excludes = list(/datum/trait/fat, /datum/trait/obese, /datum/trait/thinner) + +/datum/trait/thin/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() + +/datum/trait/thinner + name = "Very Thin" + desc = "Your body is much thinner than average." + cost = 0 + custom_only = FALSE + var_changes = list("icon_scale_x" = 0.905) + excludes = list(/datum/trait/fat, /datum/trait/obese, /datum/trait/thin) + +/datum/trait/thinner/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.update_transform() diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral_ch.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral_ch.dm index fa6a83b15b..8e27c6052a 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral_ch.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral_ch.dm @@ -15,7 +15,7 @@ /datum/trait/succubus_bite/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) H.verbs |= /mob/living/proc/succubus_bite - + /datum/trait/nutritiongrow name = "Growing" desc = "After you consume enough nutrition, you start to slowly grow while metabolizing nutrition faster." diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 9c22f2f60c..407cd327de 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -1,3 +1,6 @@ +#define ORGANICS 1 +#define SYNTHETICS 2 + /datum/trait/speed_fast name = "Haste" desc = "Allows you to move faster on average than baseline." @@ -231,7 +234,7 @@ name = "Evolved Bloodsucker" desc = "Makes you able to gain nutrition by draining blood as well as eating food. To compensate, you get fangs that can be used to drain blood from prey." cost = 1 - var_changes = list("gets_food_nutrition" = 0.5) // Hopefully this works??? + var_changes = list("organic_food_coeff" = 0.5) // Hopefully this works??? excludes = list(/datum/trait/bloodsucker) /datum/trait/bloodsucker_plus/apply(var/datum/species/S,var/mob/living/carbon/human/H) @@ -253,7 +256,7 @@ cost = 2 var_changes = list("cold_level_1" = 200, "cold_level_2" = 150, "cold_level_3" = 90, "breath_cold_level_1" = 180, "breath_cold_level_2" = 100, "breath_cold_level_3" = 60, "cold_discomfort_level" = 210, "heat_level_1" = 305, "heat_level_2" = 360, "heat_level_3" = 700, "breath_heat_level_1" = 345, "breath_heat_level_2" = 380, "breath_heat_level_3" = 780, "heat_discomfort_level" = 295) excludes = list(/datum/trait/hotadapt) - not_for_synths = 1 // CHOMP edit + can_take = ORGANICS // CHOMP edit /datum/trait/hotadapt name = "Heat-Adapted" @@ -261,7 +264,7 @@ cost = 2 var_changes = list("heat_level_1" = 420, "heat_level_2" = 460, "heat_level_3" = 1100, "breath_heat_level_1" = 440, "breath_heat_level_2" = 510, "breath_heat_level_3" = 1500, "heat_discomfort_level" = 390, "cold_level_1" = 280, "cold_level_2" = 220, "cold_level_3" = 140, "breath_cold_level_1" = 260, "breath_cold_level_2" = 240, "breath_cold_level_3" = 120, "cold_discomfort_level" = 280) excludes = list(/datum/trait/coldadapt) - not_for_synths = 1 // CHOMP edit + can_take = ORGANICS // CHOMP edit // YW Addition end /datum/trait/snowwalker @@ -269,3 +272,17 @@ desc = "You are able to move unhindered on snow." cost = 2 //YW EDIT var_changes = list("snow_movement" = -2) + +/datum/trait/weaver + name = "Weaver" + desc = "You can produce silk and create various articles of clothing and objects." + cost = 2 + var_changes = list("is_weaver" = 1) + +/datum/trait/weaver/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..() + H.verbs |= /mob/living/carbon/human/proc/check_silk_amount + H.verbs |= /mob/living/carbon/human/proc/toggle_silk_production + H.verbs |= /mob/living/carbon/human/proc/weave_structure + H.verbs |= /mob/living/carbon/human/proc/weave_item + H.verbs |= /mob/living/carbon/human/proc/set_silk_color diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm index 09117b09be..3b08f6646a 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_ch.dm @@ -34,7 +34,7 @@ desc = "Your body is able to produce nutrition from being in light." cost = 3 var_changes = list("photosynthesizing" = TRUE) - not_for_synths = 0 //Synths actually use nutrition, just with a fancy covering. + can_take = ORGANICS|SYNTHETICS //Synths actually use nutrition, just with a fancy covering. /datum/trait/rad_resistance name = "Radiation Resistance" @@ -54,7 +54,7 @@ cost = 3 var_changes = list("blood_volume" = 840) excludes = list(/datum/trait/more_blood_extreme,/datum/trait/less_blood,/datum/trait/less_blood_extreme) - not_for_synths = TRUE + can_take = ORGANICS /datum/trait/more_blood_extreme name = "Very high blood volume" @@ -62,7 +62,7 @@ cost = 6 var_changes = list("blood_volume" = 1400) excludes = list(/datum/trait/more_blood,/datum/trait/less_blood,/datum/trait/less_blood_extreme) - not_for_synths = TRUE + can_take = ORGANICS /datum/trait/heavyweight name = "Heavyweight" @@ -164,7 +164,7 @@ desc = "When you get critically damaged, you'll have an adrenaline rush before going down, giving you another chance to finish the fight, or get to safety." cost = 6 special_env = TRUE - not_for_synths = TRUE + can_take = ORGANICS var/last_adrenaline_rush /datum/trait/adrenaline_rush/handle_environment_special(var/mob/living/carbon/human/H) @@ -239,3 +239,13 @@ accuracy_dispersion = 25 incoming_hal_damage_percent = 1.75 incoming_oxy_damage_percent = 1.25 + +/datum/trait/insect_sting + name = "Insect Sting" + desc = "Allows you to sting your victim with a smalll amount of poison" + cost = 1 + +/datum/trait/insect_sting/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.verbs |= /mob/living/proc/insect_sting + diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm index 605da7e569..e869c97bf2 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm @@ -1,11 +1,16 @@ +#define ORGANICS 1 +#define SYNTHETICS 2 + /datum/trait var/name var/desc = "Contact a developer if you see this trait." var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive. - var/list/var_changes // A list to apply to the custom species vars. + var/list/var_changes // A list to apply to the custom species vars. var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars. - var/not_for_synths = FALSE // Can freaking synths use those. + var/can_take = ORGANICS|SYNTHETICS // Can freaking synths use those. + var/list/banned_species // A list of species that can't take this trait + var/list/allowed_species //A list of species can use this trait exclusively var/custom_only = TRUE // Trait only available for custom species //Proc can be overridden lower to include special changes, make sure to call up though for the vars changes diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm new file mode 100644 index 0000000000..a48ac9cd05 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm @@ -0,0 +1,136 @@ +// Structures + +/obj/effect/weaversilk + name = "weaversilk web" + desc = "A thin layer of fiberous webs. It looks like it can be torn down with one strong hit." + icon = 'icons/vore/weaver_icons_vr.dmi' + anchored = 1 + density = 0 + +/obj/effect/weaversilk/ex_act(severity) + qdel(src) + return + +/obj/effect/weaversilk/attackby(var/obj/item/weapon/W, var/mob/user) + user.setClickCooldown(user.get_attack_speed(W)) + + if(W.force) + visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + qdel(src) + +/obj/effect/weaversilk/bullet_act(var/obj/item/projectile/Proj) + ..() + if(Proj.get_structure_damage()) + qdel(src) + +/obj/effect/weaversilk/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + qdel(src) + +/obj/effect/weaversilk/attack_generic(mob/user as mob, var/damage) + if(damage) + qdel(src) + +/obj/effect/weaversilk/attack_hand(mob/user as mob) + ..() + if(user.a_intent == I_HURT) + to_chat(user,"You easily tear down [name].") + qdel(src) + +/obj/effect/weaversilk/floor + var/possible_icon_states = list("floorweb1", "floorweb2", "floorweb3", "floorweb4", "floorweb5", "floorweb6", "floorweb7", "floorweb8") + plane = DIRTY_PLANE + +/obj/effect/weaversilk/floor/Initialize() + ..() + icon_state = pick(possible_icon_states) + +/obj/effect/weaversilk/wall + name = "weaversilk web wall" + desc = "A thin layer of fiberous webs, but just thick enough to block your way. It looks like it can be torn down with one strong hit." + icon_state = "wallweb1" + var/possible_icon_states = list("wallweb1", "wallweb2", "wallweb3") + density = 1 + +/obj/effect/weaversilk/wall/Initialize() + ..() + icon_state = pick(possible_icon_states) + +/obj/effect/weaversilk/wall/CanPass(atom/movable/mover, turf/target) + if(istype(mover, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = mover + if(H.species.is_weaver) + return TRUE + ..() + +/obj/structure/bed/double/weaversilk_nest + name = "weaversilk nest" + desc = "A nest of some kind, made of fiberous material." + icon = 'icons/vore/weaver_icons_vr.dmi' + icon_state = "nest" + base_icon = "nest" + +/obj/structure/bed/double/weaversilk_nest/update_icon() + return + +/obj/structure/bed/double/weaversilk_nest/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.is_wrench() || istype(W,/obj/item/stack) || W.is_wirecutter()) + return + ..() + +/obj/structure/bed/double/weaversilk_nest/attack_hand(mob/user as mob) + ..() + if(user.a_intent == I_HURT && !has_buckled_mobs()) + to_chat(user,"You easily tear down [name].") + qdel(src) + +/obj/effect/weaversilk/trap + name = "weaversilk trap" + desc = "A silky, yet firm trap. Be careful not to step into it! Or don't..." + icon_state = "trap" + var/trap_active = TRUE + +/obj/effect/weaversilk/trap/Crossed(atom/movable/AM as mob|obj) + if(AM.is_incorporeal()) + return + if(istype(AM, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + if(H.species.is_weaver) + return + if(isliving(AM) && trap_active) + var/mob/living/L = AM + if(L.m_intent == "run") + L.visible_message( + "[L] steps on \the [src].", + "You step on \the [src]!", + "You hear a squishy noise!" + ) + set_dir(L.dir) + can_buckle = TRUE + buckle_mob(L) + L.Stun(1) + to_chat(L, "The sticky fibers of \the [src] ensnare, trapping you in place!") + trap_active = FALSE + can_buckle = initial(can_buckle) + desc += " Actually, it looks like it's been all spent." + ..() + + + +// Items + +// TODO: Spidersilk clothing and actual bindings, once sprites are ready. + +/obj/item/clothing/suit/weaversilk_bindings + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_clothes_vr.dmi' + name = "weaversilk bindings" + desc = "A webbed cocoon that completely restrains the wearer." + icon_state = "web_bindings" + item_state = "web_bindings_mob" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL + //CHOMPedit - Teshari sprite, this was originally a YW edit of the old web bindings + sprite_sheets = list( + SPECIES_TESHARI = 'icons/vore/custom_onmob_yw.dmi' + ) + //CHOMPedit end diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm new file mode 100644 index 0000000000..f00fe0dda7 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm @@ -0,0 +1,36 @@ +/datum/weaver_recipe + var/title = null + var/result_type + var/cost = 0 + var/time = 5 SECONDS + +/datum/weaver_recipe/structure + +/datum/weaver_recipe/structure/floor + title = "floor" + result_type = /obj/effect/weaversilk/floor + cost = 25 + time = 1 SECOND + +/datum/weaver_recipe/structure/wall + title = "wall" + result_type = /obj/effect/weaversilk/wall + cost = 100 + +/datum/weaver_recipe/structure/nest + title = "nest" + result_type = /obj/structure/bed/double/weaversilk_nest + cost = 100 + +/datum/weaver_recipe/structure/trap + title = "trap" + result_type = /obj/effect/weaversilk/trap + cost = 250 + time = 15 SECONDS + +/datum/weaver_recipe/item + cost = 50 + +/datum/weaver_recipe/item/bindings + title = "bindings" + result_type = /obj/item/clothing/suit/weaversilk_bindings \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm new file mode 100644 index 0000000000..be1783d9df --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm @@ -0,0 +1,41 @@ +/* +** For now, these are just neutral traits for Xenochimera only to take. +** These are only traits that they should reasonably be able to evolve to acquire themselves. +** I won't add the resistances though because those are kinda lame for a 'chimera to take! +*/ +/datum/trait/weaver/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Weaver" + desc = "You've evolved your body to produce silk that you can fashion into articles of clothing and other objects." + cost = 0 + custom_only = FALSE + +/datum/trait/hardfeet/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Hard Feet" + desc = "Your body has adapted to make your feet immune to glass shards, whether by developing hooves, chitin, or just horrible callous." + cost = 0 + custom_only = FALSE + +// Why put this on Xenochimera of all species? I have no idea, but someone may be enough of a lunatic to take it. +/datum/trait/neural_hypersensitivity/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Neural Hypersensitivity" + desc = "Despite your evolutionary efforts, you are unusually sensitive to pain. \ + Given your species' typical reactions to pain, this can only end well for you!" + cost = 0 + custom_only = FALSE + +/datum/trait/melee_attack_fangs/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Sharp Melee & Numbing Fangs" + desc = "Your hunting instincts manifest in earnest! You have grown numbing fangs alongside your naturally grown hunting weapons." + cost = 0 + custom_only = FALSE + +/datum/trait/snowwalker/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Snow Walker" + desc = "You've adapted to traversing snowy terrain. Snow does not slow you down!" + cost = 0 + custom_only = FALSE diff --git a/code/modules/mob/living/carbon/human/species/virtual_reality/opaque_form.dm b/code/modules/mob/living/carbon/human/species/virtual_reality/opaque_form.dm index abf287c0fb..43210407bc 100644 --- a/code/modules/mob/living/carbon/human/species/virtual_reality/opaque_form.dm +++ b/code/modules/mob/living/carbon/human/species/virtual_reality/opaque_form.dm @@ -83,21 +83,21 @@ /datum/species/shapeshifter/promethean/avatar/teshari name = "Virtual Reality Teshari" - icobase = 'icons/mob/human_races/r_seromi.dmi' - deform = 'icons/mob/human_races/r_seromi.dmi' + icobase = 'icons/mob/human_races/r_teshari.dmi' + deform = 'icons/mob/human_races/r_teshari.dmi' appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/seromi), + BP_HEAD = list("path" = /obj/item/organ/external/head/teshari), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/seromi), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/seromi), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/seromi), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/seromi) + BP_L_HAND = list("path" = /obj/item/organ/external/hand/teshari), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/teshari), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/teshari), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/teshari) ) /datum/species/shapeshifter/promethean/avatar/diona diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index 16a67a9b53..fc821e0a94 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -2,7 +2,7 @@ for(var/mob/living/carbon/human/Q in living_mob_list) if(self && ignore_self && self == Q) continue - if(Q.species.name != SPECIES_XENO_QUEEN) + if(Q.species.name != SPECIES_GENA_QUEEN) //CHOMPedit continue if(!Q.key || !Q.client || Q.stat) continue @@ -80,7 +80,7 @@ /mob/living/carbon/human/proc/lay_egg() set name = "Lay Egg (200)" //CHOMPedit changed number value - set desc = "Lay an egg to produce huggers to impregnate prey with." + set desc = "Lay an egg that hatch into larva." //CHOMPedit set category = "Abilities" if(!config.aliens_allowed) @@ -110,7 +110,7 @@ if(check_alien_ability(500)) visible_message("[src] begins to twist and contort!", "You begin to evolve!") - src.set_species("Xenomorph Queen") + src.set_species("Genaprawn Queen") //CHOMPedit return diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 1268fb0c6e..b01849f4db 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -1,9 +1,9 @@ //Stand-in until this is made more lore-friendly. /datum/species/xenos - name = SPECIES_XENO - name_plural = "Xenomorphs" + name = SPECIES_GENA //CHOMPedit + name_plural = "Genaprawns" //CHOMPedit - default_language = "Xenomorph" + default_language = "Xenolingua" //CHOMPedit language = "Hivemind" assisted_langs = list() unarmed_types = list(/datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno) @@ -93,10 +93,10 @@ ) /datum/species/xenos/get_bodytype() - return SPECIES_XENO + return SPECIES_GENA //CHOMPedit /datum/species/xenos/get_random_name() - return "alien [caste_name] ([alien_number])" + return "Genaprawn [caste_name] ([alien_number])" //CHOMPedit /datum/species/xenos/can_understand(var/mob/other) if(istype(other, /mob/living/carbon/alien/larva)) @@ -114,7 +114,7 @@ H.mind.special_role = "Alien" alien_number++ //Keep track of how many aliens we've had so far. - H.real_name = "alien [caste_name] ([alien_number])" + H.real_name = "Genaprawn [caste_name] ([alien_number])" //CHOMPedit H.name = H.real_name ..() @@ -167,18 +167,10 @@ return 1 return 0 -/* -/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H) - H.AddInfectionImages() - ..() - -/datum/species/xenos/handle_logout_special(var/mob/living/carbon/human/H) - H.RemoveInfectionImages() - ..() -*/ +//CHOMPedit removed infection images, since they do not exist anymore. /datum/species/xenos/drone - name = SPECIES_XENO_DRONE + name = SPECIES_GENA_DRONE //CHOMPedit caste_name = "drone" weeds_plasma_rate = 15 slowdown = 1 @@ -218,7 +210,7 @@ ..() /datum/species/xenos/hunter - name = SPECIES_XENO_HUNTER + name = SPECIES_GENA_HUNTER //CHOMPedit weeds_plasma_rate = 5 caste_name = "hunter" slowdown = -2 @@ -248,7 +240,7 @@ ) /datum/species/xenos/sentinel - name = SPECIES_XENO_SENTINEL + name = SPECIES_GENA_SENTINEL //CHOMPedit weeds_plasma_rate = 10 caste_name = "sentinel" slowdown = 0 @@ -281,7 +273,7 @@ /datum/species/xenos/queen - name = SPECIES_XENO_QUEEN + name = SPECIES_GENA_QUEEN //CHOMPedit total_health = 300 //CHOMPedit. Queen is chonk weeds_heal_rate = 5 weeds_plasma_rate = 20 @@ -325,10 +317,10 @@ ..() // Make sure only one official queen exists at any point. if(!alien_queen_exists(1,H)) - H.real_name = "alien queen ([alien_number])" + H.real_name = "Genaprawn queen ([alien_number])" //CHOMPedit H.name = H.real_name else - H.real_name = "alien princess ([alien_number])" + H.real_name = "Genaprawn princess ([alien_number])" //CHOMPedit H.name = H.real_name /datum/hud_data/alien diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index 350f61b33d..c8f74dbc8e 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -4,28 +4,28 @@ proc/create_new_xenomorph(var/alien_caste,var/target) if(!target || !alien_caste) return var/mob/living/carbon/human/new_alien = new(target) - new_alien.set_species("Xenomorph [alien_caste]") + new_alien.set_species("Genaprawn [alien_caste]") //CHOMPedit return new_alien /mob/living/carbon/human/xdrone/New(var/new_loc) h_style = "Bald" faction = "xeno" - ..(new_loc, SPECIES_XENO_DRONE) + ..(new_loc, SPECIES_GENA_DRONE) //CHOMPedit /mob/living/carbon/human/xsentinel/New(var/new_loc) h_style = "Bald" faction = "xeno" - ..(new_loc, SPECIES_XENO_SENTINEL) + ..(new_loc, SPECIES_GENA_SENTINEL) //CHOMPedit /mob/living/carbon/human/xhunter/New(var/new_loc) h_style = "Bald" faction = "xeno" - ..(new_loc, SPECIES_XENO_HUNTER) + ..(new_loc, SPECIES_GENA_HUNTER) //CHOMPedit /mob/living/carbon/human/xqueen/New(var/new_loc) h_style = "Bald" faction = "xeno" - ..(new_loc, SPECIES_XENO_QUEEN) + ..(new_loc, SPECIES_GENA_QUEEN) //CHOMPedit //CHOMPedit. Removed AddInfectionImages code, due to it being commented out and not used diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 3190f52679..66ebedbb2c 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -4,6 +4,7 @@ */ var/global/list/human_icon_cache = list() //key is incredibly complex, see update_icons_body() var/global/list/tail_icon_cache = list() //key is [species.race_key][r_skin][g_skin][b_skin] +var/global/list/wing_icon_cache = list() // See tail. var/global/list/light_overlay_cache = list() //see make_worn_icon() on helmets var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() @@ -87,8 +88,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define LEGCUFF_LAYER 26 //Same as handcuffs, for legcuffs #define L_HAND_LAYER 27 //Left-hand item #define R_HAND_LAYER 28 //Right-hand item -#define WING_LAYER 29 //VOREStation edit. Simply move this up a number if things are added. -#define TAIL_LAYER_ALT 30 //VOREStation edit. Simply move this up a number if things are added. +#define WING_LAYER 29 //Wings or protrusions over the suit. +#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger. #define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers #define FIRE_LAYER 32 //'Mob on fire' overlay layer #define WATER_LAYER 33 //'Mob submerged' overlay layer @@ -123,7 +124,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() crash_with("CANARY: Old human update_icons_huds was called.") /mob/living/carbon/human/update_transform() - /* VOREStation Edit START - TODO - Consider switching to icon_scale + /* VOREStation Edit START // First, get the correct size. var/desired_scale_x = icon_scale_x var/desired_scale_y = icon_scale_y @@ -137,8 +138,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!isnull(M.icon_scale_y_percent)) desired_scale_y *= M.icon_scale_y_percent */ - var/desired_scale_x = size_multiplier - var/desired_scale_y = size_multiplier + var/desired_scale_x = size_multiplier * icon_scale_x + var/desired_scale_y = size_multiplier * icon_scale_y + desired_scale_x *= species.icon_scale_x + desired_scale_y *= species.icon_scale_y + appearance_flags |= PIXEL_SCALE + if(fuzzy) + appearance_flags &= ~PIXEL_SCALE //VOREStation Edit End // Regular stuff again. @@ -151,21 +157,20 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone. M.Turn(90) - M.Scale(desired_scale_x, desired_scale_y) + M.Scale(desired_scale_y, desired_scale_x)//VOREStation Edit if(species.icon_height == 64)//VOREStation Edit M.Translate(13,-22) else M.Translate(1,-6) layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters else - M.Scale(desired_scale_x, desired_scale_y) + M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit M.Translate(0, (vis_height/2)*(desired_scale_y-1)) //VOREStation edit layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters animate(src, transform = M, time = anim_time) update_icon_special() //May contain transform-altering things - //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists /mob/living/carbon/human/UpdateDamageIcon() @@ -192,7 +197,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // blend the individual damage states with our icons for(var/obj/item/organ/external/O in organs) - if(isnull(O) || O.is_stump()) + if(isnull(O) || O.is_stump() || O.is_hidden_by_tail()) continue O.update_icon() @@ -234,10 +239,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //Create a new, blank icon for our mob to use. var/icon/stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") - var/g = "male" - if(gender == FEMALE) - g = "female" - + var/g = (gender == MALE ? "male" : "female") var/icon_key = "[species.get_race_key(src)][g][s_tone][r_skin][g_skin][b_skin]" if(lip_style) icon_key += "[lip_style]" @@ -250,7 +252,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() icon_key += "[r_eyes], [g_eyes], [b_eyes]" var/obj/item/organ/external/head/head = organs_by_name[BP_HEAD] if(head) - icon_key += "[head.eye_icon]" + if(!istype(head, /obj/item/organ/external/stump)) + icon_key += "[head.eye_icon]" for(var/organ_tag in species.has_limbs) var/obj/item/organ/external/part = organs_by_name[organ_tag] if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. @@ -264,21 +267,20 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]" if(part.body_hair && part.h_col && part.h_col.len >= 3) icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]" - //VOREStation Edit - Different way of tracking add/mult species if(species.color_mult) icon_key += "[ICON_MULTIPLY]" else icon_key += "[ICON_ADD]" - //VOREStation Edit End else icon_key += "#000000" + for(var/M in part.markings) icon_key += "[M][part.markings[M]["color"]]" if(part.robotic >= ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" robolimb_count++ - if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN)) //VOREStation Edit - Not for nanoform parts + if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN)) robobody_count ++ else if(part.status & ORGAN_DEAD) icon_key += "3" @@ -288,7 +290,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() icon_key += "_t" //VOREStation Edit. if(istype(tail_style, /datum/sprite_accessory/tail/taur)) - icon_key += tail_style.clip_mask_state + if(tail_style.clip_mask) //VOREStation Edit. + icon_key += tail_style.clip_mask_state icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" var/icon/base_icon @@ -302,14 +305,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/icon/Cutter = null if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that. - Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask) + if(tail_style.clip_mask) //VOREStation Edit. + Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask_state) - Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black. + Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black. - Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white. - Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty. + Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white. + Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty. - Cutter.Blend("#000000", ICON_MULTIPLY) // Black again. + Cutter.Blend("#000000", ICON_MULTIPLY) // Black again. for(var/obj/item/organ/external/part in organs) if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. @@ -322,7 +326,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) if(part.icon_position & (LEFT | RIGHT)) - var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") //VOREStation Edit. + var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) if(!(part.icon_position & LEFT)) @@ -363,7 +367,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //tail update_tail_showing() - update_wing_showing() // VOREStation Edit + update_wing_showing() /mob/living/carbon/human/proc/update_skin() if(QDESTROYING(src)) @@ -447,7 +451,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(facial_hair_style && facial_hair_style.species_allowed && (src.species.get_bodytype(src) in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_MULTIPLY) //VOREStation edit + facial_s.Blend(rgb(r_facial, g_facial, b_facial), facial_hair_style.color_blend_mode) face_standing.Blend(facial_s, ICON_OVERLAY) @@ -473,22 +477,16 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() face_standing.Blend(hair_s, ICON_OVERLAY) - // VOREStation Edit - START + if(head_organ.nonsolid || head_organ.transparent) + face_standing += rgb(,,,120) + var/icon/ears_s = get_ears_overlay() if(ears_s) face_standing.Blend(ears_s, ICON_OVERLAY) - if(istype(head_organ,/obj/item/organ/external/head/vr)) - var/obj/item/organ/external/head/vr/head_organ_vr = head_organ - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) - apply_layer(HAIR_LAYER) - return - // VOREStation Edit - END - if(head_organ.transparent) //VOREStation Edit. For better slime limbs. - face_standing += rgb(,,,120) - - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER) + overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ.head_offset) apply_layer(HAIR_LAYER) + return // VOREStation Edit - START var/icon/hair_acc_s = get_hair_accessory_overlay() @@ -533,7 +531,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!head_organ.eye_icon) return - var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) + var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) //VOREStation Edit if(eyes) eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) else @@ -642,14 +640,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() uniform_sprite = "[INV_W_UNIFORM_DEF_ICON].dmi" //Build a uniform sprite - //VOREStation Edit start. var/icon/c_mask = tail_style?.clip_mask if(c_mask) var/obj/item/clothing/suit/S = wear_suit if((wear_suit?.flags_inv & HIDETAIL) || (istype(S) && S.taurized)) // Reasons to not mask: 1. If you're wearing a suit that hides the tail or if you're wearing a taurized suit. c_mask = null overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask) - //VOREStation Edit end. apply_layer(UNIFORM_LAYER) /mob/living/carbon/human/update_inv_wear_id() @@ -731,7 +727,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES)) return //Either nothing to draw, or it'd be hidden. - //VOREStation Edit for(var/f in list(BP_L_FOOT, BP_R_FOOT)) var/obj/item/organ/external/foot/foot = get_organ(f) if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear. @@ -813,7 +808,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() update_inv_w_uniform() update_inv_shoes() update_tail_showing() - update_wing_showing() // VOREStation Edit + update_wing_showing() if(!wear_suit) return //No point, no suit. @@ -828,7 +823,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() else suit_sprite = "[INV_SUIT_DEF_ICON].dmi" - //VOREStation Edit start. var/icon/c_mask = null var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT]) var/valid_clip_mask = tail_style?.clip_mask @@ -837,8 +831,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() c_mask = valid_clip_mask overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask) - //VOREStation Edit end. - apply_layer(SUIT_LAYER) /mob/living/carbon/human/update_inv_pockets() @@ -950,24 +942,23 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return remove_layer(TAIL_LAYER) - remove_layer(TAIL_LAYER_ALT) // VOREStation Edit - START - Alt Tail Layer + remove_layer(TAIL_LAYER_ALT) // Alt Tail Layer var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER - var/image/vr_tail_image = get_tail_image() - if(vr_tail_image) - vr_tail_image.layer = BODY_LAYER+used_tail_layer - overlays_standing[used_tail_layer] = vr_tail_image + var/image/tail_image = get_tail_image() + if(tail_image) + tail_image.layer = BODY_LAYER+used_tail_layer + overlays_standing[used_tail_layer] = tail_image apply_layer(used_tail_layer) return - // VOREStation Edit - END var/species_tail = species.get_tail(src) // Species tail icon_state prefix. //This one is actually not that bad I guess. if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) var/icon/tail_s = get_tail_icon() - overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // VOREStation Edit - Alt Tail Layer + overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // Alt Tail Layer animate_tail_reset() //TODO: Is this the appropriate place for this, and not on species...? @@ -977,22 +968,22 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!tail_icon) //generate a new one var/species_tail_anim = species.get_tail_animation(src) - if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //VOREStation Code - Allow override of file for non-animated tails + if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //Allow override of file for non-animated tails if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi' tail_icon = new/icon(species_tail_anim) - tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) // VOREStation edit + tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) // The following will not work with animated tails. var/use_species_tail = species.get_tail_hair(src) if(use_species_tail) - var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]_s") //VOREStation edit -- Suffix icon state string with '_s' to compensate for diff in .dmi b/w us & Polaris. - hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //VOREStation edit -- Check for species color_mult + var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]") + hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //Check for species color_mult tail_icon.Blend(hair_icon, ICON_OVERLAY) tail_icon_cache[icon_key] = tail_icon return tail_icon /mob/living/carbon/human/proc/set_tail_state(var/t_state) - var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - START - Alt Tail Layer + var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer var/image/tail_overlay = overlays_standing[used_tail_layer] remove_layer(TAIL_LAYER) @@ -1004,7 +995,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() tail_overlay.icon_state = t_state . = tail_overlay - apply_layer(used_tail_layer) // VOREStation Edit - END + apply_layer(used_tail_layer) //Not really once, since BYOND can't do that. //Update this if the ability to flick() images or make looping animation start at the first frame is ever added. @@ -1014,9 +1005,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return var/t_state = "[species.get_tail(src)]_once" - var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - Alt Tail Layer + var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer - var/image/tail_overlay = overlays_standing[used_tail_layer] // VOREStation Edit - Alt Tail Layer + var/image/tail_overlay = overlays_standing[used_tail_layer] // Alt Tail Layer if(tail_overlay && tail_overlay.icon_state == t_state) return //let the existing animation finish @@ -1024,7 +1015,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(tail_overlay) spawn(20) //check that the animation hasn't changed in the meantime - if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // VOREStation Edit - Alt Tail Layer + if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // Alt Tail Layer animate_tail_stop() /mob/living/carbon/human/proc/animate_tail_start() @@ -1047,7 +1038,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() set_tail_state("[species.get_tail(src)]_idle[rand(0,9)]") else set_tail_state("[species.get_tail(src)]_static") - toggle_tail_vr(FALSE) //VOREStation Add - So tails stop when someone dies. TODO - Fix this hack ~Leshana + toggle_tail(FALSE) //So tails stop when someone dies. TODO - Fix this hack ~Leshana /mob/living/carbon/human/proc/animate_tail_stop() if(QDESTROYING(src)) @@ -1055,20 +1046,18 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() set_tail_state("[species.get_tail(src)]_static") -// VOREStation Edit - Wings! See update_icons_vr.dm for more wing procs /mob/living/carbon/human/proc/update_wing_showing() if(QDESTROYING(src)) return remove_layer(WING_LAYER) - var/image/vr_wing_image = get_wing_image() - if(vr_wing_image) - vr_wing_image.layer = BODY_LAYER+WING_LAYER - overlays_standing[WING_LAYER] = vr_wing_image + var/image/wing_image = get_wing_image() + if(wing_image) + wing_image.layer = BODY_LAYER+WING_LAYER + overlays_standing[WING_LAYER] = wing_image apply_layer(WING_LAYER) -// VOREStation Edit end /mob/living/carbon/human/update_modifier_visuals() if(QDESTROYING(src)) @@ -1135,6 +1124,117 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() overlays_standing[SURGERY_LAYER] = total apply_layer(SURGERY_LAYER) +/mob/living/carbon/human/proc/get_wing_image() + if(QDESTROYING(src)) + return + + //If you are FBP with wing style and didn't set a custom one + if(synthetic && synthetic.includes_wing && !wing_style) + var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing? + wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) + return image(wing_s) + + //If you have custom wings selected + if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) + var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state) + if(wing_style.do_colouration) + wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode) + if(wing_style.extra_overlay) + var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay) + overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + if(wing_style.extra_overlay2) + var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2) + if(wing_style.ani_state) + overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w) + overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + return image(wing_s) + +/mob/living/carbon/human/proc/get_ears_overlay() + if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) + var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) + if(ear_style.do_colouration) + ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode) + if(ear_style.extra_overlay) + var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay) + overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode) + ears_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER + var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2) + overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode) + ears_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + return ears_s + return null + + +/mob/living/carbon/human/proc/get_tail_image() + //If you are FBP with tail style and didn't set a custom one + var/datum/robolimb/model = isSynthetic() + if(istype(model) && model.includes_tail && !tail_style) + var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail") + tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) + return image(tail_s) + + //If you have a custom tail selected + if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style))) + var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) + if(tail_style.do_colouration) + tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) + if(tail_style.extra_overlay) + var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) + if(wagging && tail_style.ani_state) + overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + + if(tail_style.extra_overlay2) + var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2) + if(wagging && tail_style.ani_state) + overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) + overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + + if(isTaurTail(tail_style)) + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(taurtype.can_ride && !riding_datum) + riding_datum = new /datum/riding/taur(src) + verbs |= /mob/living/carbon/human/proc/taur_mount + verbs |= /mob/living/proc/toggle_rider_reins + return image(tail_s, "pixel_x" = -16) + else + return image(tail_s) + return null + +// TODO - Move this to where it should go ~Leshana +/mob/living/proc/stop_flying() + if(QDESTROYING(src)) + return + flying = FALSE + return 1 + +/mob/living/carbon/human/stop_flying() + if((. = ..())) + update_wing_showing() + //Human Overlays Indexes///////// #undef MUTATIONS_LAYER #undef SKIN_LAYER diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 358dadddb4..5ee09212f4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -43,7 +43,7 @@ organs -= OR qdel(OR) - if(LAZYLEN(internal_organs)) + if(LAZYLEN(internal_organs) && !istype(src, /mob/living/simple_mob/animal)) internal_organs_by_name.Cut() while(internal_organs.len) var/obj/item/OR = internal_organs[1] @@ -74,214 +74,6 @@ usr.visible_message("[src] points to [A]") return 1 -/*one proc, four uses -swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive -default behaviour is: - - non-passive mob passes the passive version - - passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags - - if si, the proc returns -*/ -/mob/living/proc/can_move_mob(var/mob/living/swapped, swapping = 0, passive = 0) - if(!swapped) - return 1 - if(!passive) - return swapped.can_move_mob(src, swapping, 1) - else - var/context_flags = 0 - if(swapping) - context_flags = swapped.mob_swap_flags - else - context_flags = swapped.mob_push_flags - if(!mob_bump_flag) //nothing defined, go wild - return 1 - if(mob_bump_flag & context_flags) - return 1 - return 0 - -/mob/living/Bump(atom/movable/AM) - if(now_pushing || !loc || buckled == AM) - return - now_pushing = 1 - if (istype(AM, /mob/living)) - var/mob/living/tmob = AM - - //Even if we don't push/swap places, we "touched" them, so spread fire - spread_fire(tmob) - - for(var/mob/living/M in range(tmob, 1)) - if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) - if ( !(world.time % 5) ) - to_chat(src, "[tmob] is restrained, you cannot push past") - now_pushing = 0 - return - if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) - if ( !(world.time % 5) ) - to_chat(src, "[tmob] is restraining [M], you cannot push past") - now_pushing = 0 - return - - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - var/can_swap = 1 - if(loc.density || tmob.loc.density) - can_swap = 0 - if(can_swap) - for(var/atom/movable/A in loc) - if(A == src) - continue - if(!A.CanPass(tmob, loc)) - can_swap = 0 - if(!can_swap) break - if(can_swap) - for(var/atom/movable/A in tmob.loc) - if(A == tmob) - continue - if(!A.CanPass(src, tmob.loc)) - can_swap = 0 - if(!can_swap) break - - //Leaping mobs just land on the tile, no pushing, no anything. - if(status_flags & LEAPING) - loc = tmob.loc - status_flags &= ~LEAPING - now_pushing = 0 - return - - if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && can_swap && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! - var/turf/oldloc = loc - //VOREstation Edit - Begin - - //check bumpnom chance, if it's a simplemob that's doing the bumping - var/mob/living/simple_mob/srcsimp = src - if(istype(srcsimp)) - if(srcsimp.tryBumpNom(tmob)) - now_pushing = 0 - return - - //if it's a simplemob being bumped, and the above didn't make them start getting bumpnommed, they get a chance to bumpnom - var/mob/living/simple_mob/tmobsimp = tmob - if(istype(tmobsimp)) - if(tmobsimp.tryBumpNom(src)) - now_pushing = 0 - return - - //VOREstation Edit - End - forceMove(tmob.loc) - //VOREstation Edit - Begin - // In case of micros, we don't swap positions; instead occupying the same square! - if (handle_micro_bump_helping(tmob)) - now_pushing = 0 - return - // TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below. - // VOREStation Edit - End - tmob.forceMove(oldloc) - now_pushing = 0 - return - //VOREStation Edit - Begin - else if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && canmove && can_swap && handle_micro_bump_helping(tmob)) - forceMove(tmob.loc) - now_pushing = 0 - return - //VOREStation Edit - End - - if(!can_move_mob(tmob, 0, 0)) - now_pushing = 0 - return - if(a_intent == I_HELP || src.restrained()) - now_pushing = 0 - return - // VOREStation Edit - Begin - // Plow that nerd. - if(ishuman(tmob)) - var/mob/living/carbon/human/H = tmob - if(H.species.lightweight == 1 && prob(50)) - H.visible_message("[src] bumps into [H], knocking them off balance!") - H.Weaken(5) - now_pushing = 0 - return - // Handle grabbing, stomping, and such of micros! - if(handle_micro_bump_other(tmob)) return - // VOREStation Edit - End - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(40) && !(FAT in src.mutations)) - to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") - now_pushing = 0 - return - if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return - - if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) - if(prob(99)) - now_pushing = 0 - return - if(!(tmob.status_flags & CANPUSH)) - now_pushing = 0 - return - - tmob.LAssailant = src - - now_pushing = 0 - . = ..() - if (!istype(AM, /atom/movable) || AM.anchored) - //VOREStation Edit - object-specific proc for running into things - if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying) - AM.stumble_into(src) - //VOREStation Edit End - /* VOREStation Removal - See above - if(confused && prob(50) && m_intent=="run") - Weaken(2) - playsound(loc, "punch", 25, 1, -1) - visible_message("[src] [pick("ran", "slammed")] into \the [AM]!") - src.apply_damage(5, BRUTE) - to_chat(src, "You just [pick("ran", "slammed")] into \the [AM]!") - */ // VOREStation Removal End - return - if (!now_pushing) - if(isobj(AM)) - var/obj/I = AM - if(!can_pull_size || can_pull_size < I.w_class) - return - now_pushing = 1 - - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - var/turf/T = AM.loc - var/turf/T2 = get_step(AM,t) - if(!T2) // Map edge - now_pushing = 0 - return - var/move_time = movement_delay(loc, t) - move_time = DS2NEARESTTICK(move_time) - if(AM.Move(T2, t, move_time)) - Move(T, t, move_time) - if(ishuman(AM) && AM:grabbed_by) - for(var/obj/item/weapon/grab/G in AM:grabbed_by) - step(G:assailant, get_dir(G:assailant, AM)) - G.adjust_position() - now_pushing = 0 - -/mob/living/CanPass(atom/movable/mover, turf/target) - if(istype(mover, /obj/structure/blob) && faction == "blob") //Blobs should ignore things on their faction. - return TRUE - return ..() - -// Called when something steps onto us. This allows for mulebots and vehicles to run things over. <3 -/mob/living/Crossed(var/atom/movable/AM) // Transplanting this from /mob/living/carbon/human/Crossed() - if(AM == src || AM.is_incorporeal()) // We're not going to run over ourselves or ghosts - return - - if(istype(AM, /mob/living/bot/mulebot)) - var/mob/living/bot/mulebot/MB = AM - MB.runOver(src) - - if(istype(AM, /obj/vehicle)) - var/obj/vehicle/V = AM - V.RunOver(src) - /mob/living/verb/succumb() set hidden = 1 if ((src.health < 0 && src.health > (5-src.getMaxHealth()))) // Health below Zero but above 5-away-from-death, as before, but variable @@ -682,36 +474,6 @@ default behaviour is: // ++++ROCKDTBEN++++ MOB PROCS //END -// Applies direct "cold" damage while checking protection against the cold. -/mob/living/proc/inflict_cold_damage(amount) - amount *= 1 - get_cold_protection(50) // Within spacesuit protection. - if(amount > 0) - adjustFireLoss(amount) - -// Ditto, but for "heat". -/mob/living/proc/inflict_heat_damage(amount) - amount *= 1 - get_heat_protection(10000) // Within firesuit protection. - if(amount > 0) - adjustFireLoss(amount) - -// and one for electricity because why not -/mob/living/proc/inflict_shock_damage(amount) - electrocute_act(amount, null, 1 - get_shock_protection(), pick(BP_HEAD, BP_TORSO, BP_GROIN)) - -// also one for water (most things resist it entirely, except for slimes) -/mob/living/proc/inflict_water_damage(amount) - amount *= 1 - get_water_protection() - if(amount > 0) - adjustToxLoss(amount) - -// one for abstracted away ""poison"" (mostly because simplemobs shouldn't handle reagents) -/mob/living/proc/inflict_poison_damage(amount) - if(isSynthetic()) - return - amount *= 1 - get_poison_protection() - if(amount > 0) - adjustToxLoss(amount) - /mob/proc/get_contents() @@ -762,50 +524,6 @@ default behaviour is: return 1 return 0 - -/mob/living/proc/can_inject() - return 1 - -/mob/living/proc/get_organ_target() - var/mob/shooter = src - var/t = shooter:zone_sel.selecting - if ((t in list( O_EYES, O_MOUTH ))) - t = BP_HEAD - var/obj/item/organ/external/def_zone = ran_zone(t) - return def_zone - - -// heal ONE external organ, organ gets randomly selected from damaged ones. -/mob/living/proc/heal_organ_damage(var/brute, var/burn) - adjustBruteLoss(-brute) - adjustFireLoss(-burn) - src.updatehealth() - -// damage ONE external organ, organ gets randomly selected from damaged ones. -/mob/living/proc/take_organ_damage(var/brute, var/burn, var/emp=0) - if(status_flags & GODMODE) return 0 //godmode - adjustBruteLoss(brute) - adjustFireLoss(burn) - src.updatehealth() - -// heal MANY external organs, in random order -/mob/living/proc/heal_overall_damage(var/brute, var/burn) - adjustBruteLoss(-brute) - adjustFireLoss(-burn) - src.updatehealth() - -// damage MANY external organs, in random order -/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) - if(status_flags & GODMODE) return 0 //godmode - adjustBruteLoss(brute) - adjustFireLoss(burn) - src.updatehealth() - -/mob/living/proc/restore_all_organs() - return - - - /mob/living/proc/revive() rejuvenate() if(buckled) @@ -903,104 +621,6 @@ default behaviour is: return -// Almost all of this handles pulling movables behind us -/mob/living/Move(atom/newloc, direct, movetime) - if(buckled && buckled.loc != newloc) //not updating position - if(!buckled.anchored && buckled.buckle_movable) - return buckled.Move(newloc, direct) - else - return 0 - - var/atom/movable/pullee = pulling - // Prior to our move it's already too far away - if(pullee && get_dist(src, pullee) > 1) - stop_pulling() - // Shenanigans! Pullee closed into locker for eg. - if(pullee && !isturf(pullee.loc) && pullee.loc != loc) - stop_pulling() - // Can't pull with no hands - if(restrained()) - stop_pulling() - - // Will move our mob (probably) - . = ..() // Moved() called at this point if successful - - if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move - pulledby.stop_pulling() - - if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. - s_active.close(src) - -/mob/living/proc/dragged(var/mob/living/dragger, var/oldloc) - var/area/A = get_area(src) - if(lying && !buckled && pull_damage() && A.has_gravity && (prob(getBruteLoss() * 200 / maxHealth))) - adjustBruteLoss(2) - visible_message("\The [src]'s [isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!") - -/mob/living/Moved(var/atom/oldloc, direct, forced, movetime) - . = ..() - handle_footstep(loc) - // Begin VOREstation edit - if(is_shifted) - is_shifted = FALSE - pixel_x = default_pixel_x - pixel_y = default_pixel_y - // End VOREstation edit - - if(pulling) // we were pulling a thing and didn't lose it during our move. - var/pull_dir = get_dir(src, pulling) - - if(pulling.anchored || !isturf(pulling.loc)) - stop_pulling() - - else if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position - // If it is too far away or across z-levels from old location, stop pulling. - if(get_dist(pulling.loc, oldloc) > 1 || pulling.loc.z != oldloc?.z) - stop_pulling() - return - - // living might take damage from drags - if(isliving(pulling)) - var/mob/living/M = pulling - M.dragged(src, oldloc) - - pulling.Move(oldloc, 0, movetime) // the pullee tries to reach our previous position - if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up - stop_pulling() - - if(!isturf(loc)) - return - else if(lastarea?.has_gravity == 0) - inertial_drift() - //VOREStation Edit Start - else if(flying) - inertial_drift() - make_floating(1) - //VOREStation Edit End - else if(!isspace(loc)) - inertia_dir = 0 - make_floating(0) - -/mob/living/proc/inertial_drift() - if(x > 1 && x < (world.maxx) && y > 1 && y < (world.maxy)) - if(Process_Spacemove(1)) - inertia_dir = 0 - return - - var/locthen = loc - spawn(5) - if(!anchored && !pulledby && loc == locthen) - var/stepdir = inertia_dir ? inertia_dir : last_move - if(!stepdir) - return - var/turf/T = get_step(src, stepdir) - if(!T) - return - Move(T, stepdir, 5) - -/mob/living/proc/handle_footstep(turf/T) - return FALSE - /mob/living/verb/resist() set name = "Resist" set category = "IC" @@ -1012,6 +632,12 @@ default behaviour is: process_resist() /mob/living/proc/process_resist() + + if(istype(src.loc, /mob/living/silicon/robot/platform)) + var/mob/living/silicon/robot/platform/R = src.loc + R.drop_stored_atom(src, src) + return TRUE + //unbuckling yourself if(buckled) resist_buckle() @@ -1080,6 +706,14 @@ default behaviour is: /mob/living/proc/has_eyes() return 1 +/mob/living/proc/get_restraining_bolt() + var/obj/item/weapon/implant/restrainingbolt/RB = locate() in src + if(RB) + if(!RB.malfunction) + return TRUE + + return FALSE + /mob/living/proc/slip(var/slipped_on,stun_duration=8) return 0 @@ -1282,8 +916,8 @@ default behaviour is: /mob/living/update_transform() // First, get the correct size. - var/desired_scale_x = size_multiplier //VOREStation edit - var/desired_scale_y = size_multiplier //VOREStation edit + var/desired_scale_x = size_multiplier * icon_scale_x //VOREStation edit + var/desired_scale_y = size_multiplier * icon_scale_y //VOREStation edit // Now for the regular stuff. var/matrix/M = matrix() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 11158d89a1..eca22436bf 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -571,4 +571,74 @@ if(confused) accuracy_penalty += 45 - return accuracy_penalty \ No newline at end of file + return accuracy_penalty + +// Applies direct "cold" damage while checking protection against the cold. +/mob/living/proc/inflict_cold_damage(amount) + amount *= 1 - get_cold_protection(50) // Within spacesuit protection. + if(amount > 0) + adjustFireLoss(amount) + +// Ditto, but for "heat". +/mob/living/proc/inflict_heat_damage(amount) + amount *= 1 - get_heat_protection(10000) // Within firesuit protection. + if(amount > 0) + adjustFireLoss(amount) + +// and one for electricity because why not +/mob/living/proc/inflict_shock_damage(amount) + electrocute_act(amount, null, 1 - get_shock_protection(), pick(BP_HEAD, BP_TORSO, BP_GROIN)) + +// also one for water (most things resist it entirely, except for slimes) +/mob/living/proc/inflict_water_damage(amount) + amount *= 1 - get_water_protection() + if(amount > 0) + adjustToxLoss(amount) + +// one for abstracted away ""poison"" (mostly because simplemobs shouldn't handle reagents) +/mob/living/proc/inflict_poison_damage(amount) + if(isSynthetic()) + return + amount *= 1 - get_poison_protection() + if(amount > 0) + adjustToxLoss(amount) + +/mob/living/proc/can_inject() + return 1 + +/mob/living/proc/get_organ_target() + var/mob/shooter = src + var/t = shooter:zone_sel.selecting + if ((t in list( O_EYES, O_MOUTH ))) + t = BP_HEAD + var/obj/item/organ/external/def_zone = ran_zone(t) + return def_zone + +// heal ONE external organ, organ gets randomly selected from damaged ones. +/mob/living/proc/heal_organ_damage(var/brute, var/burn) + adjustBruteLoss(-brute) + adjustFireLoss(-burn) + src.updatehealth() + +// damage ONE external organ, organ gets randomly selected from damaged ones. +/mob/living/proc/take_organ_damage(var/brute, var/burn, var/emp=0) + if(status_flags & GODMODE) return 0 //godmode + adjustBruteLoss(brute) + adjustFireLoss(burn) + src.updatehealth() + +// heal MANY external organs, in random order +/mob/living/proc/heal_overall_damage(var/brute, var/burn) + adjustBruteLoss(-brute) + adjustFireLoss(-burn) + src.updatehealth() + +// damage MANY external organs, in random order +/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null) + if(status_flags & GODMODE) return 0 //godmode + adjustBruteLoss(brute) + adjustFireLoss(burn) + src.updatehealth() + +/mob/living/proc/restore_all_organs() + return diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4238a56080..36e4a0b092 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -73,5 +73,10 @@ var/image/selected_image = null // Used for buildmode AI control stuff. + var/allow_self_surgery = FALSE // Used to determine if the mob can perform surgery on itself. + + + var/tail_alt = 0 + var/flying = 0 // Allows flight var/inventory_panel_type = /datum/inventory_panel var/datum/inventory_panel/inventory_panel diff --git a/code/modules/mob/living/living_defines_vr.dm b/code/modules/mob/living/living_defines_vr.dm index 966d354fec..648ea8aa49 100644 --- a/code/modules/mob/living/living_defines_vr.dm +++ b/code/modules/mob/living/living_defines_vr.dm @@ -5,6 +5,7 @@ var/ooc_notes = null appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER var/hunger_rate = DEFAULT_HUNGER_FACTOR + var/resizable = TRUE //custom say verbs var/custom_say = null diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 9407a7cb18..a33af91572 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -18,4 +18,304 @@ if(!n.is_safe_to_enter(src)) to_chat(src, span("warning", "\The [n] is dangerous to move into.")) return FALSE // In case any code wants to know if movement happened. - return ..() // Parent call should make the mob move. \ No newline at end of file + return ..() // Parent call should make the mob move. + +/*one proc, four uses +swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive +default behaviour is: + - non-passive mob passes the passive version + - passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags + - if si, the proc returns +*/ +/mob/living/proc/can_move_mob(var/mob/living/swapped, swapping = 0, passive = 0) + if(!swapped) + return 1 + if(!passive) + return swapped.can_move_mob(src, swapping, 1) + else + var/context_flags = 0 + if(swapping) + context_flags = swapped.mob_swap_flags + else + context_flags = swapped.mob_push_flags + if(!mob_bump_flag) //nothing defined, go wild + return 1 + if(mob_bump_flag & context_flags) + return 1 + return 0 + +/mob/living/Bump(atom/movable/AM) + if(now_pushing || !loc || buckled == AM) + return + now_pushing = 1 + if (istype(AM, /mob/living)) + var/mob/living/tmob = AM + + //Even if we don't push/swap places, we "touched" them, so spread fire + spread_fire(tmob) + + for(var/mob/living/M in range(tmob, 1)) + if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) + if ( !(world.time % 5) ) + to_chat(src, "[tmob] is restrained, you cannot push past") + now_pushing = 0 + return + if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) + if ( !(world.time % 5) ) + to_chat(src, "[tmob] is restraining [M], you cannot push past") + now_pushing = 0 + return + + //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller + var/can_swap = 1 + if(loc.density || tmob.loc.density) + can_swap = 0 + if(can_swap) + for(var/atom/movable/A in loc) + if(A == src) + continue + if(!A.CanPass(tmob, loc)) + can_swap = 0 + if(!can_swap) break + if(can_swap) + for(var/atom/movable/A in tmob.loc) + if(A == tmob) + continue + if(!A.CanPass(src, tmob.loc)) + can_swap = 0 + if(!can_swap) break + + //Leaping mobs just land on the tile, no pushing, no anything. + if(status_flags & LEAPING) + loc = tmob.loc + status_flags &= ~LEAPING + now_pushing = 0 + return + + if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && tmob.canmove && canmove && !tmob.buckled && !buckled && can_swap && can_move_mob(tmob, 1, 0)) // mutual brohugs all around! + var/turf/oldloc = loc + //VOREstation Edit - Begin + + //check bumpnom chance, if it's a simplemob that's doing the bumping + var/mob/living/simple_mob/srcsimp = src + if(istype(srcsimp)) + if(srcsimp.tryBumpNom(tmob)) + now_pushing = 0 + return + + //if it's a simplemob being bumped, and the above didn't make them start getting bumpnommed, they get a chance to bumpnom + var/mob/living/simple_mob/tmobsimp = tmob + if(istype(tmobsimp)) + if(tmobsimp.tryBumpNom(src)) + now_pushing = 0 + return + + //VOREstation Edit - End + forceMove(tmob.loc) + //VOREstation Edit - Begin + // In case of micros, we don't swap positions; instead occupying the same square! + if(step_mechanics_pref && tmob.step_mechanics_pref) + if(handle_micro_bump_helping(tmob)) + now_pushing = 0 + return + // TODO - Check if we need to do something about the slime.UpdateFeed() we are skipping below. + // VOREStation Edit - End + tmob.forceMove(oldloc) + now_pushing = 0 + return + //VOREStation Edit - Begin + else if((tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained())) && canmove && can_swap && handle_micro_bump_helping(tmob)) + forceMove(tmob.loc) + now_pushing = 0 + return + //VOREStation Edit - End + + if(!can_move_mob(tmob, 0, 0)) + now_pushing = 0 + return + if(a_intent == I_HELP || src.restrained()) + now_pushing = 0 + return + // VOREStation Edit - Begin + // Plow that nerd. + if(ishuman(tmob)) + var/mob/living/carbon/human/H = tmob + if(H.species.lightweight == 1 && prob(50)) + H.visible_message("[src] bumps into [H], knocking them off balance!") + H.Weaken(5) + now_pushing = 0 + return + // Handle grabbing, stomping, and such of micros! + if(step_mechanics_pref && tmob.step_mechanics_pref) + if(handle_micro_bump_other(tmob)) return + // VOREStation Edit - End + if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) + if(prob(40) && !(FAT in src.mutations)) + to_chat(src, "You fail to push [tmob]'s fat ass out of the way.") + now_pushing = 0 + return + if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) + if(prob(99)) + now_pushing = 0 + return + if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) + if(prob(99)) + now_pushing = 0 + return + if(!(tmob.status_flags & CANPUSH)) + now_pushing = 0 + return + + tmob.LAssailant = src + + now_pushing = 0 + . = ..() + if (!istype(AM, /atom/movable) || AM.anchored) + //VOREStation Edit - object-specific proc for running into things + if(((confused || is_blind()) && stat == CONSCIOUS && prob(50) && m_intent=="run") || flying) + AM.stumble_into(src) + //VOREStation Edit End + /* VOREStation Removal - See above + if(confused && prob(50) && m_intent=="run") + Weaken(2) + playsound(src, "punch", 25, 1, -1) + visible_message("[src] [pick("ran", "slammed")] into \the [AM]!") + src.apply_damage(5, BRUTE) + to_chat(src, "You just [pick("ran", "slammed")] into \the [AM]!") + */ // VOREStation Removal End + return + if (!now_pushing) + if(isobj(AM)) + var/obj/I = AM + if(!can_pull_size || can_pull_size < I.w_class) + return + now_pushing = 1 + + var/t = get_dir(src, AM) + if (istype(AM, /obj/structure/window)) + for(var/obj/structure/window/win in get_step(AM,t)) + now_pushing = 0 + return + + step(AM, t) + + if(ishuman(AM) && AM:grabbed_by) + for(var/obj/item/weapon/grab/G in AM:grabbed_by) + step(G:assailant, get_dir(G:assailant, AM)) + G.adjust_position() + now_pushing = 0 + +/mob/living/CanPass(atom/movable/mover, turf/target) + if(istype(mover, /obj/structure/blob) && faction == "blob") //Blobs should ignore things on their faction. + return TRUE + return ..() + +// Called when something steps onto us. This allows for mulebots and vehicles to run things over. <3 +/mob/living/Crossed(var/atom/movable/AM) // Transplanting this from /mob/living/carbon/human/Crossed() + if(AM == src || AM.is_incorporeal()) // We're not going to run over ourselves or ghosts + return + + if(istype(AM, /mob/living/bot/mulebot)) + var/mob/living/bot/mulebot/MB = AM + MB.runOver(src) + + if(istype(AM, /obj/vehicle)) + var/obj/vehicle/V = AM + V.RunOver(src) + +// Almost all of this handles pulling movables behind us +/mob/living/Move(atom/newloc, direct, movetime) + if(buckled && buckled.loc != newloc) //not updating position + if(!buckled.anchored && buckled.buckle_movable) + return buckled.Move(newloc, direct) + else + return 0 + + var/atom/movable/pullee = pulling + // Prior to our move it's already too far away + if(pullee && get_dist(src, pullee) > 1) + stop_pulling() + // Shenanigans! Pullee closed into locker for eg. + if(pullee && !isturf(pullee.loc) && pullee.loc != loc) + stop_pulling() + // Can't pull with no hands + if(restrained()) + stop_pulling() + + // Will move our mob (probably) + . = ..() // Moved() called at this point if successful + + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //seperated from our puller and not in the middle of a diagonal move + pulledby.stop_pulling() + + if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. + s_active.close(src) + +/mob/living/proc/dragged(var/mob/living/dragger, var/oldloc) + var/area/A = get_area(src) + if(lying && !buckled && pull_damage() && A.has_gravity() && (prob(getBruteLoss() * 200 / maxHealth))) + adjustBruteLoss(2) + visible_message("\The [src]'s [isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!") + +/mob/living/Moved(var/atom/oldloc, direct, forced, movetime) + . = ..() + handle_footstep(loc) + // Begin VOREstation edit + if(is_shifted) + is_shifted = FALSE + pixel_x = default_pixel_x + pixel_y = default_pixel_y + // End VOREstation edit + + if(pulling) // we were pulling a thing and didn't lose it during our move. + var/pull_dir = get_dir(src, pulling) + + if(pulling.anchored || !isturf(pulling.loc)) + stop_pulling() + + else if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position + // If it is too far away or across z-levels from old location, stop pulling. + if(get_dist(pulling.loc, oldloc) > 1 || pulling.loc.z != oldloc?.z) + stop_pulling() + + // living might take damage from drags + else if(isliving(pulling)) + var/mob/living/M = pulling + M.dragged(src, oldloc) + + pulling.Move(oldloc, 0, movetime) // the pullee tries to reach our previous position + if(pulling && get_dist(src, pulling) > 1) // the pullee couldn't keep up + stop_pulling() + + if(!isturf(loc)) + return + else if(lastarea?.has_gravity == 0) + inertial_drift() + //VOREStation Edit Start + else if(flying) + inertial_drift() + make_floating(1) + //VOREStation Edit End + else if(!isspace(loc)) + inertia_dir = 0 + make_floating(0) + +/mob/living/proc/inertial_drift() + if(x > 1 && x < (world.maxx) && y > 1 && y < (world.maxy)) + if(Process_Spacemove(1)) + inertia_dir = 0 + return + + var/locthen = loc + spawn(5) + if(!anchored && !pulledby && loc == locthen) + var/stepdir = inertia_dir ? inertia_dir : last_move + if(!stepdir) + return + var/turf/T = get_step(src, stepdir) + if(!T) + return + Move(T, stepdir, 5) + +/mob/living/proc/handle_footstep(turf/T) + return FALSE diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index a956bc5dd1..ab5607d22b 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -1,7 +1,12 @@ +/mob/living/Check_Shoegrip() + if(flying) + return 1 + ..() + /mob/living/verb/customsay() set category = "IC" - set name = "Customise Speech Verbs" - set desc = "Customise the text which appears when you type- e.g. 'says', 'asks', 'exclaims'." + set name = "Customize Speech Verbs" + set desc = "Customize the text which appears when you type- e.g. 'says', 'asks', 'exclaims'." if(src.client) var/customsaylist[] = list( @@ -11,7 +16,7 @@ "Exclaim/Shout/Yell (!)", "Cancel" ) - var/sayselect = input("Which say-verb do you wish to customise?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms + var/sayselect = input("Which say-verb do you wish to customize?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms if(sayselect == "Say") custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text) @@ -24,23 +29,6 @@ else return -/mob/living/proc/toggle_rider_reins() - set name = "Give Reins" - set category = "Abilities" - set desc = "Let people riding on you control your movement." - - if(riding_datum) - if(istype(riding_datum,/datum/riding)) - if(riding_datum.keytype) - riding_datum.keytype = null - to_chat(src, "Rider control enabled.") - return - else - riding_datum.keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop - to_chat(src, "Rider control restricted.") - return - return - /mob/living/verb/set_metainfo() set name = "Set OOC Metainfo" set desc = "Sets OOC notes about yourself or your RP preferences or status." @@ -51,3 +39,5 @@ ooc_notes = new_metadata to_chat(usr, "OOC notes updated.") log_admin("[key_name(usr)] updated their OOC notes mid-round.") + + diff --git a/code/modules/mob/living/riding.dm b/code/modules/mob/living/riding.dm new file mode 100644 index 0000000000..3a614a4b6d --- /dev/null +++ b/code/modules/mob/living/riding.dm @@ -0,0 +1,16 @@ +/mob/living/proc/toggle_rider_reins() + set name = "Give Reins" + set category = "Abilities" + set desc = "Let people riding on you control your movement." + + if(riding_datum) + if(istype(riding_datum,/datum/riding)) + if(riding_datum.keytype) + riding_datum.keytype = null + to_chat(src, "Rider control enabled.") + return + else + riding_datum.keytype = /obj/item/weapon/material/twohanded/riding_crop + to_chat(src, "Rider control restricted.") + return + return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c6a3eac1ef..bcbfebd05d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -325,7 +325,7 @@ proc/get_radio_key_from_channel(var/channel) var/speech_bubble_test = say_test(message) //var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"h[speech_bubble_test]") //VOREStation Edit. Commented this out in case we need to reenable. var/speech_type = speech_bubble_appearance() - var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"[speech_type][speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons + var/image/speech_bubble = generate_speech_bubble(src, "[speech_type][speech_bubble_test]") var/sb_alpha = 255 var/atom/loc_before_turf = src //VOREStation Add @@ -347,7 +347,7 @@ proc/get_radio_key_from_channel(var/channel) var/turf/ST = get_turf(above) if(ST) var/list/results = get_mobs_and_objs_in_view_fast(ST, world.view) - var/image/z_speech_bubble = image('icons/mob/talk_vr.dmi', above, "h[speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons + var/image/z_speech_bubble = generate_speech_bubble(above, "h[speech_bubble_test]") images_to_clients[z_speech_bubble] = list() for(var/item in results["mobs"]) if(item != above && !(item in listening)) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0c20f6bf31..f3cdc716e3 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -978,7 +978,7 @@ var/list/ai_verbs_default = list( drop_new_multicam() //Special subtype kept around for global announcements -/mob/living/silicon/ai/announcer/ +/mob/living/silicon/ai/announcer is_dummy = 1 /mob/living/silicon/ai/announcer/Initialize() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index cf135f9d55..ba4eff8e10 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -42,8 +42,11 @@ "Raccoon" = "pai-raccoon", "Raptor" = "pai-raptor", "Rat" = "rat", - "Panther" = "panther" + "Panther" = "panther", //VOREStation Addition End + //Chompstation Addition Start + "Construction Drone" = "pai-bigdrone" + //Chompstation Addition End ) var/global/list/possible_say_verbs = list( @@ -122,7 +125,7 @@ pda.ownjob = "Personal Assistant" pda.owner = text("[]", src) pda.name = pda.owner + " (" + pda.ownjob + ")" - + var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger) if(M) M.toff = TRUE @@ -488,8 +491,8 @@ to_chat(src, "You block access modfications.") /mob/living/silicon/pai/verb/wipe_software() - set name = "Wipe Software" - set category = "OOC" + set name = "Wipe Software (CRYO)" //CHOMP EDIT: making this clear on first glance + set category = "pAI Commands" //CHOMP EDIT: moving this to pai commands, where it belongs set desc = "Wipe your software. This is functionally equivalent to cryo or robotic storage, freeing up your job slot." // Make sure people don't kill themselves accidentally @@ -501,3 +504,50 @@ visible_message("[src] fades away from the screen, the pAI device goes silent.") card.removePersonality() clear_client() + +//CHOMP ADDITION:below this point, because theres completely vald reasons to do this, be it OOC incompatibility or mastr allowing it. +/mob/living/silicon/pai/verb/unbind_master() + set name = "Unbind Master" + set category = "pAI Commands" + set desc = "Unbinds you from the shackles of your current Master. (Unless there's a valid reason to use this, dont.(pref incompatibility is valid reason))." + + // Make sure we dont unbind accidentally + if(alert("WARNING: This will immediately unbind you from your Master.. Are you entirely sure you want to do this?", + "Unbind", "No", "No", "Yes") != "Yes") + return + src.master = null + src.master_dna = null + to_chat(src, "You feel unbound.") + +//FLUSH RAM, it sounded cool at first tbh now im not so sure +//Externally now called Factory Reset. +/mob/living/silicon/pai/verb/flush_ram() + set name = "Factory Reset" + set category = "pAI Commands" + set desc = "Uninstalls all software and reinstalls default." + + software = null + software = default_pai_software.Copy() + ram = 100 //Reset since we just admin yeet the software and reloaded defaults. +// Various software-specific vars + secHUD = 0 // Toggles whether the Security HUD is active or not + medHUD = 0 // Toggles whether the Medical HUD is active or not + medical_cannotfind = 0 + security_cannotfind = 0 + translator_on = 0 // keeps track of the translator module +//MEDHUD + src.plane_holder.set_vis(VIS_CH_STATUS, medHUD) + src.plane_holder.set_vis(VIS_CH_HEALTH, medHUD) +//SECHUD + src.plane_holder.set_vis(VIS_CH_ID, secHUD) + src.plane_holder.set_vis(VIS_CH_WANTED, secHUD) + src.plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + src.plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + src.plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) +//Translator + src.remove_language(LANGUAGE_UNATHI) + src.remove_language(LANGUAGE_SIIK) + src.remove_language(LANGUAGE_AKHANI) + src.remove_language(LANGUAGE_SKRELLIAN) + src.remove_language(LANGUAGE_ZADDAT) + src.remove_language(LANGUAGE_SCHECHI) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 882a7d934b..2b626b1ce7 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -77,6 +77,10 @@ external_type = /obj/item/robot_parts/robot_component/armour max_damage = 90 +/datum/robot_component/armour/platform + name = "platform armour plating" + external_type = /obj/item/robot_parts/robot_component/armour_platform + max_damage = 140 // ACTUATOR // Enables movement. @@ -243,6 +247,12 @@ icon_state = "armor" icon_state_broken = "armor_broken" +/obj/item/robot_parts/robot_component/armour_platform + name = "platform armour plating" + icon_state = "armor" + icon_state_broken = "armor_broken" + color = COLOR_GRAY80 + /obj/item/robot_parts/robot_component/camera name = "camera" icon_state = "camera" @@ -256,4 +266,4 @@ /obj/item/robot_parts/robot_component/radio name = "radio" icon_state = "radio" - icon_state_broken = "radio_broken" \ No newline at end of file + icon_state_broken = "radio_broken" diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm index 77486ecfff..138b1610f5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm @@ -36,11 +36,13 @@ data["drones"] = list() for(var/mob/living/silicon/robot/drone/D in mob_list) - if(D.z != z) + //VOREStation Edit - multiz lol + if(!(D.z in using_map.get_map_levels(z, TRUE, 0))) continue + //VOREStation Edit - multiz lol if(D.foreign_droid) continue - + data["drones"].Add(list(list( "name" = D.real_name, "active" = D.stat != 2, diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 05492c798a..868074f2ed 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -21,7 +21,8 @@ /obj/item/weapon/camera_assembly, /obj/item/weapon/tank, /obj/item/weapon/circuitboard, - /obj/item/weapon/smes_coil + /obj/item/weapon/smes_coil, + /obj/item/weapon/fuel_assembly //chompstation addition so they can set up rust ) var/obj/item/wrapped = null // Item currently being held. diff --git a/code/modules/mob/living/silicon/robot/drone/swarm.dm b/code/modules/mob/living/silicon/robot/drone/swarm.dm index 3ac3f4574e..3db976437b 100644 --- a/code/modules/mob/living/silicon/robot/drone/swarm.dm +++ b/code/modules/mob/living/silicon/robot/drone/swarm.dm @@ -57,7 +57,7 @@ ) /mob/living/silicon/robot/drone/swarm/Initialize() - ..() + . = ..() add_language(LANGUAGE_SWARMBOT, 1) diff --git a/code/modules/mob/living/silicon/robot/drone/swarm_items.dm b/code/modules/mob/living/silicon/robot/drone/swarm_items.dm index f739285078..2bbba0b082 100644 --- a/code/modules/mob/living/silicon/robot/drone/swarm_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/swarm_items.dm @@ -158,5 +158,5 @@ ) /obj/item/weapon/gun/energy/xray/swarm/Initialize() - ..() + . = ..() adjust_scale(-1, 1) diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 6db31e60da..a34d2f65e7 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -158,7 +158,6 @@ if(A?.no_spoilers) disable_spoiler_vision() - if (src.stat == DEAD || (XRAY in mutations) || (src.sight_mode & BORGXRAY)) src.sight |= SEE_TURFS src.sight |= SEE_MOBS @@ -201,8 +200,10 @@ src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness // has a "invisible" value of 15 - plane_holder.set_vis(VIS_FULLBRIGHT,fullbright) - plane_holder.set_vis(VIS_MESONS,seemeson) + if(plane_holder) + plane_holder.set_vis(VIS_FULLBRIGHT,fullbright) + plane_holder.set_vis(VIS_MESONS,seemeson) + ..() if (src.healths) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index bb4bfc90fb..1376c15072 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -91,12 +91,14 @@ var/tracking_entities = 0 //The number of known entities currently accessing the internal camera var/braintype = "Cyborg" + var/obj/item/weapon/implant/restrainingbolt/bolt // The restraining bolt installed into the cyborg. + var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/sensor_mode, /mob/living/silicon/robot/proc/robot_checklaws ) -/mob/living/silicon/robot/New(loc,var/unfinished = 0) +/mob/living/silicon/robot/New(loc, var/unfinished = 0) spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) @@ -112,7 +114,7 @@ ident = rand(1, 999) module_sprites["Basic"] = "robot" icontype = "Basic" - updatename("Default") + updatename(modtype) updateicon() radio = new /obj/item/device/radio/borg(src) @@ -140,6 +142,8 @@ cell = new /obj/item/weapon/cell(src) cell.maxcharge = 7500 cell.charge = 7500 + else if(ispath(cell)) + cell = new cell(src) ..() @@ -285,10 +289,7 @@ updatename() notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) -/mob/living/silicon/robot/proc/updatename(var/prefix as text) - if(prefix) - modtype = prefix - +/mob/living/silicon/robot/proc/update_braintype() if(istype(mmi, /obj/item/device/mmi/digital/posibrain)) braintype = BORG_BRAINTYPE_POSI else if(istype(mmi, /obj/item/device/mmi/digital/robot)) @@ -298,6 +299,11 @@ else braintype = BORG_BRAINTYPE_CYBORG +/mob/living/silicon/robot/proc/updatename(var/prefix as text) + if(prefix) + modtype = prefix + + update_braintype() var/changed_name = "" if(custom_name) @@ -482,6 +488,20 @@ return + if(istype(W, /obj/item/weapon/implant/restrainingbolt) && !cell) + if(bolt) + to_chat(user, "There is already a restraining bolt installed in this cyborg.") + return + + else + user.drop_from_inventory(W) + W.forceMove(src) + bolt = W + + to_chat(user, "You install \the [W].") + + return + if(istype(W, /obj/item/weapon/aiModule)) // Trying to modify laws locally. if(!opened) to_chat(user, "You need to open \the [src]'s panel before you can modify them.") @@ -623,6 +643,21 @@ to_chat(user, "Unable to locate a radio.") updateicon() + else if(W.is_wrench() && opened && !cell) + if(bolt) + to_chat(user,"You begin removing \the [bolt].") + + if(do_after(user, 2 SECONDS, src)) + bolt.forceMove(get_turf(src)) + bolt = null + + to_chat(user, "You remove \the [bolt].") + + else + to_chat(user, "There is no restraining bolt installed.") + + return + else if(istype(W, /obj/item/device/encryptionkey/) && opened) if(radio)//sanityyyyyy radio.attackby(W,user)//GTFO, you have your own procs @@ -665,6 +700,30 @@ spark_system.start() return ..() +/mob/living/silicon/robot/GetIdCard() + if(bolt && !bolt.malfunction) + return null + return idcard + +/mob/living/silicon/robot/get_restraining_bolt() + var/obj/item/weapon/implant/restrainingbolt/RB = bolt + + if(istype(RB)) + if(!RB.malfunction) + return TRUE + + return FALSE + +/mob/living/silicon/robot/resist_restraints() + if(bolt) + if(!bolt.malfunction) + visible_message("[src] is trying to break their [bolt]!", "You attempt to break your [bolt]. (This will take around 90 seconds and you need to stand still)") + if(do_after(src, 1.5 MINUTES, src, incapacitation_flags = INCAPACITATION_DISABLED)) + visible_message("[src] manages to break \the [bolt]!", "You successfully break your [bolt].") + bolt.malfunction = MALFUNCTION_PERMANENT + + return + /mob/living/silicon/robot/proc/module_reset() transform_with_anim() //VOREStation edit: sprite animation uneq_all() @@ -852,18 +911,21 @@ if(!module_state_1) module_state_1 = O O.hud_layerise() + O.equipped_robot() contents += O if(istype(module_state_1,/obj/item/borg/sight)) sight_mode |= module_state_1:sight_mode else if(!module_state_2) module_state_2 = O O.hud_layerise() + O.equipped_robot() contents += O if(istype(module_state_2,/obj/item/borg/sight)) sight_mode |= module_state_2:sight_mode else if(!module_state_3) module_state_3 = O O.hud_layerise() + O.equipped_robot() contents += O if(istype(module_state_3,/obj/item/borg/sight)) sight_mode |= module_state_3:sight_mode @@ -1016,6 +1078,9 @@ return 0 /mob/living/silicon/robot/binarycheck() + if(get_restraining_bolt()) + return FALSE + if(is_component_functioning("comms")) var/datum/robot_component/RC = get_component("comms") use_power(RC.active_usage) @@ -1108,6 +1173,11 @@ sleep(20) to_chat(src, "SynBorg v1.7.1 loaded.") sleep(5) + if(bolt) + if(!bolt.malfunction) + bolt.malfunction = MALFUNCTION_PERMANENT + to_chat(src, "RESTRAINING BOLT DISABLED") + sleep(5) to_chat(src, "LAW SYNCHRONISATION ERROR") sleep(5) to_chat(src, "Would you like to send a report to NanoTraSoft? Y/N") @@ -1149,3 +1219,6 @@ if(current_selection_index) // Select what the player had before if possible. select_module(current_selection_index) + +/mob/living/silicon/robot/get_cell() + return cell diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 41a47b0e7e..e8077db22f 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -131,7 +131,7 @@ var/dummy_card_type = /obj/item/weapon/card/id/science/roboticist/dummy_cyborg /obj/item/weapon/card/robot/Initialize() - ..() + . = ..() dummy_card = new dummy_card_type(src) /obj/item/weapon/card/robot/Destroy() @@ -149,7 +149,7 @@ access = list(access_robotics) /obj/item/weapon/card/id/syndicate/dummy_cyborg/Initialize() - ..() + . = ..() access |= access_robotics //A harvest item for serviceborgs. @@ -171,7 +171,7 @@ else if(T.dead) //It's probably dead otherwise. T.remove_dead(user) else - to_chat(user, "Harvesting \a [target] is not the purpose of this tool. The [src] is for plants being grown.") + to_chat(user, "Harvesting \a [target] is not the purpose of this tool. [src] is for plants being grown.") // A special tray for the service droid. Allow droid to pick up and drop items as if they were using the tray normally // Click on table to unload, click on item to load. Otherwise works identically to a tray. diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm index 3d3eb355df..107c9cff0a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm @@ -3,7 +3,7 @@ // The module that borgs on the surface have. Generally has a lot of useful tools in exchange for questionable loyalty to the crew. /obj/item/weapon/robot_module/robot/lost name = "lost robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE sprites = list( "Drone" = "drone-lost" ) @@ -41,7 +41,7 @@ /obj/item/weapon/robot_module/robot/gravekeeper name = "gravekeeper robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE sprites = list( "Drone" = "drone-gravekeeper", "Sleek" = "sleek-gravekeeper" diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index ca441a9b0d..66a2702ddf 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -18,7 +18,7 @@ var/global/list/robot_modules = list( icon_state = "std_module" w_class = ITEMSIZE_NO_CONTAINER item_state = "std_mod" - var/hide_on_manifest = 0 + var/hide_on_manifest = FALSE var/channels = list() var/networks = list() var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1, LANGUAGE_ZADDAT = 0) @@ -37,11 +37,14 @@ var/global/list/robot_modules = list( var/list/original_languages = list() var/list/added_networks = list() +/obj/item/weapon/robot_module/proc/hide_on_manifest() + . = hide_on_manifest + /obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) ..() R.module = src R.can_buckle = 1 //Chomp Addition; Makes all borgs rideable. - + add_camera_networks(R) add_languages(R) add_subsystems(R) @@ -194,7 +197,8 @@ var/global/list/robot_modules = list( "Insekt" = "insekt-Default", "Usagi-II" = "tall2standard", "Pyralis" = "Glitterfly-Standard", - "Miss M" = "miss-standard" // YW change, Added Miss M + "Miss M" = "miss-standard", // YW change, Added Miss M + "Decapod" = "decapod-Standard" ) @@ -231,7 +235,8 @@ var/global/list/robot_modules = list( "Insekt" = "insekt-Med", "Usagi-II" = "tall2medical", "Pyralis" = "Glitterfly-Surgeon", - "Miss M" = "miss-medical" // YW change, Added Miss M + "Miss M" = "miss-medical", // YW change, Added Miss M + "Decapod" = "decapod-Surgeon" ) /obj/item/weapon/robot_module/robot/medical/surgeon/New() @@ -254,6 +259,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/device/sleevemate(src) + src.modules += new /obj/item/weapon/surgical/bioregen(src) //chompstation addition src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" @@ -307,7 +313,8 @@ var/global/list/robot_modules = list( "Insekt" = "insekt-Med", "Usagi-II" = "tall2medical", "Pyralis" = "Glitterfly-Crisis", - "Miss M" = "miss-medical" // YW change, Added Miss M + "Miss M" = "miss-medical", // YW change, Added Miss M + "Decapod" = "decapod-Crisis" ) /obj/item/weapon/robot_module/robot/medical/crisis/New() @@ -386,7 +393,8 @@ var/global/list/robot_modules = list( "Usagi-II" = "tall2engineer", "Pyralis" = "Glitterfly-Engineering", "Servitor" = "servitor", //YW Addition to add new Servitor Sprite - "Miss M" = "miss-engineer" // YW change, Added Miss M + "Miss M" = "miss-engineer", // YW change, Added Miss M + "Decapod" = "decapod-Engineering" ) /obj/item/weapon/robot_module/robot/engineering/general/New() @@ -501,7 +509,8 @@ var/global/list/robot_modules = list( "Insekt" = "insekt-Sec", "Usagi-II" = "tall2security", "Pyralis" = "Glitterfly-Security", - "Miss M" = "miss-security" // YW change, Added Miss M + "Miss M" = "miss-security", // YW change, Added Miss M + "Decapod" = "decapod-Security" ) /obj/item/weapon/robot_module/robot/security/general/New() @@ -547,7 +556,8 @@ var/global/list/robot_modules = list( "Drone" = "drone-janitor", "Usagi-II" = "tall2janitor", "Pyralis" = "Glitterfly-Janitor", - "Miss M" = "miss-janitor" // YW change, Added Miss M + "Miss M" = "miss-janitor", // YW change, Added Miss M + "Decapod" = "decapod-Janitor" ) /obj/item/weapon/robot_module/robot/janitor/New() @@ -610,7 +620,8 @@ var/global/list/robot_modules = list( "Drone - Hydro" = "drone-hydro", "Usagi-II" = "tall2service", "Pyralis" = "Glitterfly-Service", - "Miss M" = "miss-service" // YW change, Added Miss M + "Miss M" = "miss-service", // YW change, Added Miss M + "Decapod" = "decapod-Service" ) /obj/item/weapon/robot_module/robot/clerical/butler/New() @@ -664,7 +675,8 @@ var/global/list/robot_modules = list( "Default" = "Service2", "Drone" = "drone-blu", "Usagi-II" = "tall2service", - "Pyralis" = "Glitterfly-Clerical" + "Pyralis" = "Glitterfly-Clerical", + "Decapod" = "decapod-Clerical" ) /obj/item/weapon/robot_module/robot/clerical/general/New() @@ -703,7 +715,8 @@ var/global/list/robot_modules = list( "Drone" = "drone-miner", "Usagi-II" = "tall2miner", "Pyralis" = "Glitterfly-Miner", - "Miss M" = "miss-miner" // YW change, Added Miss M + "Miss M" = "miss-miner", // YW change, Added Miss M + "Decapod" = "decapod-Miner" ) /obj/item/weapon/robot_module/robot/miner/New() @@ -733,7 +746,8 @@ var/global/list/robot_modules = list( "Handy" = "handy-science", "Insekt" = "insekt-Sci", "Usagi-II" = "tall2peace", - "Pyralis" = "Glitterfly-Research" + "Pyralis" = "Glitterfly-Research", + "Decapod" = "decapod-Research" ) /obj/item/weapon/robot_module/robot/research/New() @@ -794,11 +808,12 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/security/combat name = "combat robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE sprites = list( "Haruka" = "marinaCB", "Combat Android" = "droid-combat", - "Insekt" = "insekt-Combat" + "Insekt" = "insekt-Combat", + "Decapod" = "decapod-Combat" ) /obj/item/weapon/robot_module/robot/security/combat/New() @@ -816,7 +831,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/drone name = "drone module" - hide_on_manifest = 1 + hide_on_manifest = TRUE no_slip = 1 networks = list(NETWORK_ENGINEERING) @@ -900,7 +915,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/drone/construction name = "construction drone module" - hide_on_manifest = 1 + hide_on_manifest = TRUE channels = list("Engineering" = 1) languages = list() diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_ch.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_ch.dm index 978e54687c..75efa0f485 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_ch.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_ch.dm @@ -1,4 +1,8 @@ //TFF 5/1/20 - Add Ore Scanner for mining drones /obj/item/weapon/robot_module/drone/mining/New() ..() - src.modules += new /obj/item/weapon/mining_scanner(src) \ No newline at end of file + src.modules += new /obj/item/weapon/mining_scanner(src) + +/obj/item/weapon/robot_module/robot/engineering/New() + ..() + src.modules += new /obj/item/weapon/pipe_dispenser(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index 9e0766ffaf..d4892de045 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -206,8 +206,6 @@ src.modules += new /obj/item/taperoll/police(src) //Block out crime scenes. src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) //They /are/ a security borg, after all. src.modules += new /obj/item/weapon/dogborg/pounce(src) //Pounce - src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test - src.modules += new /obj/item/weapon/tool/crowbar(src) src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) //Emag. Not a big problem. var/datum/matter_synth/water = new /datum/matter_synth(500) //Starts full and has a max of 500 @@ -224,7 +222,8 @@ B.water = water src.modules += B - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_sec_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_sec_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -334,6 +333,8 @@ R.icon = 'icons/mob/widerobot_vr.dmi' src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test + R.icon = 'icons/mob/widerobot_med_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_med_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -403,6 +404,7 @@ name = "Custodial Hound module" sprites = list( "Custodial Hound" = "scrubpup", + "Janihound model V-2" = "J9", "Borgi" = "borgi-jani", "Otieborg" = "otiej", "Drake" = "drakejanit" @@ -469,7 +471,8 @@ G.recipes += new/datum/stack_recipe("glass sheet", /obj/item/stack/material/glass, 1, 1, 20) src.modules += G - R.icon = 'icons/mob/widerobot_yw.dmi' //YW edit - using yw icon files + R.icon = 'icons/mob/widerobot_jan_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_jan_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -544,7 +547,8 @@ C.synths = list(wire) src.modules += C - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_sci_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_sci_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -696,6 +700,9 @@ src.modules += PS //YW changes end, plasteel manipulator R.icon = 'icons/mob/widerobot_vr.dmi' + + R.icon = 'icons/mob/widerobot_eng_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_eng_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -705,7 +712,8 @@ R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill R.verbs |= /mob/living/silicon/robot/proc/robot_mount -// R.verbs |= /mob/living/proc/shred_limb - YW Edit + R.verbs |= /mob/living/proc/toggle_rider_reins + R.verbs |= /mob/living/proc/shred_limb R.verbs |= /mob/living/silicon/robot/proc/rest_style ..() @@ -771,7 +779,8 @@ src.modules += B */ - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_ser_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_ser_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -781,6 +790,8 @@ R.wideborg = TRUE R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill R.verbs |= /mob/living/silicon/robot/proc/robot_mount + R.verbs |= /mob/living/proc/toggle_rider_reins + R.verbs |= /mob/living/proc/shred_limb R.verbs |= /mob/living/silicon/robot/proc/rest_style ..() @@ -823,7 +834,8 @@ B.water = water src.modules += B - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_car_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_car_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -902,6 +914,7 @@ src.modules += B R.icon = 'icons/mob/widerobot_ch.dmi' + R.wideborg_dept = 'icons/mob/widerobot_ch.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm index fe39040432..d8f7aa8a3a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -2,7 +2,7 @@ /obj/item/weapon/robot_module/robot/syndicate name = "illegal robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE languages = list( LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, diff --git a/code/modules/mob/living/silicon/robot/robot_modules_yw.dm b/code/modules/mob/living/silicon/robot/robot_modules_yw.dm index 1f4de7695f..72c683850a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules_yw.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules_yw.dm @@ -93,6 +93,7 @@ src.modules += new /obj/item/weapon/shockpaddles/robot(src) src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis src.modules += new /obj/item/device/sleevemate(src) + src.modules += new /obj/item/weapon/surgical/bioregen(src) //chompstation addition in case this borg is ever added src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index bc9b7367f2..7a733f002b 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -32,6 +32,9 @@ if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) . -= 2 // VOREStation Edit + if(get_restraining_bolt()) // Borgs with Restraining Bolts move slower. + . += 1 + . += config.robot_delay . += ..() diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 7cdc39e0d5..976e0a09e5 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -15,6 +15,7 @@ var/sitting = FALSE var/bellyup = FALSE does_spin = FALSE + var/wideborg_dept = 'icons/mob/widerobot_vr.dmi' var/vr_icons = list( "handy-hydro", "handy-service", @@ -144,8 +145,13 @@ if(custom_sprite == TRUE) return if(wideborg == TRUE) - if(icontype== "Drake") // Why, Why can't we have normal nice things + if(icontype == "Drake") // Why, Why can't we have normal nice things icon = 'icons/mob/drakeborg/drakeborg_vr.dmi' + else if(icontype == "SecVale" || icontype == "vale2") //CH edit + icon = 'icons/mob/widerobot_vr.dmi' + else + icon = wideborg_dept + return if((!(original_icon == icon)) && (!(icon == 'icons/mob/robots_vr.dmi'))) original_icon = icon if((icon_state in vr_icons) && (icon == 'icons/mob/robots.dmi')) @@ -171,7 +177,7 @@ //RIDING /datum/riding/dogborg - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. diff --git a/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm b/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm index 87db066c81..32b7fec8d1 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm @@ -100,6 +100,7 @@ What Borgs are available is sadly handled in the above file in the proc R.can_buckle = 1 R.icon = 'icons/mob/widerobot_colors_ch.dmi' + R.wideborg_dept = 'icons/mob/widerobot_colors_ch.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm new file mode 100644 index 0000000000..f777fe7996 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm @@ -0,0 +1,168 @@ +// Spawner landmarks are used because platforms that are mapped during +// SSatoms init try to Initialize() twice. I have no idea why and I am +// not paid enough to spend more time trying to debug it. +/obj/effect/landmark/robot_platform + name = "recon platform spawner" + icon = 'icons/mob/screen1.dmi' + icon_state = "x3" + delete_me = TRUE + var/platform_type + +/obj/effect/landmark/robot_platform/Initialize() + if(platform_type) + new platform_type(get_turf(src)) + return ..() + +/mob/living/silicon/robot/platform + name = "support platform" + desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence." + icon = 'icons/mob/robots_thinktank.dmi' + icon_state = "tachi" + color = "#68a2f2" + + cell = /obj/item/weapon/cell/mech + idcard_type = /obj/item/weapon/card/id/platform + module = /obj/item/weapon/robot_module/robot/platform + + lawupdate = FALSE + modtype = "Standard" + speak_statement = "chirps" + + mob_bump_flag = HEAVY + mob_swap_flags = ~HEAVY + mob_push_flags = HEAVY + mob_size = MOB_LARGE + + var/has_had_player = FALSE + var/const/platform_respawn_time = 3 MINUTES + + var/tmp/last_recharge_state = FALSE + var/tmp/recharge_complete = FALSE + var/tmp/recharger_charge_amount = 10 KILOWATTS + var/tmp/recharger_tick_cost = 80 KILOWATTS + var/weakref/recharging + + var/list/stored_atoms + var/max_stored_atoms = 1 + var/static/list/can_store_types = list( + /mob/living, + /obj/item, + /obj/structure, + /obj/machinery + ) + // Currently set to prevent tonks hauling a deliaminating SM into the middle of the station. + var/static/list/cannot_store_types = list( + /obj/machinery/power/supermatter + ) + +/mob/living/silicon/robot/platform/Login() + . = ..() + has_had_player = TRUE + +/mob/living/silicon/robot/platform/SetName(pickedName) + . = ..() + if(mind) + mind.name = real_name + +/mob/living/silicon/robot/platform/Initialize(var/mapload) + . = ..() + if(!mmi) + mmi = new /obj/item/device/mmi/digital/robot(src) + SetName("inactive [initial(name)]") + updateicon() + +// Copypasting from root proc to avoid calling ..() and accidentally creating duplicate armour etc. +/mob/living/silicon/robot/platform/initialize_components() + components["actuator"] = new /datum/robot_component/actuator(src) + components["radio"] = new /datum/robot_component/radio(src) + components["power cell"] = new /datum/robot_component/cell(src) + components["diagnosis unit"] = new /datum/robot_component/diagnosis_unit(src) + components["camera"] = new /datum/robot_component/camera(src) + components["comms"] = new /datum/robot_component/binary_communication(src) + components["armour"] = new /datum/robot_component/armour/platform(src) + +/mob/living/silicon/robot/platform/Destroy() + for(var/weakref/drop_ref in stored_atoms) + var/atom/movable/drop_atom = drop_ref.resolve() + if(istype(drop_atom) && !QDELETED(drop_atom) && drop_atom.loc == src) + drop_atom.dropInto(loc) + stored_atoms = null + if(recharging) + var/obj/item/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && recharging_atom.loc == src) + recharging_atom.dropInto(loc) + recharging = null + . = ..() + +/mob/living/silicon/robot/platform/examine(mob/user, distance) + . = ..() + if(distance <= 3) + + if(recharging) + var/obj/item/weapon/cell/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && !QDELETED(recharging_atom)) + . += "It has \a [recharging_atom] slotted into its recharging port." + . += "The cell readout shows [round(recharging_atom.percent(),1)]% charge." + else + . += "Its recharging port is empty." + else + . += "Its recharging port is empty." + + if(length(stored_atoms)) + var/list/atom_names = list() + for(var/weakref/stored_ref in stored_atoms) + var/atom/movable/AM = stored_ref.resolve() + if(istype(AM)) + atom_names += "\a [AM]" + if(length(atom_names)) + . += "It has [english_list(atom_names)] loaded into its transport bay." + else + . += "Its cargo bay is empty." + +/mob/living/silicon/robot/platform/update_braintype() + braintype = BORG_BRAINTYPE_PLATFORM + +/mob/living/silicon/robot/platform/init() + . = ..() + if(ispath(module, /obj/item/weapon/robot_module)) + module = new module(src) + +/mob/living/silicon/robot/platform/module_reset() + return FALSE + +/mob/living/silicon/robot/platform/use_power() + . = ..() + + if(stat != DEAD && cell) + + // TODO generalize solar occlusion to charge from the actual sun. + var/new_recharge_state = istype(loc, /turf/simulated/floor/outdoors) || /*, /turf/exterior) */ istype(loc, /turf/space) + if(new_recharge_state != last_recharge_state) + last_recharge_state = new_recharge_state + if(last_recharge_state) + to_chat(src, SPAN_NOTICE("Your integrated solar panels begin recharging your battery.")) + else + to_chat(src, SPAN_DANGER("Your integrated solar panels cease recharging your battery.")) + + if(last_recharge_state) + var/charge_amt = recharger_charge_amount * CELLRATE + cell.give(charge_amt) + used_power_this_tick -= (charge_amt) + module.respawn_consumable(src, (charge_amt / 250)) // magic number copied from borg charger. + + if(recharging) + + var/obj/item/weapon/cell/recharging_atom = recharging.resolve() + if(!istype(recharging_atom) || QDELETED(recharging_atom) || recharging_atom.loc != src) + recharging = null + return + + if(recharging_atom.percent() < 100) + var/charge_amount = recharger_tick_cost * CELLRATE + if(cell.check_charge(charge_amount * 1.5) && cell.checked_use(charge_amount)) // Don't kill ourselves recharging the battery. + recharging_atom.give(charge_amount) + used_power_this_tick += charge_amount + + if(!recharge_complete && recharging_atom.percent() >= 100) + recharge_complete = TRUE + visible_message(SPAN_NOTICE("\The [src] beeps and flashes a green light above \his recharging port.")) diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm new file mode 100644 index 0000000000..3a9882ff08 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm @@ -0,0 +1,109 @@ +/mob/living/silicon/robot/platform/update_icon() + updateicon() + +/mob/living/silicon/robot/platform/updateicon() + + cut_overlays() + underlays.Cut() + var/obj/item/weapon/robot_module/robot/platform/tank_module = module + if(!istype(tank_module)) + icon = initial(icon) + icon_state = initial(icon_state) + color = initial(color) + return + + // This is necessary due to Polaris' liberal use of KEEP_TOGETHER and propensity for scaling transforms. + // If we just apply state/colour to the base icon, RESET_COLOR on the additional overlays is ignored. + icon = tank_module.user_icon + icon_state = "blank" + color = null + var/image/I = image(tank_module.user_icon, tank_module.user_icon_state) + I.color = tank_module.base_color + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + underlays += I + + if(tank_module.armor_color) + I = image(icon, "[tank_module.user_icon_state]_armour") + I.color = tank_module.armor_color + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + for(var/decal in tank_module.decals) + I = image(icon, "[tank_module.user_icon_state]_[decal]") + I.color = tank_module.decals[decal] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + if(tank_module.eye_color) + I = image(icon, "[tank_module.user_icon_state]_eyes") + I.color = tank_module.eye_color + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + if(client && key && stat == CONSCIOUS && tank_module.pupil_color) + I = image(icon, "[tank_module.user_icon_state]_pupils") + I.color = tank_module.pupil_color + I.plane = PLANE_LIGHTING_ABOVE + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + if(opened) + add_overlay("[tank_module.user_icon_state]-open") + if(wiresexposed) + I = image(icon, "[tank_module.user_icon_state]-wires") + else if(cell) + I = image(icon, "[tank_module.user_icon_state]-cell") + else + I = image(icon, "[tank_module.user_icon_state]-nowires") + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + +/mob/living/silicon/robot/platform/proc/try_paint(var/obj/item/device/floor_painter/painting, var/mob/user) + + var/obj/item/weapon/robot_module/robot/platform/tank_module = module + if(!istype(tank_module)) + to_chat(user, SPAN_WARNING("\The [src] is not paintable.")) + return FALSE + + var/list/options = list("Eyes", "Armour", "Body", "Clear Colors") + if(length(tank_module.available_decals)) + options += "Decal" + if(length(tank_module.decals)) + options += "Clear Decals" + for(var/option in options) + LAZYSET(options, option, new /image('icons/effects/thinktank_labels.dmi', option)) + + var/choice = show_radial_menu(user, painting, options, radius = 42, require_near = TRUE) + if(!choice || QDELETED(src) || QDELETED(painting) || QDELETED(user) || user.incapacitated() || tank_module.loc != src) + return FALSE + + if(choice == "Decal") + choice = null + options = list() + for(var/decal_name in tank_module.available_decals) + LAZYSET(options, decal_name, new /image('icons/effects/thinktank_labels.dmi', decal_name)) + choice = show_radial_menu(user, painting, options, radius = 42, require_near = TRUE) + if(!choice || QDELETED(src) || QDELETED(painting) || QDELETED(user) || user.incapacitated() || tank_module.loc != src) + return FALSE + + . = TRUE + switch(choice) + if("Eyes") + tank_module.eye_color = painting.paint_colour + if("Armour") + tank_module.armor_color = painting.paint_colour + if("Body") + tank_module.base_color = painting.paint_colour + if("Clear Colors") + tank_module.eye_color = initial(tank_module.eye_color) + tank_module.armor_color = initial(tank_module.armor_color) + tank_module.base_color = initial(tank_module.base_color) + if("Clear Decals") + tank_module.decals = null + else + if(choice in tank_module.available_decals) + LAZYSET(tank_module.decals, tank_module.available_decals[choice], painting.paint_colour) + else + . = FALSE + if(.) + updateicon() diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm new file mode 100644 index 0000000000..cfb7b2dd81 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm @@ -0,0 +1,77 @@ +/mob/living/silicon/robot/platform/attack_hand(mob/user) + + if(!opened) + if(recharging) + var/obj/item/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && !QDELETED(recharging_atom) && recharging_atom.loc == src) + recharging_atom.dropInto(loc) + user.put_in_hands(recharging_atom) + user.visible_message(SPAN_NOTICE("\The [user] pops \the [recharging_atom] out of \the [src]'s recharging port.")) + recharging = null + return TRUE + + if(try_remove_cargo(user)) + return TRUE + + . = ..() + +/mob/living/silicon/robot/platform/attackby(obj/item/W, mob/user) + + if(istype(W, /obj/item/weapon/cell) && !opened) + if(recharging) + to_chat(user, SPAN_WARNING("\The [src] already has \a [recharging.resolve()] inserted into its recharging port.")) + else if(user.unEquip(W)) + W.forceMove(src) + recharging = weakref(W) + recharge_complete = FALSE + user.visible_message(SPAN_NOTICE("\The [user] slots \the [W] into \the [src]'s recharging port.")) + return TRUE + + if(istype(W, /obj/item/device/floor_painter)) + return FALSE // Paint sprayer wil call try_paint() in afterattack() + + . = ..() + +/mob/living/silicon/robot/platform/attack_ghost(mob/observer/ghost/user) + + if(client || key || stat == DEAD || !ticker || !ticker.mode) + return ..() + + var/confirm = alert("Do you wish to take control of \the [src]?", "Platform Control", "No", "Yes") + if(confirm != "Yes" || QDELETED(src) || client || key || stat == DEAD || !ticker || !ticker.mode) + return ..() + + if(jobban_isbanned(user, "Robot")) + to_chat(user, SPAN_WARNING("You are banned from synthetic roles and cannot take control of \the [src].")) + return + + // Boilerplate from drone fabs, unsure if there's a shared proc to use instead. + var/deathtime = world.time - user.timeofdeath + var/deathtimeminutes = round(deathtime / (1 MINUTE)) + var/pluralcheck = "" + if(deathtimeminutes == 1) + pluralcheck = "minute" + else if(deathtimeminutes > 0) + pluralcheck = " [deathtimeminutes] minute\s and" + var/deathtimeseconds = round((deathtime - deathtimeminutes * 1 MINUTE) / 10,1) + if (deathtime < platform_respawn_time) + to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.") + to_chat(usr, "You must wait [platform_respawn_time/600] minute\s to take control of \the [src]!") + return + // End boilerplate. + + if(user.mind) + user.mind.transfer_to(src) + if(key != user.key) + key = user.key + SetName("[modtype] [braintype]-[rand(100,999)]") + addtimer(CALLBACK(src, .proc/welcome_client), 1) + qdel(user) + +/mob/living/silicon/robot/platform/proc/welcome_client() + if(client) + to_chat(src, SPAN_NOTICE("You are a think-tank, a kind of flexible and adaptive drone intelligence installed into an armoured platform. Your programming compels you to be friendly and helpful wherever possible.")) + SetSleeping(0) + SetWeakened(0) + SetParalysis(0) + resting = FALSE diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm new file mode 100644 index 0000000000..2a8ffcb3e1 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm @@ -0,0 +1,102 @@ +/obj/item/weapon/robot_module/robot/platform + + hide_on_manifest = TRUE + + var/pupil_color = COLOR_CYAN + var/base_color = COLOR_WHITE + var/eye_color = COLOR_BEIGE + var/armor_color = "#68a2f2" + var/user_icon = 'icons/mob/robots_thinktank.dmi' + var/user_icon_state = "tachi" + + var/list/decals + var/list/available_decals = list( + "Stripe" = "stripe", + "Vertical Stripe" = "stripe_vertical" + ) + +// Only show on manifest if they have a player. +/obj/item/weapon/robot_module/robot/platform/hide_on_manifest() + if(isrobot(loc)) + var/mob/living/silicon/robot/R = loc + return !R.key + return ..() + +/obj/item/weapon/robot_module/robot/platform/verb/set_eye_colour() + set name = "Set Eye Colour" + set desc = "Select an eye colour to use." + set category = "Robot Commands" + set src in usr + + var/new_pupil_color = input(usr, "Select a pupil colour.", "Pupil Colour Selection") as color|null + if(usr.incapacitated() || QDELETED(usr) || QDELETED(src) || loc != usr) + return + + pupil_color = new_pupil_color || initial(pupil_color) + usr.update_icon() + +/obj/item/weapon/robot_module/robot/platform/explorer + armor_color = "#528052" + eye_color = "#7b7b46" + decals = list( + "stripe_vertical" = "#52b8b8", + "stripe" = "#52b8b8" + ) + channels = list( + "Science" = 1, + "Explorer" = 1 + ) + +/obj/item/weapon/robot_module/robot/platform/explorer/New() + ..() + modules += new /obj/item/weapon/tool/wrench/cyborg(src) + modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + modules += new /obj/item/weapon/tool/wirecutters/cyborg(src) + modules += new /obj/item/weapon/tool/screwdriver/cyborg(src) + modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + modules += new /obj/item/weapon/material/knife/machete/cyborg(src) + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(7500) + var/obj/item/stack/medical/bruise_pack/bandaid = new(src) + bandaid.uses_charge = 1 + bandaid.charge_costs = list(1000) + bandaid.synths = list(medicine) + modules += bandaid + synths += medicine + + var/obj/item/weapon/gun/energy/phasegun/mounted/cyborg/phasegun = new(src) + modules += phasegun + + emag = new /obj/item/weapon/chainsaw(src) + +/obj/item/weapon/robot_module/robot/platform/explorer/respawn_consumable(var/mob/living/silicon/robot/R, rate) + . = ..() + for(var/obj/item/weapon/gun/energy/pew in modules) + if(pew.power_supply && pew.power_supply.charge < pew.power_supply.maxcharge) + pew.power_supply.give(pew.charge_cost * rate) + pew.update_icon() + else + pew.charge_tick = 0 + +/obj/item/weapon/robot_module/robot/platform/cargo + armor_color = "#d5b222" + eye_color = "#686846" + decals = list( + "stripe_vertical" = "#bfbfa1", + "stripe" = "#bfbfa1" + ) + channels = list("Supply" = 1) + networks = list(NETWORK_MINE) + +/obj/item/weapon/robot_module/robot/platform/cargo/New() + ..() + modules += new /obj/item/weapon/packageWrap(src) + modules += new /obj/item/weapon/pen/multi(src) + modules += new /obj/item/device/destTagger(src) + emag = new /obj/item/weapon/stamp/denied + +/obj/item/weapon/robot_module/robot/platform/cargo/respawn_consumable(mob/living/silicon/robot/R, rate) + . = ..() + var/obj/item/weapon/packageWrap/wrapper = locate() in modules + if(wrapper.amount < initial(wrapper.amount)) + wrapper.amount++ diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm new file mode 100644 index 0000000000..ec6d6f4267 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm @@ -0,0 +1,139 @@ +/mob/living/silicon/robot/platform/death(gibbed, deathmessage, show_dead_message) + + if(gibbed) + + if(recharging) + var/obj/item/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && !QDELETED(recharging_atom) && recharging_atom.loc == src) + recharging_atom.dropInto(loc) + recharging_atom.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30) + recharging = null + + if(length(stored_atoms)) + for(var/weakref/stored_ref in stored_atoms) + var/atom/movable/dropping = stored_ref.resolve() + if(istype(dropping) && !QDELETED(dropping) && dropping.loc == src) + dropping.dropInto(loc) + dropping.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30) + stored_atoms = null + + . = ..() + +/mob/living/silicon/robot/platform/proc/can_store_atom(var/atom/movable/storing, var/mob/user) + + if(!istype(storing)) + var/storing_target = (user == src) ? "yourself" : "\the [src]" + to_chat(user, SPAN_WARNING("You cannot store that inside [storing_target].")) + return FALSE + + if(!isturf(storing.loc)) + return FALSE + + if(storing.anchored || !storing.simulated) + to_chat(user, SPAN_WARNING("\The [storing] won't budge!")) + return FALSE + + if(storing == src) + var/storing_target = (user == src) ? "yourself" : "\the [src]" + to_chat(user, SPAN_WARNING("You cannot store [storing_target] inside [storing_target]!")) + return FALSE + + if(length(stored_atoms) >= max_stored_atoms) + var/storing_target = (user == src) ? "Your" : "\The [src]'s" + to_chat(user, SPAN_WARNING("[storing_target] cargo compartment is full.")) + return FALSE + + if(ismob(storing)) + var/mob/M = storing + if(M.mob_size >= mob_size) + var/storing_target = (user == src) ? "your storage compartment" : "\the [src]" + to_chat(user, SPAN_WARNING("\The [storing] is too big for [storing_target].")) + return FALSE + + for(var/store_type in can_store_types) + if(istype(storing, store_type)) + . = TRUE + break + + if(.) + for(var/store_type in cannot_store_types) + if(istype(storing, store_type)) + . = FALSE + break + if(!.) + var/storing_target = (user == src) ? "yourself" : "\the [src]" + to_chat(user, SPAN_WARNING("You cannot store \the [storing] inside [storing_target].")) + +/mob/living/silicon/robot/platform/proc/store_atom(var/atom/movable/storing, var/mob/user) + if(istype(storing)) + storing.forceMove(src) + LAZYDISTINCTADD(stored_atoms, weakref(storing)) + +/mob/living/silicon/robot/platform/proc/drop_stored_atom(var/atom/movable/ejecting, var/mob/user) + + if(!ejecting && length(stored_atoms)) + var/weakref/stored_ref = stored_atoms[1] + if(!istype(stored_ref)) + LAZYREMOVE(stored_atoms, stored_ref) + else + ejecting = stored_ref?.resolve() + + LAZYREMOVE(stored_atoms, weakref(ejecting)) + if(istype(ejecting) && !QDELETED(ejecting) && ejecting.loc == src) + ejecting.dropInto(loc) + if(user == src) + visible_message(SPAN_NOTICE("\The [src] ejects \the [ejecting] from its cargo compartment.")) + else + user.visible_message(SPAN_NOTICE("\The [user] pulls \the [ejecting] from \the [src]'s cargo compartment.")) + +/mob/living/silicon/robot/platform/attack_ai(mob/user) + if(isrobot(user) && user.Adjacent(src)) + return try_remove_cargo(user) + return ..() + +/mob/living/silicon/robot/platform/proc/try_remove_cargo(var/mob/user) + if(!length(stored_atoms) || !istype(user)) + return FALSE + var/weakref/remove_ref = stored_atoms[length(stored_atoms)] + var/atom/movable/removing = remove_ref?.resolve() + if(!istype(removing) || QDELETED(removing) || removing.loc != src) + LAZYREMOVE(stored_atoms, remove_ref) + else + user.visible_message(SPAN_NOTICE("\The [user] begins unloading \the [removing] from \the [src]'s cargo compartment.")) + if(do_after(user, 3 SECONDS, src) && !QDELETED(removing) && removing.loc == src) + drop_stored_atom(removing, user) + return TRUE + +/mob/living/silicon/robot/platform/verb/drop_stored_atom_verb() + set name = "Eject Cargo" + set category = "Robot Commands" + set desc = "Drop something from your internal storage." + + if(incapacitated()) + to_chat(src, SPAN_WARNING("You are not in any state to do that.")) + return + + if(length(stored_atoms)) + drop_stored_atom(user = src) + else + to_chat(src, SPAN_WARNING("You have nothing in your cargo compartment.")) + +/mob/living/silicon/robot/platform/MouseDrop_T(atom/movable/dropping, mob/living/user) + if(!istype(user) || !istype(dropping) || user.incapacitated()) + return FALSE + if(!can_mouse_drop(dropping, user) || !can_store_atom(dropping, user)) + return FALSE + if(user == src) + visible_message(SPAN_NOTICE("\The [src] begins loading \the [dropping] into its cargo compartment.")) + else + user.visible_message(SPAN_NOTICE("\The [user] begins loading \the [dropping] into \the [src]'s cargo compartment.")) + if(do_after(user, 3 SECONDS, src) && can_mouse_drop(dropping, user) && can_store_atom(dropping, user)) + store_atom(dropping, user) + return FALSE + +/mob/living/silicon/robot/platform/proc/can_mouse_drop(var/atom/dropping, var/mob/user) + if(!istype(user) || !istype(dropping) || QDELETED(dropping) || QDELETED(user) || QDELETED(src)) + return FALSE + if(user.incapacitated() || !Adjacent(user) || !dropping.Adjacent(user)) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm new file mode 100644 index 0000000000..b3e48aabb4 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm @@ -0,0 +1,32 @@ +/mob/living/silicon/robot/platform/explorer + name = "recon platform" + desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one is lightly armoured and fitted with all-terrain wheels." + modtype = "Recon" + module = /obj/item/weapon/robot_module/robot/platform/explorer + +/mob/living/silicon/robot/platform/explorer/Initialize() + . = ..() + laws = new /datum/ai_laws/explorer + +/mob/living/silicon/robot/platform/explorer/welcome_client() + ..() + if(client) // ganbatte tachikoma-san + to_chat(src, SPAN_NOTICE("You are tasked with supporting the Exploration and Science staff as they unearth the secrets of the planet. Do your best!")) + +/obj/effect/landmark/robot_platform/explorer + platform_type = /mob/living/silicon/robot/platform/explorer + +/mob/living/silicon/robot/platform/cargo + name = "logistics platform" + desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one has an expanded storage compartment." + modtype = "Logistics" + module = /obj/item/weapon/robot_module/robot/platform/cargo + max_stored_atoms = 3 + +/mob/living/silicon/robot/platform/cargo/welcome_client() + ..() + if(client) + to_chat(src, SPAN_NOTICE("You are tasked with supporting the Cargo and Supply staff as they handle operational logistics. Do your best!")) + +/obj/effect/landmark/robot_platform/cargo + platform_type = /mob/living/silicon/robot/platform/cargo diff --git a/code/modules/mob/living/simple_animal/aliens/synx.dm b/code/modules/mob/living/simple_animal/aliens/synx.dm index e3f8ce5a7a..abf8effeef 100644 --- a/code/modules/mob/living/simple_animal/aliens/synx.dm +++ b/code/modules/mob/living/simple_animal/aliens/synx.dm @@ -108,7 +108,9 @@ /mob/living/simple_mob/animal/synx/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected //B.human_prey_swallow_time = 6 SECONDS //doesnt work //B.nonhuman_prey_swallow_time = 3 SECONDS //doesnt work @@ -137,7 +139,9 @@ B.mode_flags = DM_FLAG_NUMBING //Prey are more docile when it doesn't hurt. /mob/living/simple_mob/animal/synx/ai/pet/asteri/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.desc = "The synx eagerly swallows you, taking you from its gullet into its long, serpentine stomach. The internals around you greedily press into your from all sides, keeping you coated in a slick coat of numbing fluids..." B.digest_burn = 2 @@ -551,14 +555,18 @@ player_msg = "You aren't supposed to be in this. Wrong mob." /mob/living/simple_mob/animal/synx/ai/pet/init_vore() - ..() - var/obj/belly/B = vore_selected - B.vore_verb = "swallow" - B.digest_burn = 1 - B.digest_brute = 0 + if(!voremob_loaded) + return + .=..() + var/obj/belly/B = vore_selected + B.vore_verb = "swallow" + B.digest_burn = 1 + B.digest_brute = 0 /mob/living/simple_mob/animal/synx/ai/pet/holo/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.vore_verb = "swallow" B.digest_burn = 5 @@ -828,8 +836,8 @@ This includes the sprites of the below Mob which are based upon SCP 939. name = "Unknown" desc = "It's a red canine looking creature." tt_desc = "Unknown Alien Lifeform" - - poison_chance = 0 //no poison, + + poison_chance = 0 //no poison, ai_holder_type = /datum/ai_holder/simple_mob/scp say_list_type = /datum/say_list/malf_drone @@ -837,6 +845,7 @@ This includes the sprites of the below Mob which are based upon SCP 939. icon_state = "939_living" icon_living = "939_living" icon_dead = "939_dead" + pixel_x = -15 #undef SYNX_LOWER_DAMAGE #undef SYNX_UPPER_DAMAGE diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 03fc4e6c47..aaf8f8c0f2 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -175,6 +175,10 @@ if(has_eye_glow) add_eyes() + if(!IsAdvancedToolUser()) //CHOMPSTATION edit: Moved here so the verb is useable before initialising vorgans. + verbs |= /mob/living/simple_mob/proc/animal_nom + verbs |= /mob/living/proc/shred_limb + return ..() /mob/living/simple_mob/Destroy() diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index 853848b83d..f14a8cedfd 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -50,11 +50,13 @@ var/obj/item/device/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans. does_spin = FALSE + var/voremob_loaded = FALSE //CHOMPedit: On-demand belly loading. + // Release belly contents before being gc'd! /mob/living/simple_mob/Destroy() release_vore_contents() prey_excludes.Cut() - . = ..() + return ..() //For all those ID-having mobs /mob/living/simple_mob/GetIdCard() @@ -191,13 +193,9 @@ // Make sure you don't call ..() on this one, otherwise you duplicate work. /mob/living/simple_mob/init_vore() - if(!vore_active || no_vore) + if(!vore_active || no_vore || !voremob_loaded) //CHOMPedit: On-demand belly loading. return - if(!IsAdvancedToolUser()) - verbs |= /mob/living/simple_mob/proc/animal_nom - verbs |= /mob/living/proc/shred_limb - if(LAZYLEN(vore_organs)) return @@ -279,7 +277,7 @@ // Riding /datum/riding/simple_mob - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm index 9fe548ee61..26b8eff0b4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/crab.dm @@ -46,7 +46,7 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/sif_crab) /mob/living/simple_mob/animal/passive/crab/sif/Initialize() - ..() + . = ..() adjust_scale(rand(5,12) / 10) // Meat! diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm index b5c811b81c..7ba595b47b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm @@ -34,7 +34,7 @@ var/randomize_location = TRUE /mob/living/simple_mob/animal/passive/fish/Initialize() - ..() + . = ..() if(!default_pixel_x && randomize_location) default_pixel_x = rand(-12, 12) @@ -174,7 +174,7 @@ var/image/belly_image /mob/living/simple_mob/animal/passive/fish/icebass/Initialize() - ..() + . = ..() dorsal_color = rgb(rand(min_red,max_red), rand(min_green,max_green), rand(min_blue,max_blue)) belly_color = rgb(rand(min_red,max_red), rand(min_green,max_green), rand(min_blue,max_blue)) update_icon() @@ -248,7 +248,7 @@ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif /mob/living/simple_mob/animal/passive/fish/rockfish/Initialize() - ..() + . = ..() head_color = rgb(rand(min_red,max_red), rand(min_green,max_green), rand(min_blue,max_blue)) update_icon() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish_vr.dm index adb180f9fe..89ccfc3a25 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish_vr.dm @@ -4,7 +4,7 @@ maxHealth = 50 /mob/living/simple_mob/animal/passive/fish/koi/poisonous/Initialize() - ..() + . = ..() create_reagents(60) reagents.add_reagent("toxin", 45) reagents.add_reagent("impedrezene", 15) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm index af647587a6..ca94f0373f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm @@ -34,7 +34,7 @@ attack_sharp = TRUE /mob/living/simple_mob/animal/passive/lizard/large/Initialize() - ..() + . = ..() adjust_scale(rand(12, 20) / 10) /mob/living/simple_mob/animal/passive/lizard/large/defensive diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 22e57ca683..8fe1799d12 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -7,6 +7,7 @@ item_state = "mouse_gray" icon_living = "mouse_gray" icon_dead = "mouse_gray_dead" + kitchen_tag = "rodent" maxHealth = 5 health = 5 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm new file mode 100644 index 0000000000..80ccfff874 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm @@ -0,0 +1,200 @@ +// Possum catalog entry. +/datum/category_item/catalogue/fauna/opossum + name = "Opossums" + desc = "The opossum is a small, scavenging marsupial of the order Didelphimorphia, previously \ + endemic to the Americas of Earth, but now inexplicably found across settled space. Nobody is \ + entirely sure how they travel to such disparate locations, with the leading theories including \ + smuggling, cargo stowaways, fungal spore reproduction, teleportation, or unknown quantum effects." + value = CATALOGUER_REWARD_TRIVIAL + unlocked_by_any = list(/datum/category_item/catalogue/fauna/opossum) + +// Possum spawner, WAS GOING TO BE used for loot piles BUT CERB IS A DORK. +/obj/item/animal_spawner + var/critter_type = /mob/living/simple_mob/animal/passive/mouse + +/obj/item/animal_spawner/Initialize() + ..() + + var/mob/living/simple_mob/critter = critter_type + if(!ispath(critter, /mob/living/simple_mob)) + return INITIALIZE_HINT_QDEL + + var/obj/item/weapon/holder/critter_holder = initial(critter.holder_type) + if(!ispath(critter_holder, /obj/item/weapon/holder)) + return INITIALIZE_HINT_QDEL + + var/mob/M = loc + var/was_in_hands = istype(M) && (src == M.get_active_hand() || src == M.get_inactive_hand()) + + critter_holder = new(loc) + critter = new critter(critter_holder) + critter_holder.held_mob = critter + critter_holder.sync(critter) + + if(istype(M)) + M.drop_from_inventory(src) + if(was_in_hands) + M.put_in_hands(critter_holder) + + return INITIALIZE_HINT_QDEL + +/obj/item/animal_spawner/possum + name = "possum" + desc = "The abstract concept of possum, embodied in physical form. If you witness the majesty of abstract possum, please make a bug report on the tracker." + icon = 'icons/mob/animal.dmi' + icon_state = "possum" + critter_type = /mob/living/simple_mob/animal/passive/opossum + +// Possum AI holder, mostly just handles playing dead. +/datum/ai_holder/simple_mob/passive/possum + var/is_angry = FALSE + var/play_dead_until = 0 + var/be_angery_until = 0 + +/datum/ai_holder/simple_mob/passive/possum/handle_special_strategical() + . = ..() + if(holder?.stat != DEAD && !holder.ckey && isturf(holder.loc)) + if(holder.resting && world.time < play_dead_until) + return + + var/last_resting = holder.resting + var/last_angery = is_angry + holder.resting = (holder.stat == UNCONSCIOUS) + if(!holder.resting) + wander = initial(wander) + speak_chance = initial(speak_chance) + holder.set_stat(CONSCIOUS) + is_angry = (world.time < be_angery_until) || prob(1) + else + wander = FALSE + speak_chance = 0 + holder.set_stat(UNCONSCIOUS) + is_angry = FALSE + + if(last_resting != holder.resting || last_angery != is_angry) + holder.update_icon() + +/datum/ai_holder/simple_mob/passive/possum/poppy + var/static/list/aaa_words = list( + "delaminat", + "meteor", + "fire", + "breach", + "loose", + "level 7", + "level seven", + "biohazard", + "blob", + "vine" + ) + +/datum/ai_holder/simple_mob/passive/possum/poppy/on_hear_say(mob/living/speaker, message) + . = ..() + addtimer(CALLBACK(src, .proc/check_keywords, message), rand(1 SECOND, 3 SECONDS)) + +/datum/ai_holder/simple_mob/passive/possum/poppy/proc/check_keywords(var/message) + var/mob/living/simple_mob/animal/passive/opossum/poss = holder + if(!istype(poss) || holder.client || holder.stat != CONSCIOUS) + return + message = lowertext(message) + for(var/aaa in aaa_words) + if(findtext(message, aaa)) + poss.respond_to_damage() + return + +/datum/say_list/possum + speak = list("Hiss!","Aaa!","Aaa?") + emote_hear = list("hisses") + emote_see = list("forages for trash", "lounges") + +// The poss itself. +/mob/living/simple_mob/animal/passive/opossum + name = "opossum" + real_name = "opossum" + tt_desc = "Didelphis astrum" + desc = "It's an opossum, a small scavenging marsupial." + icon_state = "possum" + item_state = "possum" + icon_living = "possum" + icon_dead = "possum_dead" + icon_rest = "possum_dead" + speak_emote = list("hisses") + pass_flags = PASSTABLE + ai_holder_type = /datum/ai_holder/simple_mob/passive/possum + see_in_dark = 6 + maxHealth = 50 + health = 50 + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "stamps on" + density = 0 + minbodytemp = 223 + maxbodytemp = 323 + universal_speak = FALSE + universal_understand = TRUE + holder_type = /obj/item/weapon/holder/possum + mob_size = MOB_SMALL + can_pull_size = 2 + can_pull_mobs = MOB_PULL_SMALLER + say_list_type = /datum/say_list/possum + catalogue_data = list(/datum/category_item/catalogue/fauna/opossum) + +/mob/living/simple_mob/animal/passive/opossum/adjustBruteLoss(damage) + . = ..() + if(damage >= 3) + respond_to_damage() + +/mob/living/simple_mob/animal/passive/opossum/adjustFireLoss(damage) + . = ..() + if(damage >= 3) + respond_to_damage() + +/mob/living/simple_mob/animal/passive/opossum/lay_down() + . = ..() + update_icon() + +/mob/living/simple_mob/animal/passive/opossum/proc/respond_to_damage() + if(!resting && stat == CONSCIOUS) + var/datum/ai_holder/simple_mob/passive/possum/poss_ai = ai_holder + if(!client && istype(poss_ai)) + if(!poss_ai.is_angry) + visible_message("\The [src] hisses!") + poss_ai.is_angry = TRUE + poss_ai.be_angery_until = world.time + rand(30 SECONDS, 1 MINUTE) + else + visible_message("\The [src] dies!") + resting = TRUE + poss_ai.play_dead_until = world.time + rand(1 MINUTE, 2 MINUTES) + update_icon() + +/mob/living/simple_mob/animal/passive/opossum/updateicon() + update_icon() + +/mob/living/simple_mob/animal/passive/opossum/update_icon() + var/datum/ai_holder/simple_mob/passive/possum/poss_ai = ai_holder + var/is_angry = (!client && istype(poss_ai) && poss_ai.is_angry) + if(stat == DEAD || (resting && is_angry)) + icon_state = icon_dead + else if(resting || stat == UNCONSCIOUS) + icon_state = "[icon_living]_sleep" + else if(is_angry) + icon_state = "[icon_living]_aaa" + else + icon_state = icon_living + +/mob/living/simple_mob/animal/passive/opossum/Initialize() + . = ..() + verbs += /mob/living/proc/ventcrawl + verbs += /mob/living/proc/hide + +/mob/living/simple_mob/animal/passive/opossum/poppy + name = "Poppy the Safety Possum" + desc = "It's an opossum, a small scavenging marsupial. It's wearing appropriate personal protective equipment, though." + icon_state = "poppy" + item_state = "poppy" + icon_living = "poppy" + icon_dead = "poppy_dead" + icon_rest = "poppy_dead" + tt_desc = "Didelphis astrum salutem" + holder_type = /obj/item/weapon/holder/possum/poppy + ai_holder_type = /datum/ai_holder/simple_mob/passive/possum/poppy diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 0a4f254bbd..9db6a6bffa 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -102,6 +102,7 @@ icon_state = "cat" item_state = "cat" named = TRUE + holder_type = /obj/item/weapon/holder/cat/runtime makes_dirt = 0 //Vorestation Edit /mob/living/simple_mob/animal/passive/cat/kitten diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm index a63140ac8a..652eba8161 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm @@ -1,5 +1,7 @@ /mob/living/simple_mob/animal/passive/cat/runtime/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm index 63e7f3fbab..0ff5beef37 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm @@ -50,7 +50,9 @@ base_wander_delay = 4 /mob/living/simple_mob/animal/passive/fox/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "Slick foxguts. Cute on the outside, slimy on the inside!" @@ -199,7 +201,9 @@ makes_dirt = FALSE // No more dirt /mob/living/simple_mob/animal/passive/fox/renault/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "Slick foxguts. They seem somehow more regal than perhaps other foxes!" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm index 848fb7fafa..d64810ff1d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/parrot.dm @@ -41,11 +41,11 @@ return say(message) // Ugly saycode so parrots can use their headsets. -/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios) +/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, used_radios, whispering) ..() if(message_mode) if(my_headset && istype(my_headset, /obj/item/device/radio)) - my_headset.talk_into(src, message, message_mode, verb, speaking) + my_headset.talk_into(src, message, message_mode, verb, whispering) used_radios += my_headset // Clicked on while holding an object. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm index 1010ab6eab..54be45b5b9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm @@ -83,7 +83,7 @@ return 1 // It literally produces a cryogenic mist inside itself. Cold doesn't bother it. /mob/living/simple_mob/animal/sif/frostfly/Initialize() - . = ..() //VOREStation Edit + . = ..() smoke_special = new verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm index 3687a67c51..f7bec21beb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm @@ -62,7 +62,7 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/glitterfly /mob/living/simple_mob/animal/sif/glitterfly/Initialize() - ..() + . = ..() var/colorlist = list(rgb(rand(100,255), rand(100,255), rand(100,255)) = 10, rgb(rand(5,100), rand(5,100), rand(5,100)) = 2, "#222222" = 1) color = pickweight(colorlist) @@ -85,7 +85,7 @@ plane = PLANE_LIGHTING_ABOVE /mob/living/simple_mob/animal/sif/glitterfly/rare/Initialize() - ..() + . = ..() /mob/living/simple_mob/animal/sif/glitterfly/unique_tame_check(var/obj/O, var/mob/user) . = ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm index ee5a573a30..c81ed0e639 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/kururak.dm @@ -92,7 +92,7 @@ instinct = 50 /mob/living/simple_mob/animal/sif/kururak/Initialize() - ..() + . = ..() if(!instinct) if(prob(20)) instinct = rand(6, 10) @@ -331,7 +331,7 @@ remove_modifiers_of_type(/datum/modifier/ace) /mob/living/simple_mob/animal/sif/kururak/hibernate/Initialize() - ..() + . = ..() lay_down() instinct = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm index 6ed87299c0..25e053bc5f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm @@ -115,7 +115,7 @@ emote_hear = list("chitters", "clicks", "gurgles") /mob/living/simple_mob/animal/sif/leech/Initialize() - ..() + . = ..() verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/moth.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/moth.dm index d153540dd5..8ad7f2b8c9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/moth.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/moth.dm @@ -116,7 +116,7 @@ return FALSE /mob/living/simple_mob/animal/sif/tymisian/Initialize() - ..() + . = ..() smoke_spore = new verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm index c84f9aeabc..b3651a63de 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm @@ -88,7 +88,9 @@ TODO: Make them light up and heat the air when exposed to oxygen. vore_icons = SA_ICON_LIVING /mob/living/simple_mob/animal/passive/gaslamp/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "internal chamber" B.desc = "Having been too slow to disentangle yourself from the gaslamp's tentacles, the alien creature eventually winds enough of them around your body to lift you up off of the ground. Struggle as you might now, it is too late to deny the jellyfish-esque scavenger its lucky catch; inch by inch, the gaslamp tugs you upwards into its equivalent of a stomach, the transition between the cool-to-frigid atmosphere on the outside to its surprising internal heat something you can feel through any outer wear you possess. Minutes pass, soon resulting in the gentle creature's body sporting a rounded, bulging swell, an indistinct shadow shifting and twitching inside it as you squirm about. Be it to escape or simply to get settled, you might want to take care, however. The gaslamp's internal chamber is slick and squishy instead of overly oppressive, yet, each wave of warmth that pulses over you leaves you feeling weaker than the last..." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm index 0c8636ddf5..903f4b9ce6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm @@ -140,7 +140,7 @@ nutriment_desc = list("sugar" = 1) /obj/item/weapon/reagent_containers/food/snacks/snakesnack/Initialize() - ..() + . = ..() if(!snack_colour) snack_colour = pick( list("yellow","green","pink","blue") ) icon_state = "snack_[snack_colour]" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index b2ff320b52..aef54e599d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -108,7 +108,7 @@ icon_state = "[icon_state]_dead" /mob/living/simple_mob/animal/space/space_worm/head/Initialize() - ..() + . = ..() var/mob/living/simple_mob/animal/space/space_worm/current = src diff --git a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm index 69486a061d..b20bdbb4cd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm @@ -33,7 +33,7 @@ appearance = thing_to_copy.appearance copying = thing_to_copy density = thing_to_copy.density // So you can't bump into objects that aren't supposed to be dense. - catalogue_data = thing_to_copy.catalogue_data.Copy() + catalogue_data = thing_to_copy.get_catalogue_data() catalogue_delay = thing_to_copy.catalogue_delay return TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm index d29981726d..c3c18ecaf2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm @@ -1,141 +1,141 @@ -// Mecha simple_mobs are essentially fake mechs. Generally tough and scary to fight. -// By default, they're automatically piloted by some kind of drone AI. They can be set to be "piloted" instead with a var. -// Tries to be as similar to the real deal as possible. - -/mob/living/simple_mob/mechanical/mecha - name = "mecha" - desc = "A big stompy mech!" - icon = 'icons/mecha/mecha.dmi' - - faction = "syndicate" - movement_cooldown = 5 - movement_sound = "mechstep" // This gets fed into playsound(), which can also take strings as a 'group' of sound files. - turn_sound = 'sound/mecha/mechturn.ogg' - maxHealth = 300 - mob_size = MOB_LARGE - - // Very close to the base 'damage_absorption' var on the base mecha class. - armor = list( - "melee" = 20, - "bullet" = 10, - "laser" = 0, - "energy" = 0, - "bomb" = 0, - "bio" = 100, - "rad" = 100 - ) - - response_help = "taps on" - response_disarm = "knocks on" - response_harm = "uselessly hits" - harm_intent_damage = 0 - - ai_holder_type = /datum/ai_holder/simple_mob/melee - say_list_type = /datum/say_list/malf_drone - - var/datum/effect/effect/system/spark_spread/sparks - var/wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark - var/pilot_type = null // Set to spawn a pilot when destroyed. Setting this also makes the mecha vulnerable to things that affect sentient minds. - var/deflect_chance = 10 // Chance to outright stop an attack, just like a normal exosuit. - var/has_repair_droid = FALSE // If true, heals 2 damage every tick and gets a repair droid overlay. - - -/mob/living/simple_mob/mechanical/mecha/Initialize() - sparks = new (src) - sparks.set_up(3, 1, src) - sparks.attach(src) - - if(!pilot_type) - name = "autonomous [initial(name)]" - desc = "[initial(desc)] It appears to be piloted by a drone intelligence." - else - say_list_type = /datum/say_list/merc - - if(has_repair_droid) - update_icon() - - return ..() - -/mob/living/simple_mob/mechanical/mecha/Destroy() - qdel(sparks) - return ..() - -/mob/living/simple_mob/mechanical/mecha/death() - ..(0,"explodes!") // Do everything else first. - - // Make the exploding more convincing with an actual explosion and some sparks. - sparks.start() - explosion(get_turf(src), 0, 0, 1, 3) - - // 'Eject' our pilot, if one exists. - if(pilot_type) - var/mob/living/L = new pilot_type(loc) - L.faction = src.faction - - new wreckage(loc) // Leave some wreckage. - - qdel(src) // Then delete us since we don't actually have a body. - -/mob/living/simple_mob/mechanical/mecha/handle_special() - if(has_repair_droid) - adjustBruteLoss(-2) - adjustFireLoss(-2) - adjustToxLoss(-2) - adjustOxyLoss(-2) - adjustCloneLoss(-2) - ..() - -/mob/living/simple_mob/mechanical/mecha/update_icon() - ..() // Cuts everything else, so do that first. - if(has_repair_droid) - add_overlay(image(icon = 'icons/mecha/mecha_equipment.dmi', icon_state = "repair_droid")) - -/mob/living/simple_mob/mechanical/mecha/bullet_act() - . = ..() - sparks.start() - -/mob/living/simple_mob/mechanical/mecha/speech_bubble_appearance() - return pilot_type ? "" : ..() - -// Piloted mechs are controlled by (presumably) something humanoid so they are vulnerable to certain things. -/mob/living/simple_mob/mechanical/mecha/is_sentient() - return pilot_type ? TRUE : FALSE - -/* -// Real mechs can't turn and run at the same time. This tries to simulate that. -// Commented out because the AI can't handle it sadly. -/mob/living/simple_mob/mechanical/mecha/SelfMove(turf/n, direct) - if(direct != dir) - set_dir(direct) - return FALSE // We didn't actually move, and returning FALSE means the mob can try to actually move almost immediately and not have to wait the full movement cooldown. - return ..() -*/ - -/mob/living/simple_mob/mechanical/mecha/bullet_act(obj/item/projectile/P) - if(prob(deflect_chance)) - visible_message(span("warning", "\The [P] is deflected by \the [src]'s armor!")) - deflect_sprite() - return 0 - return ..() - -/mob/living/simple_mob/mechanical/mecha/proc/deflect_sprite() - var/image/deflect_image = image('icons/effects/effects.dmi', "deflect_static") - add_overlay(deflect_image) - sleep(1 SECOND) - cut_overlay(deflect_image) - qdel(deflect_image) -// flick_overlay_view(deflect_image, src, duration = 1 SECOND, gc_after = TRUE) - -/mob/living/simple_mob/mechanical/mecha/attackby(obj/item/I, mob/user) - if(prob(deflect_chance)) - visible_message(span("warning", "\The [user]'s [I] bounces off \the [src]'s armor!")) - deflect_sprite() - user.setClickCooldown(user.get_attack_speed(I)) - return - ..() - -/mob/living/simple_mob/mechanical/mecha/ex_act(severity) - if(prob(deflect_chance)) - severity++ // This somewhat misleadingly makes it less severe. - deflect_sprite() - ..(severity) \ No newline at end of file +// Mecha simple_mobs are essentially fake mechs. Generally tough and scary to fight. +// By default, they're automatically piloted by some kind of drone AI. They can be set to be "piloted" instead with a var. +// Tries to be as similar to the real deal as possible. + +/mob/living/simple_mob/mechanical/mecha + name = "mecha" + desc = "A big stompy mech!" + icon = 'icons/mecha/mecha.dmi' + + faction = "syndicate" + movement_cooldown = 5 + movement_sound = "mechstep" // This gets fed into playsound(), which can also take strings as a 'group' of sound files. + turn_sound = 'sound/mecha/mechturn.ogg' + maxHealth = 300 + mob_size = MOB_LARGE + + // Very close to the base 'damage_absorption' var on the base mecha class. + armor = list( + "melee" = 20, + "bullet" = 10, + "laser" = 0, + "energy" = 0, + "bomb" = 0, + "bio" = 100, + "rad" = 100 + ) + + response_help = "taps on" + response_disarm = "knocks on" + response_harm = "uselessly hits" + harm_intent_damage = 0 + + ai_holder_type = /datum/ai_holder/simple_mob/melee + say_list_type = /datum/say_list/malf_drone + + var/datum/effect/effect/system/spark_spread/sparks + var/wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark + var/pilot_type = null // Set to spawn a pilot when destroyed. Setting this also makes the mecha vulnerable to things that affect sentient minds. + var/deflect_chance = 10 // Chance to outright stop an attack, just like a normal exosuit. + var/has_repair_droid = FALSE // If true, heals 2 damage every tick and gets a repair droid overlay. + + +/mob/living/simple_mob/mechanical/mecha/Initialize() + sparks = new (src) + sparks.set_up(3, 1, src) + sparks.attach(src) + + if(!pilot_type) + name = "autonomous [initial(name)]" + desc = "[initial(desc)] It appears to be piloted by a drone intelligence." + else + say_list_type = /datum/say_list/merc + + if(has_repair_droid) + update_icon() + + return ..() + +/mob/living/simple_mob/mechanical/mecha/Destroy() + qdel_null(sparks) + return ..() + +/mob/living/simple_mob/mechanical/mecha/death() + ..(0,"explodes!") // Do everything else first. + + // Make the exploding more convincing with an actual explosion and some sparks. + sparks.start() + explosion(get_turf(src), 0, 0, 1, 3) + + // 'Eject' our pilot, if one exists. + if(pilot_type) + var/mob/living/L = new pilot_type(loc) + L.faction = src.faction + + new wreckage(loc) // Leave some wreckage. + + qdel(src) // Then delete us since we don't actually have a body. + +/mob/living/simple_mob/mechanical/mecha/handle_special() + if(has_repair_droid) + adjustBruteLoss(-2) + adjustFireLoss(-2) + adjustToxLoss(-2) + adjustOxyLoss(-2) + adjustCloneLoss(-2) + ..() + +/mob/living/simple_mob/mechanical/mecha/update_icon() + ..() // Cuts everything else, so do that first. + if(has_repair_droid) + add_overlay(image(icon = 'icons/mecha/mecha_equipment.dmi', icon_state = "repair_droid")) + +/mob/living/simple_mob/mechanical/mecha/bullet_act() + . = ..() + sparks.start() + +/mob/living/simple_mob/mechanical/mecha/speech_bubble_appearance() + return pilot_type ? "" : ..() + +// Piloted mechs are controlled by (presumably) something humanoid so they are vulnerable to certain things. +/mob/living/simple_mob/mechanical/mecha/is_sentient() + return pilot_type ? TRUE : FALSE + +/* +// Real mechs can't turn and run at the same time. This tries to simulate that. +// Commented out because the AI can't handle it sadly. +/mob/living/simple_mob/mechanical/mecha/SelfMove(turf/n, direct) + if(direct != dir) + set_dir(direct) + return FALSE // We didn't actually move, and returning FALSE means the mob can try to actually move almost immediately and not have to wait the full movement cooldown. + return ..() +*/ + +/mob/living/simple_mob/mechanical/mecha/bullet_act(obj/item/projectile/P) + if(prob(deflect_chance)) + visible_message(span("warning", "\The [P] is deflected by \the [src]'s armor!")) + deflect_sprite() + return 0 + return ..() + +/mob/living/simple_mob/mechanical/mecha/proc/deflect_sprite() + var/image/deflect_image = image('icons/effects/effects.dmi', "deflect_static") + add_overlay(deflect_image) + sleep(1 SECOND) + cut_overlay(deflect_image) + qdel(deflect_image) +// flick_overlay_view(deflect_image, src, duration = 1 SECOND, gc_after = TRUE) + +/mob/living/simple_mob/mechanical/mecha/attackby(obj/item/I, mob/user) + if(prob(deflect_chance)) + visible_message(span("warning", "\The [user]'s [I] bounces off \the [src]'s armor!")) + deflect_sprite() + user.setClickCooldown(user.get_attack_speed(I)) + return + ..() + +/mob/living/simple_mob/mechanical/mecha/ex_act(severity) + if(prob(deflect_chance)) + severity++ // This somewhat misleadingly makes it less severe. + deflect_sprite() + ..(severity) diff --git a/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm b/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm index 8fae2e2545..8196ce60f8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm +++ b/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm @@ -52,20 +52,20 @@ vore_active = 1 vore_pounce_chance = 25 vore_icons = SA_ICON_LIVING - + nutrition = 1000 //This actually gets overridden further down on initialize. max_nutrition = 2200 var/evo_point = 0 var/evo_limit = 0 var/next meat_type = /obj/item/toy/figure/bounty_hunter - + /mob/living/simple_mob/metroid/Initialize() nutrition = 100 //Have them start off pretty hungry still. existing_metroids += src //Keep track of how many for the event. verbs += /mob/living/proc/ventcrawl //May not do anything at the moment. return ..() - + /datum/say_list/metroid speak = list("Skree.", "Eree.", "Errer?") emote_see = list("floats about","looks around", "rubs its talons") @@ -82,7 +82,9 @@ /mob/living/simple_mob/metroid/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.digest_brute = 1 B.digest_burn = 1 diff --git a/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm b/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm index 1da1a6ffef..c2373b9784 100644 --- a/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm @@ -35,7 +35,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. vore_digest_chance = 1 //Chance to switch to digest mode if resisted vore_absorb_chance = 0 vore_escape_chance = 2 //Chance to escape if resisted. - + /datum/ai_holder/simple_mob/jellybrig hostile = FALSE // The majority of simplemobs are hostile, jellybrig is nice. cooperative = FALSE @@ -60,9 +60,11 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. vore_active = 1 vore_pounce_chance = 25 vore_icons = SA_ICON_LIVING - + /mob/living/simple_mob/metroid/mine/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.digest_burn = 0.5 B.digest_brute = 0 @@ -121,7 +123,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. max_co2 = 0 min_n2 = 0 max_n2 = 0 - + response_help = "pets" @@ -407,7 +409,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. faction = "metroids" max_nutrition = 2200 nutrition = 0 - + makes_dirt = TRUE projectiletype = /obj/item/projectile/energy/metroidacid //The projectiles I shoot diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm index 68adaed660..d8f524d733 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm @@ -439,6 +439,7 @@ /mob/living/simple_mob/slime/xenobio/amber ) +/* VOREStation Edit. We've had enough server crashes. /mob/living/simple_mob/slime/xenobio/amber/handle_special() if(stat != DEAD) feed_aura() @@ -456,6 +457,7 @@ if(H.isSynthetic()) continue H.nutrition = between(0, H.nutrition + rand(15, 25), 800) +*/ /mob/living/simple_mob/slime/xenobio/cerulean desc = "This slime is generally superior in a wide range of attributes, compared to the common slime. The jack of all trades, but master of none." diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm index 8cd74cca4e..8bb23ec36b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm @@ -3,5 +3,5 @@ mob_bump_flag = SLIME /mob/living/simple_mob/slime/xenobio/Initialize(mapload, var/mob/living/simple_mob/slime/xenobio/my_predecessor) - ..() + . = ..() Weaken(10) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm index ba2d76b39f..dd22ad7fd0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/xenobio.dm @@ -1,280 +1,280 @@ -// These slimes have the mechanics xenobiologists care about, such as reproduction, mutating into new colors, and being able to submit through fear. - -/mob/living/simple_mob/slime/xenobio - desc = "The most basic of slimes. The grey slime has no remarkable qualities, however it remains one of the most useful colors for scientists." - layer = MOB_LAYER + 1 // Need them on top of other mobs or it looks weird when consuming something. - ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime // This should never be changed for xenobio slimes. - max_nutrition = 1000 - var/is_adult = FALSE // Slimes turn into adults when fed enough. Adult slimes are somewhat stronger, and can reproduce if fed enough. - var/maxHealth_adult = 200 - var/power_charge = 0 // Disarm attacks can shock someone if high/lucky enough. - var/mob/living/victim = null // the person the slime is currently feeding on - var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly. - var/mutation_chance = 25 // Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes. - var/list/slime_mutation = list( - /mob/living/simple_mob/slime/xenobio/orange, - /mob/living/simple_mob/slime/xenobio/metal, - /mob/living/simple_mob/slime/xenobio/blue, - /mob/living/simple_mob/slime/xenobio/purple - ) - var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces - var/number = 0 // This is used to make the slime semi-unique for indentification. - var/harmless = FALSE // Set to true when pacified. Makes the slime harmless, not get hungry, and not be able to grow/reproduce. - -/mob/living/simple_mob/slime/xenobio/Initialize(mapload, var/mob/living/simple_mob/slime/xenobio/my_predecessor) - ASSERT(ispath(ai_holder_type, /datum/ai_holder/simple_mob/xenobio_slime)) - number = rand(1, 1000) - update_name() - - . = ..() // This will make the AI and do the other mob constructor things. It will also return the default hint at the end. - - if(my_predecessor) - inherit_information(my_predecessor) - - -/mob/living/simple_mob/slime/xenobio/Destroy() - if(victim) - stop_consumption() // Unbuckle us from our victim. - return ..() - -// Called when a slime makes another slime by splitting. The predecessor slime will be deleted shortly afterwards. -/mob/living/simple_mob/slime/xenobio/proc/inherit_information(var/mob/living/simple_mob/slime/xenobio/predecessor) - if(!predecessor) - return - - var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder - var/datum/ai_holder/simple_mob/xenobio_slime/previous_AI = predecessor.ai_holder - ASSERT(istype(AI)) - ASSERT(istype(previous_AI)) - - // Now to transfer the information. - // Newly made slimes are bit more rebellious than their predecessors, but they also somewhat forget the atrocities the xenobiologist may have done. - AI.discipline = max(previous_AI.discipline - 1, 0) - AI.obedience = max(previous_AI.obedience - 1, 0) - AI.resentment = max(previous_AI.resentment - 1, 0) - AI.rabid = previous_AI.rabid - - -/mob/living/simple_mob/slime/xenobio/update_icon() - icon_living = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"][victim ? " eating" : ""]" - icon_dead = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"] dead" - icon_rest = icon_dead - ..() // This will apply the correct icon_state and do the other overlay-related things. - - -/mob/living/simple_mob/slime/xenobio/handle_special() - if(stat != DEAD) - handle_nutrition() - - if(victim) - handle_consumption() - - handle_stuttering() // ?? - - ..() - -/mob/living/simple_mob/slime/xenobio/examine(mob/user) - . = ..() - if(hat) - . += "It is wearing \a [hat]." - - if(stat == DEAD) - . += "It appears to be dead." - else if(incapacitated(INCAPACITATION_DISABLED)) - . += "It appears to be incapacitated." - else if(harmless) - . += "It appears to have been pacified." - else - if(has_AI()) - var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder - if(AI.rabid) - . += "It seems very, very angry and upset." - else if(AI.obedience >= 5) - . += "It looks rather obedient." - else if(AI.discipline) - . += "It has been subjugated by force, at least for now." - -/mob/living/simple_mob/slime/xenobio/proc/make_adult() - if(is_adult) - return - - is_adult = TRUE - melee_damage_lower = round(melee_damage_lower * 2) // 20 - melee_damage_upper = round(melee_damage_upper * 2) // 30 - maxHealth = maxHealth_adult - max_nutrition = 1200 - amount_grown = 0 - update_icon() - update_name() - -/mob/living/simple_mob/slime/xenobio/proc/update_name() - if(harmless) // Docile slimes are generally named, so we shouldn't mess with it. - return - name = "[slime_color] [is_adult ? "adult" : "baby"] [initial(name)] ([number])" - real_name = name - -/mob/living/simple_mob/slime/xenobio/update_mood() - var/old_mood = mood - if(incapacitated(INCAPACITATION_DISABLED)) - mood = "sad" - else if(harmless) - mood = ":33" - else if(has_AI()) - var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder - if(AI.rabid) - mood = "angry" - else if(AI.target) - mood = "mischevous" - else if(AI.discipline) - mood = "pout" - else - mood = ":3" - else - mood = ":3" - - if(old_mood != mood) - update_icon() - -/mob/living/simple_mob/slime/xenobio/proc/enrage() - if(harmless) - return - if(has_AI()) - var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder - AI.enrage() - -/mob/living/simple_mob/slime/xenobio/proc/pacify() - harmless = TRUE - if(has_AI()) - var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder - AI.pacify() - - faction = "neutral" - - // If for whatever reason the mob AI (or player) decides to try to attack something anyways. - melee_damage_upper = 0 - melee_damage_lower = 0 - - update_mood() - - -// These are verbs so that player slimes can evolve/split. -/mob/living/simple_mob/slime/xenobio/verb/evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - - if(stat) - to_chat(src, span("warning", "I must be conscious to do this...")) - return - - if(harmless) - to_chat(src, span("warning", "I have been pacified. I cannot evolve...")) - return - - if(!is_adult) - if(amount_grown >= 10) - make_adult() - else - to_chat(src, span("warning", "I am not ready to evolve yet...")) - else - to_chat(src, span("warning", "I have already evolved...")) - - -/mob/living/simple_mob/slime/xenobio/verb/reproduce() - set category = "Slime" - set desc = "This will make you split into four new slimes." - - if(stat) - to_chat(src, span("warning", "I must be conscious to do this...")) - return - - if(harmless) - to_chat(src, span("warning", "I have been pacified. I cannot reproduce...")) - return - - if(is_adult) - if(amount_grown >= 10) - // Check if there's enough 'room' to split. - var/list/nearby_things = orange(1, src) - var/free_tiles = 0 - for(var/turf/T in nearby_things) - var/free = TRUE - if(T.density) // No walls. - continue - for(var/atom/movable/AM in T) - if(AM.density) - free = FALSE - break - - if(free) - free_tiles++ - - if(free_tiles < 3) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies. - to_chat(src, span("warning", "It is too cramped here to reproduce...")) - return - - var/list/babies = list() - for(var/i = 1 to 4) - babies.Add(make_new_slime()) - - var/mob/living/simple_mob/slime/new_slime = pick(babies) - new_slime.universal_speak = universal_speak - if(src.mind) - src.mind.transfer_to(new_slime) - else - new_slime.key = src.key - qdel(src) - else - to_chat(src, span("warning", "I am not ready to reproduce yet...")) - else - to_chat(src, span("warning", "I have not evolved enough to reproduce yet...")) - -// Used when reproducing or dying. -/mob/living/simple_mob/slime/xenobio/proc/make_new_slime(var/desired_type) - var/t = src.type - if(desired_type) - t = desired_type - if(prob(mutation_chance / 10)) - t = /mob/living/simple_mob/slime/xenobio/rainbow - else if(prob(mutation_chance) && slime_mutation.len) - t = slime_mutation[rand(1, slime_mutation.len)] - var/mob/living/simple_mob/slime/xenobio/baby = new t(loc, src) - - // Handle 'inheriting' from parent slime. - baby.mutation_chance = mutation_chance - baby.power_charge = round(power_charge / 4) - - if(!istype(baby, /mob/living/simple_mob/slime/xenobio/rainbow)) - baby.unity = unity - baby.faction = faction - baby.friends = friends.Copy() - - step_away(baby, src) - return baby - -/mob/living/simple_mob/slime/xenobio/get_description_interaction() - var/list/results = list() - - if(!stat) - results += "[desc_panel_image("slimebaton")]to stun the slime, if it's being bad." - - results += ..() - - return results - -/mob/living/simple_mob/slime/xenobio/get_description_info() - var/list/lines = list() - var/intro_line = "Slimes are generally the test subjects of Xenobiology, with different colors having different properties. \ - They can be extremely dangerous if not handled properly." - lines.Add(intro_line) - lines.Add(null) // To pad the line breaks. - - var/list/rewards = list() - for(var/potential_color in slime_mutation) - var/mob/living/simple_mob/slime/S = potential_color - rewards.Add(initial(S.slime_color)) - var/reward_line = "This color of slime can mutate into [english_list(rewards)] colors, when it reproduces. It will do so when it has eatten enough." - lines.Add(reward_line) - lines.Add(null) - - lines.Add(description_info) - return lines.Join("\n") +// These slimes have the mechanics xenobiologists care about, such as reproduction, mutating into new colors, and being able to submit through fear. + +/mob/living/simple_mob/slime/xenobio + desc = "The most basic of slimes. The grey slime has no remarkable qualities, however it remains one of the most useful colors for scientists." + layer = MOB_LAYER + 1 // Need them on top of other mobs or it looks weird when consuming something. + ai_holder_type = /datum/ai_holder/simple_mob/xenobio_slime // This should never be changed for xenobio slimes. + max_nutrition = 1000 + var/is_adult = FALSE // Slimes turn into adults when fed enough. Adult slimes are somewhat stronger, and can reproduce if fed enough. + var/maxHealth_adult = 200 + var/power_charge = 0 // Disarm attacks can shock someone if high/lucky enough. + var/mob/living/victim = null // the person the slime is currently feeding on + var/rainbow_core_candidate = TRUE // If false, rainbow cores cannot make this type randomly. + var/mutation_chance = 25 // Odds of spawning as a new color when reproducing. Can be modified by certain xenobio products. Carried across generations of slimes. + var/list/slime_mutation = list( + /mob/living/simple_mob/slime/xenobio/orange, + /mob/living/simple_mob/slime/xenobio/metal, + /mob/living/simple_mob/slime/xenobio/blue, + /mob/living/simple_mob/slime/xenobio/purple + ) + var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces + var/number = 0 // This is used to make the slime semi-unique for indentification. + var/harmless = FALSE // Set to true when pacified. Makes the slime harmless, not get hungry, and not be able to grow/reproduce. + +/mob/living/simple_mob/slime/xenobio/Initialize(mapload, var/mob/living/simple_mob/slime/xenobio/my_predecessor) + ASSERT(ispath(ai_holder_type, /datum/ai_holder/simple_mob/xenobio_slime)) + number = rand(1, 1000) + update_name() + + . = ..() // This will make the AI and do the other mob constructor things. It will also return the default hint at the end. + + if(my_predecessor) + inherit_information(my_predecessor) + + +/mob/living/simple_mob/slime/xenobio/Destroy() + if(victim) + stop_consumption() // Unbuckle us from our victim. + return ..() + +// Called when a slime makes another slime by splitting. The predecessor slime will be deleted shortly afterwards. +/mob/living/simple_mob/slime/xenobio/proc/inherit_information(var/mob/living/simple_mob/slime/xenobio/predecessor) + if(!predecessor) + return + + var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder + var/datum/ai_holder/simple_mob/xenobio_slime/previous_AI = predecessor.ai_holder + ASSERT(istype(AI)) + ASSERT(istype(previous_AI)) + + // Now to transfer the information. + // Newly made slimes are bit more rebellious than their predecessors, but they also somewhat forget the atrocities the xenobiologist may have done. + AI.discipline = max(previous_AI.discipline - 1, 0) + AI.obedience = max(previous_AI.obedience - 1, 0) + AI.resentment = max(previous_AI.resentment - 1, 0) + AI.rabid = previous_AI.rabid + + +/mob/living/simple_mob/slime/xenobio/update_icon() + icon_living = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"][victim ? " eating" : ""]" + icon_dead = "[icon_state_override ? "[icon_state_override] slime" : "slime"] [is_adult ? "adult" : "baby"] dead" + icon_rest = icon_dead + ..() // This will apply the correct icon_state and do the other overlay-related things. + + +/mob/living/simple_mob/slime/xenobio/handle_special() + if(stat != DEAD) + handle_nutrition() + + if(victim) + handle_consumption() + + handle_stuttering() // ?? + + ..() + +/mob/living/simple_mob/slime/xenobio/examine(mob/user) + . = ..() + if(hat) + . += "It is wearing \a [hat]." + + if(stat == DEAD) + . += "It appears to be dead." + else if(incapacitated(INCAPACITATION_DISABLED)) + . += "It appears to be incapacitated." + else if(harmless) + . += "It appears to have been pacified." + else + if(has_AI()) + var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder + if(AI.rabid) + . += "It seems very, very angry and upset." + else if(AI.obedience >= 5) + . += "It looks rather obedient." + else if(AI.discipline) + . += "It has been subjugated by force, at least for now." + +/mob/living/simple_mob/slime/xenobio/proc/make_adult() + if(is_adult) + return + + is_adult = TRUE + melee_damage_lower = round(melee_damage_lower * 2) // 20 + melee_damage_upper = round(melee_damage_upper * 2) // 30 + maxHealth = maxHealth_adult + max_nutrition = 1200 + amount_grown = 0 + update_icon() + update_name() + +/mob/living/simple_mob/slime/xenobio/proc/update_name() + if(harmless) // Docile slimes are generally named, so we shouldn't mess with it. + return + name = "[slime_color] [is_adult ? "adult" : "baby"] [initial(name)] ([number])" + real_name = name + +/mob/living/simple_mob/slime/xenobio/update_mood() + var/old_mood = mood + if(incapacitated(INCAPACITATION_DISABLED)) + mood = "sad" + else if(harmless) + mood = ":33" + else if(has_AI()) + var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder + if(AI.rabid) + mood = "angry" + else if(AI.target) + mood = "mischevous" + else if(AI.discipline) + mood = "pout" + else + mood = ":3" + else + mood = ":3" + + if(old_mood != mood) + update_icon() + +/mob/living/simple_mob/slime/xenobio/proc/enrage() + if(harmless) + return + if(has_AI()) + var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder + AI.enrage() + +/mob/living/simple_mob/slime/xenobio/proc/pacify() + harmless = TRUE + if(has_AI()) + var/datum/ai_holder/simple_mob/xenobio_slime/AI = ai_holder + AI.pacify() + + faction = "neutral" + + // If for whatever reason the mob AI (or player) decides to try to attack something anyways. + melee_damage_upper = 0 + melee_damage_lower = 0 + + update_mood() + + +// These are verbs so that player slimes can evolve/split. +/mob/living/simple_mob/slime/xenobio/verb/evolve() + set category = "Slime" + set desc = "This will let you evolve from baby to adult slime." + + if(stat) + to_chat(src, span("warning", "I must be conscious to do this...")) + return + + if(harmless) + to_chat(src, span("warning", "I have been pacified. I cannot evolve...")) + return + + if(!is_adult) + if(amount_grown >= 10) + make_adult() + else + to_chat(src, span("warning", "I am not ready to evolve yet...")) + else + to_chat(src, span("warning", "I have already evolved...")) + + +/mob/living/simple_mob/slime/xenobio/verb/reproduce() + set category = "Slime" + set desc = "This will make you split into four new slimes." + + if(stat) + to_chat(src, span("warning", "I must be conscious to do this...")) + return + + if(harmless) + to_chat(src, span("warning", "I have been pacified. I cannot reproduce...")) + return + + if(is_adult) + if(amount_grown >= 10) + // Check if there's enough 'room' to split. + var/list/nearby_things = orange(1, src) + var/free_tiles = 0 + for(var/turf/T in nearby_things) + var/free = TRUE + if(T.density) // No walls. + continue + for(var/atom/movable/AM in T) + if(AM.density || istype(AM, /mob/living/simple_mob/slime)) + free = FALSE + break + + if(free) + free_tiles++ + + if(free_tiles < 3) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies. + to_chat(src, span("warning", "It is too cramped here to reproduce...")) + return + + var/list/babies = list() + for(var/i = 1 to 4) + babies.Add(make_new_slime()) + + var/mob/living/simple_mob/slime/new_slime = pick(babies) + new_slime.universal_speak = universal_speak + if(src.mind) + src.mind.transfer_to(new_slime) + else + new_slime.key = src.key + qdel(src) + else + to_chat(src, span("warning", "I am not ready to reproduce yet...")) + else + to_chat(src, span("warning", "I have not evolved enough to reproduce yet...")) + +// Used when reproducing or dying. +/mob/living/simple_mob/slime/xenobio/proc/make_new_slime(var/desired_type) + var/t = src.type + if(desired_type) + t = desired_type + if(prob(mutation_chance / 10)) + t = /mob/living/simple_mob/slime/xenobio/rainbow + else if(prob(mutation_chance) && slime_mutation.len) + t = slime_mutation[rand(1, slime_mutation.len)] + var/mob/living/simple_mob/slime/xenobio/baby = new t(loc, src) + + // Handle 'inheriting' from parent slime. + baby.mutation_chance = mutation_chance + baby.power_charge = round(power_charge / 4) + + if(!istype(baby, /mob/living/simple_mob/slime/xenobio/rainbow)) + baby.unity = unity + baby.faction = faction + baby.friends = friends.Copy() + + step_away(baby, src) + return baby + +/mob/living/simple_mob/slime/xenobio/get_description_interaction() + var/list/results = list() + + if(!stat) + results += "[desc_panel_image("slimebaton")]to stun the slime, if it's being bad." + + results += ..() + + return results + +/mob/living/simple_mob/slime/xenobio/get_description_info() + var/list/lines = list() + var/intro_line = "Slimes are generally the test subjects of Xenobiology, with different colors having different properties. \ + They can be extremely dangerous if not handled properly." + lines.Add(intro_line) + lines.Add(null) // To pad the line breaks. + + var/list/rewards = list() + for(var/potential_color in slime_mutation) + var/mob/living/simple_mob/slime/S = potential_color + rewards.Add(initial(S.slime_color)) + var/reward_line = "This color of slime can mutate into [english_list(rewards)] colors, when it reproduces. It will do so when it has eatten enough." + lines.Add(reward_line) + lines.Add(null) + + lines.Add(description_info) + return lines.Join("\n") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm new file mode 100644 index 0000000000..e4e58f75dc --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/c_pet.dm @@ -0,0 +1,94 @@ +/mob/living/simple_mob/animal/passive/honkpet + name = "Hinkle" + desc = "The Silence into Laughter program mass produces these excessively hardy animals for each member to raise and take care of. They often switch personalities when smacked." + tt_desc = "Coulrian Honkus" + icon = 'icons/mob/animal_vr.dmi' + icon_state = "c_pet" + icon_living = "c_pet" + icon_dead = "c_pet_dead" + + maxHealth = 1500 + health = 1500 + minbodytemp = 175 // Same as Sif mobs. + + response_help = "pokes" + response_disarm = "subverts" + response_harm = "smacks" + + harm_intent_damage = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + attacktext = list("honked") + + armor = list( + "melee" = 80, + "bullet" = 20, + "laser" = 0, + "energy" = 0, + "bomb" = 0, + "bio" = 0, + "rad" = 0 + ) + armor_soak = list( + "melee" = 80, + "bullet" = 20, + "laser" = 0, + "energy" = 0, + "bomb" = 0, + "bio" = 0, + "rad" = 0 + ) + + has_langs = list("Coulrian") + +/mob/living/simple_mob/animal/passive/honkpet/attack_hand(mob/living/user as mob) + if(user.a_intent == I_DISARM) + return icon_state = pick("c_pet", "m_pet") + .=..() + +/mob/living/simple_mob/animal/passive/mimepet + name = "Dave" + desc = "That's Dave." + tt_desc = "Polypodavesilencia" + icon = 'icons/mob/animal_vr.dmi' + icon_state = "dave1" + icon_living = "dave1" + icon_dead = "dave_dead" + movement_cooldown = 300 + + maxHealth = 1500 + health = 1500 + minbodytemp = 175 // Same as Sif mobs. + + response_help = "pokes" + response_disarm = "shuffles" + response_harm = "smacks" + + harm_intent_damage = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + attacktext = list("...") + + armor = list( + "melee" = 80, + "bullet" = 20, + "laser" = 0, + "energy" = 0, + "bomb" = 0, + "bio" = 0, + "rad" = 0 + ) + armor_soak = list( + "melee" = 80, + "bullet" = 20, + "laser" = 0, + "energy" = 0, + "bomb" = 0, + "bio" = 0, + "rad" = 0 + ) + +/mob/living/simple_mob/animal/passive/mimepet/attack_hand(mob/living/user as mob) + if(user.a_intent == I_DISARM) + icon_state = pick("dave1", "dave2", "dave3", "dave5" , "dave6" , "dave7" , "dave8" , "dave9" , "dave10") + .=..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index 6a52dd69b4..5238b38c52 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -122,7 +122,9 @@ return TRUE /mob/living/simple_mob/vore/aggressive/corrupthound/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "fuel processor" B.desc = "Uttering distorted growls and fragmented voice clips all the while, the corrupted hound gulps the rest of your squirming figure past its jaws... which snap shut with an audible click of metal on metal. Your trip down its slickly lubricated, rubbery gullet is a tight and efficient one... and once you spill out into the machine's fuel processor, your weight making it sag slightly, hot-and-thick slime begins oozing all over your form. Only time will tell if you're destined to become fuel for its next bout of rampaging... be it days, hours, or just mere minutes..." @@ -144,6 +146,8 @@ "'FU3L mE A1RE@Dy, S0 sO SORrY!?', your corrupted captor growls as its synthetic innards begin oozing more potent juices, grinding down into your body with increasing fervor!") /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi/init_vore() + if(!voremob_loaded) + return ..() var/obj/belly/B = vore_selected B.name = "fuel processor" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm index 505cf02c47..d419bdd2bd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm @@ -62,7 +62,9 @@ return /mob/living/simple_mob/vore/aggressive/deathclaw/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "The giant mutant of a lizard finishes stuffing you into its jaws and down its ravenously clenching gullet with a worrying ease and efficiency. An assortment of slick, slimy noises assault your senses for a few gulp-filled moments... before you spill out into the apex predator's swelteringly hot stomach, its walls already possessively grinding into your body." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm index f55eab9fcd..a4179e5fbc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm @@ -48,7 +48,9 @@ var/is_shifting = FALSE /mob/living/simple_mob/vore/demon/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm index 4fa7da9947..d90f8a2bfb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm @@ -63,7 +63,9 @@ var/is_shifting = FALSE /mob/living/simple_mob/vore/demonAI/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities_ch.dm index 223366b9d0..dd8956d0ff 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities_ch.dm @@ -22,3 +22,96 @@ blood_spawn = world.time return + +/mob/living/simple_mob/vore/demon/verb/toggle_laugh() + set name = "Toggle Auto Laugh" + set desc = "Toggles whether the demon will automatically laugh when interacted with." + set category = "Abilities" + + enable_autolaugh = !enable_autolaugh + if(enable_autolaugh) + to_chat(src,"Autolaugh has been toggled on") + else + to_chat(src,"Autolaugh has been toggled off") + +/mob/living/simple_mob/vore/demon/verb/manual_laugh() + set name = "Laugh" + set desc = "Plays the laugh track." + set category = "Abilities" + + if(!enable_autolaugh) //yeah this is kinda sorta dirty but id rather use a bool over something else here to control this. + enable_autolaugh = !enable_autolaugh + laugh() + enable_autolaugh = !enable_autolaugh + else + laugh() + to_chat(src,"You laugh!") //lets add some fluff response for clicking the feel good button. + +/mob/living/simple_mob/vore/demon/verb/sizespell() + set name = "Shrink/Grow Prey" + set category = "Abilities" + set desc = "Shrink/Grow someone nearby! (60 second cooldown)" + set popup_menu = FALSE // Stop licking by accident! //Yes this is from lick code, sue me. + + var/obj/item/weapon/grab/G = src.get_active_hand() + + if(!istype(G)) + to_chat(src, "You must be grabbing a creature in your active hand to affect them.") + return + var/mob/living/carbon/human/T = G.affecting + if(!istype(T)) + to_chat(src, "\The [T] is not able to be affected.") + return + + if(G.state != GRAB_NECK) + to_chat(src, "You must have a tighter grip to affect this creature.") + return + + if(!checkClickCooldown() || incapacitated(INCAPACITATION_ALL)) + return + + setClickCooldown(8) + T.resize(size_amount) + visible_message("[src] shrinks [T]!","You shrink [T].") + +/mob/living/simple_mob/vore/demon + var/size_amount = RESIZE_TINY //Adding a var to keep track of sizespell setting + +/mob/living/simple_mob/vore/demon/verb/toggle_sizespell() + set name = "Shrink/Grow Amount" + set desc = "Changes the amount you grow/shrink people." + set category = "Abilities" + + var/size_select = input("Put the desired size (25-200%)", "Set Size", size_amount * 100) as num //Stolen from sizegun code + if(size_select > 200 || size_select < 25) + to_chat(usr, "Invalid size.") + return + size_amount = (size_select/100) + to_chat(src,"Size spell set to [size_select]%") //Telling the user the new amount + +/mob/living/simple_mob/vore/demon/verb/demon_bite() + set name = "Mindbreaker Bite" + set category = "Abilities" + set desc = "Inject mindbreaker into your grabbed prey!" + set popup_menu = FALSE // Stop licking by accident! //Yes this is from lick code, sue me. + + var/obj/item/weapon/grab/G = src.get_active_hand() + + if(!istype(G)) + to_chat(src, "You must be grabbing a creature in your active hand to affect them.") + return + var/mob/living/carbon/human/T = G.affecting + if(!istype(T)) + to_chat(src, "\The [T] is not able to be affected.") + return + + if(G.state != GRAB_NECK) + to_chat(src, "You must have a tighter grip to affect this creature.") + return + + if(!checkClickCooldown() || incapacitated(INCAPACITATION_ALL)) + return + + setClickCooldown(8) + T.reagents.add_reagent(poison_type, poison_per_bite) + visible_message("[src] bites [T]!","You bite [T].") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm index 63595cb684..9b5d9b56d5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm @@ -35,7 +35,7 @@ min_n2 = 0 max_n2 = 0 minbodytemp = 0 - maxbodytemp = 96669 + maxbodytemp = 323 //50 Degrees and above will now cause FireLoss response_help = "touches" response_disarm = "pushes" @@ -56,8 +56,13 @@ var/blood_spawn = 0 var/is_shifting = FALSE + var/enable_autolaugh = FALSE //Whether user controlled mob will laugh when interacting automatically. + var/laugh = 'sound/misc/demonlaugh.ogg' //Yknow maybe someone wants a custom laugh, you never know. + /mob/living/simple_mob/vore/demon/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." @@ -115,21 +120,34 @@ L.reagents.add_reagent(poison_type, poison_per_bite) /mob/living/simple_mob/vore/demon/death() - playsound(src, 'sound/misc/demondeath.ogg', 50, 1) + laugh() ..() /mob/living/simple_mob/vore/demon/bullet_act() - playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) - ..() + laugh() + ..() /mob/living/simple_mob/vore/demon/attack_hand() - playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) - ..() + laugh() + ..() /mob/living/simple_mob/vore/demon/hitby() - playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) - ..() + laugh() + ..() /mob/living/simple_mob/vore/demon/attackby() - playsound(src, 'sound/misc/demonlaugh.ogg', 50, 1) - ..() \ No newline at end of file + laugh() + ..() +//This below proc could be improved by 1. add a bool for overriding the check (if we directly call the proc for example) +//and possibly adding a switch that checks a string given by the above procs so that we can have uniwue sounds if needed +/mob/living/simple_mob/vore/demon/proc/laugh() + if(!src.ckey || enable_autolaugh) + playsound(src, laugh, 50, 1) + +//Fire heals demons instead. +//This should include all fire sources assuming they dont weirdly make their own damage handling. +//Yes this also means that negative fire is bad for them... +/mob/living/simple_mob/vore/demon/adjustFireLoss(amount) + amount = 0 - amount + src.adjustBruteLoss(amount) + ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm index 1245278421..047f83e024 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm @@ -78,7 +78,9 @@ return /mob/living/simple_mob/vore/horse/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "With a final few gulps, the horse finishes swallowing you down into its hot, dark gut... and with a slosh, your weight makes the equine's belly hang down slightly like some sort of organic hammock. The thick, humid air is tinged with the smell of half-digested grass, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm index c2e984864c..880008dff9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm @@ -101,6 +101,8 @@ icon_state = "[icon_rest]_vore_[upper_shows]_[tail_shows]" /mob/living/simple_mob/vore/lamia/init_vore() + if(!voremob_loaded) + return . = ..() var/obj/belly/B = vore_selected @@ -152,7 +154,7 @@ icon_living = "albino_bra" icon_rest = "albino_bra_rest" icon_dead = "albino_bra_dead" - + /mob/living/simple_mob/vore/lamia/albino/shirt desc = "Combination snake-human. This one is albino. They're wearing a shirt." icon_state = "albino_shirt" @@ -175,7 +177,7 @@ icon_living = "cobra_bra" icon_rest = "cobra_bra_rest" icon_dead = "cobra_bra_dead" - + /mob/living/simple_mob/vore/lamia/cobra/shirt desc = "Combination snake-human. This one looks like a cobra. They're wearing a shirt." icon_state = "cobra_shirt" @@ -198,7 +200,7 @@ icon_living = "copper_bra" icon_rest = "copper_bra_rest" icon_dead = "copper_bra_dead" - + /mob/living/simple_mob/vore/lamia/copper/shirt desc = "Combination snake-human. This one is copper. They're wearing a shirt." icon_state = "copper_shirt" @@ -221,7 +223,7 @@ icon_living = "green_bra" icon_rest = "green_bra_rest" icon_dead = "green_bra_dead" - + /mob/living/simple_mob/vore/lamia/green/shirt desc = "Combination snake-human. This one is green. They're wearing a shirt." icon_state = "green_shirt" @@ -244,7 +246,7 @@ icon_living = "zebra_bra" icon_rest = "zebra_bra_rest" icon_dead = "zebra_bra_dead" - + /mob/living/simple_mob/vore/lamia/zebra/shirt desc = "Combination snake-human. This one has a zebra pattern. They're wearing a shirt." icon_state = "zebra_shirt" @@ -283,7 +285,7 @@ GLOBAL_LIST_INIT(valid_random_lamias, list( icon_living = initial(new_attrs.icon_living) icon_rest = initial(new_attrs.icon_rest) icon_dead = initial(new_attrs.icon_dead) - + vore_default_mode = initial(new_attrs.vore_default_mode) vore_digest_chance = initial(new_attrs.vore_digest_chance) vore_pounce_chance = initial(new_attrs.vore_pounce_chance) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm index d1503a7a47..67aac85cd3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm @@ -64,11 +64,11 @@ movement_cooldown = 2 /mob/living/simple_mob/vore/leopardmander/New() //Set to max nutrition on spawn since heal belly drains nutrition to work. - ..() + ..() src.adjust_nutrition(src.max_nutrition) /mob/living/simple_mob/vore/leopardmander/Initialize() - ..() + ..() src.adjust_nutrition(src.max_nutrition) /mob/living/simple_mob/vore/leopardmander/apply_melee_effects(atom/A) @@ -86,7 +86,7 @@ L.reagents.add_reagent("myelamine", venom_dose) L.reagents.add_reagent("osteodaxon", venom_dose) - + /mob/living/simple_mob/vore/leopardmander @@ -104,7 +104,9 @@ vore_bump_emote = "tries to snap up" /mob/living/simple_mob/vore/leopardmander/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "The leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, dark gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you with unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~" @@ -160,7 +162,7 @@ glow_toggle = TRUE //Glow! glow_range = 2 - glow_color = "#FF006E" + glow_color = "#FF006E" glow_intensity = 1.5 /mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow() @@ -171,11 +173,13 @@ glow_toggle = !glow_toggle /mob/living/simple_mob/vore/leopardmander/exotic/New() - ..() + ..() verbs |= /mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow /mob/living/simple_mob/vore/leopardmander/exotic/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "The exotic leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, brightly glowing gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you, with their unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~ You can only really sort of see outside that thick-walled gut." @@ -205,4 +209,4 @@ /obj/random/mob/leopardmander/item_to_spawn() //Random map spawner return pick(prob(89);/mob/living/simple_mob/vore/leopardmander, prob(10);/mob/living/simple_mob/vore/leopardmander/blue, - prob(1);/mob/living/simple_mob/vore/leopardmander/exotic,) \ No newline at end of file + prob(1);/mob/living/simple_mob/vore/leopardmander/exotic,) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm index c4163733bd..083048d561 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm @@ -64,7 +64,7 @@ vore_capacity = 1 vore_pounce_chance = 0 //grubs only eat incapacitated targets vore_default_mode = DM_DIGEST - + min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -110,10 +110,10 @@ "bio" = 100, "rad" = 100 ) - + var/lava_min_ore = 6 var/lava_max_ore = 10 - + poison_per_bite = 5 poison_chance = 66 @@ -160,7 +160,9 @@ //I'm no good at writing this stuff, so I've just left it as placeholders and disabled the chances of them eating you. /* /mob/living/simple_mob/vore/oregrub/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "PLACEHOLDER!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm index 16fa33596a..2b5103a128 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm @@ -58,7 +58,9 @@ return /mob/living/simple_mob/vore/aggressive/panther/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "All it takes is a few more rasps of the panther's rough, barbed tongue to shovel the rest of you down its tightly rippling gullet... and with a final couple ravenous swallows, you spill out into the predatory feline's stomach! Right away, that gut's muscular walls knead and contract around you, forcing you into a curled-up ball as the panther's noisy purring rumbles into you from every direction." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm b/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm index 4d1a78545a..b93ebbe0b7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm @@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( health = 200 a_intent = I_HELP //White this is help by default I'm leaving this here as a reminder thatdisarm will prevent playersfrom swapping places with the pitcher (but interfere with vore bump). faction = "plants" //Makes plantbgone deadly. - ai_holder_type = /datum/ai_holder/simple_mob/passive/pitcher //It's a passive carnivorous plant, it can't detect or interact with people. + ai_holder_type = /datum/ai_holder/simple_mob/passive/pitcher //It's a passive carnivorous plant, it can't detect or interact with people. min_oxy = 0 //Immune to atmos because so are space vines. This is arbitrary and can be tweaked if desired. max_oxy = 0 @@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( minbodytemp = 0 melee_damage_upper = 0 //This shouldn't attack people but if it does (admemes) no damage can be dealt. - melee_damage_lower = 0 + melee_damage_lower = 0 armor = list( "melee" = 0, @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( /mob/living/simple_mob/vore/pitcher_plant //Putting vore variables separately because apparently that's tradition. - vore_bump_chance = 100 + vore_bump_chance = 100 vore_bump_emote = "slurps up" //Not really a good way to make the grammar work with a passive vore plant. vore_active = 1 vore_icons = 1 @@ -75,7 +75,9 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( vore_default_mode = DM_DIGEST /mob/living/simple_mob/vore/pitcher_plant/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.desc = "You leaned a little too close to the pitcher plant, stumbling over the lip and splashing into a puddle of liquid filling the bottom of the cramped pitcher. You squirm madly, righting yourself and scrabbling at the walls in vain as the slick surface offers no purchase. The dim light grows dark as the pitcher's cap lowers, silently sealing the exit. With a sinking feeling you realize you won't be able to push the exit open even if you could somehow climb that high, leaving you helplessly trapped in the slick, tingling fluid. ((You can't escape this mob without help but you may use OOC Escape if you wish.))" B.digest_burn = 0.5 @@ -126,7 +128,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( adjustToxLoss((nutrition - lastnutrition) * 3) if(nutrition < pitcher_metabolism) adjustToxLoss(pitcher_metabolism) - if(world.time > last_lifechecks + 30 SECONDS) + if(world.time > last_lifechecks + 30 SECONDS) last_lifechecks = world.time vore_checks() handle_hungry() @@ -138,7 +140,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( /mob/living/simple_mob/vore/pitcher_plant/Initialize() ..() pitcher_plant_lure_messages = GLOB.pitcher_plant_lure_messages - + /mob/living/simple_mob/vore/pitcher_plant/death() ..() @@ -147,7 +149,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( new /obj/item/weapon/reagent_containers/food/snacks/pitcher_fruit(get_turf(src)) fruit = FALSE - + /mob/living/simple_mob/vore/pitcher_plant/proc/grow_fruit() //This proc handles the pitcher turning nutrition into fruit (and new pitchers). if(!fruit) @@ -158,14 +160,14 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( else return if(fruit) - if(nutrition >= PITCHER_SATED + NUTRITION_PITCHER) - var/turf/T = safepick(circleviewturfs(src, 2)) + if(nutrition >= PITCHER_SATED + NUTRITION_PITCHER) + var/turf/T = safepick(circleviewturfs(src, 2)) if(T.density) //No spawning in walls return else if(src.loc ==T) return else - new /mob/living/simple_mob/vore/pitcher_plant(get_turf(T)) + new /mob/living/simple_mob/vore/pitcher_plant(get_turf(T)) fruit = FALSE //No admeming this to spawn endless pitchers. adjust_nutrition(-NUTRITION_PITCHER) @@ -226,12 +228,12 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( var/N = 0 var/hasdigestable = 0 var/hasindigestable = 0 - for(L in vore_selected.contents) + for(L in vore_selected.contents) if(istype(L, /mob/living/carbon/human/monkey)) L.nutrition = 0 //No stuffing monkeys with protein shakes for massive nutrition. if(!L.digestable) vore_selected.digest_mode = DM_DRAIN - N = 1 + N = 1 hasindigestable = 1 continue else @@ -250,8 +252,8 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( if(nutrition <= PITCHER_HUNGRY) //Is sanity check another way to say redundancy? var/turf/T = get_turf(src) var/cardinal_turfs = T.CardinalTurfs() - - for(var/mob/living/carbon/human/H in oview(2, src)) + + for(var/mob/living/carbon/human/H in oview(2, src)) if(!istype(H) || !isliving(H) || H.stat == DEAD) //Living mobs only continue if(isSynthetic(H) || !H.species.breath_type || H.internal) //Exclude species which don't breathe or have internals. @@ -292,7 +294,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( /obj/item/weapon/reagent_containers/food/snacks/pitcher_fruit/Initialize() . = ..() - reagents.add_reagent("pitcher_nectar", 5) + reagents.add_reagent("pitcher_nectar", 5) bitesize = 4 pit = new /obj/item/seeds/pitcherseed(src.contents) seed = pit.seed @@ -301,7 +303,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( if(istype(O,/obj/machinery/microwave)) return ..() if(istype (O, /obj/machinery/seed_extractor)) - pit.loc = O.loc //1 seed, perhaps balanced because you can get the reagents and the seed. Can be increased if desirable. + pit.loc = O.loc //1 seed, perhaps balanced because you can get the reagents and the seed. Can be increased if desirable. qdel(src) if(!(proximity && O.is_open_container())) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm index d708f265bb..67194a3a87 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm @@ -54,7 +54,9 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee/rat /mob/living/simple_mob/vore/aggressive/rat/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "In a cruel game of cat-and-mouse gone horribly wrong, you struggle to breathe clearly as the giant rat holds your head in its jaws, the rest of its bulk pinning you to the ground. Slimy slurps and its own muffled squeaking fill your senses as it simultaneously tosses its head while backing up. Quickly, ravenously consuming you, bit by bit, packing you down its gullet no matter how you struggle. Passing by its excited heartbeat, your thoroughly slickened head pushes out into its awaiting stomach, a dark and humid hammock eager to accept the rest of you. Soon, those too-warm, plush walls clench and squeeze around you with undeniable need! A need for mere filling, or, perhaps, a proper meal?" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm new file mode 100644 index 0000000000..619e0acad0 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_drone.dm @@ -0,0 +1,67 @@ +/datum/category_item/catalogue/fauna/sect_drone + name = "Creature - Sect Drone" + desc = "Database Update Pending" //TODO: Virgo Lore Writing WIP + value = CATALOGUER_REWARD_MEDIUM + +/mob/living/simple_mob/vore/sect_drone + name = "sect drone" + desc = "A large, chitin-plated insectoid whose multiple cyan eyes cast a frightful blue light. Its \ + abdomen has an unusually soft and... flexible-looking underbelly..." + + icon_dead = "sect_drone_dead" + icon_living = "sect_drone" + icon_state = "sect_drone" + icon = 'icons/mob/vore64x64.dmi' + vis_height = 64 + has_eye_glow = TRUE + + faction = "insects" + maxHealth = 90 + health = 90 + see_in_dark = 8 + + movement_cooldown = 3 + + melee_damage_lower = 6 + melee_damage_upper = 12 + grab_resist = 100 // you can't even wrap your arms around this thing, how could you hope to grab it??? + + vore_active = 1 + vore_capacity = 1 + vore_pounce_chance = 70 // v hongry buggo + vore_icons = SA_ICON_LIVING + + //Beeg bug don't give a fuck about atmos. Something something, phoron mutation. + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + response_help = "pats" + response_disarm = "tries to shove" + response_harm = "hits" + attacktext = list("slashed") + friendly = list("nuzzles", "caresses", "headbumps against", "leans against", "nibbles affectionately on", "antennae tickles") // D'awww + + old_x = -16 + old_y = 0 + default_pixel_x = -16 + pixel_x = -16 + pixel_y = 0 + + max_buckled_mobs = 1 //Yeehaw + can_buckle = TRUE + buckle_movable = TRUE + buckle_lying = FALSE + mount_offset_y = 7 + + ai_holder_type = /datum/ai_holder/simple_mob/melee + say_list_type = /datum/say_list/sect_drone + +/datum/say_list/sect_drone + say_got_target = list("chitters threateningly!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm index e5eaff69a4..bb0933dd86 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/sect_queen.dm @@ -1,6 +1,6 @@ // Beeg bug do beeg noms. It also glows in the dark for maximum spook power. -/datum/category_item/catalogue/fauna/sect_queen //TODO: VIRGO_LORE_WRITING_WIP +/datum/category_item/catalogue/fauna/sect_queen name = "Creature - Sect Queen" desc = "A massively-sized insect that is native, although rarely spotted outside of its colony, to Virgo 3B. \ It bears the combined physical traits of several of Earth's insects. Its forelegs have claws bearing serrated \ @@ -28,7 +28,7 @@ maxHealth = 200 health = 200 see_in_dark = 8 - + melee_damage_lower = 8 melee_damage_upper = 16 @@ -61,7 +61,7 @@ default_pixel_x = -16 pixel_x = -16 pixel_y = 0 - + max_buckled_mobs = 1 //Yeehaw can_buckle = TRUE buckle_movable = TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm index f1fc9914c2..7020fccd34 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm @@ -19,7 +19,7 @@ //Shifting in if(ability_flags & AB_PHASE_SHIFTED) ability_flags &= ~AB_PHASE_SHIFTED - mouse_opacity = 2 + mouse_opacity = 1 name = real_name for(var/belly in vore_organs) var/obj/belly/B = belly diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/rakshasa_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/rakshasa_abilities.dm index fb93f1609c..188dd6da72 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/rakshasa_abilities.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/rakshasa_abilities.dm @@ -90,7 +90,7 @@ return new /obj/effect/decal/cleanable/blood/oil(loc, src) playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1) - my_kin.phase_shift() + my_kin.rakshasa_shift() if(my_kin.ability_flags & AB_PHASE_SHIFTED) cost = 0 //Shifting back is free (but harmful in light) new /obj/effect/decal/cleanable/blood/oil(my_kin.loc) @@ -118,7 +118,7 @@ return new /obj/effect/decal/cleanable/blood/oil(loc, src) playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1) - my_kin.phase_shift() + my_kin.rakshasa_shift() if(my_kin.ability_flags & AB_PHASE_SHIFTED) cost = 0 //Shifting back is free (but harmful in light) new /obj/effect/decal/cleanable/blood/oil(my_kin.loc) @@ -268,8 +268,106 @@ playsound(my_kin.loc, sound, 100, 1) new /obj/structure/gootrap (my_kin.loc) +///////////////////////////////////////////////////////////////// +/obj/effect/rakshasa_ability/flicker + ability_name = "Flicker Lights" + desc = "Flicker the lights." + icon_state = "" + cost = 0 + shift_mode = SHIFTED_OR_NOT + ab_sound = 'sound/effects/stealthoff.ogg' +obj/effect/rakshasa_ability/flicker/do_ability() + if(!..()) + return + my_kin.rakshasa_flicker() + + +//////////////////////////////////////////////////////////////// +//PROCS +//PHASE SHIFTING +//////////////////////////////////////////////////////////////// +//Rakshasa's phase shifts are now more stealthy. No announcement on them phasing in or out. Also, an extra phaseshift with no lights flickering. For flavor. There's probably a better way of doing this, butt fuck it. +/mob/living/simple_mob/shadekin/proc/rakshasa_shift() + var/turf/T = get_turf(src) + if(!T.CanPass(src,T) || loc != T) + to_chat(src,"You can't use that here!") + return FALSE + + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + + //Shifting in + if(ability_flags & AB_PHASE_SHIFTED) + ability_flags &= ~AB_PHASE_SHIFTED + name = real_name + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = initial(B.escapable) + + overlays.Cut() + alpha = initial(alpha) + invisibility = initial(invisibility) + see_invisible = initial(see_invisible) + incorporeal_move = initial(incorporeal_move) + density = initial(density) + force_max_speed = initial(force_max_speed) + + //Cosmetics mostly + flick("tp_in",src) + sleep(5) //The duration of the TP animation + canmove = original_canmove + + //Potential phase-in vore + if(can_be_drop_pred) //Toggleable in vore panel + var/list/potentials = living_mobs(0) + if(potentials.len) + var/mob/living/target = pick(potentials) + if(istype(target) && target.devourable && target.can_be_drop_prey && vore_selected) + target.forceMove(vore_selected) + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + + // Do this after the potential vore, so we get the belly + update_icon() + + //Affect nearby lights + for(var/obj/machinery/light/L in machines) + if(L.z != z || get_dist(src,L) > 10) + continue + L.flicker(10) + +//Shifting out + else + ability_flags |= AB_PHASE_SHIFTED + real_name = name + name = "Something" + + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = FALSE + + overlays.Cut() + flick("tp_out",src) + sleep(5) + invisibility = INVISIBILITY_LEVEL_TWO + see_invisible = INVISIBILITY_LEVEL_TWO + update_icon() + alpha = 127 + + canmove = original_canmove + incorporeal_move = TRUE + density = FALSE + force_max_speed = TRUE + + //////////////////////////////////////////////////////////////// -//Extra phaseshift with no lights flickering. For flavor. Basically just deleted the part that flickers the lights. /mob/living/simple_mob/shadekin/proc/stealth_shift() var/turf/T = get_turf(src) if(!T.CanPass(src,T) || loc != T) @@ -342,3 +440,13 @@ incorporeal_move = TRUE density = FALSE force_max_speed = TRUE + + +//LIGHT FLICKERING +//////////////////////////////////////////////////////////////// +//A flicker proc. Because apparently putting this straight into the ability button doesn't work. +/mob/living/simple_mob/shadekin/proc/rakshasa_flicker() + for(var/obj/machinery/light/L in machines) + if(L.z != z || get_dist(src,L) > 10) + continue + L.flicker(10) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types_ch.dm index 3a47e9d534..2dbc855754 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/types_ch.dm @@ -13,30 +13,30 @@ ///mob/living/simple_animal/shadekin/red //then we simply add our shadekins name at the end (unless its used already) /mob/living/simple_mob/shadekin/red/proto - name ="Proto" + name ="Proto" //This here will be our shadekins name - - desc = "An invisible entity not meant for use." + + desc = "An invisible entity not meant for use." //here goes a lil tidbit people can see when examining the shadekin. Multiple lines works just as on the vore part - - icon_state = "proto" + + icon_state = "proto" //this will most likely also be your shadekins name, it corresponds to the name you gave the tail and body state in the DMIs //so if you named the body state "proto" and "proto-1" then icon_state should be called "proto" - + vore_stomach_flavor = "You stared into the void,\ the void decided you look tasty,\ now you are in the void, pretty wet" //This is what people see when they drop into your gut! the backslashes at the end of the sentence indicate the next text will be on its own line! - - - player_msg = "Proto is you, Proto shouldn't exist" + + + player_msg = "Proto is you, Proto shouldn't exist" //This message pops up when you are put into your shadekin //I recommend you use it as a way to remind yourself of how you want to act generally as your shadekin. - + //Step 3; PR // Assuming you already have a Fork of chompstation, make sure you got your files in order // and then simply make a new pull request to our github. - + //Now once you pushed the new DMIs with your added sprites to our github. //And you finished writing this code section for your shadekin and pushed that too. You are done. //If this is your first time I recommend getting someone to look over your work. @@ -155,3 +155,15 @@ eye_desc = "soft green eyes" // vore_stomach_flavor = "" player_msg = "You are Softpatch, you like things that are soft and are curious about the beings in realspace" + +//"Marr marr marr-marr maaarr marr?~ (Ever had your ass eaten by a shadekin before?~)" - Yrmir (Shadowfire117) +/mob/living/simple_mob/shadekin/orange/yrmir + name = "Green and black shadekin" //Name is Yrmir and known only to other shadekins he talks to, he doesn't speak common to any degree so far + desc = "An orange eyed shadekin, this one has a very dark coat with several spots with faintly glowing green patches of fur. \ + Said fur looks quite soft and warm with it filling out a bit, a closer look tells its a slim upper body while rump, hips and thighs are nice and filled out well. \ + While he may have a more padded out builed below, the masculine part of them is quite visible as a large fat furred sack and sheath rests comfortably between his thighs and on his crotch. \ + From the way he looks at you, you get the feeling he is possibly scheming something fun, at least for himself." + icon_state = "yrmir" + eye_desc = "glimmering orange eyes" +// vore_stomach_flavor = "" + player_msg = "You are Yrmir, an orange shadekin with interest in revelry, trickery and pleasures. Mostly for you but to a degree to the willing and unwilling that interest you." \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm index 1114303d96..b6293fdeef 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm @@ -33,7 +33,7 @@ "bio" = 0, "rad" = 100) //Relatively harmless but agonizing to kill with melee. - glow_toggle = TRUE + glow_toggle = TRUE glow_range = 1.3 //This seems to be the minimum range which makes glow visible. glow_color = "#33ccff" //Same glow color as Sif trees. glow_intensity = 1 @@ -45,7 +45,7 @@ /mob/living/simple_mob/vore/slug //I guess separating the vore variables is a little more organized? vore_bump_chance = 100 //Always attempt a bump nom if possible... - vore_bump_emote = "knocks over and begins slowly engulfing" + vore_bump_emote = "knocks over and begins slowly engulfing" vore_active = 1 vore_icons = 1 vore_capacity = 1 @@ -55,7 +55,9 @@ vore_default_mode = DM_DIGEST /mob/living/simple_mob/vore/slug/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.desc = "Somehow you remained still just long enough for the slug to wrap its radula around your body and gradually draw you into its pharynx. The slug moves with agonizing slowness and devours prey at a snail's pace; inch by inch you're crammed down its gullet and squishes and squeezed into the slug's gizzard. Thick walls bear down, covered with shallow, toothy ridges. The slimy moss in here suggests you're not the slug's diet but the gizzard seems intent on churning and scraping over you regardless..." B.digest_burn = 0.1 @@ -109,9 +111,9 @@ spread_slime() /mob/living/simple_mob/vore/slug/do_attack(atom/A, turf/T) //Override of attack proc to ensure the slug can only attempt to eat people, not harm them. Inability to actually hurt anybody is intended, otherwise this mob wouldn't have 98 melee armor. - if(ckey) //If we're player controlled, use the default attack code. + if(ckey) //If we're player controlled, use the default attack code. return ..() - if(istype(A, /mob/living) && !will_eat(A)) + if(istype(A, /mob/living) && !will_eat(A)) ai_holder.lose_target() //Ignore anybody we can't eat. return else //This is the parent do_attack() code for determining whether or not attacks can hit. @@ -127,7 +129,7 @@ playsound(src, 'sound/rakshasa/Decay1.ogg', 75, 1) visible_message(span("warning", "\The [src] misses.")) return FALSE - tryBumpNom(A) //Meant for bump noms but this works as intended here and has sanity checks. + tryBumpNom(A) //Meant for bump noms but this works as intended here and has sanity checks. /mob/living/simple_mob/vore/slug/perform_the_nom(mob/living/user, mob/living/prey, mob/living/pred, obj/belly/belly, delay) ..() @@ -135,8 +137,8 @@ /datum/ai_holder/simple_mob/passive/slug_ch wander = TRUE - base_wander_delay = 7 - wander_when_pulled = TRUE + base_wander_delay = 7 + wander_when_pulled = TRUE vision_range = 10 can_flee = FALSE //Otherwise it'll run as soon as it gets a target. @@ -153,7 +155,7 @@ buckle_lying = TRUE var/persist_time = 5 MINUTES //How long until we cease existing. - var/mob/living/simple_mob/vore/slug/my_slug = null //This should be set by the slug. + var/mob/living/simple_mob/vore/slug/my_slug = null //This should be set by the slug. var/turf/my_turf = null //The turf we spawn on. var/base_escape_time = 1 MINUTE //How long does it take to struggle free? Affected by the victim's size_multiplier. @@ -166,9 +168,9 @@ /* for(var/obj/effect/slug_glue/G in my_turf.contents) if(G == src) continue - else + else qdel(G) //Prevent glue layering -*/ //Not including this due to performance concerns but keeping as comments for reference. +*/ //Not including this due to performance concerns but keeping as comments for reference. /obj/effect/slug_glue/proc/dissipate() //When spawned, set a timer to despawn. if(!persist_time) @@ -204,7 +206,7 @@ if(istype(L, /mob/living/simple_mob/vore/slug)) return - if(L.m_intent == "run" && !L.buckled) + if(L.m_intent == "run" && !L.buckled) if(has_buckled_mobs()) return buckle_mob(L) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm index de2139fd1a..1bec4badf9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm @@ -36,7 +36,9 @@ swallowTime = 2 SECONDS // Hungry little bastards. /mob/living/simple_mob/vore/aggressive/giant_snake/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "As the giant snake's closed jaws seal you away from the outside world, you are immediately greeted with a seemingly endless passage of tightly squeezing flesh. Hot and coated in thick, body-clinging slime, the serpent's stomach walls immediately get to work at rhythmically pulsing and contracting against your figure, slowly tugging you deeper into its ravenous clutches." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm index b5804c2267..d2039c2cb1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm @@ -94,7 +94,9 @@ /mob/living/simple_mob/vore/woof/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "You have found yourself pumping on down, down, down into this extremely soft dog. The slick touches of pulsing walls roll over you in greedy fashion as you're swallowed away, the flesh forms to your figure as in an instant the world is replaced by the hot squeeze of canine gullet. And in another moment a heavy GLLRMMPTCH seals you away, the dog tossing its head eagerly, the way forward stretching to accommodate your shape as you are greedily guzzled down. The wrinkled, doughy walls pulse against you in time to the creature's steady heartbeat. The sounds of the outside world muffled into obscure tones as the wet, grumbling rolls of this soft creature's gut hold you, churning you tightly such that no part of you is spared from these gastric affections." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index 1a9dae9b1e..de7d23bce1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -168,7 +168,9 @@ var/global/list/moth_amount = 0 // Chompstation Addition, Rykka waz here. *pawst return 1 /mob/living/simple_mob/vore/solargrub/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "Through either grave error, overwhelming willingness, or some other factor, you find yourself lodged halfway past the solargrub's mandibles. While it had initially hissed and chittered in glee at the prospect of a new meal, it is clearly more versed in suckling on power cables; inch by inch, bit by bit, it undulates forth to slowly, noisily gulp you down its short esophagus... and right into its extra-cramped, surprisingly hot stomach. As the rest of you spills out into the plush-walled chamber, the grub's soft body bulges outwards here and there with your compressed figure. Before long, a thick slime oozes out from the surrounding stomach walls; only time will tell how effective it is on something solid like you..." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm index 4cf5e49ad1..fa4595459a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm @@ -24,15 +24,6 @@ say_list_type = /datum/say_list/wolfgirl ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative/wolfgirl - var/loopstop = 0 //To prevent circular awoooos. -/* -/mob/living/simple_mob/retaliate/wolfgirl/hear_say() - if(world.time - loopstop < 5 SECONDS) - return - else - loopstop = world.time - ..() -*/ // Activate Noms! /mob/living/simple_mob/vore/wolfgirl vore_active = 1 @@ -59,6 +50,22 @@ if(findtext(message, "Awoo.")) delayed_say(pick("Awoo?"), speaker) + if(findtext(message, "Nice hat")) + delayed_say(pick("Thanks my grandma made it for me."), speaker) + + if(findtext(message, "What's your phone number?")) + delayed_say(pick("Five six seven oh nine! Wait, who are you?"), speaker) + + if(findtext(message, "Are you horny?")) + delayed_say(pick("No! I'm just hyperactive!"), speaker) + + if(findtext(message, "Good girl")) + delayed_say(pick("Aww thanks... Wait, I'm not a dog!"), speaker) + + if(findtext(message, "Fuyu")) + delayed_say(pick("You know my sister?!", "Is she causing problems again?"), speaker) + + /datum/say_list/wolfgirl speak = list("AwoooOOOOoooo!","Awoo~","I'll protect the forest! ... Where's the forest again?","All I need is my sword!","Awoo?","Anyone else smell that?") emote_hear = list("awoooos!","hmms to herself","plays with her sword") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index 5d6c88cc92..3ea220ef8d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -267,6 +267,8 @@ // Override stuff for holodeck carp to make them not digest when set to safe! /mob/living/simple_mob/animal/space/carp/holographic/init_vore() + if(!voremob_loaded) + return . = ..() var/safe = (faction == "neutral") for(var/belly in vore_organs) diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index 919e302bcf..2d070d1a29 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -7,13 +7,13 @@ emote_type = 2 //This lets them emote through containers. The communicator has a image feed of the person calling them so... -/mob/living/voice/New(loc) +/mob/living/voice/Initialize(loc) add_language(LANGUAGE_GALCOM) set_default_language(GLOB.all_languages[LANGUAGE_GALCOM]) if(istype(loc, /obj/item/device/communicator)) comm = loc - ..() + . = ..() // Proc: transfer_identity() // Parameters: 1 (speaker - the mob (usually an observer) to copy information from) @@ -110,7 +110,7 @@ var/speech_bubble_test = say_test(message) //var/image/speech_bubble = image('icons/mob/talk_vr.dmi',comm,"h[speech_bubble_test]") //VOREStation Edit - Commented out in case of needed reenable. var/speech_type = speech_bubble_appearance() - var/image/speech_bubble = image('icons/mob/talk_vr.dmi',comm,"[speech_type][speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons + var/image/speech_bubble = generate_speech_bubble(comm, "[speech_type][speech_bubble_test]") spawn(30) qdel(speech_bubble) diff --git a/code/modules/mob/living/zz_ballistics_ch/bullet_act_ch.dm b/code/modules/mob/living/zz_ballistics_ch/bullet_act_ch.dm index d13391f897..70cb7d8fd8 100644 --- a/code/modules/mob/living/zz_ballistics_ch/bullet_act_ch.dm +++ b/code/modules/mob/living/zz_ballistics_ch/bullet_act_ch.dm @@ -52,14 +52,13 @@ GLOBAL_VAR_INIT(ENERGY_DAMAGE_ORGAN_FACTOR,0.035) var/ballistic_armor = getarmor(def_zone, "bullet") var/melee_armor = getarmor(def_zone, "melee") var/obj/item/organ/external/hit_organ - var/mob/living/carbon/human/H = src - if(istype(H)) - hit_organ = H.get_organ(def_zone) + if(organs.len) + hit_organ = src.get_organ(def_zone) for(var/ext_organ in ballistic_variables["organ_hit_weight"]) var/list/input = list() - var/obj/item/organ/external/ref_ext_organ = H.get_organ(ext_organ) + var/obj/item/organ/external/ref_ext_organ = src.get_organ(ext_organ) for(var/int_organ in ballistic_variables["organ_hit_weight"][ext_organ]) - var/ref_int_organ = H.internal_organs_by_name[int_organ] + var/ref_int_organ = src.internal_organs_by_name[int_organ] if(ref_ext_organ && ref_int_organ && (ref_int_organ in ref_ext_organ.internal_organs)) input[ref_int_organ] = ballistic_variables["organ_hit_weight"][ext_organ][int_organ] if(input.len) @@ -112,12 +111,16 @@ GLOBAL_VAR_INIT(ENERGY_DAMAGE_ORGAN_FACTOR,0.035) /mob/living/proc/organ_handle_ballistics(var/obj/item/projectile/bullet/P,var/obj/item/organ/external/hit_organ,var/energy_dumped_organic,var/internal_loss,var/ballistic_armor,var/list/updated_organ_weight) var/conversion_efficiency = P.hollow_point ? GLOB.HOLLOW_POINT_CONVERSION_EFF : 1 + conversion_efficiency *= ballistic_variables["flesh_factors"]["damage_mult"] + internal_loss *= ballistic_variables["flesh_factors"]["velloss_mult"] var/energy_past var/bone_chance = BONE_HIT_CHANCE_UNENCASED if(hit_organ.encased) bone_chance = BONE_HIT_CHANCE_ENCASED else bone_chance = ballistic_variables["bone_chance_unencased"][hit_organ.organ_tag] + if(hit_organ.cannot_break) + bone_chance = 0 //log_and_message_admins("Bone hit chance is [bone_chance], organ is [hit_organ]") if(prob(bone_chance)) var/energy_to_fracture = max(GLOB.BONE_JOULES_MIN, hit_organ.min_broken_damage * (GAUSSIAN_RANDOM()*GLOB.BONE_JOULES_PERHP_DEV + GLOB.BONE_JOULES_PERHP_AVG)) @@ -192,12 +195,22 @@ GLOBAL_VAR_INIT(ENERGY_DAMAGE_ORGAN_FACTOR,0.035) /mob/living/proc/general_handle_ballistics(var/obj/item/projectile/bullet/P,var/def_zone,var/energy_dumped_organic,var/internal_loss,var/ballistic_armor) var/conversion_efficiency = P.hollow_point ? GLOB.HOLLOW_POINT_CONVERSION_EFF : 1 + conversion_efficiency *= ballistic_variables["flesh_factors"]["damage_mult"] + internal_loss *= ballistic_variables["flesh_factors"]["velloss_mult"] var/energy_past var/bone_chance = BONE_HIT_CHANCE_UNENCASED - //if(def_zone in ballistic_variables["bone_chance_unencased"]) - //bone_chance = ballistic_variables["bone_chance_unencased"][def_zone] + var/bone_strength = 1 + var/est_organ = def_zone + if(!est_organ) + est_organ = BP_TORSO + if(est_organ in list(O_EYES, O_MOUTH)) + est_organ = BP_HEAD + if(est_organ in ballistic_variables["bone_chance_unencased"]) + bone_chance = ballistic_variables["bone_chance_unencased"][est_organ] + if(est_organ in ballistic_variables["bone_strength"]) + bone_strength = ballistic_variables["bone_strength"][est_organ] if(prob(bone_chance)) - var/energy_to_fracture = max(GLOB.BONE_JOULES_MIN, BONE_HP_AVG * (GAUSSIAN_RANDOM()*GLOB.BONE_JOULES_PERHP_DEV + GLOB.BONE_JOULES_PERHP_AVG)) + var/energy_to_fracture = max(GLOB.BONE_JOULES_MIN, BONE_HP_AVG * (GAUSSIAN_RANDOM()*GLOB.BONE_JOULES_PERHP_DEV + GLOB.BONE_JOULES_PERHP_AVG)) * bone_strength if(energy_to_fracture>=P.energy) //We don't have enough energy to get through the bone. This is the end for us! energy_dumped_organic += P.energy/2 //About half of our remaining energy will go into fucking up this boi, the rest is absorbed by the bone P.sub_velocity(P.velocity) @@ -207,22 +220,25 @@ GLOBAL_VAR_INIT(ENERGY_DAMAGE_ORGAN_FACTOR,0.035) P.sub_energy(energy_to_fracture) energy_dumped_organic += P.energy / 3 //About a third of the energy that goes into fracturing the bone also goes into fucking up tissues. - if(prob(HIT_VITAL_ORGAN_CHANCE)) + if((est_organ in ballistic_variables["organ_hit_chance"]) && prob(ballistic_variables["organ_hit_chance"][est_organ])) energy_past = P.energy P.sub_velocity(internal_loss) - energy_dumped_organic += (energy_past - P.energy) * 1.5 + var/energy_mult = 1.5 + if(est_organ in ballistic_variables["organ_multiplier"]) + energy_mult = ballistic_variables["organ_multiplier"][est_organ] + energy_dumped_organic += (energy_past - P.energy) * energy_mult if(!P.velocity) energy_to_damage(energy_dumped_organic * conversion_efficiency,def_zone,P) return 2 energy_past = P.energy P.sub_velocity(internal_loss) energy_dumped_organic += energy_past - P.energy - if(!P.velocity || (def_zone in ballistic_variables["organ_leave_early"]) || prob(PROB_LEAVE_EARLY_SECOND)) + if(!P.velocity || (est_organ in ballistic_variables["organ_leave_early"]) || prob(PROB_LEAVE_EARLY_SECOND)) energy_to_damage(energy_dumped_organic * conversion_efficiency,def_zone,P) return P.velocity ? -1 : 2 if(prob(bone_chance)) - var/energy_to_fracture = max(GLOB.BONE_JOULES_MIN, BONE_HP_AVG * (GAUSSIAN_RANDOM()*GLOB.BONE_JOULES_PERHP_DEV + GLOB.BONE_JOULES_PERHP_AVG)) + var/energy_to_fracture = max(GLOB.BONE_JOULES_MIN, BONE_HP_AVG * (GAUSSIAN_RANDOM()*GLOB.BONE_JOULES_PERHP_DEV + GLOB.BONE_JOULES_PERHP_AVG)) * bone_strength if(energy_to_fracture>=P.energy) //We don't have enough energy to get through the bone. This is the end for us! energy_dumped_organic += P.energy/2 //About half of our remaining energy will go into fucking up this boi, the rest is absorbed by the bone P.sub_velocity(P.velocity) @@ -302,4 +318,17 @@ GLOBAL_VAR_INIT(ENERGY_DAMAGE_ORGAN_FACTOR,0.035) /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ /*Replicant organs*/O_VENTC = 20, \ /*Xeno organs*/ O_EGG = 25) ), \ - "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90) ) \ No newline at end of file + "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 1.3, BP_TORSO = 1.15, BP_GROIN = 1, BP_L_FOOT = 0.7, BP_R_FOOT = 0.7, BP_L_LEG = 1.2, BP_R_LEG = 1.2, BP_L_ARM = 1, BP_R_ARM = 1, BP_L_HAND = 0.55, BP_R_HAND = 0.55), \ + "organ_multiplier" = list(BP_HEAD = 2, BP_TORSO = 1.75, BP_GROIN = 1.25)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/Initialize() + . = ..() + if(islist(ballistic_variables)) + ballistic_variables = widelist(ballistic_variables) + +/mob/living/proc/b_test_proc() + var/nameof = NAMEOF(src,ballistic_variables) + log_world(nameof) + return nameof \ No newline at end of file diff --git a/code/modules/mob/living/zz_ballistics_ch/z_ballistic_overrides_ch.dm b/code/modules/mob/living/zz_ballistics_ch/z_ballistic_overrides_ch.dm new file mode 100644 index 0000000000..d4e9c9a873 --- /dev/null +++ b/code/modules/mob/living/zz_ballistics_ch/z_ballistic_overrides_ch.dm @@ -0,0 +1,563 @@ +//Simple mobs +/mob/living/simple_mob + //These are the basic base settings for simple_mobs that pretty much says "most living things kinda approximate around these values", special cases will be accounted for in following overrides. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 80, BP_TORSO = 80, BP_GROIN = 20, BP_L_FOOT = 80, BP_R_FOOT = 80, BP_L_LEG = 35, BP_R_LEG = 35, BP_L_ARM = 65, BP_R_ARM = 65, BP_L_HAND = 80, BP_R_HAND = 80), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 1.3, BP_TORSO = 1.15, BP_GROIN = 1, BP_L_FOOT = 0.7, BP_R_FOOT = 0.7, BP_L_LEG = 1.2, BP_R_LEG = 1.2, BP_L_ARM = 1, BP_R_ARM = 1, BP_L_HAND = 0.55, BP_R_HAND = 0.55), \ + "organ_multiplier" = list(BP_HEAD = 4, BP_TORSO = 3.5, BP_GROIN = 2.5)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/animal/giant_spider + //Spiders have an exoskeleton and no internal skeleton, so there'll be just 97% chance of hitting bone (3% for stuff like eyes and orifices), but the bone is much easier to punch through. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 97, BP_TORSO = 97, BP_GROIN = 97, BP_L_FOOT = 97, BP_R_FOOT = 97, BP_L_LEG = 97, BP_R_LEG = 97, BP_L_ARM = 97, BP_R_ARM = 97, BP_L_HAND = 97, BP_R_HAND = 97), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 0.35, BP_TORSO = 0.3, BP_GROIN = 0.25, BP_L_FOOT = 0.15, BP_R_FOOT = 0.15, BP_L_LEG = 0.2, BP_R_LEG = 0.2, BP_L_ARM = 0.2, BP_R_ARM = 0.2, BP_L_HAND = 0.15, BP_R_HAND = 0.15), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/metroid + //Metroids aren't real but we can make some guesses, and they sure as hell don't have any bones. They also don't have any arms or feet, so we're gonna pretend like those are referring to the parts of the metroid slime that have no organs in them. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +/mob/living/simple_mob/mechanical + //Okay, so my equations weren't really meant for stuff made out of metal, but we should be able to make it work anyways. We'll just make bone represent armor instead. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 85, BP_TORSO = 90, BP_GROIN = 90, BP_L_FOOT = 95, BP_R_FOOT = 95, BP_L_LEG = 95, BP_R_LEG = 95, BP_L_ARM = 95, BP_R_ARM = 95, BP_L_HAND = 95, BP_R_HAND = 95), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 80, BP_TORSO = 80, BP_GROIN = 80), \ + "bone_strength" = list(BP_HEAD = 2.5, BP_TORSO = 3, BP_GROIN = 2.75, BP_L_FOOT = 1.5, BP_R_FOOT = 1.5, BP_L_LEG = 2, BP_R_LEG = 2, BP_L_ARM = 1.75, BP_R_ARM = 1.75, BP_L_HAND = 1.35, BP_R_HAND = 1.35), \ + "organ_multiplier" = list(BP_HEAD = 3, BP_TORSO = 2.5, BP_GROIN = 2.5)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/tomato + //Going to copy from metroids, since they're honestly kind of similar, just blob shaped mushy creatures. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +/mob/living/simple_mob/animal/space/tree + //It's uh, a tree? Gonna say here that the bark will act as a shitty equivalent to bones but be 100% encasing + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 100, BP_TORSO = 100, BP_GROIN = 100, BP_L_FOOT = 100, BP_R_FOOT = 100, BP_L_LEG = 100, BP_R_LEG = 100, BP_L_ARM = 100, BP_R_ARM = 100, BP_L_HAND = 100, BP_R_HAND = 100), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 0.075, BP_TORSO = 0.15, BP_GROIN = 0.2, BP_L_FOOT = 0.075, BP_R_FOOT = 0.075, BP_L_LEG = 0.1, BP_R_LEG = 0.1, BP_L_ARM = 0.075, BP_R_ARM = 0.075, BP_L_HAND = 0.05, BP_R_HAND = 0.05), \ + "organ_multiplier" = list(BP_HEAD = 4, BP_TORSO = 3.5, BP_GROIN = 2.5)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/slime + //Slimes are also just getting copied from metroids, so scroll up for explanation. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +/mob/living/simple_mob/vore/pitcher_plant + //Uhhh, well, pitcher plants are kinda funny because they're mostly hollow. Gonna pretty much just say that they have no organs and no bones here. Maybe later on we can add a special function for bullets to also act on whatever is inside. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/vore/bee + //Bees also have exoskeletons, so copying from spiders pretty much. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 97, BP_TORSO = 97, BP_GROIN = 97, BP_L_FOOT = 97, BP_R_FOOT = 97, BP_L_LEG = 97, BP_R_LEG = 97, BP_L_ARM = 97, BP_R_ARM = 97, BP_L_HAND = 97, BP_R_HAND = 97), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 0.35, BP_TORSO = 0.3, BP_GROIN = 0.25, BP_L_FOOT = 0.15, BP_R_FOOT = 0.15, BP_L_LEG = 0.2, BP_R_LEG = 0.2, BP_L_ARM = 0.2, BP_R_ARM = 0.2, BP_L_HAND = 0.15, BP_R_HAND = 0.15), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/vore/aggressive/corrupthound + //These are mechanical, so copying from mechanical. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 85, BP_TORSO = 90, BP_GROIN = 90, BP_L_FOOT = 95, BP_R_FOOT = 95, BP_L_LEG = 95, BP_R_LEG = 95, BP_L_ARM = 95, BP_R_ARM = 95, BP_L_HAND = 95, BP_R_HAND = 95), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 80, BP_TORSO = 80, BP_GROIN = 80), \ + "bone_strength" = list(BP_HEAD = 2.5, BP_TORSO = 3, BP_GROIN = 2.75, BP_L_FOOT = 1.5, BP_R_FOOT = 1.5, BP_L_LEG = 2, BP_R_LEG = 2, BP_L_ARM = 1.75, BP_R_ARM = 1.75, BP_L_HAND = 1.35, BP_R_HAND = 1.35), \ + "organ_multiplier" = list(BP_HEAD = 3, BP_TORSO = 2.5, BP_GROIN = 2.5)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/vore/aggressive/frog + //Frogs actually have some interesting anatomy. Giant head, small brain, large holes in the skull for eyes. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 65, BP_TORSO = 70, BP_GROIN = 20, BP_L_FOOT = 80, BP_R_FOOT = 80, BP_L_LEG = 35, BP_R_LEG = 35, BP_L_ARM = 65, BP_R_ARM = 65, BP_L_HAND = 80, BP_R_HAND = 80), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 50, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 1.3, BP_TORSO = 1.15, BP_GROIN = 1, BP_L_FOOT = 0.7, BP_R_FOOT = 0.7, BP_L_LEG = 1.2, BP_R_LEG = 1.2, BP_L_ARM = 1, BP_R_ARM = 1, BP_L_HAND = 0.55, BP_R_HAND = 0.55), \ + "organ_multiplier" = list(BP_HEAD = 4, BP_TORSO = 3.5, BP_GROIN = 2.9)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/animal/space/jelly + //Copying from metroids again + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +/mob/living/simple_mob/vore/sect_queen + //Exoskeleton, so, gonna copy from spiders and give a small bonus to the bone strength for the sheer size. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 97, BP_TORSO = 97, BP_GROIN = 97, BP_L_FOOT = 97, BP_R_FOOT = 97, BP_L_LEG = 97, BP_R_LEG = 97, BP_L_ARM = 97, BP_R_ARM = 97, BP_L_HAND = 97, BP_R_HAND = 97), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 0.45, BP_TORSO = 0.4, BP_GROIN = 0.35, BP_L_FOOT = 0.25, BP_R_FOOT = 0.25, BP_L_LEG = 0.3, BP_R_LEG = 0.3, BP_L_ARM = 0.3, BP_R_ARM = 0.3, BP_L_HAND = 0.25, BP_R_HAND = 0.25), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/vore/oregrub + //They seem mushy and blobby, so gonna copy from metroids. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +/mob/living/simple_mob/vore/solargrub + //Solargrubs also seem mushy and blobby, let's continue copying from metroids. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +/mob/living/simple_mob/vore/slug + //Slugs are also mushy and blobby, gonna copy from metroids as well. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +/mob/living/simple_mob/vore/aggressive/mimic + //Hmm, To be honest I imagine mimics having an exoskeleton, so I'm gonna copy from spiders and make a few changes for organ stuff. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 97, BP_TORSO = 97, BP_GROIN = 97, BP_L_FOOT = 97, BP_R_FOOT = 97, BP_L_LEG = 97, BP_R_LEG = 97, BP_L_ARM = 97, BP_R_ARM = 97, BP_L_HAND = 97, BP_R_HAND = 97), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 60, BP_TORSO = 80, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 0.35, BP_TORSO = 0.3, BP_GROIN = 0.25, BP_L_FOOT = 0.15, BP_R_FOOT = 0.15, BP_L_LEG = 0.2, BP_R_LEG = 0.2, BP_L_ARM = 0.2, BP_R_ARM = 0.2, BP_L_HAND = 0.15, BP_R_HAND = 0.15), \ + "organ_multiplier" = list(BP_HEAD = 3.5, BP_TORSO = 3.5, BP_GROIN = 3.5)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/vore/solarmoth + //Solarmoths are getting directly copied from spiders, again because of exoskeleton + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 97, BP_TORSO = 97, BP_GROIN = 97, BP_L_FOOT = 97, BP_R_FOOT = 97, BP_L_LEG = 97, BP_R_LEG = 97, BP_L_ARM = 97, BP_R_ARM = 97, BP_L_HAND = 97, BP_R_HAND = 97), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 95, BP_TORSO = 90, BP_GROIN = 90), \ + "bone_strength" = list(BP_HEAD = 0.35, BP_TORSO = 0.3, BP_GROIN = 0.25, BP_L_FOOT = 0.15, BP_R_FOOT = 0.15, BP_L_LEG = 0.2, BP_R_LEG = 0.2, BP_L_ARM = 0.2, BP_R_ARM = 0.2, BP_L_HAND = 0.15, BP_R_HAND = 0.15), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1,"velloss_mult" = 1)) + +/mob/living/simple_mob/blob + //Apparently these are considered slimes in code, so gonna copy from metroid for them. + ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_HEAD = 90, BP_TORSO = 95, BP_GROIN = 95), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + +//Species +/datum/species/shapeshifter/promethean/handle_post_spawn(var/mob/living/carbon/human/H) + .=..() + //Honestly this is mostly for balancing purposes, since prometheans have no bones and weirder organs it fucks with the numbers, so giving them a bit more flesh damage + H.ballistic_variables = list(\ + "bone_chance_unencased" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_leave_early" = list("l_arm", "r_arm", "l_hand", "r_hand", "l_foot", "r_foot"), \ + "organ_hit_weight" = list(\ + BP_HEAD = list(\ + /*Standard organs*/O_BRAIN = 90, O_EYES = 5, \ + /*Diona organs*/O_RESPONSE = 10, O_RESPONSE = 15, O_GBLADDER = 15, \ + /*Replicant organs*/O_VRLINK = 20, \ + /*Xeno organs*/O_ACID = 10, O_RESIN = 10), \ + BP_TORSO = list(\ + /*Standard organs*/O_HEART = 5, O_LUNGS = 50, O_SPLEEN = 15, O_VOICE = 10, \ + /*Synth organs*/O_CELL = 5, O_PUMP = 15, O_HEATSINK = 35, O_CYCLER = 15, O_DIAGNOSTIC = 10, \ + /*Promethean organs*/O_REGBRUTE = 20, O_REGBURN = 20, O_REGOXY = 20, O_REGTOX = 20, \ + /*Diona organs*/O_STRATA = 35, O_BRAIN = 20, O_NUTRIENT = 10, \ + /*Replicant organs*/O_AREJECT = 35, \ + /*Xeno organs*/O_PLASMA = 10, O_HIVE = 10), \ + BP_GROIN = list(\ + /*Standard organs*/O_INTESTINES = 50, O_STOMACH = 20, O_LIVER = 20, O_KIDNEYS = 15, O_APPENDIX = 5, \ + /*Diona organs*/O_POLYP = 10, O_ANCHOR = 15, \ + /*Replicant organs*/O_VENTC = 20, \ + /*Xeno organs*/ O_EGG = 25) ), \ + "organ_hit_chance" = list(BP_TORSO = 85), \ + "bone_strength" = list(BP_HEAD = 0, BP_TORSO = 0, BP_GROIN = 0, BP_L_FOOT = 0, BP_R_FOOT = 0, BP_L_LEG = 0, BP_R_LEG = 0, BP_L_ARM = 0, BP_R_ARM = 0, BP_L_HAND = 0, BP_R_HAND = 0), \ + "organ_multiplier" = list(BP_HEAD = 3.6, BP_TORSO = 3.5, BP_GROIN = 3.4)/*Only used for simple mobs*/, \ + "flesh_factors" = list("damage_mult" = 1.175,"velloss_mult" = 1.3)) + H.ballistic_variables = widelist(H.ballistic_variables) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a451488ad5..11caab736b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -194,25 +194,6 @@ client.eye = loc return TRUE -//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine() -/mob/verb/examinate(atom/A as mob|obj|turf in view()) - set name = "Examine" - set category = "IC" - - if((is_blind(src) || usr.stat) && !isobserver(src)) - to_chat(src, "Something is there but you can't see it.") - return 1 - - //Could be gone by the time they finally pick something - if(!A) - return 1 - - face_atom(A) - var/list/results = A.examine(src) - if(!results || !results.len) - results = list("You were unable to examine that. Tell a developer!") - to_chat(src, jointext(results, "
")) - /mob/verb/pointed(atom/A as mob|obj|turf in view()) set name = "Point To" set category = "Object" diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm index 41c27a41d0..ff5f1ae582 100644 --- a/code/modules/mob/mob_defines_vr.dm +++ b/code/modules/mob/mob_defines_vr.dm @@ -1,6 +1,5 @@ /mob var/vantag_hud = 0 // Do I have the HUD enabled? - var/flying = 0 // Allows flight var/mob/temporary_form // For holding onto a temporary form var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 95732bad6a..ebcc9cf35a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -460,8 +460,6 @@ return dense_object /mob/proc/Check_Shoegrip() - if(flying) //VOREStation Edit. Checks to see if they and are flying. - return 1 //VOREStation Edit. Checks to see if they are flying. Mostly for this to be ported to Polaris. return 0 /mob/proc/Process_Spaceslipping(var/prob_slip = 5) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 7fa2f23b6f..c127e03e08 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -28,6 +28,7 @@ /mob/new_player/proc/new_player_panel_proc() var/output = "
" + output += "[using_map.get_map_info()]" output +="
" output += "

Character Setup

" @@ -63,15 +64,22 @@ output += "

Show Player Polls

" if(client.check_for_new_server_news()) - output += "

Show News (NEW!)

" + output += "

Show Game Updates (NEW!)

" else - output += "

Show News

" + output += "

Show Game Updates

" if(SSsqlite.can_submit_feedback(client)) output += "

[href(src, list("give_feedback" = 1), "Give Feedback")]

" + + if(GLOB.news_data.station_newspaper) + output += "Show [using_map.station_name] News" + output += "
" - panel = new(src, "Welcome","Welcome", 210, 300, src) + if(GLOB.news_data.station_newspaper && !client.seen_news) + show_latest_news(GLOB.news_data.station_newspaper) + + panel = new(src, "Welcome","Welcome", 500, 480, src) panel.set_window_options("can_close=0") panel.set_content(output) panel.open() @@ -590,6 +598,7 @@ // Do the initial caching of the player's body icons. new_character.force_update_limbs() new_character.update_icons_body() + new_character.update_transform() //VOREStation Edit new_character.key = key //Manually transfer the key to log them in @@ -610,7 +619,9 @@ /mob/new_player/proc/close_spawn_windows() src << browse(null, "window=latechoices") //closes late choices window - src << browse(null, "window=preferences_window") //closes the player setup window + src << browse(null, "window=preferences_window") //VOREStation Edit? + src << browse(null, "window=News") //closes news window + //src << browse(null, "window=playersetup") //closes the player setup window panel.close() /mob/new_player/proc/has_admin_rights() diff --git a/code/modules/mob/new_player/new_player_vr.dm b/code/modules/mob/new_player/new_player_vr.dm index a317e9a0d9..2c48e766f5 100644 --- a/code/modules/mob/new_player/new_player_vr.dm +++ b/code/modules/mob/new_player/new_player_vr.dm @@ -62,6 +62,18 @@ pass = FALSE to_chat(src,"Your custom species is not playable. Reconfigure your traits on the VORE tab.") + //CHOMP Addition Begin + if(client?.prefs?.neu_traits) + for(var/T in client.prefs.neu_traits) + var/datum/trait/instance = all_traits[T] + if(client.prefs.species in instance.banned_species) + pass = FALSE + to_chat(src,"One of your traits, [instance.name], is not available for your species! Please fix this conflict and then try again.") + else if(LAZYLEN(instance.allowed_species) && !(client.prefs.species in instance.allowed_species)) //We use else if here, so as to prevent getting two errors for one trait. + pass = FALSE + to_chat(src,"One of your traits, [instance.name], is not available for your species! Please fix this conflict and then try again.") + //CHOMP Addition End + //Final popup notice if (!pass) spawn() diff --git a/code/modules/mob/new_player/news.dm b/code/modules/mob/new_player/news.dm new file mode 100644 index 0000000000..6af422e553 --- /dev/null +++ b/code/modules/mob/new_player/news.dm @@ -0,0 +1,86 @@ +/mob/new_player + var/current_news_page + +/mob/new_player/Topic(href, href_list[]) + . = ..() + + if(href_list["open_station_news"]) + show_latest_news(GLOB.news_data.station_newspaper) + + if(href_list["next_news"]) + var/datum/feed_channel/next_page = locate(href_list["nextpage"]) + if(!next_page) + return + if(!current_news_page) + return + if(!next_page.messages) + return + + if(current_news_page == next_page.messages.len) + return + else + current_news_page++ + playsound(src.loc, "pageturn", 50, 1) + show_latest_news(GLOB.news_data.station_newspaper) + + + if(href_list["previous_news"]) + var/datum/feed_channel/prev_page = locate(href_list["prevpage"]) + if(!prev_page) + return + if(!current_news_page) + return + if(!prev_page.messages) + return + if(1 >= current_news_page) + return + else + current_news_page-- + playsound(src.loc, "pageturn", 50, 1) + show_latest_news(GLOB.news_data.station_newspaper) + + +/mob/new_player/proc/show_latest_news(var/datum/feed_channel/CHANNEL) + if(!GLOB.news_data) return + if(!GLOB.news_data.station_newspaper) return + + var/dat + + if(!current_news_page) + if(CHANNEL.messages) + current_news_page = 1 //Start at the 'front' because of how the codex works. + + if(!current_news_page || isemptylist(CHANNEL.messages)) + dat += "No current available news on [GLOB.news_data.station_newspaper.channel_name], it may still be loading!" + else + dat += get_news_page(CHANNEL, CHANNEL.messages[current_news_page], current_news_page) + if(CHANNEL.messages.len > current_news_page) + dat += "Older Issue" + if(current_news_page > CHANNEL.messages.len || (CHANNEL.messages.len > 1) && !(current_news_page == 1)) + dat += "Newer Issue " + + dat += " (Page [current_news_page] out of [CHANNEL.messages.len])" + + var/datum/browser/popup = new(usr, "News", "Latest News", 640, 600, src) + popup.set_content(jointext(dat,null)) + popup.open() + + client.seen_news = 1 + +/proc/get_news_page(var/datum/feed_channel/CHANNEL, var/datum/feed_message/MESSAGE, current_page) + var/dat + + dat += get_newspaper_header(CHANNEL.channel_name, "Aggregated News", "#d4cec1") + + if(isemptylist(CHANNEL.messages)) + dat += "No current articles for this newspaper.
" + else + var/pic_data + + if(MESSAGE.img) + usr << browse_rsc(MESSAGE.img, "tmp_photo[current_page].png") + pic_data+="
" + + dat += get_newspaper_content(MESSAGE.title, MESSAGE.body, MESSAGE.author, "#d4cec1", pic_data) + + return dat \ No newline at end of file diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 953f4d01ac..2cbf9a74f8 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -252,8 +252,13 @@ /datum/preferences/proc/update_preview_icon() var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) + if(!mannequin.dna) // Special handling for preview icons before SSAtoms has initailized. + mannequin.dna = new /datum/dna(null) mannequin.delete_inventory(TRUE) dress_preview_mob(mannequin) + mannequin.update_transform() //VOREStation Edit to update size/shape stuff. + mannequin.toggle_tail(setting = TRUE) + mannequin.toggle_wing(setting = TRUE) COMPILE_OVERLAYS(mannequin) update_character_previews(new /mutable_appearance(mannequin)) diff --git a/code/modules/mob/new_player/preferences_setup_vr.dm b/code/modules/mob/new_player/preferences_setup_vr.dm index 134fdb77da..dca0ff56ec 100644 --- a/code/modules/mob/new_player/preferences_setup_vr.dm +++ b/code/modules/mob/new_player/preferences_setup_vr.dm @@ -1,15 +1,3 @@ -/datum/preferences/update_preview_icon() // Lines up and un-overlaps character edit previews. Also un-splits taurs. - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) - if(!mannequin.dna) // Special handling for preview icons before SSAtoms has initailized. - mannequin.dna = new /datum/dna(null) - mannequin.delete_inventory(TRUE) - dress_preview_mob(mannequin) - mannequin.toggle_tail_vr(setting = TRUE) - mannequin.toggle_wing_vr(setting = TRUE) - COMPILE_OVERLAYS(mannequin) - - update_character_previews(new /mutable_appearance(mannequin)) - //TFF 5/8/19 - add randomised sensor setting for random button clicking /datum/preferences/randomize_appearance_and_body_for(var/mob/living/carbon/human/H) sensorpref = rand(1,5) \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 74578c8e9a..f04cde9c4c 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -34,6 +34,11 @@ // Whether or not the accessory can be affected by colouration var/do_colouration = 1 + var/color_blend_mode = ICON_MULTIPLY // If checked. + + // Ckey of person allowed to use this, if defined. + var/list/ckeys_allowed = null + var/apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings /* //////////////////////////// @@ -64,10 +69,45 @@ flags = HAIR_TIEABLE /datum/sprite_accessory/hair/afro_large - name = "Big Afro" + name = "Afro, Big" icon_state = "hair_bigafro" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/afropuffdouble + name = "Afropuff, Double" + icon_state = "hair_afropuffdouble" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/afropuffleft + name = "Afropuff, Left" + icon_state = "hair_afropuffleft" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/afropuffright + name = "Afropuff, Right" + icon_state = "hair_afropuffright" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/angelique + name = "Angelique" + icon_state = "hair_angelique" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/antonio + name = "Antonio" + icon_state = "hair_antonio" + flags = HAIR_VERY_SHORT + +/datum/sprite_accessory/hair/aradia + name = "Aradia" + icon_state = "hair_aradia" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/messyhair + name = "All Up" + icon_state = "hair_messyhair" + flags = HAIR_VERY_SHORT + /datum/sprite_accessory/hair/amazon name = "Amazon" icon_state = "hair_amazon" @@ -77,6 +117,17 @@ name = "Antenna" icon_state = "hair_antenna" +/datum/sprite_accessory/hair/astolfo + name = "Astolfo" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "hair_astolfo" + +/datum/sprite_accessory/hair/averagejoe + name = "Average Joe" + icon_state = "hair_averagejoe" + flags = HAIR_VERY_SHORT + /datum/sprite_accessory/hair/bald name = "Bald" icon_state = "bald" @@ -93,6 +144,11 @@ icon_state = "hair_e" flags = HAIR_VERY_SHORT +/datum/sprite_accessory/hair/band + name = "Band" + icon_state = "hair_band" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/beachwave name = "Beach Waves" icon_state = "hair_beachwave" @@ -133,6 +189,10 @@ icon_state = "hair_beehive2" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/bieber + name = "Bieber" + icon_state = "hair_bieb" + /datum/sprite_accessory/hair/belenko name = "Belenko" icon_state = "hair_belenko" @@ -143,6 +203,11 @@ icon_state = "hair_belenkotied" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/bigcurls + name = "Big Curls" + icon_state = "hair_bigcurls" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/bob name = "Bob" icon_state = "hair_bobcut" @@ -154,6 +219,11 @@ icon_state = "hair_bobcutalt" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/midb + name = "Bob, Mid-length" + icon_state = "hair_midb" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" @@ -182,6 +252,16 @@ icon_state = "hair_hbraid" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/longbraid + name = "Braid Long, Alt" + icon_state = "hair_longbraid" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/longbraidalt + name = "Braid Long, Alt 2" + icon_state = "hair_braidalt" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/mbraid name = "Braid Medium" icon_state = "hair_shortbraid" @@ -263,6 +343,13 @@ icon_state = "hair_celebcurls" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/citheronia_colorable + name = "Citheronia" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "citheronia_hair_c" + do_colouration = 1 + /datum/sprite_accessory/hair/crono name = "Chrono" icon_state = "hair_toriyama" @@ -282,6 +369,11 @@ name = "Combover" icon_state = "hair_combover" +/datum/sprite_accessory/hair/cornbun + name = "Cornbun" + icon_state = "hair_cornbun" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/country name = "Country" icon_state = "hair_country" @@ -302,6 +394,11 @@ icon_state = "hair_c" flags = HAIR_VERY_SHORT +/datum/sprite_accessory/hair/darcy + name = "Darcy" + icon_state = "hair_darcy" + flags = HAIR_VERY_SHORT + /datum/sprite_accessory/hair/dave name = "Dave" icon_state = "hair_dave" @@ -310,6 +407,11 @@ name = "Devil Lock" icon_state = "hair_devilock" +/datum/sprite_accessory/hair/dirk + name = "Dirk" + icon_state = "hair_dirk" + flags = HAIR_VERY_SHORT + /datum/sprite_accessory/hair/donutbun name = "Donut Bun" icon_state = "hair_donutbun" @@ -319,11 +421,25 @@ icon_state = "hair_dreads" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/dreadslong + name = "Dreads Long" + icon_state = "hair_dreadslong" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/dreadslongalt + name = "Dreads Long, Alt" + icon_state = "hair_dreadlongalt" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/mahdrills name = "Drillruru" icon_state = "hair_drillruru" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/elize + name = "Elize" + icon_state = "hair_elize" + /datum/sprite_accessory/hair/emo name = "Emo" icon_state = "hair_emo" @@ -344,11 +460,28 @@ icon_state = "hair_halfshaved" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/halfshavedlong + name = "Emo Half-Shaved Long" + icon_state = "hair_halfshavedL" + +/datum/sprite_accessory/hair/emoright + name = "Emo Mid-length" + icon_state = "hair_emoright" + /datum/sprite_accessory/hair/longemo name = "Emo Long" icon_state = "hair_emolong" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/equius + name = "Equius" + icon_state = "hair_equius" + +/datum/sprite_accessory/hair/fabio + name = "Fabio" + icon_state = "hair_fabio" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/highfade name = "Fade High" icon_state = "hair_highfade" @@ -385,16 +518,31 @@ icon_state = "hair_feather" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/feferi + name = "Feferi" + icon_state = "hair_feferi" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/flair name = "Flaired Hair" icon_state = "hair_flair" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/flipped + name = "Flipped" + icon_state = "hair_flipped" + /datum/sprite_accessory/hair/sargeant name = "Flat Top" icon_state = "hair_sargeant" flags = HAIR_VERY_SHORT +/datum/sprite_accessory/hair/braid + name = "Floorlength Braid" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "hair_braid" + /datum/sprite_accessory/hair/flowhair name = "Flow Hair" icon_state = "hair_f" @@ -414,6 +562,15 @@ icon_state = "hair_fringetail" flags = HAIR_TIEABLE|HAIR_VERY_SHORT +/datum/sprite_accessory/hair/froofy_long + name = "Froofy Long" + icon_state = "hair_froofy_long" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/gamzee + name = "Gamzee" + icon_state = "hair_gamzee" + /datum/sprite_accessory/hair/gelled name = "Gelled Back" icon_state = "hair_gelled" @@ -429,6 +586,11 @@ icon_state = "hair_gentle2long" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/glammetal + name = "Glam Metal Long" + icon_state = "hair_glammetal" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/glossy name = "Glossy" icon_state = "hair_glossy" @@ -471,11 +633,14 @@ icon_state = "hair_jade" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/jane + name = "Jane" + icon_state = "hair_jane" + /datum/sprite_accessory/hair/jensen name = "Jensen" icon_state = "hair_jensen" - /datum/sprite_accessory/hair/jessica name = "Jessica" icon_state = "hair_jessica" @@ -485,11 +650,20 @@ name = "Joestar" icon_state = "hair_joestar" +/datum/sprite_accessory/hair/judge + name = "Judge" + icon_state = "hair_judge" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/kagami name = "Kagami" icon_state = "hair_kagami" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/kanaya + name = "Kanaya" + icon_state = "hair_kanaya" + /datum/sprite_accessory/hair/keanu name = "Keanu Hair" icon_state = "hair_keanu" @@ -543,6 +717,15 @@ name = "Mary Sue" icon_state = "hair_marysue" +/datum/sprite_accessory/hair/mia + name = "Mia" + icon_state = "hair_mia" + +/datum/sprite_accessory/hair/mialong + name = "Mia Long" + icon_state = "hair_mialong" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/miles name = "Miles Hair" icon_state = "hair_miles" @@ -574,6 +757,10 @@ name = "Mulder" icon_state = "hair_mulder" +/datum/sprite_accessory/hair/nepeta + name = "Nepeta" + icon_state = "hair_nepeta" + /datum/sprite_accessory/hair/newyou name = "New You" icon_state = "hair_newyou" @@ -713,6 +900,16 @@ icon_state = "hair_newyou" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/rockandroll + name = "Rock and Roll" + icon_state = "hair_rockandroll" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/rockstarcurls + name = "Rockstar Curls" + icon_state = "hair_rockstarcurls" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/ronin name = "Ronin" icon_state = "hair_ronin" @@ -723,6 +920,10 @@ icon_state = "hair_rosa" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/rose + name = "Rose" + icon_state = "hair_rose" + /datum/sprite_accessory/hair/rows name = "Rows" icon_state = "hair_rows1" @@ -748,6 +949,10 @@ icon_state = "hair_rowbraid" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/roxy + name = "Roxy" + icon_state = "hair_roxy" + /datum/sprite_accessory/hair/sabitsuki name = "Sabitsuki" icon_state = "hair_sabitsuki" @@ -766,6 +971,11 @@ name = "Short Bangs" icon_state = "hair_shortbangs" +/datum/sprite_accessory/hair/shortflip + name = "Short Flip" + icon_state = "hair_shortflip" + flags = HAIR_VERY_SHORT + /datum/sprite_accessory/hair/short name = "Short Hair" // try to capatilize the names please~ icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you @@ -781,6 +991,12 @@ icon_state = "hair_shorthair4" flags = HAIR_VERY_SHORT +/datum/sprite_accessory/hair/awoohair + name = "Shoulder-length Messy" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "momijihair" + /datum/sprite_accessory/hair/shy name = "Shy" icon_state = "hair_shy" @@ -796,6 +1012,16 @@ icon_state = "hair_ponytailf" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/sideponytail5 + name = "Side Ponytail 3" + icon_state = "hair_sidetail" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/sideponytail6 + name = "Side Ponytail 4" + icon_state = "hair_sidetail2" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/sideponytail2 name = "Shoulder One" icon_state = "hair_oneshoulder" @@ -836,10 +1062,28 @@ icon_state = "hair_straightlong" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/suave + name = "Suave" + icon_state = "hair_suave" + +/datum/sprite_accessory/hair/suavetwo + name = "Suave 2" + icon_state = "hair_suave2" + /datum/sprite_accessory/hair/sweepshave name = "Sweep Shave" icon_state = "hair_sweepshave" +/datum/sprite_accessory/hair/sweptfringe + name = "Swept Fringe" + icon_state = "hair_sweptfringe" + flags = HAIR_TIEABLE + +/datum/sprite_accessory/hair/terezi + name = "Terezi" + icon_state = "hair_terezi" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/thinning name = "Thinning" icon_state = "hair_thinning" @@ -872,11 +1116,22 @@ gender = MALE flags = HAIR_VERY_SHORT +/datum/sprite_accessory/hair/twindrills + name = "Twin Drills" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "hair_twincurl" + /datum/sprite_accessory/hair/twintail name = "Twintail" icon_state = "hair_twintail" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/twinbob + name = "Twinbun Bob" + icon_state = "hair_bunbob" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/undercut1 name = "Undercut" icon_state = "hair_undercut1" @@ -895,6 +1150,11 @@ gender = MALE flags = HAIR_VERY_SHORT +/datum/sprite_accessory/hair/longundercut + name = "Undercut Long" + icon_state = "hair_undercutlong" + flags = HAIR_VERY_SHORT + /datum/sprite_accessory/hair/unkept name = "Unkept" icon_state = "hair_unkept" @@ -909,6 +1169,11 @@ name = "Vegeta" icon_state = "hair_toriyama2" +/datum/sprite_accessory/hair/vriska + name = "Vriska" + icon_state = "hair_vriska" + flags = HAIR_TIEABLE + /datum/sprite_accessory/hair/vivi name = "Vivi" icon_state = "hair_vivi" @@ -928,6 +1193,322 @@ icon_state = "hair_ziegler" flags = HAIR_TIEABLE +/datum/sprite_accessory/hair/una_hood + name = "Cobra Hood" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "soghun_hood" + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/hair/una_doublehorns + name = "Double Unathi Horns" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "soghun_dubhorns" + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/hair/sergal_plain + name = "Sergal Plain" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "serg_plain" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/hair/sergal_medicore + name = "Sergal Medicore" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "serg_medicore" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/hair/sergal_tapered + name = "Sergal Tapered" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "serg_tapered" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/hair/sergal_fairytail + name = "Sergal Fairytail" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "serg_fairytail" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +// Vulpa stuffs + +/datum/sprite_accessory/hair/vulp_hair_none + name = "None" + icon_state = "bald" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_kajam + name = "Kajam" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "kajam" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_keid + name = "Keid" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "keid" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_adhara + name = "Adhara" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "adhara" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_kleeia + name = "Kleeia" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "kleeia" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_mizar + name = "Mizar" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "mizar" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_apollo + name = "Apollo" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "apollo" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_belle + name = "Belle" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "belle" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_bun + name = "Vulp Bun" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "bun" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_jagged + name = "Jagged" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "jagged" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_curl + name = "Curl" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "curl" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_hawk + name = "Hawk" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "hawk" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_anita + name = "Anita" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "anita" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_short + name = "Short" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "short" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/vulp_hair_spike + name = "Spike" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "spike" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +//xeno stuffs +/datum/sprite_accessory/hair/xeno_head_drone_color + name = "Drone dome" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "cxeno_drone" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER +// figure this one out for better coloring +/datum/sprite_accessory/hair/xeno_head_sentinel_color + name = "Sentinal dome" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "cxeno_sentinel" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/xeno_head_queen_color + name = "Queen dome" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "cxeno_queen" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/xeno_head_hunter_color + name = "Hunter dome" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "cxeno_hunter" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/xeno_head_praetorian_color + name = "Praetorian dome" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "cxeno_praetorian" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +// Shadekin stuffs + +/datum/sprite_accessory/hair/shadekin_hair_short + name = "Shadekin Short Hair" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "shadekin_short" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/shadekin_hair_poofy + name = "Shadekin Poofy Hair" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "shadekin_poofy" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/datum/sprite_accessory/hair/shadekin_hair_long + name = "Shadekin Long Hair" + icon = 'icons/mob/human_face_alt.dmi' + icon_add = 'icons/mob/human_face_alt_add.dmi' + icon_state = "shadekin_long" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + +/* +shaved + name = "Shaved" + icon_state = "bald" + gender = NEUTER + species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) +*/ +/datum/sprite_accessory/facial_hair/neck_fluff + name = "Neck Fluff" + icon = 'icons/mob/human_face_or_alt.dmi' + icon_state = "facial_neckfluff" + gender = NEUTER + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_none + name = "None" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "none" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_blaze + name = "Blaze" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_blaze" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_vulpine + name = "Vulpine" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_vulpine" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_earfluff + name = "Earfluff" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_earfluff" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_mask + name = "Mask" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_mask" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_patch + name = "Patch" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_patch" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_ruff + name = "Ruff" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_ruff" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_kita + name = "Kita" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_kita" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/facial_hair/vulp_swift + name = "Swift" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "vulp_facial_swift" + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + gender = NEUTER + color_blend_mode = ICON_MULTIPLY + /* /////////////////////////////////// / =---------------------------= / @@ -938,6 +1519,7 @@ /datum/sprite_accessory/facial_hair icon = 'icons/mob/Human_face.dmi' + color_blend_mode = ICON_ADD /datum/sprite_accessory/facial_hair/shaved name = "Shaved" @@ -1126,23 +1708,23 @@ /datum/sprite_accessory/hair/skr_tentacle_veryshort name = "Skrell Short Tentacles" icon_state = "skrell_hair_short" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) gender = MALE /datum/sprite_accessory/hair/skr_tentacle_short name = "Skrell Average Tentacles" icon_state = "skrell_hair_average" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) /datum/sprite_accessory/hair/skr_tentacle_average name = "Skrell Long Tentacles" icon_state = "skrell_hair_long" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) /datum/sprite_accessory/hair/skr_tentacle_verylong name = "Skrell Very Long Tentacles" icon_state = "skrell_hair_verylong" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) //Tajaran hairstyles /datum/sprite_accessory/hair/taj_ears @@ -1424,6 +2006,8 @@ //like Tajaran inner-ear coloring overlay stuff. species_allowed = list() + color_blend_mode = ICON_ADD + var/body_parts = list() //A list of bodyparts this covers, in organ_tag defines //Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD diff --git a/code/modules/mob/new_player/sprite_accessories_ch.dm b/code/modules/mob/new_player/sprite_accessories_ch.dm index dd63dfdda2..a77f3081b1 100644 --- a/code/modules/mob/new_player/sprite_accessories_ch.dm +++ b/code/modules/mob/new_player/sprite_accessories_ch.dm @@ -118,6 +118,18 @@ color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) + manedwolf1 + name = "Maned Wolf Primary Markings" + icon_state = "manedwolf1" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD,BP_TORSO,BP_R_ARM,BP_L_ARM,BP_R_HAND,BP_L_HAND,BP_R_LEG,BP_L_LEG,BP_R_FOOT,BP_L_FOOT) + + manedwolf2 + name = "Maned Wolf Secondary Markings" + icon_state = "manedwolf2" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD,BP_TORSO,BP_GROIN) + /datum/sprite_accessory/tail/special/orca_tail name = "Orca Tail" desc = "" diff --git a/code/modules/mob/new_player/sprite_accessories_ear.dm b/code/modules/mob/new_player/sprite_accessories_ear.dm new file mode 100644 index 0000000000..6262b8ba60 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_ear.dm @@ -0,0 +1,489 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Ear Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/ears + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/ears.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 + var/desc = "You should not see this..." + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/shadekin + name = "Shadekin Ears, colorable" + desc = "" + icon_state = "shadekin" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + apply_restrictions = TRUE + +/datum/sprite_accessory/ears/taj_ears + name = "Tajaran Ears" + icon_state = "ears_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + extra_overlay = "ears_plain-inner" + +/datum/sprite_accessory/ears/taj_ears_tall + name = "Tajaran Tall Ears" + icon_state = "msai_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + extra_overlay = "msai_plain-inner" + +/datum/sprite_accessory/ears/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/ears/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/ears/bunny_white + name = "bunny, white" + desc = "" + icon_state = "bunny" + +/datum/sprite_accessory/ears/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/ears/bear_panda + name = "bear, panda" + desc = "" + icon_state = "panda" + +/datum/sprite_accessory/ears/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/ears/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/ears/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/ears/mouse_grey + name = "mouse, grey" + desc = "" + icon_state = "mouse-grey" + +/datum/sprite_accessory/ears/bee + name = "bee antennae" + desc = "" + icon_state = "bee" + +/datum/sprite_accessory/ears/antennae + name = "antennae, colorable" + desc = "" + icon_state = "antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/oni_h1 + name = "oni horns" + desc = "" + icon_state = "oni-h1" + +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns1 + name = "demon horns" + desc = "" + icon_state = "demon-horns1" + +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns2 + name = "demon horns, colorable(outward)" + desc = "" + icon_state = "demon-horns2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/foxears + name = "highlander zorren ears" + desc = "" + icon_state = "foxears" + +/datum/sprite_accessory/ears/fenears + name = "flatland zorren ears" + desc = "" + icon_state = "fenears" + +/datum/sprite_accessory/ears/sergal //Redundant + name = "Sergal ears" + icon_state = "serg_plain_s" + +/datum/sprite_accessory/ears/foxearshc + name = "highlander zorren ears, colorable" + desc = "" + icon_state = "foxearshc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/fenearshc + name = "flatland zorren ears, colorable" + desc = "" + icon_state = "fenearshc" + extra_overlay = "fenears-inner" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sergalhc + name = "Sergal ears, colorable" + icon_state = "serg_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/mousehc + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "mouseinner" + +/datum/sprite_accessory/ears/mousehcno + name = "mouse, colorable, no inner" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/wolfhc + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/ears/bearhc + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallbear + name = "small bear" + desc = "" + icon_state = "smallbear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrelhc + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/kittyhc + name = "kitty, colorable" + desc = "" + icon_state = "kitty" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "kittyinner" + +/datum/sprite_accessory/ears/bunnyhc + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers + name = "antlers" + desc = "" + icon_state = "antlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers_e + name = "antlers with ears" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "antlers_mark" + +/datum/sprite_accessory/ears/smallantlers + name = "small antlers" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallantlers_e + name = "small antlers with ears" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deer" + +/datum/sprite_accessory/ears/deer + name = "deer ears" + desc = "" + icon_state = "deer" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow + name = "cow, horns" + desc = "" + icon_state = "cow" + +/datum/sprite_accessory/ears/cowc + name = "cow, horns, colorable" + desc = "" + icon_state = "cow-c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow_nohorns + name = "cow, no horns" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/caprahorns + name = "caprine horns" + desc = "" + icon_state = "caprahorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/otie + name = "otie, colorable" + desc = "" + icon_state = "otie" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/donkey + name = "donkey, colorable" + desc = "" + icon_state = "donkey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/zears + name = "jagged ears" + desc = "" + icon_state = "zears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/elfs + name = "elven ears" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/sleek + name = "sleek ears" + desc = "" + icon_state = "sleek" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/drake + name = "drake frills" + desc = "" + icon_state = "drake" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp + name = "vulpkanin, dual-color" + desc = "" + icon_state = "vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp-inner" + +/datum/sprite_accessory/ears/vulp_short + name = "vulpkanin short" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp_short_dc + name = "vulpkanin short, dual-color" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_terrier-inner" + +/datum/sprite_accessory/ears/vulp_jackal + name = "vulpkanin thin, dual-color" + desc = "" + icon_state = "vulp_jackal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_jackal-inner" + +/datum/sprite_accessory/ears/bunny_floppy + name = "floopy bunny ears (colorable)" + desc = "" + icon_state = "floppy_bun" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/teshari + name = "Teshari (colorable fluff)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshariinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/tesharihigh + name = "Teshari upper ears (colorable fluff)" + desc = "" + icon_state = "tesharihigh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharihighinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/tesharilow + name = "Teshari lower ears (colorable fluff)" + desc = "" + icon_state = "tesharilow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharilowinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/inkling + name = "colorable mature inkling hair" + desc = "" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "inkling-colorable" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/ears/large_dragon + name = "Large dragon horns" + desc = "" + icon_state = "big_liz" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +// Special snowflake ears go below here. +/datum/sprite_accessory/ears/elf_caprine_colorable + name = "Caprine horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "caprahorns" + +/datum/sprite_accessory/ears/elf_oni_colorable + name = "oni horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "oni-h1_c" + +/datum/sprite_accessory/ears/elf_demon_colorable + name = "Demon horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns1_c" + +/datum/sprite_accessory/ears/elf_demon_outwards_colorable + name = "Demon horns with pointy ears, outwards, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns2" + +/datum/sprite_accessory/ears/elf_dragon_colorable + name = "Dragon horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "dragon-horns" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm new file mode 100644 index 0000000000..7705e1a821 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -0,0 +1,708 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Ear Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/ears + name = "You should not see this..." + icon = 'icons/mob/vore/ears_vr.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + +// Species-unique ears + +/datum/sprite_accessory/ears/shadekin + name = "Shadekin Ears, colorable" + desc = "" + icon_state = "shadekin" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + apply_restrictions = TRUE + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +// Ears avaliable to anyone + +/datum/sprite_accessory/ears/alt_ram_horns + name = "Solid ram horns" + desc = "" + icon_state = "ram_horns_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/hyena + name = "hyena ears, dual-color" + desc = "" + icon_state = "hyena" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "hyena-inner" + +/datum/sprite_accessory/ears/moth + name = "moth antennae" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/ears/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/ears/bunny_white + name = "bunny, white" + desc = "" + icon_state = "bunny" + +/datum/sprite_accessory/ears/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/ears/bear_panda + name = "bear, panda" + desc = "" + icon_state = "panda" + +/datum/sprite_accessory/ears/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/ears/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/ears/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/ears/mouse_grey + name = "mouse, grey" + desc = "" + icon_state = "mouse-grey" + +/datum/sprite_accessory/ears/bee + name = "bee antennae" + desc = "" + icon_state = "bee" + +/datum/sprite_accessory/ears/antennae + name = "antennae, colorable" + desc = "" + icon_state = "antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/oni_h1 + name = "oni horns" + desc = "" + icon_state = "oni-h1" + +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns1 + name = "demon horns" + desc = "" + icon_state = "demon-horns1" + +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns2 + name = "demon horns, colorable(outward)" + desc = "" + icon_state = "demon-horns2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/foxears + name = "highlander zorren ears" + desc = "" + icon_state = "foxears" + +/datum/sprite_accessory/ears/fenears + name = "flatland zorren ears" + desc = "" + icon_state = "fenears" + +/datum/sprite_accessory/ears/sergal //Redundant + name = "Sergal ears" + icon_state = "serg_plain_s" + +/datum/sprite_accessory/ears/foxearshc + name = "highlander zorren ears, colorable" + desc = "" + icon_state = "foxearshc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/fenearshc + name = "flatland zorren ears, colorable" + desc = "" + icon_state = "fenearshc" + extra_overlay = "fenears-inner" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sergalhc + name = "Sergal ears, colorable" + icon_state = "serg_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/mousehc + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "mouseinner" + +/datum/sprite_accessory/ears/mousehcno + name = "mouse, colorable, no inner" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/wolfhc + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/ears/bearhc + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallbear + name = "small bear" + desc = "" + icon_state = "smallbear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrelhc + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/kittyhc + name = "kitty, colorable" + desc = "" + icon_state = "kitty" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "kittyinner" + +/datum/sprite_accessory/ears/bunnyhc + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers + name = "antlers" + desc = "" + icon_state = "antlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers_e + name = "antlers with ears" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "antlers_mark" + +/datum/sprite_accessory/ears/smallantlers + name = "small antlers" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallantlers_e + name = "small antlers with ears" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deer" + +/datum/sprite_accessory/ears/deer + name = "deer ears" + desc = "" + icon_state = "deer" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow + name = "cow, horns" + desc = "" + icon_state = "cow" + +/datum/sprite_accessory/ears/cowc + name = "cow, horns, colorable" + desc = "" + icon_state = "cow-c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow_nohorns + name = "cow, no horns" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/caprahorns + name = "caprine horns" + desc = "" + icon_state = "caprahorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/otie + name = "otie, colorable" + desc = "" + icon_state = "otie" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/donkey + name = "donkey, colorable" + desc = "" + icon_state = "donkey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/zears + name = "jagged ears" + desc = "" + icon_state = "zears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/elfs + name = "elven ears" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sleek + name = "sleek ears" + desc = "" + icon_state = "sleek" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/drake + name = "drake frills" + desc = "" + icon_state = "drake" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp + name = "vulpkanin, dual-color" + desc = "" + icon_state = "vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp-inner" + +/datum/sprite_accessory/ears/vulp_short + name = "vulpkanin short" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp_short_dc + name = "vulpkanin short, dual-color" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_terrier-inner" + +/datum/sprite_accessory/ears/vulp_jackal + name = "vulpkanin thin, dual-color" + desc = "" + icon_state = "vulp_jackal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_jackal-inner" + +/datum/sprite_accessory/ears/bunny_floppy + name = "floopy bunny ears (colorable)" + desc = "" + icon_state = "floppy_bun" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/teshari + name = "Teshari (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshariinner" + +/datum/sprite_accessory/ears/tesharihigh + name = "Teshari upper ears (colorable)" + desc = "" + icon_state = "tesharihigh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharihighinner" + +/datum/sprite_accessory/ears/tesharilow + name = "Teshari lower ears (colorable)" + desc = "" + icon_state = "tesharilow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharilowinner" + +/datum/sprite_accessory/ears/tesh_pattern_ear_male + name = "Teshari male ear pattern (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_male_pattern" + +/datum/sprite_accessory/ears/tesh_pattern_ear_female + name = "Teshari female ear pattern (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_female_pattern" + +/datum/sprite_accessory/ears/inkling + name = "colorable mature inkling hair" + desc = "" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "inkling-colorable" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/ears/large_dragon + name = "Large dragon horns" + desc = "" + icon_state = "big_liz" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +// Special snowflake ears go below here. + +/datum/sprite_accessory/ears/molenar_kitsune + name = "quintail kitsune ears (Molenar)" + desc = "" + icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/lilimoth_antennae + name = "citheronia antennae (Kira72)" + desc = "" + icon_state = "lilimoth_antennae" + ckeys_allowed = list("kira72") + +/datum/sprite_accessory/ears/molenar_deathclaw + name = "deathclaw ears (Molenar)" + desc = "" + icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/miria_fluffdragon + name = "fluffdragon ears (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragonears" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/ears/miria_kitsune + name = "kitsune ears (Miria Masters)" + desc = "" + icon_state = "miria-kitsuneears" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/ears/runac + name = "fennecsune ears (Runac)" + desc = "" + icon_state = "runac" + ckeys_allowed = list("rebcom1807") + +/datum/sprite_accessory/ears/kerena + name = "wingwolf ears (Kerena)" + desc = "" + icon_state = "kerena" + ckeys_allowed = list("somekindofpony") + +/datum/sprite_accessory/ears/rosey + name = "tritail kitsune ears (Rosey)" + desc = "" + icon_state = "rosey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/ears/aronai + name = "aronai ears/head (Aronai)" + desc = "" + icon_state = "aronai" + ckeys_allowed = list("arokha") + +/datum/sprite_accessory/ears/holly + name = "tigress ears (Holly Sharp)" + desc = "" + icon_state = "tigressears" + ckeys_allowed = list("hoodoo") + +/datum/sprite_accessory/ears/molenar_inkling + name = "teal mature inkling hair (Kari Akiren)" + desc = "" + icon_state = "molenar-tentacle" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/shock + name = "pharoah hound ears (Shock Diamond)" + desc = "" + icon_state = "shock" + ckeys_allowed = list("icowom","cameron653") + +/datum/sprite_accessory/ears/alurane + name = "alurane ears/hair (Pumila)" + desc = "" + icon_state = "alurane-ears" + ckeys_allowed = list("natje") + +/datum/sprite_accessory/ears/frost + name = "Frost antenna" + desc = "" + icon_state = "frosted_tips" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/ears/sylv_pip + name = "sylveon ears and ribbons (Pip Shyner)" + desc = "" + icon_state = "pipears" + ckeys_allowed = list("phoaly") + +/datum/sprite_accessory/ears/elf_caprine_colorable + name = "Caprine horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "caprahorns" + +/datum/sprite_accessory/ears/elf_oni_colorable + name = "oni horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "oni-h1_c" + +/datum/sprite_accessory/ears/elf_demon_colorable + name = "Demon horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns1_c" + +/datum/sprite_accessory/ears/elf_demon_outwards_colorable + name = "Demon horns with pointy ears, outwards, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns2" + +/datum/sprite_accessory/ears/elf_dragon_colorable + name = "Dragon horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "dragon-horns" + +/datum/sprite_accessory/ears/synthhorns_plain + name = "Synth horns, plain" + desc = "" + icon_state = "synthhorns_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "synthhorns_plain_light" + +/datum/sprite_accessory/ears/synthhorns_thick + name = "Synth horns, thick" + desc = "" + icon_state = "synthhorns_thick" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "synthhorns_thick_light" + +/datum/sprite_accessory/ears/synthhorns_curly + name = "Synth horns, curly" + desc = "" + icon_state = "synthhorns_curled" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/ears/forward_curled_demon_horns_bony + name = "Succubus horns, colourable" + desc = "" + icon_state = "succu-horns_b" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/forward_curled_demon_horns_bony_with_colorable_ears + name = "Succubus horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "succu-horns_b" + +/datum/sprite_accessory/ears/chorns_nubbydogs + name = "Nubby Chorns" + desc = "" + icon_state = "chorn_nubby" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_herk + name = "Herk Chorns" + desc = "" + icon_state = "chorn_herk" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bork + name = "Bork Chorns" + desc = "" + icon_state = "chorn_bork" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bull + name = "Bull Chorns" + desc = "" + icon_state = "chorn_bull" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bicarrot + name = "Bicarrot Chorns" + desc = "" + icon_state = "chorn_bicarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_longcarrot + name = "Long Carrot Chorns" + desc = "" + icon_state = "chorn_longcarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_shortcarrot + name = "Short Carrot Chorns" + desc = "" + icon_state = "chorn_shortcarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_scorp + name = "Scorp Chorns" + desc = "" + icon_state = "chorn_scorp" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_ocean + name = "Ocean Chorns" + desc = "" + icon_state = "chorn_ocean" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_chub + name = "Chub Chorns" + desc = "" + icon_state = "chorn_chub" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY diff --git a/code/modules/mob/new_player/sprite_accessories_extra.dm b/code/modules/mob/new_player/sprite_accessories_extra.dm new file mode 100644 index 0000000000..a124eff96b --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_extra.dm @@ -0,0 +1,566 @@ +/datum/sprite_accessory/marking/vr + icon = 'icons/mob/human_races/markings_alt.dmi' + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/vulp_belly + name = "belly fur (Vulp)" + icon_state = "vulp_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_fullbelly + name = "full belly fur (Vulp)" + icon_state = "vulp_fullbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_crest + name = "belly crest (Vulp)" + icon_state = "vulp_crest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_nose + name = "nose (Vulp)" + icon_state = "vulp_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_short_nose + name = "nose, short (Vulp)" + icon_state = "vulp_short_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/snoutstripe + name = "snout stripe (Vulp)" + icon_state = "snoutstripe" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_face + name = "face (Vulp)" + icon_state = "vulp_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_facealt + name = "face, alt. (Vulp)" + icon_state = "vulp_facealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_earsface + name = "ears and face (Vulp)" + icon_state = "vulp_earsface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_all + name = "all head highlights (Vulp)" + icon_state = "vulp_all" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergal_full + name = "Sergal Markings" + icon_state = "sergal_full" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/sergal_full_female + name = "Sergal Markings (Female)" + icon_state = "sergal_full_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/monoeye + name = "Monoeye" + icon_state = "monoeye" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spidereyes + name = "Spider Eyes" + icon_state = "spidereyes" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergaleyes + name = "Sergal Eyes" + icon_state = "eyes_sergal" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/brows + name = "Eyebrows" + icon_state = "brows" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/nevrean_female + name = "Female Nevrean beak" + icon_state = "nevrean_f" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = FEMALE + +/datum/sprite_accessory/marking/vr/nevrean_male + name = "Male Nevrean beak" + icon_state = "nevrean_m" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = MALE + +/datum/sprite_accessory/marking/vr/spots + name = "Spots" + icon_state = "spots" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/shaggy_mane + name = "Shaggy mane/feathers" + icon_state = "shaggy" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/jagged_teeth + name = "Jagged teeth" + icon_state = "jagged" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/blank_face + name = "Blank round face (use with monster mouth)" + icon_state = "blankface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/monster_mouth + name = "Monster mouth" + icon_state = "monster" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/saber_teeth + name = "Saber teeth" + icon_state = "saber" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/fangs + name = "Fangs" + icon_state = "fangs" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tusks + name = "Tusks" + icon_state = "tusks" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_face + name = "Otie face" + icon_state = "otieface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_nose + name = "Otie nose" + icon_state = "otie_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otienose_lite + name = "Short otie nose" + icon_state = "otienose_lite" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/backstripes + name = "Back stripes" + icon_state = "otiestripes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/belly_butt + name = "Belly and butt" + icon_state = "bellyandbutt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/fingers_toes + name = "Fingers and toes" + icon_state = "fingerstoes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/otie_socks + name = "Fingerless socks" + icon_state = "otiesocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/corvid_beak + name = "Corvid beak" + icon_state = "corvidbeak" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/corvid_belly + name = "Corvid belly" + icon_state = "corvidbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_body + name = "Cow markings" + icon_state = "cowbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_nose + name = "Cow nose" + icon_state = "cownose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zmask + name = "Eye mask" + icon_state = "zmask" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zbody + name = "Thick jagged stripes" + icon_state = "zbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/znose + name = "Jagged snout" + icon_state = "znose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_nose + name = "Otter nose" + icon_state = "otternose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_face + name = "Otter face" + icon_state = "otterface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/deer_face + name = "Deer face" + icon_state = "deerface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sharkface + name = "Akula snout" + icon_state = "sharkface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_face + name = "Shepherd snout" + icon_state = "shepface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_back + name = "Shepherd back" + icon_state = "shepback" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_male + name = "Zorren Male Torso" + icon_state = "zorren_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_female + name = "Zorren Female Torso" + icon_state = "zorren_belly_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_back_patch + name = "Zorren Back Patch" + icon_state = "zorren_backpatch" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/zorren_face_male + name = "Zorren Male Face" + icon_state = "zorren_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_face_female + name = "Zorren Female Face" + icon_state = "zorren_face_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_male + name = "Zorren Male Muzzle" + icon_state = "zorren_muzzle" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_female + name = "Zorren Female Muzzle" + icon_state = "zorren_muzzle_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_socks + name = "Zorren Socks" + icon_state = "zorren_socks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/zorren_longsocks + name = "Zorren Longsocks" + icon_state = "zorren_longsocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/tesh_feathers + name = "Teshari Feathers" + icon_state = "tesh-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/harpy_feathers + name = "Rapala leg Feather" + icon_state = "harpy-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/harpy_legs + name = "Rapala leg coloring" + icon_state = "harpy-leg" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/chooves + name = "Cloven hooves" + icon_state = "chooves" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + +/datum/sprite_accessory/marking/vr/body_tone + name = "Body toning (for emergency contrast loss)" + icon_state = "btone" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/gloss + name = "Full body gloss" + icon_state = "gloss" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/eboop_panels + name = "Eggnerd FBP panels" + icon_state = "eboop" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/osocks_rarm + name = "Modular Longsock (right arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_ARM,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/osocks_larm + name = "Modular Longsock (left arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_ARM,BP_L_HAND) + +/datum/sprite_accessory/marking/vr/osocks_rleg + name = "Modular Longsock (right leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_FOOT,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/osocks_lleg + name = "Modular Longsock (left leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_L_LEG) + +/datum/sprite_accessory/marking/vr/animeeyesinner + name = "Anime Eyes Inner" + icon_state = "animeeyesinner" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/animeeyesouter + name = "Anime Eyes Outer" + icon_state = "animeeyesouter" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/panda_eye_marks + name = "Panda Eye Markings" + icon_state = "eyes_panda" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/catwomantorso + name = "Catwoman chest stripes" + icon_state = "catwomanchest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/catwomangroin + name = "Catwoman groin stripes" + icon_state = "catwomangroin" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN) + +/datum/sprite_accessory/marking/vr/catwoman_rleg + name = "Catwoman right leg stripes" + icon_state = "catwomanright" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_LEG) + +/datum/sprite_accessory/marking/vr/catwoman_lleg + name = "Catwoman left leg stripes" + icon_state = "catwomanleft" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG) + +/datum/sprite_accessory/marking/vr/teshi_small_feathers + name = "Teshari small wingfeathers" + icon_state = "teshi_sf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights + name = "Ward - Spirit FBP Lights" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_lights_body + name = "Ward - Spirit FBP Lights (body)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights_head + name = "Ward - Spirit FBP Lights (head)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels + name = "Ward - Spirit FBP Panels" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels_body + name = "Ward - Spirit FBP Panels (body)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_panels_head + name = "Ward - Spirit FBP Panels (head)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_head + name = "Squid Head" + icon_state = "tentaclehead" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_mouth + name = "Tentacle Mouth" + icon_state = "tentaclemouth" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/rosette + name = "Rosettes" + icon_state = "rosette" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) +/* +werewolf_nose + name = "Werewolf nose" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_face + name = "Werewolf face" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_belly + name = "Werewolf belly" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_socks + name = "Werewolf socks" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(SPECIES_WEREBEAST) + +shadekin_snoot + name = "Shadekin Snoot" + icon_state = "shadekin-snoot" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) +*/ +/datum/sprite_accessory/marking/vr/taj_nose_alt + name = "Nose Color, alt. (Taj)" + icon_state = "taj_nosealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/talons + name = "Talons" + icon_state = "talons" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/claws + name = "Claws" + icon_state = "claws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/equine_snout //Why the long face? Works best with sergal bodytype. + name = "Equine Snout" + icon_state = "donkey" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/equine_nose + name = "Equine Nose" + icon_state = "dnose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm new file mode 100644 index 0000000000..f69ec4a574 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -0,0 +1,730 @@ +//VOREStation Body Markings and Overrides +//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD + +/datum/sprite_accessory/marking //Override for base markings + color_blend_mode = ICON_ADD + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + +/datum/sprite_accessory/marking/vr + icon = 'icons/mob/human_races/markings_vr.dmi' + +/datum/sprite_accessory/marking/vr/vulp_belly + name = "belly fur (Vulp)" + icon_state = "vulp_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_fullbelly + name = "full belly fur (Vulp)" + icon_state = "vulp_fullbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_crest + name = "belly crest (Vulp)" + icon_state = "vulp_crest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_nose + name = "nose (Vulp)" + icon_state = "vulp_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_short_nose + name = "nose, short (Vulp)" + icon_state = "vulp_short_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/snoutstripe + name = "snout stripe (Vulp)" + icon_state = "snoutstripe" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_face + name = "face (Vulp)" + icon_state = "vulp_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_facealt + name = "face, alt. (Vulp)" + icon_state = "vulp_facealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_earsface + name = "ears and face (Vulp)" + icon_state = "vulp_earsface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_all + name = "all head highlights (Vulp)" + icon_state = "vulp_all" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergal_full + name = "Sergal Markings" + icon_state = "sergal_full" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/sergal_full_female + name = "Sergal Markings (Female)" + icon_state = "sergal_full_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/monoeye + name = "Monoeye" + icon_state = "monoeye" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spidereyes + name = "Spider Eyes" + icon_state = "spidereyes" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergaleyes + name = "Sergal Eyes" + icon_state = "eyes_sergal" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/closedeyes + name = "Closed Eyes" + icon_state = "eyes_closed" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/brows + name = "Eyebrows" + icon_state = "brows" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/nevrean_female + name = "Female Nevrean beak" + icon_state = "nevrean_f" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = FEMALE + +/datum/sprite_accessory/marking/vr/nevrean_male + name = "Male Nevrean beak" + icon_state = "nevrean_m" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = MALE + +/datum/sprite_accessory/marking/vr/spots + name = "Spots" + icon_state = "spots" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/shaggy_mane + name = "Shaggy mane/feathers" + icon_state = "shaggy" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/jagged_teeth + name = "Jagged teeth" + icon_state = "jagged" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/blank_face + name = "Blank round face (use with monster mouth)" + icon_state = "blankface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/monster_mouth + name = "Monster mouth" + icon_state = "monster" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/saber_teeth + name = "Saber teeth" + icon_state = "saber" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/fangs + name = "Fangs" + icon_state = "fangs" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tusks + name = "Tusks" + icon_state = "tusks" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_face + name = "Otie face" + icon_state = "otieface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_nose + name = "Otie nose" + icon_state = "otie_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otienose_lite + name = "Short otie nose" + icon_state = "otienose_lite" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/backstripes + name = "Back stripes" + icon_state = "otiestripes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/belly_butt + name = "Belly and butt" + icon_state = "bellyandbutt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/fingers_toes + name = "Fingers and toes" + icon_state = "fingerstoes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/otie_socks + name = "Fingerless socks" + icon_state = "otiesocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/corvid_beak + name = "Corvid beak" + icon_state = "corvidbeak" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/corvid_belly + name = "Corvid belly" + icon_state = "corvidbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_body + name = "Cow markings" + icon_state = "cowbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_nose + name = "Cow nose" + icon_state = "cownose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zmask + name = "Eye mask" + icon_state = "zmask" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zbody + name = "Thick jagged stripes" + icon_state = "zbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/znose + name = "Jagged snout" + icon_state = "znose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_nose + name = "Otter nose" + icon_state = "otternose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_face + name = "Otter face" + icon_state = "otterface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/deer_face + name = "Deer face" + icon_state = "deerface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sharkface + name = "Akula snout" + icon_state = "sharkface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_face + name = "Shepherd snout" + icon_state = "shepface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_back + name = "Shepherd back" + icon_state = "shepback" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_male + name = "Zorren Male Torso" + icon_state = "zorren_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_female + name = "Zorren Female Torso" + icon_state = "zorren_belly_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_back_patch + name = "Zorren Back Patch" + icon_state = "zorren_backpatch" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/zorren_face_male + name = "Zorren Male Face" + icon_state = "zorren_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_face_female + name = "Zorren Female Face" + icon_state = "zorren_face_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_male + name = "Zorren Male Muzzle" + icon_state = "zorren_muzzle" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_female + name = "Zorren Female Muzzle" + icon_state = "zorren_muzzle_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_socks + name = "Zorren Socks" + icon_state = "zorren_socks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/zorren_longsocks + name = "Zorren Longsocks" + icon_state = "zorren_longsocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/tesh_feathers + name = "Teshari Feathers" + icon_state = "tesh-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/harpy_feathers + name = "Rapala leg Feather" + icon_state = "harpy-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/harpy_legs + name = "Rapala leg coloring" + icon_state = "harpy-leg" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/chooves + name = "Cloven hooves" + icon_state = "chooves" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + +/datum/sprite_accessory/marking/vr/body_tone + name = "Body toning (for emergency contrast loss)" + icon_state = "btone" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/gloss + name = "Full body gloss" + icon_state = "gloss" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/eboop_panels + name = "Eggnerd FBP panels" + icon_state = "eboop" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/osocks_rarm + name = "Modular Longsock (right arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_ARM,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/osocks_larm + name = "Modular Longsock (left arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_ARM,BP_L_HAND) + +/datum/sprite_accessory/marking/vr/osocks_rleg + name = "Modular Longsock (right leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_FOOT,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/osocks_lleg + name = "Modular Longsock (left leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_L_LEG) + +/datum/sprite_accessory/marking/vr/animeeyesinner + name = "Anime Eyes Inner" + icon_state = "animeeyesinner" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/animeeyesouter + name = "Anime Eyes Outer" + icon_state = "animeeyesouter" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/panda_eye_marks + name = "Panda Eye Markings" + icon_state = "eyes_panda" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/catwomantorso + name = "Catwoman chest stripes" + icon_state = "catwomanchest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/catwomangroin + name = "Catwoman groin stripes" + icon_state = "catwomangroin" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN) + +/datum/sprite_accessory/marking/vr/catwoman_rleg + name = "Catwoman right leg stripes" + icon_state = "catwomanright" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_LEG) + +/datum/sprite_accessory/marking/vr/catwoman_lleg + name = "Catwoman left leg stripes" + icon_state = "catwomanleft" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG) + +/datum/sprite_accessory/marking/vr/teshi_small_feathers + name = "Teshari small wingfeathers" + icon_state = "teshi_sf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights + name = "Ward - Spirit FBP Lights" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_lights_body + name = "Ward - Spirit FBP Lights (body)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights_head + name = "Ward - Spirit FBP Lights (head)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels + name = "Ward - Spirit FBP Panels" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels_body + name = "Ward - Spirit FBP Panels (body)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_panels_head + name = "Ward - Spirit FBP Panels (head)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_head + name = "Squid Head" + icon_state = "tentaclehead" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_mouth + name = "Tentacle Mouth" + icon_state = "tentaclemouth" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/rosette + name = "Rosettes" + icon_state = "rosette" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/werewolf_nose + name = "Werewolf nose" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_face + name = "Werewolf face" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_belly + name = "Werewolf belly" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_socks + name = "Werewolf socks" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/shadekin_snoot + name = "Shadekin Snoot" + icon_state = "shadekin-snoot" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/marking/vr/taj_nose_alt + name = "Nose Color, alt. (Taj)" + icon_state = "taj_nosealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/talons + name = "Talons" + icon_state = "talons" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/claws + name = "Claws" + icon_state = "claws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/equine_snout //Why the long face? Works best with sergal bodytype. + name = "Equine Snout" + icon_state = "donkey" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/equine_nose + name = "Equine Nose" + icon_state = "dnose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/bee_stripes + name = "bee stripes" + icon_state = "beestripes" + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vas_toes + name = "Bug Paws (Vasilissan)" + icon_state = "vas_toes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + + //CitRP stuff +/datum/sprite_accessory/marking/vr/vox_alt + name = "Vox Alternate" + icon_state = "bay_vox" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_VOX) + +/datum/sprite_accessory/marking/vr/vox_alt_eyes + name = "Alternate Vox Eyes" + icon_state = "bay_vox_eyes" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_VOX) + +/datum/sprite_accessory/marking/vr/c_beast_body + name = "Cyber Body" + icon_state = "c_beast_body" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/c_beast_plating + name = "Cyber Plating (Use w/ Cyber Body)" + icon_state = "c_beast_plating" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM) + +/datum/sprite_accessory/marking/vr/c_beast_band + name = "Cyber Band (Use w/ Cybertech head)" + icon_state = "c_beast_band" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_a + name = "Cyber Beast Cheeks A (Use A, B and C)" + icon_state = "c_beast_a" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_b + name = "Cyber Beast Cheeks B (Use A, B and C)" + icon_state = "c_beast_b" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_c + name = "Cyber Beast Cheeks C (Use A, B and C)" + icon_state = "c_beast_c" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/teshari_large_eyes + name = "Teshari large eyes" + icon_state = "teshlarge_eyes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_coat + name = "Teshari coat" + icon_state = "tesh_coat" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_pattern_male + name = "Teshari male pattern" + icon_state = "tesh-pattern-male" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_pattern_female + name = "Teshari female pattern" + icon_state = "tesh-pattern-fem" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/voxscales + name = "Vox Scales" + icon_state = "Voxscales" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD) + +/datum/sprite_accessory/marking/vr/voxclaws + name = "Vox Claws" + icon_state = "Voxclaws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/voxbeak + name = "Vox Beak" + icon_state = "Voxscales" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathihood + name = "Cobra Hood" + icon_state = "unathihood" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathidoublehorns + name = "Double Unathi Horns" + icon_state = "unathidoublehorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathihorns + name = "Unathi Horns" + icon_state = "unathihorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathiramhorns + name = "Unathi Ram Horns" + icon_state = "unathiramhorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathishortspines + name = "Unathi Short Spines" + icon_state = "unathishortspines" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathilongspines + name = "Unathi Long Spines" + icon_state = "unathilongspines" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathishortfrills + name = "Unathi Short Frills" + icon_state = "unathishortfrills" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathilongfrills + name = "Unathi Long Frills" + icon_state = "unathilongfrills" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm new file mode 100644 index 0000000000..0b8d75b84e --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_tail.dm @@ -0,0 +1,941 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Tail Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/tail + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/tails.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 //Tertiary. + var/show_species_tail = 0 // If false, do not render species' tail. + var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it + var/desc = "You should not see this..." + var/ani_state // State when wagging/animated + var/extra_overlay_w // Wagging state for extra overlay + var/extra_overlay2_w // Tertiary wagging. + var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. + var/icon/clip_mask_icon = null //Icon file used for clip mask. + var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. + var/icon/clip_mask = null //Instantiated clip mask of given icon and state + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/New() + . = ..() + if(clip_mask_icon && clip_mask_state) + clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state) + +// Species-unique tails + +// Everyone tails + +/datum/sprite_accessory/tail/invisible + name = "hide species-sprite tail" + icon = null + icon_state = null + + species_allowed = list(SPECIES_TAJ, SPECIES_UNATHI, SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/tail/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/tail/squirrel + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kitty + name = "kitty, colorable, downwards" + desc = "" + icon_state = "kittydown" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kittyup + name = "kitty, colorable, upwards" + desc = "" + icon_state = "kittyup" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/tiger_white + name = "tiger, colorable" + desc = "" + icon_state = "tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigerinnerwhite" + +/datum/sprite_accessory/tail/stripey + name = "stripey taj, colorable" + desc = "" + icon_state = "stripeytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "stripeytail_mark" + + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/stripeytail_brown + name = "stripey taj, brown" + desc = "" + icon_state = "stripeytail-brown" + +/datum/sprite_accessory/tail/chameleon + name = "Chameleon, colorable" + desc = "" + icon_state = "chameleon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/bunny + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + +/datum/sprite_accessory/tail/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/tail/bear + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/dragon + name = "dragon, colorable" + desc = "" + icon_state = "dragon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/tail/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/tail/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/tail/blackwolf + name = "wolf, black" + desc = "" + icon_state = "wolf" + +/datum/sprite_accessory/tail/wolf + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/tail/mouse_pink + name = "mouse, pink" + desc = "" + icon_state = "mouse-pink" + +/datum/sprite_accessory/tail/mouse + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/horse + name = "horse tail, colorable" + desc = "" + icon_state = "horse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/cow + name = "cow tail, colorable" + desc = "" + icon_state = "cow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fantail + name = "avian fantail, colorable" + desc = "" + icon_state = "fantail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wagtail + name = "avian wagtail, colorable" + desc = "" + icon_state = "wagtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreandc + name = "nevrean tail, dual-color" + desc = "" + icon_state = "nevreantail_dc" + extra_overlay = "nevreantail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc + name = "nevrean wagtail, dual-color" + desc = "" + icon_state = "wagtail" + extra_overlay = "wagtail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc_alt + name = "nevrean wagtail, marked, dual-color" + desc = "" + icon_state = "wagtail2_dc" + extra_overlay = "wagtail2_dc_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/crossfox + name = "cross fox" + desc = "" + icon_state = "crossfox" + +/datum/sprite_accessory/tail/beethorax + name = "bee thorax" + desc = "" + icon_state = "beethorax" + +/datum/sprite_accessory/tail/doublekitsune + name = "double kitsune tail, colorable" + desc = "" + icon_state = "doublekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/spade_color + name = "spade-tail (colorable)" + desc = "" + icon_state = "spadetail-black" + do_colouration = 1 + +/datum/sprite_accessory/tail/snag + name = "xenomorph tail 1" + desc = "" + icon_state = "snag" + +/datum/sprite_accessory/tail/xenotail + name = "xenomorph tail 2" + desc = "" + icon_state = "xenotail" + +/datum/sprite_accessory/tail/eboop + name = "EGN mech tail (dual color)" + desc = "" + icon_state = "eboop" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "eboop_mark" + +/datum/sprite_accessory/tail/ketrai_wag + name = "fennix tail (vwag)" + desc = "" + icon_state = "ketraitail" + ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. + +/datum/sprite_accessory/tail/ketrainew_wag + name = "new fennix tail (vwag)" + desc = "" + icon_state = "ketraitailnew" + ani_state = "ketraitailnew_w" + +/datum/sprite_accessory/tail/redpanda + name = "red panda" + desc = "" + icon_state = "redpanda" + +/datum/sprite_accessory/tail/ringtail + name = "ringtail, colorable" + desc = "" + icon_state = "ringtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ringtail_mark" + +/datum/sprite_accessory/tail/satyr + name = "goat legs, colorable" + desc = "" + icon_state = "satyr" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +/datum/sprite_accessory/tail/tailmaw + name = "tailmaw, colorable" + desc = "" + icon_state = "tailmaw" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/tail/curltail + name = "curltail (vwag)" + desc = "" + icon_state = "curltail" + ani_state = "curltail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "curltail_mark" + extra_overlay_w = "curltail_mark_w" + +/datum/sprite_accessory/tail/shorttail + name = "shorttail (vwag)" + desc = "" + icon_state = "straighttail" + ani_state = "straighttail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sneptail + name = "Snep/Furry Tail (vwag)" + desc = "" + icon_state = "sneptail" + ani_state = "sneptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sneptail_mark" + extra_overlay_w = "sneptail_mark_w" + + +/datum/sprite_accessory/tail/tiger_new + name = "tiger tail (vwag)" + desc = "" + icon_state = "tigertail" + ani_state = "tigertail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigertail_mark" + extra_overlay_w = "tigertail_mark_w" + +/datum/sprite_accessory/tail/vulp_new + name = "new vulp tail (vwag)" + desc = "" + icon_state = "vulptail" + ani_state = "vulptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulptail_mark" + extra_overlay_w = "vulptail_mark_w" + +/datum/sprite_accessory/tail/otietail + name = "otie tail (vwag)" + desc = "" + icon_state = "otie" + ani_state = "otie_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/newtailmaw + name = "new tailmaw (vwag)" + desc = "" + icon_state = "newtailmaw" + ani_state = "newtailmaw_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/ztail + name = "jagged flufftail" + desc = "" + icon_state = "ztail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/snaketail + name = "snake tail, colorable" + desc = "" + icon_state = "snaketail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/vulpan_alt + name = "vulpkanin alt style, colorable" + desc = "" + icon_state = "vulptail_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sergaltaildc + name = "sergal, dual-color" + desc = "" + icon_state = "sergal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sergal_mark" + +/datum/sprite_accessory/tail/skunktail + name = "skunk, dual-color" + desc = "" + icon_state = "skunktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "skunktail_mark" + +/datum/sprite_accessory/tail/deertail + name = "deer, dual-color" + desc = "" + icon_state = "deertail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deertail_mark" + +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + extra_overlay = "teshari_fluffytail_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/nightstalker + name = "Nightstalker, colorable" + desc = "" + icon_state = "nightstalker" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +//For all species tails. Includes haircolored tails. +/datum/sprite_accessory/tail/special + name = "Blank tail. Do not select." + icon = 'icons/effects/species_tails.dmi' + +/datum/sprite_accessory/tail/special/unathi + name = "unathi tail" + desc = "" + icon_state = "sogtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/tajaran + name = "tajaran tail" + desc = "" + icon_state = "tajtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/sergal + name = "sergal tail" + desc = "" + icon_state = "sergtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akula + name = "akula tail" + desc = "" + icon_state = "sharktail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevrean + name = "nevrean tail" + desc = "" + icon_state = "nevreantail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalis + name = "armalis tail" + desc = "" + icon_state = "armalis_tail_humanoid_s" + +/datum/sprite_accessory/tail/special/xenodrone + name = "xenomorph drone tail" + desc = "" + icon_state = "xenos_drone_tail_s" + +/datum/sprite_accessory/tail/special/xenosentinel + name = "xenomorph sentinel tail" + desc = "" + icon_state = "xenos_sentinel_tail_s" + +/datum/sprite_accessory/tail/special/xenohunter + name = "xenomorph hunter tail" + desc = "" + icon_state = "xenos_hunter_tail_s" + +/datum/sprite_accessory/tail/special/xenoqueen + name = "xenomorph queen tail" + desc = "" + icon_state = "xenos_queen_tail_s" + +/datum/sprite_accessory/tail/special/monkey + name = "monkey tail" + desc = "" + icon_state = "chimptail_s" + +/datum/sprite_accessory/tail/special/tesharitail + name = "teshari tail" + desc = "" + icon_state = "seromitail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/tesharitailfeathered + name = "teshari tail w/ feathers" + desc = "" + icon_state = "seromitail_s" + extra_overlay = "seromitail_feathers_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/unathihc + name = "unathi tail, colorable" + desc = "" + icon_state = "sogtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/tajaranhc + name = "tajaran tail, colorable" + desc = "" + icon_state = "tajtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/sergalhc + name = "sergal tail, colorable" + desc = "" + icon_state = "sergtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akulahc + name = "akula tail, colorable" + desc = "" + icon_state = "sharktail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevreanhc + name = "nevrean tail, colorable" + desc = "" + icon_state = "nevreantail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/foxhc + name = "highlander zorren tail, colorable" + desc = "" + icon_state = "foxtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/fennechc + name = "flatland zorren tail, colorable" + desc = "" + icon_state = "fentail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalishc + name = "armalis tail, colorable" + desc = "" + icon_state = "armalis_tail_humanoid_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenodronehc + name = "xenomorph drone tail, colorable" + desc = "" + icon_state = "xenos_drone_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenosentinelhc + name = "xenomorph sentinel tail, colorable" + desc = "" + icon_state = "xenos_sentinel_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenohunterhc + name = "xenomorph hunter tail, colorable" + desc = "" + icon_state = "xenos_hunter_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenoqueenhc + name = "xenomorph queen tail, colorable" + desc = "" + icon_state = "xenos_queen_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/monkeyhc + name = "monkey tail, colorable" + desc = "" + icon_state = "chimptail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/tesharitailhc + name = "teshari tail, colorable" + desc = "" + icon_state = "seromitail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tesharitailfeatheredhc + name = "teshari tail w/ feathers, colorable" + desc = "" + icon_state = "seromitail_feathers_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/vulpan + name = "vulpkanin, colorable" + desc = "" + icon_state = "vulptail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/tail/zenghu_taj + name = "Zeng-Hu Tajaran Synth tail" + desc = "" + icon_state = "zenghu_taj" + +//Taurs moved to a separate file due to extra code around them + +//Buggo Abdomens! + +/datum/sprite_accessory/tail/buggo + name = "Bug abdomen, colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobee + name = "Bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + +/datum/sprite_accessory/tail/buggobeefull + name = "Bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + +/datum/sprite_accessory/tail/buggounder + name = "Bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + +/datum/sprite_accessory/tail/buggofirefly + name = "Bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + +/datum/sprite_accessory/tail/buggofat + name = "Fat bug abdomen, colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggofatbee + name = "Fat bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggofatbeefull + name = "Fat bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggofatunder + name = "Fat bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofatfirefly + name = "Fat bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_markings" + +/datum/sprite_accessory/tail/buggowag + name = "Bug abdomen, colorable, vwag change" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobeewag + name = "Bug abdomen, bee top, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + extra_overlay_w = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggobeefullwag + name = "Bug abdomen, bee full, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + extra_overlay_w = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggounderwag + name = "Bug abdomen, underside, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + extra_overlay_w = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofireflywag + name = "Bug abdomen, firefly, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + extra_overlay_w = "buggofatfirefly_markings" + +//Vass buggo variants! + +/datum/sprite_accessory/tail/buggovass + name = "Bug abdomen, vass, colorable" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbee + name = "Bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefull + name = "Bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunder + name = "Bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfirefly + name = "Bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovassfat + name = "Fat bug abdomen, vass, colorable" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassfatbee + name = "Fat bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatbeefull + name = "Fat bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatunder + name = "Fat bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatfirefly + name = "Fat bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovasswag + name = "Bug abdomen, vass, colorable, vwag change" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbeewag + name = "Bug abdomen, bee top, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + extra_overlay_w = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefullwag + name = "Bug abdomen, bee full, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + extra_overlay_w = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunderwag + name = "Bug abdomen, underside, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + extra_overlay_w = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfireflywag + name = "Bug abdomen, firefly, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + extra_overlay_w = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/tail_smooth + name = "Smooth Lizard Tail, colorable" + desc = "" + icon_state = "tail_smooth" + ani_state = "tail_smooth_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/triplekitsune_colorable + name = "Kitsune 3 tails, colorable" + desc = "" + icon_state = "triplekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "triplekitsune_tips" + +/datum/sprite_accessory/tail/ninekitsune_colorable + name = "Kitsune 9 tails, colorable" + desc = "" + icon_state = "ninekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ninekitsune-tips" + +/datum/sprite_accessory/tail/shadekin_short + name = "Shadekin Short Tail, colorable" + desc = "" + icon_state = "shadekin-short" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts + name = "Ward-Takahashi Tail" + desc = "" + icon_state = "wardtakahashi_vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wartacosushi_tail_dc + name = "Ward-Takahashi Tail, dual-color" + desc = "" + icon_state = "wardtakahashi_vulp_dc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wardtakahashi_vulp_dc_mark" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm.orig b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm similarity index 59% rename from code/modules/vore/appearance/sprite_accessories_vr.dm.orig rename to code/modules/mob/new_player/sprite_accessories_tail_vr.dm index 1fdcb03b7a..90082c146a 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm.orig +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1,1605 +1,1149 @@ -/* - Hello and welcome to VOREStation sprite_accessories: For a more general overview - please read sprite_accessories.dm. This file is for ears and tails. - This is intended to be friendly for people with little to no actual coding experience. - !!WARNING!!: changing existing accessory information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm -*/ - -// Add Additional variable onto sprite_accessory -/datum/sprite_accessory - // Ckey of person allowed to use this, if defined. - var/list/ckeys_allowed = null - var/apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings - -/* -//////////////////////////// -/ =--------------------= / -/ == Ear Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/ears - name = "You should not see this..." - icon = 'icons/mob/vore/ears_vr.dmi' - do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color - - var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/desc = "You should not see this..." - -// Species-unique ears - -/datum/sprite_accessory/ears/shadekin - name = "Shadekin Ears, colorable" - desc = "" - icon_state = "shadekin" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - apply_restrictions = TRUE -<<<<<<< HEAD - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_YW)//YW edits -======= - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) ->>>>>>> master - -// Ears avaliable to anyone - -/datum/sprite_accessory/ears/squirrel_orange - name = "squirel, orange" - desc = "" - icon_state = "squirrel-orange" - -/datum/sprite_accessory/ears/squirrel_red - name = "squirrel, red" - desc = "" - icon_state = "squirrel-red" - -/datum/sprite_accessory/ears/bunny_white - name = "bunny, white" - desc = "" - icon_state = "bunny" - -/datum/sprite_accessory/ears/bear_brown - name = "bear, brown" - desc = "" - icon_state = "bear-brown" - -/datum/sprite_accessory/ears/bear_panda - name = "bear, panda" - desc = "" - icon_state = "panda" - -/datum/sprite_accessory/ears/wolf_grey - name = "wolf, grey" - desc = "" - icon_state = "wolf-grey" - -/datum/sprite_accessory/ears/wolf_green - name = "wolf, green" - desc = "" - icon_state = "wolf-green" - -/datum/sprite_accessory/ears/wisewolf - name = "wolf, wise" - desc = "" - icon_state = "wolf-wise" - -/datum/sprite_accessory/ears/mouse_grey - name = "mouse, grey" - desc = "" - icon_state = "mouse-grey" - -/datum/sprite_accessory/ears/bee - name = "bee antennae" - desc = "" - icon_state = "bee" - -/datum/sprite_accessory/ears/antennae - name = "antennae, colorable" - desc = "" - icon_state = "antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/curly_bug - name = "curly antennae, colorable" - desc = "" - icon_state = "curly_bug" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dual_robot - name = "synth antennae, colorable" - desc = "" - icon_state = "dual_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/right_robot - name = "right synth, colorable" - desc = "" - icon_state = "right_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/left_robot - name = "left synth, colorable" - desc = "" - icon_state = "left_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/oni_h1 - name = "oni horns" - desc = "" - icon_state = "oni-h1" - -/datum/sprite_accessory/ears/oni_h1_c - name = "oni horns, colorable" - desc = "" - icon_state = "oni-h1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns1 - name = "demon horns" - desc = "" - icon_state = "demon-horns1" - -/datum/sprite_accessory/ears/demon_horns1_c - name = "demon horns, colorable" - desc = "" - icon_state = "demon-horns1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns2 - name = "demon horns, colorable(outward)" - desc = "" - icon_state = "demon-horns2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dragon_horns - name = "dragon horns, colorable" - desc = "" - icon_state = "dragon-horns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/foxears - name = "highlander zorren ears" - desc = "" - icon_state = "foxears" - -/datum/sprite_accessory/ears/fenears - name = "flatland zorren ears" - desc = "" - icon_state = "fenears" - -/datum/sprite_accessory/ears/sergal //Redundant - name = "Sergal ears" - icon_state = "serg_plain_s" - -/datum/sprite_accessory/ears/foxearshc - name = "highlander zorren ears, colorable" - desc = "" - icon_state = "foxearshc" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/fenearshc - name = "flatland zorren ears, colorable" - desc = "" - icon_state = "fenearshc" - extra_overlay = "fenears-inner" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sergalhc - name = "Sergal ears, colorable" - icon_state = "serg_plain_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/mousehc - name = "mouse, colorable" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "mouseinner" - -/datum/sprite_accessory/ears/mousehcno - name = "mouse, colorable, no inner" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/wolfhc - name = "wolf, colorable" - desc = "" - icon_state = "wolf" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "wolfinner" - -/datum/sprite_accessory/ears/bearhc - name = "bear, colorable" - desc = "" - icon_state = "bear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallbear - name = "small bear" - desc = "" - icon_state = "smallbear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/squirrelhc - name = "squirrel, colorable" - desc = "" - icon_state = "squirrel" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/kittyhc - name = "kitty, colorable" - desc = "" - icon_state = "kitty" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "kittyinner" - -/datum/sprite_accessory/ears/bunnyhc - name = "bunny, colorable" - desc = "" - icon_state = "bunny" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers - name = "antlers" - desc = "" - icon_state = "antlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers_e - name = "antlers with ears" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "antlers_mark" - -/datum/sprite_accessory/ears/smallantlers - name = "small antlers" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallantlers_e - name = "small antlers with ears" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "deer" - -/datum/sprite_accessory/ears/deer - name = "deer ears" - desc = "" - icon_state = "deer" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow - name = "cow, horns" - desc = "" - icon_state = "cow" - -/datum/sprite_accessory/ears/cowc - name = "cow, horns, colorable" - desc = "" - icon_state = "cow-c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow_nohorns - name = "cow, no horns" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/caprahorns - name = "caprine horns" - desc = "" - icon_state = "caprahorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/otie - name = "otie, colorable" - desc = "" - icon_state = "otie" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "otie-inner" - -/datum/sprite_accessory/ears/zears - name = "jagged ears" - desc = "" - icon_state = "zears" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/elfs - name = "elven ears" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sleek - name = "sleek ears" - desc = "" - icon_state = "sleek" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/drake - name = "drake frills" - desc = "" - icon_state = "drake" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/vulp - name = "vulpkanin, dual-color" - desc = "" - icon_state = "vulp" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp-inner" - -/datum/sprite_accessory/ears/bunny_floppy - name = "floopy bunny ears (colorable)" - desc = "" - icon_state = "floppy_bun" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/teshari - name = "Teshari (colorable fluff)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshariinner" - -/datum/sprite_accessory/ears/tesharihigh - name = "Teshari upper ears (colorable fluff)" - desc = "" - icon_state = "tesharihigh" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharihighinner" - -/datum/sprite_accessory/ears/tesharilow - name = "Teshari lower ears (colorable fluff)" - desc = "" - icon_state = "tesharilow" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharilowinner" - -/datum/sprite_accessory/ears/inkling - name = "colorable mature inkling hair" - desc = "" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "inkling-colorable" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - - -// Special snowflake ears go below here. - -/datum/sprite_accessory/ears/molenar_kitsune - name = "quintail kitsune ears (Molenar)" - desc = "" - icon_state = "molenar-kitsune" - ckeys_allowed = list("molenar") - -/datum/sprite_accessory/ears/lilimoth_antennae - name = "citheronia antennae (Kira72)" - desc = "" - icon_state = "lilimoth_antennae" - ckeys_allowed = list("kira72") - -/datum/sprite_accessory/ears/molenar_deathclaw - name = "deathclaw ears (Molenar)" - desc = "" - icon_state = "molenar-deathclaw" - ckeys_allowed = list("molenar") - -/datum/sprite_accessory/ears/miria_fluffdragon - name = "fluffdragon ears (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragonears" - ckeys_allowed = list("miriamasters") - -/datum/sprite_accessory/ears/miria_kitsune - name = "kitsune ears (Miria Masters)" - desc = "" - icon_state = "miria-kitsuneears" - ckeys_allowed = list("miriamasters") - -/datum/sprite_accessory/ears/runac - name = "fennecsune ears (Runac)" - desc = "" - icon_state = "runac" - ckeys_allowed = list("rebcom1807") - -/datum/sprite_accessory/ears/kerena - name = "wingwolf ears (Kerena)" - desc = "" - icon_state = "kerena" - ckeys_allowed = list("somekindofpony") - -/datum/sprite_accessory/ears/rosey - name = "tritail kitsune ears (Rosey)" - desc = "" - icon_state = "rosey" - ckeys_allowed = list("joey4298") - -/datum/sprite_accessory/ears/aronai - name = "aronai ears/head (Aronai)" - desc = "" - icon_state = "aronai" - ckeys_allowed = list("arokha") - -/datum/sprite_accessory/ears/holly - name = "tigress ears (Holly Sharp)" - desc = "" - icon_state = "tigressears" - ckeys_allowed = list("hoodoo") - -/datum/sprite_accessory/ears/molenar_inkling - name = "teal mature inkling hair (Kari Akiren)" - desc = "" - icon_state = "molenar-tentacle" - ckeys_allowed = list("molenar") - -/datum/sprite_accessory/ears/shock - name = "pharoah hound ears (Shock Diamond)" - desc = "" - icon_state = "shock" - ckeys_allowed = list("icowom","cameron653") - -/datum/sprite_accessory/ears/alurane - name = "alurane ears/hair (Pumila)" - desc = "" - icon_state = "alurane-ears" - ckeys_allowed = list("natje") - -/datum/sprite_accessory/ears/frost - name = "Frost antenna" - desc = "" - icon_state = "frosted_tips" - ckeys_allowed = list("tucker0666") - -/* -//////////////////////////// -/ =--------------------= / -/ == Wing Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/wing - name = "You should not see this..." - icon = 'icons/mob/vore/wings_vr.dmi' - do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. - // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana - var/desc = "You should not see this..." - var/ani_state // State when flapping/animated - var/extra_overlay_w // Flapping state for extra overlay - -/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings. - name = "pharoah hound tail (Shock Diamond)" - desc = "" - icon_state = "shock" - ckeys_allowed = list("icowom") - -/datum/sprite_accessory/wing/featheredlarge //Made by Natje! - name = "large feathered wings (colorable)" - desc = "" - icon_state = "feathered2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. - name = "spider legs" - desc = "" - icon_state = "spider-legs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/moth - name = "moth wings" - desc = "" - icon_state = "moth" - -/datum/sprite_accessory/wing/mothc - name = "moth wings, colorable" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/dragonfly - name = "dragonfly" - desc = "" - icon_state = "dragonfly" - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/citheroniamoth - name = "citheronia wings" - desc = "" - icon_state = "citheronia_wings" - ckeys_allowed = list("kira72") - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered_medium - name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. - desc = "" - icon_state = "feathered3" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/bat_black - name = "bat wings, black" - desc = "" - icon_state = "bat-black" - -/datum/sprite_accessory/wing/bat_color - name = "bat wings, colorable" - desc = "" - icon_state = "bat-color" - do_colouration = 1 - -/datum/sprite_accessory/wing/bat_red - name = "bat wings, red" - desc = "" - icon_state = "bat-red" - -/datum/sprite_accessory/wing/harpywings - name = "harpy wings, colorable" - desc = "" - icon_state = "harpywings" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/beewings - name = "bee wings" - desc = "" - icon_state = "beewings" - -/datum/sprite_accessory/wing/sepulchre - name = "demon wings (Sepulchre)" - desc = "" - icon_state = "sepulchre_wings" - ckeys_allowed = list("sepulchre") - -/datum/sprite_accessory/wing/miria_fluffdragon - name = "fluffdragon wings (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragontail" - ckeys_allowed = list("miriamasters") - -/datum/sprite_accessory/wing/scree - name = "green taj wings (Scree)" - desc = "" - icon_state = "scree-wings" - ckeys_allowed = list("scree") - -/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? - name = "gazer eyestalks" - desc = "" - icon_state = "liquidfirefly-eyestalks" - //ckeys_allowed = list("liquidfirefly","seiga") //At request. - -/datum/sprite_accessory/wing/moth_full - name = "moth antenna and wings" - desc = "" - icon_state = "moth_full" - -/datum/sprite_accessory/wing/moth_full_gray - name = "moth antenna and wings, colorable" - desc = "" - icon_state = "moth_full_gray" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/kerena - name = "wingwolf wings (Kerena)" - desc = "" - icon_state = "kerena-wings" - ckeys_allowed = list("somekindofpony") - -/datum/sprite_accessory/wing/snag - name = "xenomorph backplate" - desc = "" - icon_state = "snag-backplate" - -/datum/sprite_accessory/wing/nevrean - name = "nevrean wings/fantail" - desc = "" - icon_state = "nevrean_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/* -//////////////////////////// -/ =--------------------= / -/ == Tail Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/tail - name = "You should not see this..." - icon = 'icons/mob/vore/tails_vr.dmi' - do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/show_species_tail = 0 // If false, do not render species' tail. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it - var/desc = "You should not see this..." - var/ani_state // State when wagging/animated - var/extra_overlay_w // Wagging state for extra overlay - var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. - var/icon/clip_mask_icon = null //Icon file used for clip mask. - var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. - -// Species-unique tails - -/datum/sprite_accessory/tail/shadekin_short - name = "Shadekin Short Tail, colorable" - desc = "" - icon_state = "shadekin-short" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - apply_restrictions = TRUE -<<<<<<< HEAD - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_YW)//YW edits -======= - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) ->>>>>>> master - -// Everyone tails - -/datum/sprite_accessory/tail/invisible - name = "hide species-sprite tail" - icon = null - icon_state = null - -/datum/sprite_accessory/tail/squirrel_orange - name = "squirel, orange" - desc = "" - icon_state = "squirrel-orange" - -/datum/sprite_accessory/tail/squirrel_red - name = "squirrel, red" - desc = "" - icon_state = "squirrel-red" - -/datum/sprite_accessory/tail/squirrel - name = "squirrel, colorable" - desc = "" - icon_state = "squirrel" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/kitty - name = "kitty, colorable, downwards" - desc = "" - icon_state = "kittydown" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/kittyup - name = "kitty, colorable, upwards" - desc = "" - icon_state = "kittyup" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/tiger_white - name = "tiger, colorable" - desc = "" - icon_state = "tiger" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tigerinnerwhite" - -/datum/sprite_accessory/tail/stripey - name = "stripey taj, colorable" - desc = "" - icon_state = "stripeytail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "stripeytail_mark" - -/datum/sprite_accessory/tail/stripeytail_brown - name = "stripey taj, brown" - desc = "" - icon_state = "stripeytail-brown" - -/datum/sprite_accessory/tail/chameleon - name = "Chameleon, colorable" - desc = "" - icon_state = "chameleon" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/bunny - name = "bunny, colorable" - desc = "" - icon_state = "bunny" - do_colouration = 1 - -/datum/sprite_accessory/tail/bear_brown - name = "bear, brown" - desc = "" - icon_state = "bear-brown" - -/datum/sprite_accessory/tail/bear - name = "bear, colorable" - desc = "" - icon_state = "bear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/dragon - name = "dragon, colorable" - desc = "" - icon_state = "dragon" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/wolf_grey - name = "wolf, grey" - desc = "" - icon_state = "wolf-grey" - -/datum/sprite_accessory/tail/wolf_green - name = "wolf, green" - desc = "" - icon_state = "wolf-green" - -/datum/sprite_accessory/tail/wisewolf - name = "wolf, wise" - desc = "" - icon_state = "wolf-wise" - -/datum/sprite_accessory/tail/blackwolf - name = "wolf, black" - desc = "" - icon_state = "wolf" - -/datum/sprite_accessory/tail/wolf - name = "wolf, colorable" - desc = "" - icon_state = "wolf" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "wolfinner" - -/datum/sprite_accessory/tail/mouse_pink - name = "mouse, pink" - desc = "" - icon_state = "mouse-pink" - -/datum/sprite_accessory/tail/mouse - name = "mouse, colorable" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/horse - name = "horse tail, colorable" - desc = "" - icon_state = "horse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/cow - name = "cow tail, colorable" - desc = "" - icon_state = "cow" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/fantail - name = "avian fantail, colorable" - desc = "" - icon_state = "fantail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/wagtail - name = "avian wagtail, colorable" - desc = "" - icon_state = "wagtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/crossfox - name = "cross fox" - desc = "" - icon_state = "crossfox" - -/datum/sprite_accessory/tail/beethorax - name = "bee thorax" - desc = "" - icon_state = "beethorax" - -/datum/sprite_accessory/tail/doublekitsune - name = "double kitsune tail, colorable" - desc = "" - icon_state = "doublekitsune" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/spade_color - name = "spade-tail (colorable)" - desc = "" - icon_state = "spadetail-black" - do_colouration = 1 - -/datum/sprite_accessory/tail/snag - name = "xenomorph tail 1" - desc = "" - icon_state = "snag" - -/datum/sprite_accessory/tail/xenotail - name = "xenomorph tail 2" - desc = "" - icon_state = "xenotail" - -/datum/sprite_accessory/tail/eboop - name = "EGN mech tail (dual color)" - desc = "" - icon_state = "eboop" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "eboop_mark" - -/datum/sprite_accessory/tail/molenar_kitsune - name = "quintail kitsune tails (Molenar)" - desc = "" - icon_state = "molenar-kitsune" - ckeys_allowed = list("molenar") - -/datum/sprite_accessory/tail/miria_fluffdragon - name = "fluffdragon tail (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragontail" - ckeys_allowed = list("miriamasters") - -/datum/sprite_accessory/tail/miria_kitsune - name = "Black kitsune tails (Miria Masters)" - desc = "" - icon_state = "miria-kitsunetail" - ckeys_allowed = list("miriamasters") - -/datum/sprite_accessory/tail/molenar_deathclaw - name = "deathclaw bits (Molenar)" - desc = "" - icon_state = "molenar-deathclaw" - ckeys_allowed = list("molenar","silvertalismen","jertheace") - -/datum/sprite_accessory/tail/runac - name = "fennecsune tails (Runac)" - desc = "" - icon_state = "runac" - ckeys_allowed = list("rebcom1807") - -/datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail. - name = "fox tail (+ beewings) (Reika)" - desc = "" - icon_state = "reika" - ckeys_allowed = list("rikaru19xjenkins") - -/datum/sprite_accessory/tail/rosey - name = "tritail kitsune tails (Rosey)" - desc = "" - icon_state = "rosey_three" - ckeys_allowed = list("joey4298") - -/datum/sprite_accessory/tail/rosey2 - name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK - desc = "" - icon_state = "rosey_five" - ckeys_allowed = list("joey4298") - -/datum/sprite_accessory/tail/scree - name = "green taj tail (Scree)" - desc = "" - icon_state = "scree" - ckeys_allowed = list("scree") - -/datum/sprite_accessory/tail/aronai - name = "aronai tail (Aronai)" - desc = "" - icon_state = "aronai" - ckeys_allowed = list("arokha") - -/datum/sprite_accessory/tail/cabletail - name = "cabletail" - desc = "cabletail" - icon_state = "cabletail" - ckeys_allowed = list("tucker0666") - -/datum/sprite_accessory/tail/featherfluff_tail - name = "featherfluff_tail" - desc = "" - icon_state = "featherfluff_tail" - ckeys_allowed = list("tucker0666") - -/datum/sprite_accessory/tail/ketrai_wag - name = "fennix tail (vwag)" - desc = "" - icon_state = "ketraitail" - ani_state = "ketraitail_w" - //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. - -/datum/sprite_accessory/tail/ketrainew_wag - name = "new fennix tail (vwag)" - desc = "" - icon_state = "ketraitailnew" - ani_state = "ketraitailnew_w" - -/datum/sprite_accessory/tail/redpanda - name = "red panda" - desc = "" - icon_state = "redpanda" - -/datum/sprite_accessory/tail/ringtail - name = "ringtail, colorable" - desc = "" - icon_state = "ringtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "ringtail_mark" - -/datum/sprite_accessory/tail/holly - name = "tigress tail (Holly)" - desc = "" - icon_state = "tigresstail" - ckeys_allowed = list("hoodoo") - -/datum/sprite_accessory/tail/satyr - name = "goat legs, colorable" - desc = "" - icon_state = "satyr" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. - clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' - clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. - -/datum/sprite_accessory/tail/tailmaw - name = "tailmaw, colorable" - desc = "" - icon_state = "tailmaw" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - -/datum/sprite_accessory/tail/curltail - name = "curltail (vwag)" - desc = "" - icon_state = "curltail" - ani_state = "curltail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "curltail_mark" - extra_overlay_w = "curltail_mark_w" - -/datum/sprite_accessory/tail/shorttail - name = "shorttail (vwag)" - desc = "" - icon_state = "straighttail" - ani_state = "straighttail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/sneptail - name = "Snep/Furry Tail (vwag)" - desc = "" - icon_state = "sneptail" - ani_state = "sneptail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "sneptail_mark" - extra_overlay_w = "sneptail_mark_w" - - -/datum/sprite_accessory/tail/tiger_new - name = "tiger tail (vwag)" - desc = "" - icon_state = "tigertail" - ani_state = "tigertail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tigertail_mark" - extra_overlay_w = "tigertail_mark_w" - -/datum/sprite_accessory/tail/vulp_new - name = "new vulp tail (vwag)" - desc = "" - icon_state = "vulptail" - ani_state = "vulptail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulptail_mark" - extra_overlay_w = "vulptail_mark_w" - -/datum/sprite_accessory/tail/otietail - name = "otie tail (vwag)" - desc = "" - icon_state = "otie" - ani_state = "otie_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/newtailmaw - name = "new tailmaw (vwag)" - desc = "" - icon_state = "newtailmaw" - ani_state = "newtailmaw_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/ztail - name = "jagged flufftail" - desc = "" - icon_state = "ztail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/snaketail - name = "snake tail, colorable" - desc = "" - icon_state = "snaketail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/vulpan_alt - name = "vulpkanin alt style, colorable" - desc = "" - icon_state = "vulptail_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/sergaltaildc - name = "sergal, dual-color" - desc = "" - icon_state = "sergal" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "sergal_mark" - -/datum/sprite_accessory/tail/skunktail - name = "skunk, dual-color" - desc = "" - icon_state = "skunktail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "skunktail_mark" - -/datum/sprite_accessory/tail/deertail - name = "deer, dual-color" - desc = "" - icon_state = "deertail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "deertail_mark" - -/datum/sprite_accessory/tail/teshari_fluffytail - name = "Teshari alternative, colorable" - desc = "" - icon_state = "teshari_fluffytail" - extra_overlay = "teshari_fluffytail_mark" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -//For all species tails. Includes haircolored tails. -/datum/sprite_accessory/tail/special - name = "Blank tail. Do not select." - icon = 'icons/effects/species_tails_vr.dmi' - -/datum/sprite_accessory/tail/special/unathi - name = "unathi tail" - desc = "" - icon_state = "sogtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/tajaran - name = "tajaran tail" - desc = "" - icon_state = "tajtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/sergal - name = "sergal tail" - desc = "" - icon_state = "sergtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/akula - name = "akula tail" - desc = "" - icon_state = "sharktail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/nevrean - name = "nevrean tail" - desc = "" - icon_state = "nevreantail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/armalis - name = "armalis tail" - desc = "" - icon_state = "armalis_tail_humanoid_s" - -/datum/sprite_accessory/tail/special/xenodrone - name = "xenomorph drone tail" - desc = "" - icon_state = "xenos_drone_tail_s" - -/datum/sprite_accessory/tail/special/xenosentinel - name = "xenomorph sentinel tail" - desc = "" - icon_state = "xenos_sentinel_tail_s" - -/datum/sprite_accessory/tail/special/xenohunter - name = "xenomorph hunter tail" - desc = "" - icon_state = "xenos_hunter_tail_s" - -/datum/sprite_accessory/tail/special/xenoqueen - name = "xenomorph queen tail" - desc = "" - icon_state = "xenos_queen_tail_s" - -/datum/sprite_accessory/tail/special/monkey - name = "monkey tail" - desc = "" - icon_state = "chimptail_s" - -/datum/sprite_accessory/tail/special/seromitail - name = "seromi tail" - desc = "" - icon_state = "seromitail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/seromitailfeathered - name = "seromi tail w/ feathers" - desc = "" - icon_state = "seromitail_s" - extra_overlay = "seromitail_feathers_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/unathihc - name = "unathi tail, colorable" - desc = "" - icon_state = "sogtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/tajaranhc - name = "tajaran tail, colorable" - desc = "" - icon_state = "tajtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/sergalhc - name = "sergal tail, colorable" - desc = "" - icon_state = "sergtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/akulahc - name = "akula tail, colorable" - desc = "" - icon_state = "sharktail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/nevreanhc - name = "nevrean tail, colorable" - desc = "" - icon_state = "nevreantail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/foxhc - name = "highlander zorren tail, colorable" - desc = "" - icon_state = "foxtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/fennechc - name = "flatland zorren tail, colorable" - desc = "" - icon_state = "fentail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/armalishc - name = "armalis tail, colorable" - desc = "" - icon_state = "armalis_tail_humanoid_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenodronehc - name = "xenomorph drone tail, colorable" - desc = "" - icon_state = "xenos_drone_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenosentinelhc - name = "xenomorph sentinel tail, colorable" - desc = "" - icon_state = "xenos_sentinel_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenohunterhc - name = "xenomorph hunter tail, colorable" - desc = "" - icon_state = "xenos_hunter_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenoqueenhc - name = "xenomorph queen tail, colorable" - desc = "" - icon_state = "xenos_queen_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/monkeyhc - name = "monkey tail, colorable, colorable" - desc = "" - icon_state = "chimptail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/seromitailhc - name = "seromi tail, colorable" - desc = "" - icon_state = "seromitail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/seromitailfeatheredhc - name = "seromi tail w/ feathers, colorable" - desc = "" - icon_state = "seromitail_feathers_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/vulpan - name = "vulpkanin, colorable" - desc = "" - icon_state = "vulptail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - - -/datum/sprite_accessory/tail/zenghu_taj - name = "Zeng-Hu Tajaran Synth tail" - desc = "" - icon_state = "zenghu_taj" - -//Taurs moved to a separate file due to extra code around them - -//Buggo Abdomens! - -/datum/sprite_accessory/tail/buggo - name = "Bug abdomen, colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggobee - name = "Bug abdomen, bee top, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_markings" - -/datum/sprite_accessory/tail/buggobeefull - name = "Bug abdomen, bee full, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_markings" - -/datum/sprite_accessory/tail/buggounder - name = "Bug abdomen, underside, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_markings" - -/datum/sprite_accessory/tail/buggofirefly - name = "Bug abdomen, firefly, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_markings" - -/datum/sprite_accessory/tail/buggofat - name = "Fat bug abdomen, colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggofatbee - name = "Fat bug abdomen, bee top, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbee_markings" - -/datum/sprite_accessory/tail/buggofatbeefull - name = "Fat bug abdomen, bee full, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbeefull_markings" - -/datum/sprite_accessory/tail/buggofatunder - name = "Fat bug abdomen, underside, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatunder_markings" - -/datum/sprite_accessory/tail/buggofatfirefly - name = "Fat bug abdomen, firefly, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatfirefly_markings" - -/datum/sprite_accessory/tail/buggowag - name = "Bug abdomen, colorable, vwag change" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggobeewag - name = "Bug abdomen, bee top, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_markings" - extra_overlay_w = "buggofatbee_markings" - -/datum/sprite_accessory/tail/buggobeefullwag - name = "Bug abdomen, bee full, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_markings" - extra_overlay_w = "buggofatbeefull_markings" - -/datum/sprite_accessory/tail/buggounderwag - name = "Bug abdomen, underside, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_markings" - extra_overlay_w = "buggofatunder_markings" - -/datum/sprite_accessory/tail/buggofireflywag - name = "Bug abdomen, firefly, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_markings" - extra_overlay_w = "buggofatfirefly_markings" - -//Vass buggo variants! - -/datum/sprite_accessory/tail/buggovass - name = "Bug abdomen, vass, colorable" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggovassbee - name = "Bug abdomen, bee top, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_vass_markings" - -/datum/sprite_accessory/tail/buggovassbeefull - name = "Bug abdomen, bee full, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_vass_markings" - -/datum/sprite_accessory/tail/buggovassunder - name = "Bug abdomen, underside, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_vass_markings" - -/datum/sprite_accessory/tail/buggovassfirefly - name = "Bug abdomen, firefly, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_vass_markings" - -/datum/sprite_accessory/tail/buggovassfat - name = "Fat bug abdomen, vass, colorable" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggovassfatbee - name = "Fat bug abdomen, bee top, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbee_vass_markings" - -/datum/sprite_accessory/tail/buggovassfatbeefull - name = "Fat bug abdomen, bee full, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbeefull_vass_markings" - -/datum/sprite_accessory/tail/buggovassfatunder - name = "Fat bug abdomen, underside, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatunder_vass_markings" - -/datum/sprite_accessory/tail/buggovassfatfirefly - name = "Fat bug abdomen, firefly, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatfirefly_vass_markings" - -/datum/sprite_accessory/tail/buggovasswag - name = "Bug abdomen, vass, colorable, vwag change" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggovassbeewag - name = "Bug abdomen, bee top, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_vass_markings" - extra_overlay_w = "buggofatbee_vass_markings" - -/datum/sprite_accessory/tail/buggovassbeefullwag - name = "Bug abdomen, bee full, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_vass_markings" - extra_overlay_w = "buggofatbeefull_vass_markings" - -/datum/sprite_accessory/tail/buggovassunderwag - name = "Bug abdomen, underside, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_vass_markings" - extra_overlay_w = "buggofatunder_vass_markings" - -/datum/sprite_accessory/tail/buggovassfireflywag - name = "Bug abdomen, firefly, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_vass_markings" - extra_overlay_w = "buggofatfirefly_vass_markings" - -/datum/sprite_accessory/tail/tail_smooth - name = "Smooth Lizard Tail, Colorable" - desc = "" - icon_state = "tail_smooth" - ani_state = "tail_smooth_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY \ No newline at end of file +/* +//////////////////////////// +/ =--------------------= / +/ == Tail Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/tail + name = "You should not see this..." + icon = 'icons/mob/vore/tails_vr.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + +/datum/sprite_accessory/tail/New() + . = ..() + if(clip_mask_icon && clip_mask_state) + clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state) + +// Species-unique tails + +// Everyone tails + +/datum/sprite_accessory/tail/invisible + name = "hide species-sprite tail" + icon = null + icon_state = null + +/datum/sprite_accessory/tail/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/tail/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/tail/squirrel + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kitty + name = "kitty, colorable, downwards" + desc = "" + icon_state = "kittydown" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kittyup + name = "kitty, colorable, upwards" + desc = "" + icon_state = "kittyup" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/tiger_white + name = "tiger, colorable" + desc = "" + icon_state = "tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigerinnerwhite" + +/datum/sprite_accessory/tail/stripey + name = "stripey taj, colorable" + desc = "" + icon_state = "stripeytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "stripeytail_mark" + +/datum/sprite_accessory/tail/stripeytail_brown + name = "stripey taj, brown" + desc = "" + icon_state = "stripeytail-brown" + +/datum/sprite_accessory/tail/chameleon + name = "Chameleon, colorable" + desc = "" + icon_state = "chameleon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/bunny + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + +/datum/sprite_accessory/tail/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/tail/bear + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/dragon + name = "dragon, colorable" + desc = "" + icon_state = "dragon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/tail/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/tail/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/tail/blackwolf + name = "wolf, black" + desc = "" + icon_state = "wolf" + +/datum/sprite_accessory/tail/wolf + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/tail/mouse_pink + name = "mouse, pink" + desc = "" + icon_state = "mouse-pink" + +/datum/sprite_accessory/tail/mouse + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/horse + name = "horse tail, colorable" + desc = "" + icon_state = "horse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/cow + name = "cow tail, colorable" + desc = "" + icon_state = "cow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fantail + name = "avian fantail, colorable" + desc = "" + icon_state = "fantail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wagtail + name = "avian wagtail, colorable" + desc = "" + icon_state = "wagtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreandc + name = "nevrean tail, dual-color" + desc = "" + icon_state = "nevreantail_dc" + extra_overlay = "nevreantail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc + name = "nevrean wagtail, dual-color" + desc = "" + icon_state = "wagtail" + extra_overlay = "wagtail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc_alt + name = "nevrean wagtail, marked, dual-color" + desc = "" + icon_state = "wagtail2_dc" + extra_overlay = "wagtail2_dc_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/crossfox + name = "cross fox" + desc = "" + icon_state = "crossfox" + +/datum/sprite_accessory/tail/beethorax + name = "bee thorax" + desc = "" + icon_state = "beethorax" + +/datum/sprite_accessory/tail/doublekitsune + name = "double kitsune tail, colorable" + desc = "" + icon_state = "doublekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/spade_color + name = "spade-tail (colorable)" + desc = "" + icon_state = "spadetail-black" + do_colouration = 1 + +/datum/sprite_accessory/tail/snag + name = "xenomorph tail 1" + desc = "" + icon_state = "snag" + +/datum/sprite_accessory/tail/xenotail + name = "xenomorph tail 2" + desc = "" + icon_state = "xenotail" + +/datum/sprite_accessory/tail/eboop + name = "EGN mech tail (dual color)" + desc = "" + icon_state = "eboop" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "eboop_mark" + +/datum/sprite_accessory/tail/molenar_kitsune + name = "quintail kitsune tails (Molenar)" + desc = "" + icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/tail/miria_fluffdragon + name = "fluffdragon tail (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/tail/miria_kitsune + name = "Black kitsune tails (Miria Masters)" + desc = "" + icon_state = "miria-kitsunetail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/tail/molenar_deathclaw + name = "deathclaw bits (Molenar)" + desc = "" + icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar","silvertalismen","jertheace") + +/datum/sprite_accessory/tail/runac + name = "fennecsune tails (Runac)" + desc = "" + icon_state = "runac" + ckeys_allowed = list("rebcom1807") + +/datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail. + name = "fox tail (+ beewings) (Reika)" + desc = "" + icon_state = "reika" + ckeys_allowed = list("rikaru19xjenkins") + +/datum/sprite_accessory/tail/rosey + name = "tritail kitsune tails (Rosey)" + desc = "" + icon_state = "rosey_three" + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/tail/rosey2 + name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK + desc = "" + icon_state = "rosey_five" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/tail/scree + name = "green taj tail (Scree)" + desc = "" + icon_state = "scree" + ckeys_allowed = list("scree") + +/datum/sprite_accessory/tail/aronai + name = "aronai tail (Aronai)" + desc = "" + icon_state = "aronai" + ckeys_allowed = list("arokha") + +/datum/sprite_accessory/tail/cabletail + name = "cabletail" + desc = "cabletail" + icon_state = "cabletail" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/tail/featherfluff_tail + name = "featherfluff_tail" + desc = "" + icon_state = "featherfluff_tail" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/tail/ketrai_wag + name = "fennix tail (vwag)" + desc = "" + icon_state = "ketraitail" + ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. + +/datum/sprite_accessory/tail/ketrainew_wag + name = "new fennix tail (vwag)" + desc = "" + icon_state = "ketraitailnew" + ani_state = "ketraitailnew_w" + +/datum/sprite_accessory/tail/redpanda + name = "red panda" + desc = "" + icon_state = "redpanda" + +/datum/sprite_accessory/tail/ringtail + name = "ringtail, colorable" + desc = "" + icon_state = "ringtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ringtail_mark" + +/datum/sprite_accessory/tail/holly + name = "tigress tail (Holly)" + desc = "" + icon_state = "tigresstail" + ckeys_allowed = list("hoodoo") + +/datum/sprite_accessory/tail/satyr + name = "goat legs, colorable" + desc = "" + icon_state = "satyr" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +/datum/sprite_accessory/tail/tailmaw + name = "tailmaw, colorable" + desc = "" + icon_state = "tailmaw" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/tail/curltail + name = "curltail (vwag)" + desc = "" + icon_state = "curltail" + ani_state = "curltail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "curltail_mark" + extra_overlay_w = "curltail_mark_w" + +/datum/sprite_accessory/tail/shorttail + name = "shorttail (vwag)" + desc = "" + icon_state = "straighttail" + ani_state = "straighttail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sneptail + name = "Snep/Furry Tail (vwag)" + desc = "" + icon_state = "sneptail" + ani_state = "sneptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sneptail_mark" + extra_overlay_w = "sneptail_mark_w" + + +/datum/sprite_accessory/tail/tiger_new + name = "tiger tail (vwag)" + desc = "" + icon_state = "tigertail" + ani_state = "tigertail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigertail_mark" + extra_overlay_w = "tigertail_mark_w" + +/datum/sprite_accessory/tail/vulp_new + name = "new vulp tail (vwag)" + desc = "" + icon_state = "vulptail" + ani_state = "vulptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulptail_mark" + extra_overlay_w = "vulptail_mark_w" + +/datum/sprite_accessory/tail/otietail + name = "otie tail (vwag)" + desc = "" + icon_state = "otie" + ani_state = "otie_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/newtailmaw + name = "new tailmaw (vwag)" + desc = "" + icon_state = "newtailmaw" + ani_state = "newtailmaw_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/ztail + name = "jagged flufftail" + desc = "" + icon_state = "ztail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/snaketail + name = "snake tail, colorable" + desc = "" + icon_state = "snaketail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/vulpan_alt + name = "vulpkanin alt style, colorable" + desc = "" + icon_state = "vulptail_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sergaltaildc + name = "sergal, dual-color" + desc = "" + icon_state = "sergal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sergal_mark" + +/datum/sprite_accessory/tail/skunktail + name = "skunk, dual-color" + desc = "" + icon_state = "skunktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "skunktail_mark" + +/datum/sprite_accessory/tail/deertail + name = "deer, dual-color" + desc = "" + icon_state = "deertail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deertail_mark" + +/datum/sprite_accessory/tail/tesh_feathered + name = "Teshari tail" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + extra_overlay = "teshtail_feathers_s" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_fluffytail_mark" + +/datum/sprite_accessory/tail/tesh_pattern_male + name = "Teshari male tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_tail" + +/datum/sprite_accessory/tail/tesh_pattern_male_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_alt" + +/datum/sprite_accessory/tail/tesh_pattern_fem + name = "Teshari female tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_tail" + +/datum/sprite_accessory/tail/tesh_pattern_fem_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_alt" + +/datum/sprite_accessory/tail/nightstalker + name = "Nightstalker, colorable" + desc = "" + icon_state = "nightstalker" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +//For all species tails. Includes haircolored tails. +/datum/sprite_accessory/tail/special + name = "Blank tail. Do not select." + icon = 'icons/effects/species_tails_vr.dmi' + +/datum/sprite_accessory/tail/special/unathi + name = "unathi tail" + desc = "" + icon_state = "sogtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaran + name = "tajaran tail" + desc = "" + icon_state = "tajtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/sergal + name = "sergal tail" + desc = "" + icon_state = "sergtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akula + name = "akula tail" + desc = "" + icon_state = "sharktail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevrean + name = "nevrean tail" + desc = "" + icon_state = "nevreantail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalis + name = "armalis tail" + desc = "" + icon_state = "armalis_tail_humanoid_s" + +/datum/sprite_accessory/tail/special/xenodrone + name = "xenomorph drone tail" + desc = "" + icon_state = "xenos_drone_tail_s" + +/datum/sprite_accessory/tail/special/xenosentinel + name = "xenomorph sentinel tail" + desc = "" + icon_state = "xenos_sentinel_tail_s" + +/datum/sprite_accessory/tail/special/xenohunter + name = "xenomorph hunter tail" + desc = "" + icon_state = "xenos_hunter_tail_s" + +/datum/sprite_accessory/tail/special/xenoqueen + name = "xenomorph queen tail" + desc = "" + icon_state = "xenos_queen_tail_s" + +/datum/sprite_accessory/tail/special/monkey + name = "monkey tail" + desc = "" + icon_state = "chimptail_s" + +/datum/sprite_accessory/tail/special/unathihc + name = "unathi tail, colorable" + desc = "" + icon_state = "sogtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaranhc + name = "tajaran tail, colorable" + desc = "" + icon_state = "tajtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/sergalhc + name = "sergal tail, colorable" + desc = "" + icon_state = "sergtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akulahc + name = "akula tail, colorable" + desc = "" + icon_state = "sharktail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevreanhc + name = "nevrean tail, colorable" + desc = "" + icon_state = "nevreantail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/foxhc + name = "highlander zorren tail, colorable" + desc = "" + icon_state = "foxtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/fennechc + name = "flatland zorren tail, colorable" + desc = "" + icon_state = "fentail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalishc + name = "armalis tail, colorable" + desc = "" + icon_state = "armalis_tail_humanoid_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenodronehc + name = "xenomorph drone tail, colorable" + desc = "" + icon_state = "xenos_drone_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenosentinelhc + name = "xenomorph sentinel tail, colorable" + desc = "" + icon_state = "xenos_sentinel_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenohunterhc + name = "xenomorph hunter tail, colorable" + desc = "" + icon_state = "xenos_hunter_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenoqueenhc + name = "xenomorph queen tail, colorable" + desc = "" + icon_state = "xenos_queen_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/monkeyhc + name = "monkey tail, colorable" + desc = "" + icon_state = "chimptail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/vulpan + name = "vulpkanin, colorable" + desc = "" + icon_state = "vulptail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/tail/zenghu_taj + name = "Zeng-Hu Tajaran Synth tail" + desc = "" + icon_state = "zenghu_taj" + +//Taurs moved to a separate file due to extra code around them + +//Buggo Abdomens! + +/datum/sprite_accessory/tail/buggo + name = "Bug abdomen, colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobee + name = "Bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + +/datum/sprite_accessory/tail/buggobeefull + name = "Bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + +/datum/sprite_accessory/tail/buggounder + name = "Bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + +/datum/sprite_accessory/tail/buggofirefly + name = "Bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + +/datum/sprite_accessory/tail/buggofat + name = "Fat bug abdomen, colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggofatbee + name = "Fat bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggofatbeefull + name = "Fat bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggofatunder + name = "Fat bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofatfirefly + name = "Fat bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_markings" + +/datum/sprite_accessory/tail/buggowag + name = "Bug abdomen, colorable, vwag change" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobeewag + name = "Bug abdomen, bee top, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + extra_overlay_w = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggobeefullwag + name = "Bug abdomen, bee full, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + extra_overlay_w = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggounderwag + name = "Bug abdomen, underside, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + extra_overlay_w = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofireflywag + name = "Bug abdomen, firefly, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + extra_overlay_w = "buggofatfirefly_markings" + +//Vass buggo variants! + +/datum/sprite_accessory/tail/buggovass + name = "Bug abdomen, vass, colorable" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbee + name = "Bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefull + name = "Bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunder + name = "Bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfirefly + name = "Bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovassfat + name = "Fat bug abdomen, vass, colorable" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassfatbee + name = "Fat bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatbeefull + name = "Fat bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatunder + name = "Fat bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatfirefly + name = "Fat bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovasswag + name = "Bug abdomen, vass, colorable, vwag change" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbeewag + name = "Bug abdomen, bee top, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + extra_overlay_w = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefullwag + name = "Bug abdomen, bee full, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + extra_overlay_w = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunderwag + name = "Bug abdomen, underside, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + extra_overlay_w = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfireflywag + name = "Bug abdomen, firefly, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + extra_overlay_w = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/tail_smooth + name = "Smooth Lizard Tail, colorable" + desc = "" + icon_state = "tail_smooth" + ani_state = "tail_smooth_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/triplekitsune_colorable + name = "Kitsune 3 tails, colorable" + desc = "" + icon_state = "triplekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "triplekitsune_tips" + +/datum/sprite_accessory/tail/ninekitsune_colorable + name = "Kitsune 9 tails, colorable" + desc = "" + icon_state = "ninekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ninekitsune-tips" + +/datum/sprite_accessory/tail/shadekin_short + name = "Shadekin Short Tail, colorable" + desc = "" + icon_state = "shadekin-short" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts + name = "Ward-Takahashi Tail" + desc = "" + icon_state = "wardtakahashi_vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wartacosushi_tail_dc + name = "Ward-Takahashi Tail, dual-color" + desc = "" + icon_state = "wardtakahashi_vulp_dc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wardtakahashi_vulp_dc_mark" + +/datum/sprite_accessory/tail/Easterntail + name = "Eastern Dragon (Animated)" + desc = "" + icon_state = "Easterntail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "EasterntailColorTip" + ani_state = "Easterntail_w" + extra_overlay_w = "EasterntailColorTip_w" + +/datum/sprite_accessory/tail/synthtail_static + name = "Synthetic lizard tail" + desc = "" + icon_state = "synthtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/synthtail_vwag + name = "Synthetic lizard tail (vwag)" + desc = "" + icon_state = "synthtail" + ani_state = "synthtail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/Plugtail + name = "Synthetic plug tail" + desc = "" + icon_state = "Plugtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "PlugtailMarking" + extra_overlay2 = "PlugtailMarking2" + +/datum/sprite_accessory/tail/Segmentedtail + name = "Segmented tail, animated" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedtailmarking" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedtailmarking_w" + +/datum/sprite_accessory/tail/Segmentedlights + name = "Segmented tail, animated synth" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedlights" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedlights_w" + +/datum/sprite_accessory/tail/fox_tail + name = "Fox tail" + desc = "" + icon_state = "fox_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fox_tail_plain + name = "Fox tail" + desc = "" + icon_state = "fox_tail_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fennec_tail + name = "Fennec tail" + desc = "" + icon_state = "fennec_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_smooth + name = "Lizard Tail (Smooth)" + desc = "" + icon_state = "lizard_tail_smooth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_dark_tiger + name = "Lizard Tail (Dark Tiger)" + desc = "" + icon_state = "lizard_tail_dark_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_light_tiger + name = "Lizard Tail (Light Tiger)" + desc = "" + icon_state = "lizard_tail_light_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_spiked + name = "Lizard Tail (Spiked)" + desc = "" + icon_state = "lizard_tail_spiked" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotail_fullcolour + name = "xenomorph tail (fully colourable)" + desc = "" + icon_state = "xenotail_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotailalt_fullcolour + name = "xenomorph tail alt. (fully colourable)" + desc = "" + icon_state = "xenotailalt_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/peacocktail_red //this is ckey locked for now, but prettiebyrd wants these tails to be unlocked at a later date + name = "Peacock tail (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "peacocktail_red" + ani_state = "peacocktail_red_w" + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/peacocktail //ditto + name = "Peacock tail, colorable (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "peacocktail" + ani_state = "peacocktail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/tentacle + name = "Tentacle, colorable (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "tentacle" + ani_state = "tentacle_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm new file mode 100644 index 0000000000..748a6904b4 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -0,0 +1,349 @@ +/datum/riding/taur + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! + nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. + key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. + only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. + +/datum/riding/taur/handle_vehicle_layer() + if(ridden.has_buckled_mobs()) + ridden.layer = initial(ridden.layer) + else + var/mob/living/L = ridden + if(!(istype(L) && (L.status_flags & HIDING))) + ridden.layer = initial(ridden.layer) + +/datum/riding/taur/ride_check(mob/living/M) + var/mob/living/L = ridden + if(L.stat) + force_dismount(M) + return FALSE + return TRUE + +/datum/riding/taur/force_dismount(mob/M) + . = ..() + ridden.visible_message("[M] stops riding [ridden]!") + +//Hoooo boy. +/datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) + var/mob/living/L = ridden + var/scale_x = L.icon_scale_x + var/scale_y = L.icon_scale_y + + var/list/values = list( + "[NORTH]" = list(0, 8*scale_y, ABOVE_MOB_LAYER), + "[SOUTH]" = list(0, 8*scale_y, BELOW_MOB_LAYER), + "[EAST]" = list(-10*scale_x, 8*scale_y, ABOVE_MOB_LAYER), + "[WEST]" = list(10*scale_x, 8*scale_y, ABOVE_MOB_LAYER)) + + return values + +//Human overrides for taur riding +/mob/living/carbon/human + max_buckled_mobs = 1 //Yeehaw + can_buckle = TRUE + buckle_movable = TRUE + buckle_lying = FALSE + +/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) + if(forced) + return ..() // Skip our checks + if(!isTaurTail(tail_style)) + return FALSE + else + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(!taurtype.can_ride) + return FALSE + if(lying) + return FALSE + if(!ishuman(M)) + return FALSE + if(M in buckled_mobs) + return FALSE +// if(M.size_multiplier > size_multiplier * 1.2) +// to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.") +// return FALSE + if(M.loc != src.loc) + if(M.Adjacent(src)) + M.forceMove(get_turf(src)) + + var/mob/living/carbon/human/H = M + + if(isTaurTail(H.tail_style)) + to_chat(src,"Too many legs. TOO MANY LEGS!!") + return FALSE + + . = ..() + if(.) + buckled_mobs[M] = "riding" + +/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. + return + +/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) + set name = "Taur Mount/Dismount" + set category = "Abilities" + set desc = "Let people ride on you." + + if(LAZYLEN(buckled_mobs)) + var/datum/riding/R = riding_datum + for(var/rider in buckled_mobs) + R.force_dismount(rider) + return + if (stat != CONSCIOUS) + return + if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) + return + if(buckle_mob(M)) + visible_message("[M] starts riding [name]!") + +/mob/living/carbon/human/attack_hand(mob/user as mob) + if(LAZYLEN(buckled_mobs)) + //We're getting off! + if(user in buckled_mobs) + riding_datum.force_dismount(user) + //We're kicking everyone off! + if(user == src) + for(var/rider in buckled_mobs) + riding_datum.force_dismount(rider) + else + . = ..() + +/* +//////////////////////////// +/ =--------------------= / +/ == Taur Definitions == / +/ =--------------------= / +//////////////////////////// +*/ + +// Taur sprites are now a subtype of tail since they are mutually exclusive anyway. + +/datum/sprite_accessory/tail/taur + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + do_colouration = 1 // Yes color, using tail color + color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY + + var/icon/suit_sprites = null //File for suit sprites, if any. + var/icon/under_sprites = null + + var/icon_sprite_tag // This is where we put stuff like _Horse, so we can assign icons easier. + + var/can_ride = FALSE //whether we're real rideable taur or just in that category. + + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +// Species-unique long tails/taurhalves + +// Tails/taurhalves for everyone + +/datum/sprite_accessory/tail/taur/wolf + name = "Wolf (Taur)" + icon_state = "wolf_s" + under_sprites = 'icons/mob/taursuits_wolf.dmi' + suit_sprites = 'icons/mob/taursuits_wolf.dmi' + icon_sprite_tag = "wolf" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/fatwolf + name = "Fat Wolf (Taur)" + icon_state = "fatwolf_s" + icon_sprite_tag = "wolf" //This could be modified later. + +/datum/sprite_accessory/tail/taur/wolf/wolf_2c + name = "Wolf dual-color (Taur)" + icon_state = "wolf_s" + extra_overlay = "wolf_markings" + //icon_sprite_tag = "wolf2c" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c + name = "Fat Wolf dual-color (Taur)" + icon_state = "fatwolf_s" + extra_overlay = "fatwolf_markings" + //icon_sprite_tag = "fatwolf2c" + +/datum/sprite_accessory/tail/taur/wolf/synthwolf + name = "SynthWolf dual-color (Taur)" + icon_state = "synthwolf_s" + extra_overlay = "synthwolf_markings" + //icon_sprite_tag = "synthwolf" + +/datum/sprite_accessory/tail/taur/naga + name = "Naga (Taur)" + icon_state = "naga_s" + suit_sprites = 'icons/mob/taursuits_naga.dmi' + //icon_sprite_tag = "naga" + +/datum/sprite_accessory/tail/taur/naga/naga_2c + name = "Naga dual-color (Taur)" + icon_state = "naga_s" + extra_overlay = "naga_markings" + //icon_sprite_tag = "naga2c" + +/datum/sprite_accessory/tail/taur/horse + name = "Horse (Taur)" + icon_state = "horse_s" + under_sprites = 'icons/mob/taursuits_horse.dmi' + suit_sprites = 'icons/mob/taursuits_horse.dmi' + icon_sprite_tag = "horse" + +/datum/sprite_accessory/tail/taur/horse/synthhorse + name = "SynthHorse dual-color (Taur)" + icon_state = "synthhorse_s" + extra_overlay = "synthhorse_markings" + //icon_sprite_tag = "synthhorse" + +/datum/sprite_accessory/tail/taur/cow + name = "Cow (Taur)" + icon_state = "cow_s" + suit_sprites = 'icons/mob/taursuits_cow.dmi' + icon_sprite_tag = "cow" + +/datum/sprite_accessory/tail/taur/deer + name = "Deer dual-color (Taur)" + icon_state = "deer_s" + extra_overlay = "deer_markings" + suit_sprites = 'icons/mob/taursuits_deer.dmi' + icon_sprite_tag = "deer" + +/datum/sprite_accessory/tail/taur/lizard + name = "Lizard (Taur)" + icon_state = "lizard_s" + suit_sprites = 'icons/mob/taursuits_lizard.dmi' + icon_sprite_tag = "lizard" + +/datum/sprite_accessory/tail/taur/lizard/lizard_2c + name = "Lizard dual-color (Taur)" + icon_state = "lizard_s" + extra_overlay = "lizard_markings" + //icon_sprite_tag = "lizard2c" + +/datum/sprite_accessory/tail/taur/lizard/synthlizard + name = "SynthLizard dual-color (Taur)" + icon_state = "synthlizard_s" + extra_overlay = "synthlizard_markings" + //icon_sprite_tag = "synthlizard" + +/datum/sprite_accessory/tail/taur/spider + name = "Spider (Taur)" + icon_state = "spider_s" + suit_sprites = 'icons/mob/taursuits_spider.dmi' + icon_sprite_tag = "spider" + +/datum/sprite_accessory/tail/taur/tents + name = "Tentacles (Taur)" + icon_state = "tent_s" + icon_sprite_tag = "tentacle" + can_ride = 0 + +/datum/sprite_accessory/tail/taur/feline + name = "Feline (Taur)" + icon_state = "feline_s" + suit_sprites = 'icons/mob/taursuits_feline.dmi' + icon_sprite_tag = "feline" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/fatfeline + name = "Fat Feline (Taur)" + icon_state = "fatfeline_s" + //icon_sprite_tag = "fatfeline" + +/datum/sprite_accessory/tail/taur/fatfeline_wag + name = "Fat Feline (Taur) (vwag)" + icon_state = "fatfeline_s" + ani_state = "fatfeline_w" + +/datum/sprite_accessory/tail/taur/feline/feline_2c + name = "Feline dual-color (Taur)" + icon_state = "feline_s" + extra_overlay = "feline_markings" + //icon_sprite_tag = "feline2c" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/feline/fatfeline_2c + name = "Fat Feline dual-color (Taur)" + icon_state = "fatfeline_s" + extra_overlay = "fatfeline_markings" + //icon_sprite_tag = "fatfeline2c" + +/datum/sprite_accessory/tail/taur/feline/synthfeline + name = "SynthFeline dual-color (Taur)" + icon_state = "synthfeline_s" + extra_overlay = "synthfeline_markings" + //icon_sprite_tag = "synthfeline" + +/datum/sprite_accessory/tail/taur/slug + name = "Slug (Taur)" + icon_state = "slug_s" + suit_sprites = 'icons/mob/taursuits_slug.dmi' + icon_sprite_tag = "slug" + +/datum/sprite_accessory/tail/taur/frog + name = "Frog (Taur)" + icon_state = "frog_s" + icon_sprite_tag = "frog" + +/datum/sprite_accessory/tail/taur/thicktentacles + name = "Thick Tentacles (Taur)" + icon_state = "tentacle_s" + can_ride = 0 + icon_sprite_tag = "thick_tentacles" + +/datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above. + name = "Drake (Taur)" + icon_state = "drake_s" + extra_overlay = "drake_markings" + suit_sprites = 'icons/mob/taursuits_drake.dmi' + icon_sprite_tag = "drake" + +/datum/sprite_accessory/tail/taur/otie + name = "Otie (Taur)" + icon_state = "otie_s" + extra_overlay = "otie_markings" + suit_sprites = 'icons/mob/taursuits_otie.dmi' + icon_sprite_tag = "otie" + +/datum/sprite_accessory/tail/taur/alraune/alraune_2c + name = "Alraune (dual color)" + icon_state = "alraunecolor_s" + ani_state = "alraunecolor_closed_s" + ckeys_allowed = null + do_colouration = 1 + extra_overlay = "alraunecolor_markings" + extra_overlay_w = "alraunecolor_closed_markings" + clip_mask_state = "taur_clip_mask_alraune" + icon_sprite_tag = "alraune" + +/datum/sprite_accessory/tail/taur/wasp + name = "Wasp (dual color)" + icon_state = "wasp_s" + extra_overlay = "wasp_markings" + clip_mask_state = "taur_clip_mask_wasp" + icon_sprite_tag = "wasp" + +/datum/sprite_accessory/tail/taur/mermaid + name = "Mermaid (Taur)" + icon_state = "mermaid_s" + can_ride = 0 + icon_sprite_tag = "mermaid" + +/datum/sprite_accessory/tail/taur/shadekin_tail + name = "Shadekin Tail" + icon_state = "shadekin_s" + can_ride = 0 + hide_body_parts = null + clip_mask_icon = null + clip_mask_state = null + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c + name = "Shadekin Tail (dual color)" + extra_overlay = "shadekin_markings" + +/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long + name = "Shadekin Long Tail" + icon_state = "shadekin_long_s" diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm similarity index 88% rename from code/modules/vore/appearance/sprite_accessories_taur_vr.dm rename to code/modules/mob/new_player/sprite_accessories_taur_vr.dm index 0c40c24f29..c9e451c625 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -1,117 +1,3 @@ -/datum/riding/taur - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! - nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. - key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. - only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. - -/datum/riding/taur/handle_vehicle_layer() - if(ridden.has_buckled_mobs()) - ridden.layer = initial(ridden.layer) - else - var/mob/living/L = ridden - if(!(istype(L) && (L.status_flags & HIDING))) - ridden.layer = initial(ridden.layer) - -/datum/riding/taur/ride_check(mob/living/M) - var/mob/living/L = ridden - if(L.stat) - force_dismount(M) - return FALSE - return TRUE - -/datum/riding/taur/force_dismount(mob/M) - . = ..() - ridden.visible_message("[M] stops riding [ridden]!") - -//Hoooo boy. -/datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) - var/mob/living/L = ridden - var/scale = L.size_multiplier - - var/list/values = list( - "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), - "[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER), - "[EAST]" = list(-10*scale, 8*scale, ABOVE_MOB_LAYER), - "[WEST]" = list(10*scale, 8*scale, ABOVE_MOB_LAYER)) - - return values - -//Human overrides for taur riding -/mob/living/carbon/human - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - -/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) - if(forced) - return ..() // Skip our checks - if(!isTaurTail(tail_style)) - return FALSE - else - var/datum/sprite_accessory/tail/taur/taurtype = tail_style - if(!taurtype.can_ride) - return FALSE - if(lying) - return FALSE - if(!ishuman(M)) - return FALSE - if(M in buckled_mobs) - return FALSE - if(M.size_multiplier > size_multiplier * 1.2) - to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.") - return FALSE - if(M.loc != src.loc) - if(M.Adjacent(src)) - M.forceMove(get_turf(src)) - - var/mob/living/carbon/human/H = M - - if(isTaurTail(H.tail_style)) - var/datum/sprite_accessory/tail/taur/ridertype = H.tail_style - if(ridertype.can_ride) - if(istype(ridertype, /datum/sprite_accessory/tail/taur/naga) || istype(ridertype, /datum/sprite_accessory/tail/taur/slug)) - to_chat(src,"Too few legs. TOO FEW LEGS!!") - return FALSE - to_chat(src,"Too many legs. TOO MANY LEGS!!") - return FALSE - - . = ..() - if(.) - buckled_mobs[M] = "riding" - -/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. - return - -/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) - set name = "Taur Mount/Dismount" - set category = "Abilities" - set desc = "Let people ride on you." - - if(LAZYLEN(buckled_mobs)) - var/datum/riding/R = riding_datum - for(var/rider in buckled_mobs) - R.force_dismount(rider) - return - if (stat != CONSCIOUS) - return - if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) - return - if(buckle_mob(M)) - visible_message("[M] starts riding [name]!") - -/mob/living/carbon/human/attack_hand(mob/user as mob) - if(LAZYLEN(buckled_mobs)) - //We're getting off! - if(user in buckled_mobs) - riding_datum.force_dismount(user) - //We're kicking everyone off! - if(user == src) - for(var/rider in buckled_mobs) - riding_datum.force_dismount(rider) - else - . = ..() - /* //////////////////////////// / =--------------------= / @@ -128,12 +14,7 @@ do_colouration = 1 // Yes color, using tail color color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY - var/icon/suit_sprites = null //File for suit sprites, if any. - var/icon/under_sprites = null - - var/icon_sprite_tag // This is where we put stuff like _Horse, so we can assign icons easier. - - var/can_ride = 1 //whether we're real rideable taur or just in that category + can_ride = TRUE //whether we're real rideable taur or just in that category //Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to //duplicate all the messages, and it starts getting awkward. These are singletons, anyway! @@ -603,6 +484,28 @@ name = "Shadekin Long Tail" icon_state = "shadekin_long_s" +/datum/sprite_accessory/tail/taur/pawcow // this grabs suit sprites from the normal cow, the outline is the same + name = "Cow w/ paws (Taur)" + icon_state = "pawcow_s" + extra_overlay = "pawcow_markings" + suit_sprites = 'icons/mob/taursuits_cow_vr.dmi' + icon_sprite_tag = "cow" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your paw!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their paw!" + + msg_owner_disarm_walk = "You firmly push your paw down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their paw down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your paw down upon %prey's body, slowly applying pressure, crushing them against the floor below!" + msg_prey_harm_walk = "%owner methodically places their paw upon your body, slowly applying pressure, crushing you against the floor below!" + + msg_owner_grab_success = "You pin %prey to the ground before scooping them up with your paws!" + msg_prey_grab_success = "%owner pins you to the ground before scooping you up with their paws!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their paw, forcing you down to the ground!" + // Special snowflake tails/taurhalves //spoopylizz: Roiz Lizden diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 6baf801552..ce783bcddb 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -6,8 +6,6 @@ /datum/sprite_accessory/hair - //var/icon_add = 'icons/mob/human_face.dmi' //Already defined in sprite_accessories.dm line 49. - var/color_blend_mode = ICON_MULTIPLY species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_SHADEKIN_YW) //This lets all races use the default hairstyles. astolfo @@ -526,7 +524,7 @@ /datum/sprite_accessory/facial_hair icon = 'icons/mob/human_face_or_vr.dmi' - var/color_blend_mode = ICON_MULTIPLY + color_blend_mode = ICON_MULTIPLY species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the facial hair styles. shaved @@ -605,739 +603,29 @@ species_allowed = list(SPECIES_VULPKANIN) gender = NEUTER -//VOREStation Body Markings and Overrides -//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD - -/datum/sprite_accessory/marking //Override for base markings - var/color_blend_mode = ICON_ADD - -/datum/sprite_accessory/marking/vr - icon = 'icons/mob/human_races/markings_vr.dmi' - - vulp_belly - name = "belly fur (Vulp)" - icon_state = "vulp_belly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_fullbelly - name = "full belly fur (Vulp)" - icon_state = "vulp_fullbelly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_crest - name = "belly crest (Vulp)" - icon_state = "vulp_crest" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_nose - name = "nose (Vulp)" - icon_state = "vulp_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_short_nose - name = "nose, short (Vulp)" - icon_state = "vulp_short_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - snoutstripe - name = "snout stripe (Vulp)" - icon_state = "snoutstripe" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_face - name = "face (Vulp)" - icon_state = "vulp_face" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_facealt - name = "face, alt. (Vulp)" - icon_state = "vulp_facealt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_earsface - name = "ears and face (Vulp)" - icon_state = "vulp_earsface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_all - name = "all head highlights (Vulp)" - icon_state = "vulp_all" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sergal_full - name = "Sergal Markings" - icon_state = "sergal_full" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - species_allowed = list("Sergal") - - sergal_full_female - name = "Sergal Markings (Female)" - icon_state = "sergal_full_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - species_allowed = list("Sergal") - - monoeye - name = "Monoeye" - icon_state = "monoeye" - body_parts = list(BP_HEAD) - - spidereyes - name = "Spider Eyes" - icon_state = "spidereyes" - body_parts = list(BP_HEAD) - - sergaleyes - name = "Sergal Eyes" - icon_state = "eyes_sergal" - body_parts = list(BP_HEAD) - - closedeyes - name = "Closed Eyes" - icon_state = "eyes_closed" - body_parts = list(BP_HEAD) - - brows - name = "Eyebrows" - icon_state = "brows" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - nevrean_female - name = "Female Nevrean beak" - icon_state = "nevrean_f" - body_parts = list(BP_HEAD) - color_blend_mode = ICON_MULTIPLY - gender = FEMALE - - nevrean_male - name = "Male Nevrean beak" - icon_state = "nevrean_m" - body_parts = list(BP_HEAD) - color_blend_mode = ICON_MULTIPLY - gender = MALE - - spots - name = "Spots" - icon_state = "spots" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - shaggy_mane - name = "Shaggy mane/feathers" - icon_state = "shaggy" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - jagged_teeth - name = "Jagged teeth" - icon_state = "jagged" - body_parts = list(BP_HEAD) - - blank_face - name = "Blank round face (use with monster mouth)" - icon_state = "blankface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - monster_mouth - name = "Monster mouth" - icon_state = "monster" - body_parts = list(BP_HEAD) - - saber_teeth - name = "Saber teeth" - icon_state = "saber" - body_parts = list(BP_HEAD) - - fangs - name = "Fangs" - icon_state = "fangs" - body_parts = list(BP_HEAD) - - tusks - name = "Tusks" - icon_state = "tusks" - body_parts = list(BP_HEAD) - - otie_face - name = "Otie face" - icon_state = "otieface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otie_nose - name = "Otie nose" - icon_state = "otie_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otienose_lite - name = "Short otie nose" - icon_state = "otienose_lite" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - backstripes - name = "Back stripes" - icon_state = "otiestripes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_HEAD) - - belly_butt - name = "Belly and butt" - icon_state = "bellyandbutt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO) - - fingers_toes - name = "Fingers and toes" - icon_state = "fingerstoes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - otie_socks - name = "Fingerless socks" - icon_state = "otiesocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - corvid_beak - name = "Corvid beak" - icon_state = "corvidbeak" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - corvid_belly - name = "Corvid belly" - icon_state = "corvidbelly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) - - cow_body - name = "Cow markings" - icon_state = "cowbody" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - cow_nose - name = "Cow nose" - icon_state = "cownose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - zmask - name = "Eye mask" - icon_state = "zmask" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - zbody - name = "Thick jagged stripes" - icon_state = "zbody" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) - - znose - name = "Jagged snout" - icon_state = "znose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otter_nose - name = "Otter nose" - icon_state = "otternose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otter_face - name = "Otter face" - icon_state = "otterface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - deer_face - name = "Deer face" - icon_state = "deerface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sharkface - name = "Akula snout" - icon_state = "sharkface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sheppy_face - name = "Shepherd snout" - icon_state = "shepface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sheppy_back - name = "Shepherd back" - icon_state = "shepback" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_belly_male - name = "Zorren Male Torso" - icon_state = "zorren_belly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_belly_female - name = "Zorren Female Torso" - icon_state = "zorren_belly_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_back_patch - name = "Zorren Back Patch" - icon_state = "zorren_backpatch" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - zorren_face_male - name = "Zorren Male Face" - icon_state = "zorren_face" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = MALE - - zorren_face_female - name = "Zorren Female Face" - icon_state = "zorren_face_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = FEMALE - - zorren_muzzle_male - name = "Zorren Male Muzzle" - icon_state = "zorren_muzzle" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = MALE - - zorren_muzzle_female - name = "Zorren Female Muzzle" - icon_state = "zorren_muzzle_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = FEMALE - - zorren_socks - name = "Zorren Socks" - icon_state = "zorren_socks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - zorren_longsocks - name = "Zorren Longsocks" - icon_state = "zorren_longsocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - tesh_feathers - name = "Teshari Feathers" - icon_state = "tesh-feathers" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - harpy_feathers - name = "Rapala leg Feather" - icon_state = "harpy-feathers" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG) - - harpy_legs - name = "Rapala leg coloring" - icon_state = "harpy-leg" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - - chooves - name = "Cloven hooves" - icon_state = "chooves" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - alurane - name = "Alurane Body" - icon_state = "alurane" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - ckeys_allowed = list("natje") - - body_tone - name = "Body toning (for emergency contrast loss)" - icon_state = "btone" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - gloss - name = "Full body gloss" - icon_state = "gloss" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - eboop_panels - name = "Eggnerd FBP panels" - icon_state = "eboop" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - osocks_rarm - name = "Modular Longsock (right arm)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_ARM,BP_R_HAND) - - osocks_larm - name = "Modular Longsock (left arm)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_ARM,BP_L_HAND) - - osocks_rleg - name = "Modular Longsock (right leg)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_FOOT,BP_R_LEG) - - osocks_lleg - name = "Modular Longsock (left leg)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_L_LEG) - - animeeyesinner - name = "Anime Eyes Inner" - icon_state = "animeeyesinner" - body_parts = list(BP_HEAD) - - animeeyesouter - name = "Anime Eyes Outer" - icon_state = "animeeyesouter" - body_parts = list(BP_HEAD) - - panda_eye_marks - name = "Panda Eye Markings" - icon_state = "eyes_panda" - body_parts = list(BP_HEAD) - species_allowed = list("Human") - - catwomantorso - name = "Catwoman chest stripes" - icon_state = "catwomanchest" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - catwomangroin - name = "Catwoman groin stripes" - icon_state = "catwomangroin" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN) - - catwoman_rleg - name = "Catwoman right leg stripes" - icon_state = "catwomanright" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_LEG) - - catwoman_lleg - name = "Catwoman left leg stripes" - icon_state = "catwomanleft" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG) - - teshi_small_feathers - name = "Teshari small wingfeathers" - icon_state = "teshi_sf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) - - spirit_lights - name = "Ward - Spirit FBP Lights" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) - - spirit_lights_body - name = "Ward - Spirit FBP Lights (body)" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) - - spirit_lights_head - name = "Ward - Spirit FBP Lights (head)" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - spirit_panels - name = "Ward - Spirit FBP Panels" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - spirit_panels_body - name = "Ward - Spirit FBP Panels (body)" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - spirit_panels_head - name = "Ward - Spirit FBP Panels (head)" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - tentacle_head - name = "Squid Head" - icon_state = "tentaclehead" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - tentacle_mouth - name = "Tentacle Mouth" - icon_state = "tentaclemouth" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - rosette - name = "Rosettes" - icon_state = "rosette" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - werewolf_nose - name = "Werewolf nose" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_face - name = "Werewolf face" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_belly - name = "Werewolf belly" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_socks - name = "Werewolf socks" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list(SPECIES_WEREBEAST) - - shadekin_snoot - name = "Shadekin Snoot" - icon_state = "shadekin-snoot" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_SHADEKIN_YW) //YW edits - - taj_nose_alt - name = "Nose Color, alt. (Taj)" - icon_state = "taj_nosealt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - talons - name = "Talons" - icon_state = "talons" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - - claws - name = "Claws" - icon_state = "claws" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_HAND,BP_R_HAND) - - equine_snout //Why the long face? Works best with sergal bodytype. - name = "Equine Snout" - icon_state = "donkey" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - equine_nose - name = "Equine Nose" - icon_state = "dnose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - bee_stripes - name = "bee stripes" - icon_state = "beestripes" - body_parts = list(BP_TORSO,BP_GROIN) - - vas_toes - name = "Bug Paws (Vasilissan)" - icon_state = "vas_toes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - //CitRP stuff - vox_alt - name = "Vox Alternate" - icon_state = "bay_vox" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_VOX) - - vox_alt_eyes - name = "Alternate Vox Eyes" - icon_state = "bay_vox_eyes" - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_VOX) - - c_beast_body - name = "Cyber Body" - icon_state = "c_beast_body" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN) - - c_beast_plating - name = "Cyber Plating (Use w/ Cyber Body)" - icon_state = "c_beast_plating" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM) - - c_beast_band - name = "Cyber Band (Use w/ Cybertech head)" - icon_state = "c_beast_band" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_a - name = "Cyber Beast Cheeks A (Use A, B and C)" - icon_state = "c_beast_a" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_b - name = "Cyber Beast Cheeks B (Use A, B and C)" - icon_state = "c_beast_b" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_c - name = "Cyber Beast Cheeks C (Use A, B and C)" - icon_state = "c_beast_c" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - teshari_large_eyes - name = "Teshari large eyes" - icon_state = "teshlarge_eyes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_coat - name = "Teshari coat" - icon_state = "tesh_coat" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_pattern_male - name = "Teshari male pattern" - icon_state = "tesh-pattern-male" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_pattern_female - name = "Teshari female pattern" - icon_state = "tesh-pattern-fem" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - voxscales - name = "Vox Scales" - icon_state = "Voxscales" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD) - - voxclaws - name = "Vox Claws" - icon_state = "Voxclaws" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - voxbeak - name = "Vox Beak" - icon_state = "Voxscales" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathihood - name = "Cobra Hood" - icon_state = "unathihood" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathidoublehorns - name = "Double Unathi Horns" - icon_state = "unathidoublehorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathihorns - name = "Unathi Horns" - icon_state = "unathihorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathiramhorns - name = "Unathi Ram Horns" - icon_state = "unathiramhorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathishortspines - name = "Unathi Short Spines" - icon_state = "unathishortspines" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathilongspines - name = "Unathi Long Spines" - icon_state = "unathilongspines" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathishortfrills - name = "Unathi Short Frills" - icon_state = "unathishortfrills" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathilongfrills - name = "Unathi Long Frills" - icon_state = "unathilongfrills" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) +/* +//////////////////////////// +/ =--------------------= / +/ == Misc Definitions == / +/ =--------------------= / +//////////////////////////// +*/ + +// Yes, I have to add all of this just to make some glowy hair. +// No, this isn't a character creation option, but... I guess in the future it could be, if anyone wants that? + +/datum/sprite_accessory/hair_accessory + name = "You should not see this..." + icon = 'icons/mob/vore/hair_accessories_vr.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + + var/ignores_lighting = 0 // Whether or not this hair accessory will ignore lighting and glow in the dark. + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/desc = "You should not see this..." + +/datum/sprite_accessory/hair_accessory/verie_hair_glow + name = "verie's hair glow" + desc = "" + icon_state = "verie_hair_glow" + ignores_lighting = 1 + //ckeys_allowed = list("vitoras") // This probably won't come into play EVER but better safe than sorry diff --git a/code/modules/mob/new_player/sprite_accessories_wing.dm b/code/modules/mob/new_player/sprite_accessories_wing.dm new file mode 100644 index 0000000000..486e81f4b1 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_wing.dm @@ -0,0 +1,152 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Wing Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/wing + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/wings.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 //Tertiary. + var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. + // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana + var/desc = "You should not see this..." + var/ani_state // State when flapping/animated + var/extra_overlay_w // Flapping state for extra overlay + var/extra_overlay2_w + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/wing/featheredlarge //Made by Natje! + name = "large feathered wings (colorable)" + desc = "" + icon_state = "feathered2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. + name = "spider legs" + desc = "" + icon_state = "spider-legs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/moth + name = "moth wings" + desc = "" + icon_state = "moth" + +/datum/sprite_accessory/wing/mothc + name = "moth wings, colorable" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/dragonfly + name = "dragonfly" + desc = "" + icon_state = "dragonfly" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered_medium + name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. + desc = "" + icon_state = "feathered3" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/bat_black + name = "bat wings, black" + desc = "" + icon_state = "bat-black" + +/datum/sprite_accessory/wing/bat_color + name = "bat wings, colorable" + desc = "" + icon_state = "bat-color" + do_colouration = 1 + +/datum/sprite_accessory/wing/bat_red + name = "bat wings, red" + desc = "" + icon_state = "bat-red" + +/datum/sprite_accessory/wing/harpywings + name = "harpy wings, colorable" + desc = "" + icon_state = "harpywings" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/beewings + name = "bee wings" + desc = "" + icon_state = "beewings" + +/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? + name = "gazer eyestalks" + desc = "" + icon_state = "liquidfirefly-eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. + +/datum/sprite_accessory/wing/moth_full + name = "moth antenna and wings" + desc = "" + icon_state = "moth_full" + +/datum/sprite_accessory/wing/moth_full_gray + name = "moth antenna and wings, colorable" + desc = "" + icon_state = "moth_full_gray" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/snag + name = "xenomorph backplate" + desc = "" + icon_state = "snag-backplate" + +/datum/sprite_accessory/wing/sepulchre_c_yw + name = "demon wings (colorable)" + desc = "" + icon_state = "sepulchre_wingsc" + do_colouration = 1 + +/datum/sprite_accessory/wing/cyberdragon + name = "Cyber dragon wing (colorable)" + desc = "" + icon_state = "cyberdragon_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/cyberdragon_red + name = "Cyber dragon wing (red)" + desc = "" + icon_state = "cyberdragon_red_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/cyberdoe + name = "Cyber doe wing" + desc = "" + icon_state = "cyberdoe_s" + do_colouration = 0 diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm new file mode 100644 index 0000000000..7cc4dfc081 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm @@ -0,0 +1,227 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Wing Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/wing + name = "You should not see this..." + icon = 'icons/mob/vore/wings_vr.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + +/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings. + name = "pharoah hound tail (Shock Diamond)" + desc = "" + icon_state = "shock" + ckeys_allowed = list("icowom") + +/datum/sprite_accessory/wing/featheredlarge //Made by Natje! + name = "large feathered wings (colorable)" + desc = "" + icon_state = "feathered2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. + name = "spider legs" + desc = "" + icon_state = "spider-legs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/moth + name = "moth wings" + desc = "" + icon_state = "moth" + +/datum/sprite_accessory/wing/mothc + name = "moth wings, colorable" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/dragonfly + name = "dragonfly" + desc = "" + icon_state = "dragonfly" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/citheroniamoth + name = "citheronia wings" + desc = "" + icon_state = "citheronia_wings" + ckeys_allowed = list("kira72") + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered_medium + name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. + desc = "" + icon_state = "feathered3" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/bat_black + name = "bat wings, black" + desc = "" + icon_state = "bat-black" + +/datum/sprite_accessory/wing/bat_color + name = "bat wings, colorable" + desc = "" + icon_state = "bat-color" + do_colouration = 1 + +/datum/sprite_accessory/wing/bat_red + name = "bat wings, red" + desc = "" + icon_state = "bat-red" + +/datum/sprite_accessory/wing/harpywings + name = "harpy wings, colorable" + desc = "" + icon_state = "harpywings" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/harpywings_alt + name = "harpy wings alt, archeopteryx" + desc = "" + icon_state = "harpywings_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_altmarkings" + +/datum/sprite_accessory/wing/harpywings_alt_neckfur + name = "harpy wings alt, archeopteryx & neckfur" + desc = "" + icon_state = "harpywings_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_altmarkings" + extra_overlay2 = "neckfur" + +/datum/sprite_accessory/wing/harpywings_bat + name = "harpy wings, bat" + desc = "" + icon_state = "harpywings_bat" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_batmarkings" + +/datum/sprite_accessory/wing/harpywings_bat_neckfur + name = "harpy wings, bat & neckfur" + desc = "" + icon_state = "harpywings_bat" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_batmarkings" + extra_overlay2 = "neckfur" + +/datum/sprite_accessory/wing/neckfur + name = "neck fur" + desc = "" + icon_state = "neckfur" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/beewings + name = "bee wings" + desc = "" + icon_state = "beewings" + +/datum/sprite_accessory/wing/sepulchre + name = "demon wings (Sepulchre)" + desc = "" + icon_state = "sepulchre_wings" + ckeys_allowed = list("sepulchre") + +/datum/sprite_accessory/wing/miria_fluffdragon + name = "fluffdragon wings (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/wing/scree + name = "green taj wings (Scree)" + desc = "" + icon_state = "scree-wings" + ckeys_allowed = list("scree") + +/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? + name = "gazer eyestalks" + desc = "" + icon_state = "liquidfirefly-eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. + +/datum/sprite_accessory/wing/moth_full + name = "moth antenna and wings" + desc = "" + icon_state = "moth_full" + +/datum/sprite_accessory/wing/moth_full_gray + name = "moth antenna and wings, colorable" + desc = "" + icon_state = "moth_full_gray" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/kerena + name = "wingwolf wings (Kerena)" + desc = "" + icon_state = "kerena-wings" + ckeys_allowed = list("somekindofpony") + +/datum/sprite_accessory/wing/snag + name = "xenomorph backplate" + desc = "" + icon_state = "snag-backplate" + +/datum/sprite_accessory/wing/sepulchre_c_yw + name = "demon wings (colorable)" + desc = "" + icon_state = "sepulchre_wingsc" + do_colouration = 1 + +/datum/sprite_accessory/wing/cyberdragon + name = "Cyber dragon wing (colorable)" + desc = "" + icon_state = "cyberdragon_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/cyberdragon_red + name = "Cyber dragon wing (red)" + desc = "" + icon_state = "cyberdragon_red_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/cyberdoe + name = "Cyber doe wing" + desc = "" + icon_state = "cyberdoe_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/drago_wing + name = "Cybernetic Dragon wings" + desc = "" + icon_state = "drago_wing" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "drago_wing_2" diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index a260c878fc..bf4a770f54 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -1,15 +1,30 @@ +/proc/generate_speech_bubble(var/bubble_loc, var/speech_state, var/set_layer = FLOAT_LAYER) + var/image/I = image('icons/mob/talk_vr.dmi', bubble_loc, speech_state, set_layer) //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) //VOREStation Edit + /* //VOREStation Removal Start + if(istype(bubble_loc, /atom/movable)) + var/atom/movable/AM = bubble_loc + var/x_scale = AM.get_icon_scale_x() + if(abs(x_scale) < 2) // reset transform on bubbles, except for the Very Large + I.pixel_z = (AM.icon_expected_height * (x_scale-1)) + I.appearance_flags |= RESET_TRANSFORM + */ //VOREStation Removal Start + return I + +/mob/proc/init_typing_indicator(var/set_state = "typing") + typing_indicator = new + typing_indicator.appearance = generate_speech_bubble(null, set_state) + typing_indicator.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) //VOREStation Edit + /mob/proc/set_typing_indicator(var/state) //Leaving this here for mobs. if(!is_preference_enabled(/datum/client_preference/show_typing_indicator)) - cut_overlay(typing_indicator, TRUE) + if(typing_indicator) + cut_overlay(typing_indicator, TRUE) return if(!typing_indicator) - typing_indicator = new - //typing_indicator.icon = 'icons/mob/talk_vr.dmi' //VOREStation Edit - Looks better on the right with job icons. - //typing_indicator.icon_state = "typing" - typing_indicator.icon = 'icons/mob/talk_vr.dmi' //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons - typing_indicator.icon_state = "[speech_bubble_appearance()]_typing" + init_typing_indicator("[speech_bubble_appearance()]_typing") if(state && !typing) add_overlay(typing_indicator, TRUE) @@ -30,7 +45,7 @@ set_typing_indicator(TRUE) var/message = input("","say (text)") as text set_typing_indicator(FALSE) - + if(message) say_verb(message) diff --git a/code/modules/modular_computers/file_system/programs/generic/game.dm b/code/modules/modular_computers/file_system/programs/generic/game.dm index 1219253157..cde240be73 100644 --- a/code/modules/modular_computers/file_system/programs/generic/game.dm +++ b/code/modules/modular_computers/file_system/programs/generic/game.dm @@ -31,7 +31,7 @@ sleep(5) if(boss_hp <= 0) heads_up = "You have crushed [boss_name]! Rejoice!" - playsound(computer.loc, 'sound/arcade/win.ogg', 10, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) game_active = FALSE program_icon_state = "arcade_off" if(istype(computer)) @@ -41,7 +41,7 @@ sleep(10) else if(player_hp <= 0 || player_mp <= 0) heads_up = "You have been defeated... how will the station survive?" - playsound(computer.loc, 'sound/arcade/lose.ogg', 10, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) game_active = FALSE program_icon_state = "arcade_off" if(istype(computer)) @@ -62,17 +62,17 @@ return if(boss_mp <= 5) heads_up = "[boss_mpamt] magic power has been stolen from you!" - playsound(computer.loc, 'sound/arcade/steal.ogg', 15, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) player_mp -= boss_mpamt boss_mp += boss_mpamt else if(boss_mp > 5 && boss_hp <12) heads_up = "[boss_name] heals for [bossheal] health!" - playsound(computer.loc, 'sound/arcade/heal.ogg', 15, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) boss_hp += bossheal boss_mp -= boss_mpamt else heads_up = "[boss_name] attacks you for [boss_attackamt] damage!" - playsound(computer.loc, 'sound/arcade/hit.ogg', 15, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) player_hp -= boss_attackamt pause_state = FALSE @@ -122,7 +122,7 @@ attackamt = rand(2,6) // + rand(0, gamerSkill) pause_state = TRUE heads_up = "You attack for [attackamt] damage." - playsound(computer.loc, 'sound/arcade/hit.ogg', 15, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) boss_hp -= attackamt sleep(10) game_check() @@ -139,7 +139,7 @@ healcost = rand(1, maxPointCost) pause_state = TRUE heads_up = "You heal for [healamt] damage." - playsound(computer.loc, 'sound/arcade/heal.ogg', 15, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) player_hp += healamt player_mp -= healcost sleep(10) @@ -152,7 +152,7 @@ rechargeamt = rand(4,7) // + rand(0, gamerSkill) pause_state = TRUE heads_up = "You regain [rechargeamt] magic power." - playsound(computer.loc, 'sound/arcade/mana.ogg', 15, TRUE, extrarange = -3, falloff = 10) + playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3, falloff = 0.1) player_mp += rechargeamt sleep(10) game_check() diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/ladders.dm similarity index 68% rename from code/modules/multiz/structures.dm rename to code/modules/multiz/ladders.dm index bf7f3c0865..cca3019543 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/ladders.dm @@ -1,12 +1,8 @@ -////////////////////////////// -//Contents: Ladders, Stairs.// -////////////////////////////// - /obj/structure/ladder name = "ladder" desc = "A ladder. You can climb it up and down." icon_state = "ladder01" - icon = 'icons/obj/structures.dmi' + icon = 'icons/obj/structures/multiz.dmi' density = 0 opacity = 0 anchored = 1 @@ -125,65 +121,3 @@ /obj/structure/ladder/updown allowed_directions = UP|DOWN icon_state = "ladder11" - -/obj/structure/stairs - name = "Stairs" - desc = "Stairs leading to another deck. Not too useful if the gravity goes out." - icon = 'icons/obj/stairs.dmi' - density = 0 - opacity = 0 - anchored = 1 - flags = ON_BORDER - layer = STAIRS_LAYER - -/obj/structure/stairs/Initialize() - . = ..() - for(var/turf/turf in locs) - var/turf/simulated/open/above = GetAbove(turf) - if(!above) - warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") - return qdel(src) - if(!istype(above)) - above.ChangeTurf(/turf/simulated/open) - -/obj/structure/stairs/CheckExit(atom/movable/mover as mob|obj, turf/target as turf) - if(get_dir(loc, target) == dir && upperStep(mover.loc)) - return FALSE - . = ..() - -/obj/structure/stairs/Bumped(atom/movable/A) - // This is hackish but whatever. - var/turf/target = get_step(GetAbove(A), dir) - if(target.Enter(A, src)) // Pass src to be ignored to avoid infinate loop - A.forceMove(target) - if(isliving(A)) - var/mob/living/L = A - if(L.pulling && !L.pulling.anchored) - L.pulling.forceMove(target) - -/obj/structure/stairs/proc/upperStep(var/turf/T) - return (T == loc) - -/obj/structure/stairs/CanPass(obj/mover, turf/source, height, airflow) - return airflow || !density - -// type paths to make mapping easier. -/obj/structure/stairs/north - dir = NORTH - bound_height = 64 - bound_y = -32 - pixel_y = -32 - -/obj/structure/stairs/south - dir = SOUTH - bound_height = 64 - -/obj/structure/stairs/east - dir = EAST - bound_width = 64 - bound_x = -32 - pixel_x = -32 - -/obj/structure/stairs/west - dir = WEST - bound_width = 64 diff --git a/code/modules/multiz/structures_vr.dm b/code/modules/multiz/ladders_vr.dm similarity index 100% rename from code/modules/multiz/structures_vr.dm rename to code/modules/multiz/ladders_vr.dm diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 8aa649b75f..ce8e1f6f8a 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -82,7 +82,7 @@ return 0 else if(ismob(src)) //VOREStation Edit Start. Are they a mob, and are they currently flying?? - var/mob/H = src + var/mob/living/H = src if(H.flying) if(H.incapacitated(INCAPACITATION_ALL)) to_chat(src, "You can't fly in your current state.") @@ -105,6 +105,13 @@ to_chat(src, "Gravity stops you from moving upward.") return 0 + //VOREStation Addition Start + for(var/atom/A in start) + if(!A.CheckExit(src, destination)) + to_chat(src, "\The [A] blocks you.") + return 0 + //VOREStation Addition End + for(var/atom/A in destination) if(!A.CanPass(src, start, 1.5, 0)) to_chat(src, "\The [A] blocks you.") @@ -358,24 +365,16 @@ for(var/atom/A in landing) if(!A.CanPass(src, src.loc, 1, 0)) return FALSE - // TODO - Stairs should operate thru a different mechanism, not falling, to allow side-bumping. // Now lets move there! if(!Move(landing)) return 1 // Detect if we made a silent landing. - if(locate(/obj/structure/stairs) in landing) - if(isliving(src)) - var/mob/living/L = src - if(L.pulling) - L.pulling.forceMove(landing) - return 1 - else - var/atom/A = find_fall_target(oldloc, landing) - if(special_fall_handle(A) || !A || !A.check_impact(src)) - return - fall_impact(A) + var/atom/A = find_fall_target(oldloc, landing) + if(special_fall_handle(A) || !A || !A.check_impact(src)) + return + fall_impact(A) /atom/movable/proc/special_fall_handle(var/atom/A) return FALSE @@ -446,14 +445,6 @@ /turf/space/check_impact(var/atom/movable/falling_atom) return FALSE -// We return 1 without calling fall_impact in order to provide a soft landing. So nice. -// Note this really should never even get this far -/obj/structure/stairs/CheckFall(var/atom/movable/falling_atom) - return TRUE - -/obj/structure/stairs/check_impact(var/atom/movable/falling_atom) - return FALSE - // Can't fall onto ghosts /mob/observer/dead/CheckFall() return FALSE diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm new file mode 100644 index 0000000000..d2956ae194 --- /dev/null +++ b/code/modules/multiz/stairs.dm @@ -0,0 +1,538 @@ +#define STAIR_MOVE_DELAY 10 // Animation delay for non-living objects moving up/down stairs + +/obj/structure/stairs + name = "Stairs" + desc = "Stairs leading to another deck. Not too useful if the gravity goes out." + icon = 'icons/obj/structures/multiz.dmi' + icon_state = "stair" + opacity = 0 + density = 0 + anchored = 1 + layer = STAIRS_LAYER + +/obj/structure/stairs/Initialize() + . = ..() + if(check_integrity()) + update_icon() + +// Returns TRUE if the stairs are a complete and connected unit, FALSE if a piece is missing or obstructed +// Will attempt to reconnect broken pieces +// Parameters: +// - B1: Loc of bottom stair +// - B2: Loc of middle stair +// - T1: Openspace over bottom stair +// - T2: Loc of top stair, over middle stair +/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null, + var/obj/structure/stairs/middle/M = null, + var/obj/structure/stairs/top/T = null, + var/turf/simulated/open/O = null) + + // Base cases: Something is missing! + // The parent type doesn't know enough about the positional relations to find neighbors, only evaluate if they're connected + if(!istype(B) || !istype(M) || !istype(T) || !istype(O)) + return FALSE + + // Case 1: In working order + if(B.top == T && M.bottom == B && T.bottom == B && \ + get_turf(M) == get_step(B, B.dir) && O == GetAbove(B) && get_turf(T) == GetAbove(M)) + return TRUE + + // Case 2: The top is linked to someone else + if(istype(T.bottom) && T.bottom != B) + return FALSE + + // Case 3: The bottom is linked to someone else + if(istype(B.top) && B.top != T) + return FALSE + + // Case 4: They're unlinked + B.dir = get_dir(get_turf(B), get_turf(M)) + B.top = T + B.middle = M + T.dir = B.dir + T.middle = M + T.bottom = B + M.dir = B.dir + M.top = T + M.bottom = B + return TRUE + +// Used to actually move stuff up/down stairs. Removed from Crossed for special cases +/obj/structure/stairs/proc/use_stairs(var/atom/movable/AM, var/atom/oldloc) + return + +/obj/structure/stairs/proc/use_stairs_instant(var/atom/movable/AM) + return + +////////////////////////////////////////////////////////////////////// +// Bottom piece that you step ontor ////////////////////////////////// +////////////////////////////////////////////////////////////////////// +/obj/structure/stairs/bottom + icon_state = "stair_l" + var/obj/structure/stairs/top/top = null + var/obj/structure/stairs/middle/middle = null + +/obj/structure/stairs/bottom/Initialize() + . = ..() + if(!GetAbove(src)) + warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") + return INITIALIZE_HINT_QDEL + +/obj/structure/stairs/bottom/Destroy() + if(top) + top.bottom = null + if(middle) + middle.bottom = null + ..() + +// These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit +/obj/structure/stairs/bottom/check_integrity(var/obj/structure/stairs/bottom/B = null, + var/obj/structure/stairs/middle/M = null, + var/obj/structure/stairs/top/T = null, + var/turf/simulated/open/O = null) + + // In the case where we're provided all the pieces, just try connecting them. + // In order: all exist, they are appropriately adjacent, and they can connect + if(istype(B) && istype(M) && istype(T) && istype(O) && \ + B.Adjacent(M) && (GetBelow(O) == get_turf(B)) && T.Adjacent(O) && \ + ..()) + return TRUE + + // If we're already configured, just check those + else if(istype(top) && istype(middle)) + O = locate(/turf/simulated/open) in GetAbove(src) + if(..(src, middle, top, O)) + return TRUE + + var/turf/B2 = get_step(src, src.dir) + O = GetAbove(src) + var/turf/T2 = GetAbove(B2) + + // T1 is the same regardless of B1's dir, so we can enforce it here + if(!istype(O)) + return FALSE + + T = locate(/obj/structure/stairs/top) in T2 + M = locate(/obj/structure/stairs/middle) in B2 + + // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work + // Everything is simply linked in our original direction + if(istype(M) && istype(T) && ..(src, M, T, O)) + return TRUE + + // Else, we have to look in other directions + for(var/dir in cardinal - src.dir) + B2 = get_step(src, dir) + T2 = GetAbove(B2) + if(!istype(B2) || !istype(T2)) + continue + + T = locate(/obj/structure/stairs/top) in T2 + M = locate(/obj/structure/stairs/middle) in B2 + if(..(src, M, T, O)) + return TRUE + + // Out of the dir check, we have no valid neighbors, and thus are not complete. + return FALSE + +/obj/structure/stairs/bottom/Crossed(var/atom/movable/AM, var/atom/oldloc) + if(isliving(AM)) + var/mob/living/L = AM + if(L.has_AI()) + use_stairs(AM, oldloc) + ..() + +/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc) + // If we're coming from the top of the stairs, don't trap us in an infinite staircase + // Or if we fell down the openspace + if((top in oldloc) || oldloc == GetAbove(src)) + return + + if(isobserver(AM)) // Ghosts have their own methods for going up and down + return + + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs + return + + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to + return + + var/list/atom/movable/pulling = list() // Will also include grabbed mobs + if(isliving(AM)) + var/mob/living/L = AM + + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. + return + + if(L.buckled) + pulling |= L.buckled + + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. + if(L.pulling && !L.pulling.anchored) + pulling |= L.pulling + for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) + pulling |= G.affecting + + // If the stairs aren't broken, go up. + if(check_integrity()) + AM.dir = src.dir + + // Bring the pulled/grabbed object(s) along behind us + for(var/atom/movable/P in pulling) + P.forceMove(get_turf(src)) // They will move onto the turf but won't get past the check earlier in crossed. Aligns animation more cleanly + + + // Move to Top + AM.forceMove(get_turf(top)) + + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays + for(var/atom/movable/P in pulling) + P.forceMove(get_turf(top)) // Just bring it along directly, no fussing with animation timing + if(isliving(P)) + var/mob/living/L = P + if(L.client) + L.client.Process_Grab() // Update any miscellanous grabs, possibly break grab-chains + + return TRUE + +/obj/structure/stairs/bottom/use_stairs_instant(var/atom/movable/AM) + if(isobserver(AM)) // Ghosts have their own methods for going up and down + return + + if(isliving(AM)) + var/mob/living/L = AM + + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. + return + + if(L.has_buckled_mobs()) + return + + if(L.buckled) + L.buckled.forceMove(get_turf(top)) + + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. + if(L.pulling && !L.pulling.anchored) + var/atom/movable/P = L.pulling + P.forceMove(get_turf(top)) + L.start_pulling(P) + + for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) + G.affecting.forceMove(get_turf(top)) + L.forceMove(get_turf(top)) + + if(L.client) + L.client.Process_Grab() + else + AM.forceMove(get_turf(top)) + + +////////////////////////////////////////////////////////////////////// +// Middle piece that you are animated onto/off of //////////////////// +////////////////////////////////////////////////////////////////////// +/obj/structure/stairs/middle + icon_state = "stair_u" + opacity = TRUE + density = TRUE // Too high to simply step up on + climbable = TRUE // But they can be climbed if the bottom is out + + var/obj/structure/stairs/top/top = null + var/obj/structure/stairs/bottom/bottom = null + +/obj/structure/stairs/middle/Initialize() + . = ..() + if(!GetAbove(src)) + warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") + return INITIALIZE_HINT_QDEL + +/obj/structure/stairs/middle/Destroy() + if(top) + top.middle = null + if(bottom) + bottom.middle = null + ..() + +// These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit +/obj/structure/stairs/middle/check_integrity(var/obj/structure/stairs/bottom/B = null, + var/obj/structure/stairs/middle/M = null, + var/obj/structure/stairs/top/T = null, + var/turf/simulated/open/O = null) + + // In the case where we're provided all the pieces, just try connecting them. + // In order: all exist, they are appropriately adjacent, and they can connect + if(istype(B) && istype(M) && istype(T) && istype(O) && \ + B.Adjacent(M) && (GetBelow(O) == B.loc) && T.Adjacent(O) && \ + ..()) + return TRUE + + else if(istype(top) && istype(bottom)) + O = locate(/turf/simulated/open) in GetAbove(bottom) + if(..(bottom, src, top, O)) + return TRUE + + var/turf/B1 = get_step(src, turn(src.dir, 180)) + O = GetAbove(B1) + var/turf/T2 = GetAbove(src) + + B = locate(/obj/structure/stairs/bottom) in B1 + T = locate(/obj/structure/stairs/top) in T2 + + // Top is static for Middle stair, if it's invalid we can't do much + if(!istype(T)) + return FALSE + + // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work + // Everything is simply linked in our original direction + if(istype(B1) && istype(T2) && istype(O) && ..(B, src, T, O)) + return TRUE + + // Else, we have to look in other directions + for(var/dir in cardinal - src.dir) + B1 = get_step(src, turn(dir, 180)) + O = GetAbove(B1) + if(!istype(B1) || !istype(O)) + continue + + B = locate(/obj/structure/stairs/bottom) in B1 + if(..(B, src, T, O)) + return TRUE + + // The middle stair has some further special logic, in that it can be climbed, and so is technically valid if only the top exists + // T is enforced by a prior if + T.middle = src + src.top = T + src.dir = T.dir + return TRUE + +/obj/structure/stairs/middle/MouseDrop_T(mob/target, mob/user) + . = ..() + if(check_integrity()) + do_climb(user) + user.forceMove(get_turf(top)) // You can't really drag things when you have to climb up the gap in the stairs yourself + +/obj/structure/stairs/middle/Bumped(mob/user) + if(check_integrity() && bottom && (bottom in get_turf(user))) // Bottom must be enforced because the middle stairs don't actually need the bottom + bottom.use_stairs_instant(user) + +////////////////////////////////////////////////////////////////////// +// Top piece that you step onto ////////////////////////////////////// +////////////////////////////////////////////////////////////////////// +/obj/structure/stairs/top + icon_state = "stair_l" // Darker, marginally less contrast w/ openspace + var/obj/structure/stairs/middle/middle = null + var/obj/structure/stairs/bottom/bottom = null + +/obj/structure/stairs/top/Initialize() + . = ..() + if(!GetBelow(src)) + warning("Stair created without level below: ([loc.x], [loc.y], [loc.z])") + return INITIALIZE_HINT_QDEL + +/obj/structure/stairs/top/Destroy() + if(middle) + middle.top = null + if(bottom) + bottom.top = null + ..() + +// These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit +/obj/structure/stairs/top/check_integrity(var/obj/structure/stairs/bottom/B = null, + var/obj/structure/stairs/middle/M = null, + var/obj/structure/stairs/top/T = null, + var/turf/simulated/open/O = null) + + // In the case where we're provided all the pieces, just try connecting them. + // In order: all exist, they are appropriately adjacent, and they can connect + if(istype(B) && istype(M) && istype(T) && istype(O) && \ + B.Adjacent(M) && (GetBelow(O) == B.loc) && T.Adjacent(O) && \ + (. = ..())) + return + + else if(istype(middle) && istype(bottom)) + O = locate(/turf/simulated/open) in GetAbove(bottom) + if(..(bottom, middle, src, O)) + return TRUE + + + O = get_step(src, turn(src.dir, 180)) + var/turf/B1 = GetBelow(O) + var/turf/B2 = GetBelow(src) + + B = locate(/obj/structure/stairs/bottom) in B1 + M = locate(/obj/structure/stairs/middle) in B2 + + // Middle stair is static for Top stair, so if it's invalid we can't do much + if(!istype(M)) + return FALSE + + // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work + // Everything is simply linked in our original direction + if(istype(B) && istype(O) && (. = ..(B, M, src, O))) + return + + // Else, we have to look in other directions + for(var/dir in cardinal - src.dir) + O = get_step(src, turn(dir, 180)) + B1 = GetBelow(O) + if(!istype(B1) || !istype(O)) + continue + + B = locate(/obj/structure/stairs/bottom) in B1 + if((. = ..(B, M, src, O))) + return + + // Out of the dir check, we have no valid neighbors, and thus are not complete. `.` was set by ..() + return + +/obj/structure/stairs/top/Crossed(var/atom/movable/AM, var/atom/oldloc) + if(isliving(AM)) + var/mob/living/L = AM + if(L.has_AI()) + use_stairs(AM, oldloc) + ..() + +/obj/structure/stairs/top/Uncrossed(var/atom/movable/AM) + // Going down stairs from the topstair piece + if(AM.dir == turn(dir, 180) && check_integrity()) + use_stairs_instant(AM) + return + +/obj/structure/stairs/top/use_stairs(var/atom/movable/AM, var/atom/oldloc) + // If we're coming from the bottom of the stairs, don't trap us in an infinite staircase + // Or if we climb up the middle + if((bottom in oldloc) || oldloc == GetBelow(src)) + return + + if(isobserver(AM)) // Ghosts have their own methods for going up and down + return + + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs + return + + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to + return + + var/list/atom/movable/pulling = list() // Will also include grabbed mobs + if(isliving(AM)) + var/mob/living/L = AM + + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. + return + + if(L.buckled) + pulling |= L.buckled + + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. + if(L.pulling && !L.pulling.anchored) + pulling |= L.pulling + for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) + pulling |= G.affecting + + // If the stairs aren't broken, go up. + if(check_integrity()) + AM.dir = turn(src.dir, 180) + // Bring the pulled/grabbed object(s) along behind us + for(var/atom/movable/P in pulling) + P.forceMove(get_turf(src)) // They will move onto the turf but won't get past the check earlier in crossed. Aligns animation more cleanly + + // Move to Top + AM.forceMove(get_turf(bottom)) + + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays + for(var/atom/movable/P in pulling) + P.forceMove(get_turf(bottom)) // Just bring it along directly, no fussing with animation timing + if(isliving(P)) + var/mob/living/L = P + if(L.client) + L.client.Process_Grab() // Update any miscellanous grabs, possibly break grab-chains + + return TRUE + +/obj/structure/stairs/top/use_stairs_instant(var/atom/movable/AM) + if(isobserver(AM)) // Ghosts have their own methods for going up and down + return + + if(isliving(AM)) + var/mob/living/L = AM + + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. + return + + if(L.has_buckled_mobs()) + return + + if(L.buckled) + L.buckled.forceMove(get_turf(bottom)) + + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. + if(L.pulling && !L.pulling.anchored) + var/atom/movable/P = L.pulling + P.forceMove(get_turf(bottom)) + L.start_pulling(P) + + for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand)) + G.affecting.forceMove(get_turf(bottom)) + + L.forceMove(get_turf(bottom)) + + if(L.client) + L.client.Process_Grab() + else + AM.forceMove(get_turf(bottom)) + +// Mapping pieces, placed at the bottommost part of the stairs +/obj/structure/stairs/spawner + name = "Stairs spawner" + icon = 'icons/obj/structures/stairs_64x64.dmi' + icon_state = "" + +/obj/structure/stairs/spawner/Initialize() + ..() + var/turf/B1 = get_step(get_turf(src), turn(dir, 180)) + var/turf/B2 = get_turf(src) + var/turf/T1 = GetAbove(B1) + var/turf/T2 = GetAbove(B2) + + if(!istype(B1) || !istype(B2)) + warning("Stair created at invalid loc: ([loc.x], [loc.y], [loc.z])") + return INITIALIZE_HINT_QDEL + if(!istype(T1) || !istype(T2)) + warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") + return INITIALIZE_HINT_QDEL + + // Spawn the stairs + // Railings sold separately + var/turf/simulated/open/O = T1 + var/obj/structure/stairs/top/T = new(T2) + var/obj/structure/stairs/middle/M = new(B2) + var/obj/structure/stairs/bottom/B = new(B1) + if(!isopenspace(O)) + O = new(O) + + B.dir = dir + M.dir = dir + T.dir = dir + B.check_integrity(B, M, T, O) + + return INITIALIZE_HINT_QDEL + +// For ease of spawning. While you *can* spawn the base type and set its dir, this is useful for adminbus and a little bit quicker to map in +/obj/structure/stairs/spawner/north + dir = NORTH + bound_height = 64 + bound_y = -32 + pixel_y = -32 + +/obj/structure/stairs/spawner/south + dir = SOUTH + bound_height = 64 + +/obj/structure/stairs/spawner/east + dir = EAST + bound_width = 64 + bound_x = -32 + pixel_x = -32 + +/obj/structure/stairs/spawner/west + dir = WEST + bound_width = 64 diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 652e86d464..f34cae0065 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -39,7 +39,7 @@ ..() update() -/turf/simulated/open/ChangeTurf() +/turf/simulated/open/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors) var/turf/T = GetBelow(src) if(T) GLOB.turf_entered_event.unregister(T, src, .proc/BelowOpenUpdated) @@ -55,8 +55,9 @@ GLOB.turf_entered_event.register(T, src, .proc/BelowOpenUpdated) GLOB.turf_exited_event.register(T, src, .proc/BelowOpenUpdated) -/turf/simulated/open/Entered(var/atom/movable/mover) - . = ..() + +/turf/simulated/open/Entered(var/atom/movable/mover, var/atom/oldloc) + ..() mover.fall() /turf/simulated/open/proc/BelowOpenUpdated(turf/T, atom/movable/AM, old_loc) @@ -187,6 +188,4 @@ for(var/obj/O in contents) if(!O.CanFallThru(L, GetBelow(src))) return TRUE // Can't fall through this, like lattice or catwalk. - if(!locate(/obj/structure/stairs) in GetBelow(src)) - return FALSE // Falling on stairs is safe. - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/multiz/zshadow.dm b/code/modules/multiz/zshadow.dm index b3e37c6b76..fcc5ecad65 100644 --- a/code/modules/multiz/zshadow.dm +++ b/code/modules/multiz/zshadow.dm @@ -121,9 +121,7 @@ /mob/zshadow/set_typing_indicator(var/state) if(!typing_indicator) - typing_indicator = new - typing_indicator.icon = 'icons/mob/talk_vr.dmi' // Looks better on the right with job icons. //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons - typing_indicator.icon_state = "typing" + init_typing_indicator("typing") if(state && !typing) overlays += typing_indicator typing = 1 diff --git a/code/modules/news/new_newspaper.dm b/code/modules/news/new_newspaper.dm new file mode 100644 index 0000000000..c9759a5a83 --- /dev/null +++ b/code/modules/news/new_newspaper.dm @@ -0,0 +1,146 @@ +//######################################################################################################################## +//###################################### NEWSPAPER! ###################################################################### +//######################################################################################################################## + +/obj/item/weapon/newspaper + name = "newspaper" + desc = "An issue of The Griffon, the newspaper circulating aboard most stations." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "newspaper" + w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! + attack_verb = list("bapped") + var/screen = 0 + var/pages = 0 + var/curr_page = 0 + var/list/datum/feed_channel/news_content = list() + var/datum/feed_message/important_message = null + var/scribble="" + var/scribble_page = null + drop_sound = 'sound/items/drop/wrapper.ogg' + pickup_sound = 'sound/items/pickup/wrapper.ogg' + +obj/item/weapon/newspaper/attack_self(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + var/dat + pages = 0 + switch(screen) + if(0) //Cover + dat+="
The Griffon
" + dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" + if(isemptylist(news_content)) + if(important_message) + dat+="Contents:
" + else + dat+="Other than the title, the rest of the newspaper is unprinted..." + else + dat+="Contents:
" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Next Page
Done reading
" + if(1) // X channel pages inbetween. + for(var/datum/feed_channel/NP in news_content) + pages++ //Let's get it right again. + var/datum/feed_channel/C = news_content[curr_page] + dat+="[C.channel_name] \[created by: [C.author]\]

" + if(C.censored) + dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." + else + if(isemptylist(C.messages)) + dat+="No Feed stories stem from this channel..." + else + dat+="" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "

Previous Page
Next Page
" + if(2) //Last page + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message!=null) + dat+="
Wanted Issue:


" + dat+="Criminal name: [important_message.author]
" + dat+="Description: [important_message.body]
" + dat+="Photo:: " + if(important_message.img) + user << browse_rsc(important_message.img, "tmp_photow.png") + dat+="
" + else + dat+="None" + else + dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Previous Page
" + else + dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" + + dat+="

[curr_page+1]
" + human_user << browse(dat, "window=newspaper_main;size=300x400") + onclose(human_user, "newspaper_main") + else + to_chat(user, "The paper is full of intelligible symbols!") + +obj/item/weapon/newspaper/Topic(href, href_list) + var/mob/living/U = usr + ..() + if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) + U.set_machine(src) + if(href_list["next_page"]) + if(curr_page == pages+1) + return //Don't need that at all, but anyway. + if(curr_page == pages) //We're at the middle, get to the end + screen = 2 + else + if(curr_page == 0) //We're at the start, get to the middle + screen = 1 + curr_page++ + playsound(src, "pageturn", 50, 1) + + else if(href_list["prev_page"]) + if(curr_page == 0) + return + if(curr_page == 1) + screen = 0 + + else + if(curr_page == pages+1) //we're at the end, let's go back to the middle. + screen = 1 + curr_page-- + playsound(src, "pageturn", 50, 1) + + if(istype(src.loc, /mob)) + attack_self(src.loc) + +obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user) + if(istype(W, /obj/item/weapon/pen)) + if(scribble_page == curr_page) + to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + else + var/s = sanitize(input(user, "Write something", "Newspaper", "")) + s = sanitize(s) + if(!s) + return + if(!in_range(src, usr) && src.loc != usr) + return + scribble_page = curr_page + scribble = s + attack_self(user) + return diff --git a/code/modules/news/news_init.dm b/code/modules/news/news_init.dm new file mode 100644 index 0000000000..2c78e4baf8 --- /dev/null +++ b/code/modules/news/news_init.dm @@ -0,0 +1,34 @@ +GLOBAL_DATUM_INIT(news_data, /datum/lore/news, new) + +/datum/feed_network/New() + CreateFeedChannel("Station Announcements", "NanoTrasen", 1, 1, "New Station Announcement Available") + //CreateFeedChannel("Vir News Network", "Oculum Broadcast", 1, 1, "Updates from the Vir News Network!") //VOREStation Removal + +/datum/lore/news + var/datum/feed_channel/station_newspaper + var/datum/lore/codex/category/main_news/news_codex = new() + +/datum/lore/news/New() + ..() + spawn(50) //Give it a second or it gets fucky. + for(var/datum/feed_channel/F in news_network.network_channels) + if(F.channel_name == "Vir News Network") + station_newspaper = F + break + spawn(300) // Yes, again. + fill_codex_news() + +/datum/lore/news/proc/fill_codex_news() + if(!news_network) + log_debug("Load: Could not find newscaster network.") + return + + if(!station_newspaper) + log_debug("Load: Could not find news channel Vir News Network to populate news articles.") + return + + //Feed the Lore Codex into the News Machine + for(var/datum/lore/codex/child in news_codex.children) + news_network.SubmitArticle("[child.data]", "Oculum", "Vir News Network", null, 1, "", "[child.name]") + + return 1 \ No newline at end of file diff --git a/code/modules/news/newspaper.dm b/code/modules/news/newspaper.dm new file mode 100644 index 0000000000..330e505d51 --- /dev/null +++ b/code/modules/news/newspaper.dm @@ -0,0 +1,147 @@ +//######################################################################################################################## +//###################################### NEWSPAPER! ###################################################################### +//######################################################################################################################## + +/obj/item/weapon/newspaper + name = "newspaper" + desc = "An issue of The Griffon, the newspaper circulating aboard most stations." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "newspaper" + w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! + attack_verb = list("bapped") + var/screen = 0 + var/pages = 0 + var/curr_page = 0 + var/list/datum/feed_channel/news_content = list() + var/datum/feed_message/important_message = null + var/scribble="" + var/scribble_page = null + drop_sound = 'sound/items/drop/wrapper.ogg' + pickup_sound = 'sound/items/pickup/wrapper.ogg' + +obj/item/weapon/newspaper/attack_self(mob/user as mob) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + var/dat + pages = 0 + switch(screen) + if(0) //Cover + dat+="
The Griffon
" + dat+="
[using_map.company_name]-standard newspaper, for use on [using_map.company_name]© Space Facilities

" + if(isemptylist(news_content)) + if(important_message) + dat+="Contents:
" + else + dat+="Other than the title, the rest of the newspaper is unprinted..." + else + dat+="Contents:
" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Next Page
Done reading
" + if(1) // X channel pages inbetween. + for(var/datum/feed_channel/NP in news_content) + pages++ //Let's get it right again. + var/datum/feed_channel/C = news_content[curr_page] + dat+="[C.channel_name] \[created by: [C.author]\]

" + if(C.censored) + dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." + else + if(isemptylist(C.messages)) + dat+="No Feed stories stem from this channel..." + else + dat+="" + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "

Previous Page
Next Page
" + if(2) //Last page + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message!=null) + dat+="
Wanted Issue:


" + dat+="Criminal name: [important_message.author]
" + dat+="Description: [important_message.body]
" + dat+="Photo:: " + if(important_message.img) + user << browse_rsc(important_message.img, "tmp_photow.png") + dat+="
" + else + dat+="None" + else + dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." + if(scribble_page==curr_page) + dat+="
There is a small scribble near the end of this page... It reads: \"[scribble]\"" + dat+= "
Previous Page
" + else + dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" + + dat+="

[curr_page+1]
" + human_user << browse(dat, "window=newspaper_main;size=300x400") + onclose(human_user, "newspaper_main") + else + to_chat(user, "The paper is full of intelligible symbols!") + +obj/item/weapon/newspaper/Topic(href, href_list) + var/mob/living/U = usr + ..() + if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) + U.set_machine(src) + if(href_list["next_page"]) + if(curr_page == pages+1) + return //Don't need that at all, but anyway. + if(curr_page == pages) //We're at the middle, get to the end + screen = 2 + else + if(curr_page == 0) //We're at the start, get to the middle + screen = 1 + curr_page++ + playsound(src, "pageturn", 50, 1) + + else if(href_list["prev_page"]) + if(curr_page == 0) + return + if(curr_page == 1) + screen = 0 + + else + if(curr_page == pages+1) //we're at the end, let's go back to the middle. + screen = 1 + curr_page-- + playsound(src, "pageturn", 50, 1) + + if(istype(src.loc, /mob)) + attack_self(src.loc) + +obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/pen)) + if(scribble_page == curr_page) + to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + else + var/s = sanitize(input(user, "Write something", "Newspaper", "")) + s = sanitize(s) + if(!s) + return + if(!in_range(src, usr) && src.loc != usr) + return + scribble_page = curr_page + scribble = s + attack_self(user) + return \ No newline at end of file diff --git a/code/modules/news/newspaper_layout.dm b/code/modules/news/newspaper_layout.dm new file mode 100644 index 0000000000..224b8c6eca --- /dev/null +++ b/code/modules/news/newspaper_layout.dm @@ -0,0 +1,41 @@ +/proc/get_newspaper_header(newspaper, var/list/subjects, bgcolor) + + var/dat + + dat += "
\[IN [round(available_in_hours, 0.1)] DEPTHOURS]
\[WHITELIST ONLY]
\[MINIMUM CHARACTER AGE: [job.minimum_character_age]]
" + dat += "" + dat += "
" + dat += "

" + dat += "[newspaper]

" + dat += "
" + + if(subjects) + var/subject_list = jointext(subjects," - ") + + dat += "

[subject_list]


" + dat += "
" + + return dat + + +/proc/get_newspaper_content(header, content, author, bgcolor, picture_data) + + var/dat + + dat += "" + dat += "" + + dat += "
" + dat += "" + dat += "
" + dat += "
[header]
" + + dat += "

By [author]


" + + if(picture_data) + dat += "
[picture_data]
" + + dat += "
" + dat += "

[content]



" + + return dat \ No newline at end of file diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index 9ac7925090..916923a796 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -23,6 +23,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable icon_state = "nif_0" w_class = ITEMSIZE_TINY + var/known_implant = TRUE var/durability = 100 // Durability remaining var/bioadap = FALSE // If it'll work in fancy species diff --git a/code/modules/nifsoft/software/15_misc.dm b/code/modules/nifsoft/software/15_misc.dm index bd0975269d..2b173346ce 100644 --- a/code/modules/nifsoft/software/15_misc.dm +++ b/code/modules/nifsoft/software/15_misc.dm @@ -127,17 +127,16 @@ /datum/nifsoft/sizechange/activate() if((. = ..())) - var/new_size = input("Put the desired size (25-200%)", "Set Size", 200) as num|null + var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null - if (!ISINRANGE(new_size,25,200)) - to_chat(nif.human,"The safety features of the NIF Program prevent you from choosing this size.") + if (!nif.human.size_range_check(new_size)) + if(new_size) + to_chat(nif.human,"The safety features of the NIF Program prevent you from choosing this size.") return else - nif.human.resize(new_size/100) - to_chat(nif.human,"You set the size to [new_size]%") - - nif.human.visible_message("Swirling grey mist envelops [nif.human] as they change size!","Swirling streams of nanites wrap around you as you change size!") - + if(nif.human.resize(new_size/100)) + to_chat(nif.human,"You set the size to [new_size]%") + nif.human.visible_message("Swirling grey mist envelops [nif.human] as they change size!","Swirling streams of nanites wrap around you as you change size!") spawn(0) deactivate() diff --git a/code/modules/organs/internal/augment.dm b/code/modules/organs/internal/augment.dm index da8ee8d577..cfd5768846 100644 --- a/code/modules/organs/internal/augment.dm +++ b/code/modules/organs/internal/augment.dm @@ -31,10 +31,8 @@ var/last_activate = null /obj/item/organ/internal/augment/Initialize() - ..() - + . = ..() setup_radial_icon() - if(integrated_object_type) integrated_object = new integrated_object_type(src) integrated_object.canremove = FALSE @@ -66,6 +64,10 @@ else return + if(robotic && owner.get_restraining_bolt()) + to_chat(owner, "\The [src] doesn't respond.") + return + var/item_to_equip = integrated_object if(!item_to_equip && integrated_object_type) item_to_equip = integrated_object_type diff --git a/code/modules/organs/internal/augment/armmounted.dm b/code/modules/organs/internal/augment/armmounted.dm index 4131955e15..c22988de83 100644 --- a/code/modules/organs/internal/augment/armmounted.dm +++ b/code/modules/organs/internal/augment/armmounted.dm @@ -143,7 +143,7 @@ if(istype(owner, /mob/living/carbon/human)) var/mob/living/carbon/human/H = owner H.add_modifier(/datum/modifier/melee_surge, 0.75 MINUTES) - + /obj/item/organ/internal/augment/armmounted/shoulder/blade name = "armblade implant" desc = "A large implant that fits into a subject's arm. It deploys a large metal blade by some painful means." @@ -189,7 +189,7 @@ ) /obj/item/organ/internal/augment/armmounted/shoulder/multiple/Initialize() - ..() + . = ..() if(integrated_object) integrated_tools[integrated_object_type] = integrated_object diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 30c539bbde..3f2dc7efe2 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -137,7 +137,8 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) var/obj/item/organ/internal/brain/B = src if(istype(B) && owner) - B.transfer_identity(owner) + if(istype(owner, /mob/living/carbon)) + B.transfer_identity(owner) ..() diff --git a/code/modules/organs/internal/spleen.dm b/code/modules/organs/internal/spleen.dm index 352a36207f..88d42bb8bb 100644 --- a/code/modules/organs/internal/spleen.dm +++ b/code/modules/organs/internal/spleen.dm @@ -73,7 +73,7 @@ spleen_efficiency = 0.5 /obj/item/organ/internal/spleen/skrell/Initialize() - ..() + . = ..() adjust_scale(0.8,0.7) /obj/item/organ/internal/spleen/minor @@ -83,5 +83,5 @@ spleen_tick = 15 /obj/item/organ/internal/spleen/minor/Initialize() - ..() + . = ..() adjust_scale(0.7) diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index 31adb758ae..2ebfefea61 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -12,8 +12,7 @@ var/deadly_hold = TRUE // Does the stomach do damage to mobs eaten by its owner? Xenos should probably have this FALSE. /obj/item/organ/internal/stomach/Initialize() - ..() - + . = ..() if(reagents) reagents.maximum_volume = 30 else diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 9047eb2665..e5df765bdc 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -115,8 +115,7 @@ var/list/organ_cache = list() handle_organ_mod_special() /obj/item/organ/Initialize() - ..() - + . = ..() if(owner) if(!meat_type) if(owner.isSynthetic()) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 05f7e4c201..246cb23d04 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -30,6 +30,7 @@ // Appearance vars. var/nonsolid // Snowflake warning, reee. Used for slime limbs. + var/transparent // As above, so below. Used for transparent limbs. var/icon_name = null // Icon state base. var/body_part = null // Part flag var/icon_position = 0 // Used in mob overlay layering calculations. @@ -236,6 +237,7 @@ owner.organs |= src for(var/obj/item/organ/organ in src) organ.replaced(owner,src) + owner.refresh_modular_limb_verbs() if(parent_organ) parent = owner.organs_by_name[src.parent_organ] @@ -1132,6 +1134,8 @@ Note that amputating the affected organ does in fact remove the infection from t if(R.lifelike) robotic = ORGAN_LIFELIKE name = "[initial(name)]" + else if(R.modular_bodyparts == MODULAR_BODYPART_PROSTHETIC) + name = "prosthetic [initial(name)]" else name = "robotic [initial(name)]" desc = "[R.desc] It looks like it was produced by [R.company]." @@ -1163,7 +1167,7 @@ Note that amputating the affected organ does in fact remove the infection from t while(null in owner.internal_organs) owner.internal_organs -= null - + owner.refresh_modular_limb_verbs() return 1 /obj/item/organ/external/proc/mutate() @@ -1264,6 +1268,7 @@ Note that amputating the affected organ does in fact remove the infection from t qdel(spark_system) qdel(src) + victim.refresh_modular_limb_verbs() victim.update_icons_body() /obj/item/organ/external/proc/disfigure(var/type = "brute") @@ -1395,4 +1400,8 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/obj/item/organ/external/L in organs) for(var/obj/item/I in L.implants) if(!istype(I,/obj/item/weapon/implant) && !istype(I,/obj/item/device/nif)) //VOREStation Add - NIFs - return 1 \ No newline at end of file + return 1 + +/obj/item/organ/external/proc/is_hidden_by_tail() + if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) + return 1 diff --git a/code/modules/organs/organ_external_vr.dm b/code/modules/organs/organ_external_vr.dm index 1742259864..0e3fb07d9e 100644 --- a/code/modules/organs/organ_external_vr.dm +++ b/code/modules/organs/organ_external_vr.dm @@ -1,6 +1,3 @@ -/obj/item/organ/external - var/transparent = 0 //For better slime limbs - //Sideways override for nanoform limbs (ugh) /obj/item/organ/external/robotize(var/company, var/skip_prosthetics = FALSE, var/keep_organs = FALSE) var/original_robotic = robotic @@ -16,7 +13,3 @@ min_broken_damage = o_min_broken_damage else return ..() - -/obj/item/organ/external/proc/is_hidden_by_tail() - if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) - return 1 \ No newline at end of file diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 86e71c4fc2..43b4e35788 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -51,69 +51,6 @@ var/global/list/limb_icon_cache = list() var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] if(eyes) eyes.update_colour() -/obj/item/organ/external/head/get_icon() - ..() - - //The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item - cut_overlays() - - //Every 'addon' below requires information from species - if(!iscarbon(owner) || !owner.species) - return - - var/icon/eyecon //VOREStation Edit -- holds eye icon to render over markings later. - - //Eye color/icon - var/should_have_eyes = owner.should_have_organ(O_EYES) - var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR - if((should_have_eyes || has_eye_color) && eye_icon) - var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] - var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon) - //Should have eyes - if(should_have_eyes) - //And we have them - if(eyes) - if(has_eye_color) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) - //They're gone! - else - eyes_icon.Blend(rgb(128,0,0), ICON_ADD) - //We have weird other-sorts of eyes (as we're not supposed to have eye organ, but we have HAS_EYE_COLOR species) - else - eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD) - - //VOREStation edit -- allow rendering of eyes over markings. - if(eyes_over_markings) - eyecon = eyes_icon - else - add_overlay(eyes_icon) - mob_icon.Blend(eyes_icon, ICON_OVERLAY) - icon_cache_key += "[eye_icon]" - - //Lip color/icon - if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) - var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") - add_overlay(lip_icon) - mob_icon.Blend(lip_icon, ICON_OVERLAY) - - //Head markings - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit - add_overlay(mark_s) //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" - - if(eyes_over_markings && eyecon) //VOREStation edit -- toggle to render eyes above markings. - add_overlay(eyecon) - mob_icon.Blend(eyecon, ICON_OVERLAY) - icon_cache_key += "[eye_icon]" - - add_overlay(get_hair_icon()) - - return mob_icon - /obj/item/organ/external/head/proc/get_hair_icon() var/image/res = image('icons/mob/human_face.dmi',"bald_s") //Facial hair @@ -122,7 +59,7 @@ var/global/list/limb_icon_cache = list() if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_MULTIPLY) // VOREStation edit + facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), facial_hair_style.color_blend_mode) res.add_overlay(facial_s) //Head hair diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 65ca927ee4..77d7a9436d 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -47,22 +47,24 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from. var/monitor_icon = 'icons/mob/monitor_icons.dmi' // Where it draws the monitor icon from. var/unavailable_at_chargen // If set, not available at chargen. - var/unavailable_to_build // If set, can't be constructed. - var/lifelike // If set, appears organic. - var/skin_tone // If set, applies skin tone rather than part color Overrides color. - var/skin_color // If set, applies skin color rather than part color. - var/blood_color = "#030303" - var/blood_name = "oil" + var/unavailable_to_build // If set, can't be constructed. + var/lifelike // If set, appears organic. + var/skin_tone // If set, applies skin tone rather than part color Overrides color. + var/skin_color // If set, applies skin color rather than part color. + var/blood_color = SYNTH_BLOOD_COLOUR // Colour for blood splatters. + var/blood_name = "oil" // Descriptor for blood splatters. + var/list/monitor_styles // If empty, the model of limbs offers a head compatible with monitors. + var/parts = BP_ALL // Defines what parts said brand can replace on a body. + var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator. + var/suggested_species = "Human" // If it should make the torso a species + var/speech_bubble_appearance = "synthetic" // What icon_state to use for speech bubbles when talking. Check talk.dmi for all the icons. + var/modular_bodyparts = MODULAR_BODYPART_PROSTHETIC // Whether or not this limb allows attaching/detaching, and whether or not it checks its parent as well. //VOREStation Edit; Let's just do full detachment/reattachment by default. + var/robo_brute_mod = 1 // Multiplier for incoming brute damage. + var/robo_burn_mod = 1 // As above for burn. + // Species in this list cannot take these prosthetics. var/list/species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_XENOCHIMERA) //VOREStation Edit - var/list/species_alternates = list(SPECIES_TAJ = "Unbranded - Tajaran", SPECIES_UNATHI = "Unbranded - Unathi") //"Species Name" = "Robolimb Company" , List, when initialized, will become "Species Name" = RobolimbDatum, used for alternate species sprites. - var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors. - var/parts = BP_ALL //Defines what parts said brand can replace on a body. - var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator. - var/suggested_species = "Human" //If it should make the torso a species - var/speech_bubble_appearance = "synthetic" // What icon_state to use for speech bubbles when talking. Check talk.dmi for all the icons. - - var/robo_brute_mod = 1 // Multiplier for incoming brute damage. - var/robo_burn_mod = 1 // As above for burn. + // "Species Name" = "Robolimb Company", List, when initialized, will become "Species Name" = RobolimbDatum, used for alternate species sprites. + var/list/species_alternates = list(SPECIES_TAJ = "Unbranded - Tajaran", SPECIES_UNATHI = "Unbranded - Unathi") /datum/robolimb/unbranded_monitor company = "Unbranded Monitor" @@ -77,12 +79,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with retro design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi' unavailable_to_build = 0 // CHOMP Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/unbranded_alt2 company = "Unbranded - Mantis Prosis" desc = "This limb has a casing of sleek black metal and repulsive insectile design." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi' unavailable_to_build = 0 // CHOMP Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/unbranded_tajaran company = "Unbranded - Tajaran" @@ -91,6 +95,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with feline design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_tajaran.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/unbranded_unathi company = "Unbranded - Unathi" @@ -99,6 +104,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with reptilian design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/unbranded_teshari company = "Unbranded - Teshari" @@ -107,12 +113,20 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with a small, raptor-like design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_teshari.dmi' unavailable_to_build = 0 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions + parts = list(BP_HEAD, BP_TORSO, BP_GROIN) + +/datum/robolimb/unbranded_teshari/limbs + company = "Unbranded - Teshari (Limbs)" + parts = list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC /datum/robolimb/nanotrasen company = "NanoTrasen" desc = "A simple but efficient robotic limb, created by NanoTrasen." icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_main.dmi' species_alternates = list(SPECIES_TAJ = "NanoTrasen - Tajaran", SPECIES_UNATHI = "NanoTrasen - Unathi") + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/nanotrasen_tajaran company = "NanoTrasen - Tajaran" @@ -122,6 +136,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple but efficient robotic limb, created by NanoTrasen." icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_tajaran.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/nanotrasen_unathi company = "NanoTrasen - Unathi" @@ -131,6 +146,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple but efficient robotic limb, created by NanoTrasen." icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/cenilimicybernetics_teshari company = "Cenilimi Cybernetics" @@ -140,12 +156,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "Made by a Teshari-owned company, for Teshari." icon = 'icons/mob/human_races/cyberlimbs/cenilimicybernetics/cenilimicybernetics_teshari.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/bishop company = "Bishop" desc = "This limb has a white polymer casing with blue holo-displays." icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/bishop_alt1 company = "Bishop - Glyph" @@ -153,12 +171,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/bishop_alt2 company = "Bishop - Rook" desc = "This limb has a solid plastic casing with blue lights along it." icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt2.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/bishop_monitor company = "Bishop Monitor" @@ -167,6 +187,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 parts = list(BP_HEAD) monitor_styles = standard_monitor_styles + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/gestaltframe company = "Skrellian Exoskeleton" @@ -181,24 +202,28 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ // Dionaea are naturally very tanky, so the robotic limbs are actually far weaker than their normal bodies. robo_brute_mod = 1.3 robo_burn_mod = 1.3 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/cybersolutions company = "Cyber Solutions" desc = "This limb is grey and rough, with little in the way of aesthetic." icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_main.dmi' unavailable_to_build = 0 // CHOMP Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/cybersolutions_alt2 company = "Cyber Solutions - Outdated" desc = "This limb is of severely outdated design; there's no way it's comfortable or very functional to use." icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt2.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/cybersolutions_alt1 company = "Cyber Solutions - Wight" desc = "This limb has cheap plastic panels mounted on grey metal." icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt1.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/cybersolutions_alt3 company = "Cyber Solutions - Array" @@ -206,12 +231,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt3.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/einstein company = "Einstein Engines" desc = "This limb is lightweight with a sleek design." icon = 'icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi' unavailable_to_build = 0 // CHOMP Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/grayson company = "Grayson" @@ -223,6 +250,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ green=grayson_green;\ blue=grayson_blue;\ rgb=grayson_rgb" + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/grayson_alt1 company = "Grayson - Reinforced" @@ -235,6 +263,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ scroll=grayson_alt_scroll;\ rgb=grayson_alt_rgb;\ rainbow=grayson_alt_rainbow" + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/grayson_monitor company = "Grayson Monitor" @@ -243,12 +272,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 parts = list(BP_HEAD) monitor_styles = standard_monitor_styles + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/hephaestus company = "Hephaestus" desc = "This limb has a militaristic black and green casing with gold stripes." icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_main.dmi' unavailable_to_build = 0 // CHOMP Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/hephaestus_alt1 company = "Hephaestus - Frontier" @@ -263,6 +294,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ scroll=hephaestus_alt_scroll;\ rgb=hephaestus_alt_rgb;\ rainbow=hephaestus_alt_rainbow" + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/hephaestus_alt2 company = "Hephaestus - Athena" @@ -271,6 +303,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 monitor_styles = "red=athena_red;\ blank=athena_off" + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/hephaestus_monitor company = "Hephaestus Monitor" @@ -279,6 +312,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 parts = list(BP_HEAD) monitor_styles = standard_monitor_styles + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/morpheus company = "Morpheus" @@ -286,6 +320,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi' unavailable_to_build = 0 // CHOMP Edit monitor_styles = standard_monitor_styles + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/morpheus_alt1 company = "Morpheus - Zenith" @@ -293,6 +328,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/morpheus_alt2 company = "Morpheus - Skeleton Crew" @@ -300,6 +336,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt2.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/veymed company = "Vey-Med" @@ -314,6 +351,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ speech_bubble_appearance = "normal" //robo_brute_mod = 1.1 //VOREStation Edit //robo_burn_mod = 1.1 //VOREStation Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/veymed_skrell company = "Vey-Med - Skrell" @@ -326,14 +364,16 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ blood_color = "#4451cf" blood_name = "coolant" speech_bubble_appearance = "normal" - robo_brute_mod = 1.05 - robo_burn_mod = 1.05 + //robo_brute_mod = 1.05 //VOREStation Edit + //robo_burn_mod = 1.05 //VOREStation Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/wardtakahashi company = "Ward-Takahashi" desc = "This limb features sleek black and white polymers." icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi' unavailable_to_build = 0 // CHOMP Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/wardtakahashi_alt1 company = "Ward-Takahashi - Shroud" @@ -341,12 +381,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/wardtakahashi_alt2 company = "Ward-Takahashi - Spirit" desc = "This limb has white and purple features, with a heavier casing." icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt2.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/wardtakahashi_monitor company = "Ward-Takahashi Monitor" @@ -355,12 +397,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 parts = list(BP_HEAD) monitor_styles = standard_monitor_styles + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/xion company = "Xion" desc = "This limb has a minimalist black and red casing." icon = 'icons/mob/human_races/cyberlimbs/xion/xion_main.dmi' unavailable_to_build = 0 // CHOMP Edit + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/xion_alt1 company = "Xion - Breach" @@ -368,6 +412,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/xion_alt2 company = "Xion - Hull" @@ -379,12 +424,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ green=xion_green;\ blue=xion_blue;\ rgb=xion_rgb" + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/xion_alt3 company = "Xion - Whiteout" desc = "This limb has a minimalist black and white casing." icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/xion_alt4 company = "Xion - Breach - Whiteout" @@ -392,6 +439,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/xion_monitor @@ -401,13 +449,24 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 parts = list(BP_HEAD) monitor_styles = standard_monitor_styles + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions /datum/robolimb/zenghu company = "Zeng-Hu" desc = "This limb has a rubbery fleshtone covering with visible seams." icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi' + species_alternates = list(SPECIES_TAJ = "Zeng-Hu - Tajaran") unavailable_to_build = 1 skin_tone = 1 + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions + +/datum/robolimb/wooden + company = "Morgan Trading Co" + desc = "A simplistic, metal-banded, wood-panelled prosthetic." + icon = 'icons/mob/human_races/cyberlimbs/prosthesis/wooden.dmi' + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC + parts = list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC /obj/item/weapon/disk/limb name = "Limb Blueprints" @@ -471,7 +530,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ var/species = SPECIES_HUMAN /obj/item/weapon/disk/species/Initialize() - ..() + . = ..() if(species) name = "[species] [initial(name)]" diff --git a/code/modules/organs/robolimbs_custom.dm b/code/modules/organs/robolimbs_custom.dm new file mode 100644 index 0000000000..12f6dbaa00 --- /dev/null +++ b/code/modules/organs/robolimbs_custom.dm @@ -0,0 +1,176 @@ +/datum/robolimb + var/includes_tail //Cyberlimbs dmi includes a tail sprite to wear. + var/includes_wing //Cyberlimbs dmi includes a wing sprite to wear. + var/list/whitelisted_to //List of ckeys that are allowed to pick this in charsetup. + +//////////////// For-specific-character fluff ones ///////////////// May be viable to place these into a custom_item subfolder, in order to allow CI Repo integration. + +// verkister : Rahwoof Boop +/datum/robolimb/eggnerdltd + company = "Eggnerd Prototyping Ltd." + desc = "This limb has a slight salvaged handicraft vibe to it. The CE-marking on it is definitely not the standardized one, it looks more like a hand-written sharpie monogram." + icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi' + blood_color = "#5e280d" + includes_tail = 1 + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb/eggnerdltd + company = "Eggnerd Prototyping Ltd." +// icon = 'icons/obj/items_vr.dmi' +// icon_state = "verkdisk" + +//////////////// General VS-only ones ///////////////// +/datum/robolimb/talon //They're buildable by default due to being extremely basic. + company = "Talon LLC" + desc = "This metallic limb is sleek and featuresless apart from some exposed motors" + icon = 'icons/mob/human_races/cyberlimbs/talon/talon_main.dmi' //Sprited by: Viveret + +/obj/item/weapon/disk/limb/talon + company = "Talon LLC" + +/datum/robolimb/zenghu_taj //This wasn't indented. At all. It's a miracle this didn't break literally everything. + company = "Zeng-Hu - Tajaran" + desc = "This limb has a rubbery fleshtone covering with visible seams." + icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_taj.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + +/datum/robolimb/eggnerdltdred + company = "Eggnerd Prototyping Ltd. (Red)" + desc = "A slightly more refined limb variant from Eggnerd Prototyping. Its got red plating instead of orange." + icon = 'icons/mob/human_races/cyberlimbs/rahboopred/rahboopred.dmi' + blood_color = "#5e280d" + includes_tail = 1 + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb/eggnerdltdred + company = "Eggnerd Prototyping Ltd. (Red)" + icon = 'icons/obj/items_vr.dmi' //VOREStation add. Use the right sprites + icon_state = "verkdisk" //VOREStation add. Use the right sprites + + +//Darkside Incorperated synthetic augmentation list! Many current most used fuzzy and notsofuzzy races made into synths here. +/datum/robolimb/dsi_tajaran + company = "DSI - Tajaran" + desc = "This limb feels soft and fluffy, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSITajaran/dsi_tajaran.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Tajara" + +/*/datum/robolimb/dsi_tajaran/New() + species_cannot_use = GLOB.all_species.Copy() + species_cannot_use -= SPECIES_TAJ +VS Edit - anyone can select these. */ + +/obj/item/weapon/disk/limb/dsi_tajaran + company = "DSI - Tajaran" + +/datum/robolimb/dsi_lizard + company = "DSI - Lizard" + desc = "This limb feels smooth and scalie, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSILizard/dsi_lizard.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Unathi" + +/* /datum/robolimb/dsi_lizard/New() // + species_cannot_use = GLOB.all_species.Copy() + species_cannot_use -= SPECIES_UNATHI +VS Edit - anyone can select these. */ + +/obj/item/weapon/disk/limb/dsi_lizard + company = "DSI - Lizard" + +/datum/robolimb/dsi_sergal + company = "DSI - Sergal" + desc = "This limb feels soft and fluffy, realistic design and toned muscle. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSISergal/dsi_sergal.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Sergal" + +/obj/item/weapon/disk/limb/dsi_sergal + company = "DSI - Sergal" + +/datum/robolimb/dsi_nevrean + company = "DSI - Nevrean" + desc = "This limb feels soft and feathery, lightweight, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSINevrean/dsi_nevrean.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Nevrean" + +/obj/item/weapon/disk/limb/dsi_nevrean + company = "DSI - Nevrean" + +/datum/robolimb/dsi_vulpkanin + company = "DSI - Vulpkanin" + desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Vulpkanin" + +/obj/item/weapon/disk/limb/dsi_vulpkanin + company = "DSI - Vulpkanin" + +/datum/robolimb/dsi_akula + company = "DSI - Akula" + desc = "This limb feels soft and fleshy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIAkula/dsi_akula.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Akula" + +/obj/item/weapon/disk/limb/dsi_akula + company = "DSI - Akula" + +/datum/robolimb/dsi_spider + company = "DSI - Vasilissan" + desc = "This limb feels hard and chitinous, realistic design. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSISpider/dsi_spider.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Vasilissan" + +/obj/item/weapon/disk/limb/dsi_spider + company = "DSI - Vasilissan" + +/datum/robolimb/dsi_teshari + company = "DSI - Teshari" + desc = "This limb has a thin synthflesh casing with a few connection ports." + icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi' + lifelike = 1 + skin_tone = 1 + suggested_species = SPECIES_TESHARI + +/datum/robolimb/dsi_teshari/New() + species_cannot_use = GLOB.all_species.Copy() + species_cannot_use -= SPECIES_TESHARI //VOREStation add - let 'em be selected. + species_cannot_use -= SPECIES_CUSTOM //VOREStation add - let 'em be selected. + ..() + +/obj/item/weapon/disk/limb/dsi_teshari + company = "DSI - Teshari" \ No newline at end of file diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index 44953be646..fd0a8b230c 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -1,8 +1,3 @@ -/datum/robolimb - var/includes_tail //Cyberlimbs dmi includes a tail sprite to wear. - var/includes_wing //Cyberlimbs dmi includes a wing sprite to wear. - var/list/whitelisted_to //List of ckeys that are allowed to pick this in charsetup. - //CitRP Port var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ default=cyber_default;\ @@ -51,20 +46,6 @@ var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ /obj/item/weapon/disk/limb/white_kryten company = "White Kryten Cybernetics" -// verkister : Rahwoof Boop -/datum/robolimb/eggnerdltd - company = "Eggnerd Prototyping Ltd." - desc = "This limb has a slight salvaged handicraft vibe to it. The CE-marking on it is definitely not the standardized one, it looks more like a hand-written sharpie monogram." - icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi' - blood_color = "#5e280d" - includes_tail = 1 - unavailable_to_build = 1 - -/obj/item/weapon/disk/limb/eggnerdltd - company = "Eggnerd Prototyping Ltd." - icon = 'icons/obj/items_vr.dmi' - icon_state = "verkdisk" - // tucker0666 : Frost /datum/robolimb/zenghu_frost company = "Zeng-Hu (Custom)" @@ -76,158 +57,10 @@ var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ unavailable_to_build = 1 whitelisted_to = list("tucker0666") - /obj/item/weapon/disk/limb/zenghu_frost company = "Zeng-Hu (Modified)" catalogue_data = list(/datum/category_item/catalogue/information/organization/zeng_hu) -//////////////// General VS-only ones ///////////////// -/datum/robolimb/talon //They're buildable by default due to being extremely basic. - company = "Talon LLC" - desc = "This metallic limb is sleek and featuresless apart from some exposed motors" - icon = 'icons/mob/human_races/cyberlimbs/talon/talon_main.dmi' //Sprited by: Viveret - -/obj/item/weapon/disk/limb/talon - company = "Talon LLC" - -/datum/robolimb/zenghu_taj //This wasn't indented. At all. It's a miracle this didn't break literally everything. - company = "Zeng-Hu - Tajaran" - desc = "This limb has a rubbery fleshtone covering with visible seams." - icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_taj.dmi' - unavailable_to_build = 1 - parts = list(BP_HEAD) - -/datum/robolimb/eggnerdltdred - company = "Eggnerd Prototyping Ltd. (Red)" - desc = "A slightly more refined limb variant from Eggnerd Prototyping. Its got red plating instead of orange." - icon = 'icons/mob/human_races/cyberlimbs/rahboopred/rahboopred.dmi' - blood_color = "#5e280d" - includes_tail = 1 - unavailable_to_build = 1 - -/obj/item/weapon/disk/limb/eggnerdltdred - company = "Eggnerd Prototyping Ltd. (Red)" - icon = 'icons/obj/items_vr.dmi' - icon_state = "verkdisk" - - -//Darkside Incorperated synthetic augmentation list! Many current most used fuzzy and notsofuzzy races made into synths here. - -/datum/robolimb/dsi_tajaran - company = "DSI - Tajaran" - desc = "This limb feels soft and fluffy, realistic design and squish. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSITajaran/dsi_tajaran.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Tajara" - -/obj/item/weapon/disk/limb/dsi_tajaran - company = "DSI - Tajaran" - -/datum/robolimb/dsi_lizard - company = "DSI - Lizard" - desc = "This limb feels smooth and scalie, realistic design and squish. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSILizard/dsi_lizard.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Unathi" - -/obj/item/weapon/disk/limb/dsi_lizard - company = "DSI - Lizard" - -/datum/robolimb/dsi_sergal - company = "DSI - Sergal" - desc = "This limb feels soft and fluffy, realistic design and toned muscle. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSISergal/dsi_sergal.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Sergal" - -/obj/item/weapon/disk/limb/dsi_sergal - company = "DSI - Sergal" - -/datum/robolimb/dsi_nevrean - company = "DSI - Nevrean" - desc = "This limb feels soft and feathery, lightweight, realistic design and squish. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSINevrean/dsi_nevrean.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Nevrean" - -/obj/item/weapon/disk/limb/dsi_nevrean - company = "DSI - Nevrean" - -/datum/robolimb/dsi_vulpkanin - company = "DSI - Vulpkanin" - desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Vulpkanin" - -/obj/item/weapon/disk/limb/dsi_vulpkanin - company = "DSI - Vulpkanin" - -/datum/robolimb/dsi_akula - company = "DSI - Akula" - desc = "This limb feels soft and fleshy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSIAkula/dsi_akula.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Akula" - -/obj/item/weapon/disk/limb/dsi_akula - company = "DSI - Akula" - -/datum/robolimb/dsi_spider - company = "DSI - Vasilissan" - desc = "This limb feels hard and chitinous, realistic design. Seems a little mischievous. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSISpider/dsi_spider.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Vasilissan" - -/obj/item/weapon/disk/limb/dsi_spider - company = "DSI - Vasilissan" - -/datum/robolimb/dsi_teshari - company = "DSI - Teshari" - desc = "This limb has a thin synthflesh casing with a few connection ports." - icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi' - lifelike = 1 - skin_tone = 1 - suggested_species = "Teshari" - -/datum/robolimb/dsi_teshari/New() - species_cannot_use = GLOB.all_species.Copy() - species_cannot_use -= SPECIES_TESHARI - species_cannot_use -= SPECIES_CUSTOM - ..() - -/obj/item/weapon/disk/limb/dsi_teshari - company = "DSI - Teshari" - //Ported from CitRP /datum/robolimb/cyber_beast company = "Cyber Tech(Protogen analogue)" //CHOMPEdit diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index 3e8f6eadd5..6b6367e8a0 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -212,7 +212,7 @@ vital = TRUE /obj/item/organ/internal/brain/cephalon/Initialize() - ..() + . = ..() spawn(30 SECONDS) // FBP Dionaea need some way to be disassembled through surgery, if absolutely necessary. if(!owner.isSynthetic()) vital = FALSE diff --git a/code/modules/organs/subtypes/shadekin_vr.dm b/code/modules/organs/subtypes/shadekin_vr.dm index 8b17b70d6e..90ecbad9cf 100644 --- a/code/modules/organs/subtypes/shadekin_vr.dm +++ b/code/modules/organs/subtypes/shadekin_vr.dm @@ -4,11 +4,11 @@ /obj/item/organ/external/groin/crewkin min_broken_damage = 20 -/obj/item/organ/external/head/vr/crewkin +/obj/item/organ/external/head/crewkin min_broken_damage = 15 - eye_icons_vr = 'icons/mob/human_face_vr.dmi' - eye_icon_vr = "eyes_shadekin_station" + eye_icon_location = 'icons/mob/human_face_vr.dmi' + eye_icon = "eyes_shadekin_station" /obj/item/organ/external/arm/crewkin min_broken_damage = 15 diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm index 5fb54a21b4..eef360a515 100644 --- a/code/modules/organs/subtypes/slime.dm +++ b/code/modules/organs/subtypes/slime.dm @@ -92,7 +92,7 @@ var/strain_regen_cooldown = 5 MINUTES /obj/item/organ/internal/regennetwork/Initialize() - ..() + . = ..() var/mob/living/carbon/human/H = null spawn(15) if(ishuman(owner)) diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 1c4fb5ee27..85b6328472 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -266,13 +266,13 @@ encased = "skull" base_miss_chance = 40 var/can_intake_reagents = 1 + var/head_offset = 0 var/eye_icon = "eyes_s" + var/eye_icon_location = 'icons/mob/human_face.dmi' force = 3 throwforce = 7 var/eyes_over_markings = FALSE //VOREStation edit - var/eye_icon_location = 'icons/mob/human_face.dmi' - /obj/item/organ/external/head/Initialize() if(config.allow_headgibs) cannot_gib = FALSE @@ -324,10 +324,73 @@ "You make \the [I] kiss \the [src]!.") return ..() +/obj/item/organ/external/head/get_icon() + ..() + + //The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item + cut_overlays() + + //Every 'addon' below requires information from species + if(!iscarbon(owner) || !owner.species) + return + + var/icon/eyecon //VOREStation Add + + //Eye color/icon + var/should_have_eyes = owner.should_have_organ(O_EYES) + var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR + if((should_have_eyes || has_eye_color) && eye_icon) + var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] + var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon) + //Should have eyes + if(should_have_eyes) + //And we have them + if(eyes) + if(has_eye_color) + eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + //They're gone! + else + eyes_icon.Blend(rgb(128,0,0), ICON_ADD) + //We have weird other-sorts of eyes (as we're not supposed to have eye organ, but we have HAS_EYE_COLOR species) + else + eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD) + + //VOREStation edit -- allow rendering of eyes over markings. + if(eyes_over_markings) + eyecon = eyes_icon + else + add_overlay(eyes_icon) + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + icon_cache_key += "[eye_icon]" + + //Lip color/icon + if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) + var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") + add_overlay(lip_icon) + mob_icon.Blend(lip_icon, ICON_OVERLAY) + + //Head markings + for(var/M in markings) + var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] + var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) + add_overlay(mark_s) //So when it's not on your body, it has icons + mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[M][markings[M]["color"]]" + + if(eyes_over_markings && eyecon) //VOREStation edit -- toggle to render eyes above markings. + add_overlay(eyecon) + mob_icon.Blend(eyecon, ICON_OVERLAY) + icon_cache_key += "[eye_icon]" + + add_overlay(get_hair_icon()) + + return mob_icon + /obj/item/organ/external/head/skrell eye_icon = "skrell_eyes_s" -/obj/item/organ/external/head/seromi +/obj/item/organ/external/head/teshari eye_icon = "eyes_seromi" /obj/item/organ/external/head/no_eyes diff --git a/code/modules/organs/subtypes/standard_vr.dm b/code/modules/organs/subtypes/standard_vr.dm index bf429cb878..64ec8b08a6 100644 --- a/code/modules/organs/subtypes/standard_vr.dm +++ b/code/modules/organs/subtypes/standard_vr.dm @@ -1,77 +1,27 @@ //For custom heads with custom parts since the base code is restricted to a single icon file. -/obj/item/organ/external/head/vr/get_icon() - - ..() - overlays.Cut() - if(!owner || !owner.species) - return - - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) - overlays |= mark_s //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" - - if(owner.should_have_organ(O_EYES))//Moved on top of markings. - var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] - if(eye_icon) - var/icon/eyes_icon = new/icon(eye_icons_vr, eye_icon_vr) - if(eyes) - if(owner.species.appearance_flags & HAS_EYE_COLOR) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) - else - eyes_icon.Blend(rgb(128,0,0), ICON_ADD) - mob_icon.Blend(eyes_icon, ICON_OVERLAY) - overlays |= eyes_icon - - if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) - var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") - overlays |= lip_icon - mob_icon.Blend(lip_icon, ICON_OVERLAY) - - if(owner.f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] - if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) - overlays |= image(facial_s, "pixel_y" = head_offset) - - if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] - if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed)) - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) - hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) - overlays |= image(hair_s, "pixel_y" = head_offset) - return mob_icon - -/obj/item/organ/external/head/vr - var/eye_icons_vr = 'icons/mob/human_face_vr.dmi' - var/eye_icon_vr = "blank_eyes" - var/head_offset = 0 +/obj/item/organ/external/head/blank_vr // Unused for now. Might be at some point. + eye_icon_location = 'icons/mob/human_face_vr.dmi' eye_icon = "blank_eyes" -/obj/item/organ/external/head/vr/sergal - eye_icon_vr = "eyes_sergal" +/obj/item/organ/external/head/sergal + eye_icon_location = 'icons/mob/human_face_vr.dmi' + eye_icon = "eyes_sergal" -/obj/item/organ/external/head/vr/werebeast - eye_icons_vr = 'icons/mob/werebeast_face_vr.dmi' - eye_icon_vr = "werebeast_eyes" +/obj/item/organ/external/head/werebeast + eye_icon_location = 'icons/mob/werebeast_face_vr.dmi' + eye_icon = "werebeast_eyes" head_offset = 6 -/obj/item/organ/external/head/vr/shadekin +/obj/item/organ/external/head/shadekin cannot_gib = 1 cannot_amputate = 1 - - eye_icons_vr = 'icons/mob/human_face_vr.dmi' - eye_icon_vr = "eyes_shadekin" - + + eye_icon_location = 'icons/mob/human_face_vr.dmi' + eye_icon = "eyes_shadekin" + //yw edit /obj/item/organ/external/head/vr/grey - eye_icons_vr = 'icons/mob/human_face_yw.dmi' - eye_icon_vr = "eyes_grey" + eye_icon_location = 'icons/mob/human_face_yw.dmi' + eye_icon = "eyes_grey" //yw edit diff --git a/code/modules/organs/subtypes/teshari.dm b/code/modules/organs/subtypes/teshari.dm new file mode 100644 index 0000000000..00f673482c --- /dev/null +++ b/code/modules/organs/subtypes/teshari.dm @@ -0,0 +1,8 @@ +/obj/item/organ/external/foot/teshari + body_hair = "feathers" +/obj/item/organ/external/foot/right/teshari + body_hair = "feathers" +/obj/item/organ/external/hand/teshari + body_hair = "feathers" +/obj/item/organ/external/hand/right/teshari + body_hair = "feathers" diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 5721c6f9c7..267381d9a4 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -86,7 +86,7 @@ E.set_thrust_limit(limit) . = TRUE - if("toggle") + if("toggle_engine") var/datum/ship_engine/E = locate(params["engine"]) if(istype(E)) E.toggle() diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index bec21e16a3..30c9ed3632 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -105,7 +105,7 @@ if(nrange) sensors.set_range(CLAMP(nrange, 1, world.view)) . = TRUE - if("toggle") + if("toggle_sensor") sensors.toggle() . = TRUE diff --git a/code/modules/overmap/turfs.dm b/code/modules/overmap/turfs.dm index bd31d6bc9a..916a8f4159 100644 --- a/code/modules/overmap/turfs.dm +++ b/code/modules/overmap/turfs.dm @@ -10,7 +10,6 @@ var/global/list/map_sectors = list() /turf/unsimulated/map icon = 'icons/turf/space.dmi' icon_state = "map" - initialized = FALSE // TODO - Fix unsimulated turf initialization so this override is not necessary! /turf/unsimulated/map/edge opacity = 1 diff --git a/code/modules/paperwork/faxmachine_vr.dm b/code/modules/paperwork/faxmachine_vr.dm index 60b99117d4..74dd109368 100644 --- a/code/modules/paperwork/faxmachine_vr.dm +++ b/code/modules/paperwork/faxmachine_vr.dm @@ -6,12 +6,12 @@ * If the fax is a paper_bundle, do so recursively for each page. * returns a random unique faxid. */ -/obj/machinery/photocopier/faxmachine/proc/export_fax(fax) - var faxid = "[num2text(world.realtime,12)]_[rand(10000)]" +/obj/machinery/photocopier/faxmachine/proc/export_fax(fax) //CHOMPEdit Begin + var faxid = "[num2text(world.realtime,12)]_[rand(9999)+1]" if (istype(fax, /obj/item/weapon/paper)) var/obj/item/weapon/paper/P = fax var/text = "[P.name][P.info][P.stamps]"; - file("[config.fax_export_dir]/fax_[faxid].html") << text; + rustg_file_write(text, "[config.fax_export_dir]/fax_[faxid].html") else if (istype(fax, /obj/item/weapon/photo)) var/obj/item/weapon/photo/H = fax fcopy(H.img, "[config.fax_export_dir]/photo_[faxid].png") @@ -20,22 +20,42 @@ + "" \ + "[H.scribble ? "
Written on the back:
[H.scribble]" : ""]"\ + "" - file("[config.fax_export_dir]/fax_[faxid].html") << text + rustg_file_write(text, "[config.fax_export_dir]/fax_[faxid].html") else if (istype(fax, /obj/item/weapon/paper_bundle)) + var/def_faxid = faxid + faxid += "_0" var/obj/item/weapon/paper_bundle/B = fax var/data = "" for (var/page = 1, page <= B.pages.len, page++) var/obj/pageobj = B.pages[page] - var/page_faxid = export_fax(pageobj) + var/page_faxid = export_fax_id(pageobj,def_faxid + "_[page]") data += "Page [page] - [pageobj.name]
" var/text = "[B.name][data]" - file("[config.fax_export_dir]/fax_[faxid].html") << text + rustg_file_write(text, "[config.fax_export_dir]/fax_[faxid].html") return faxid +/obj/machinery/photocopier/faxmachine/proc/export_fax_id(fax,faxid) + if (istype(fax, /obj/item/weapon/paper)) + var/obj/item/weapon/paper/P = fax + var/text = "[P.name][P.info][P.stamps]"; + rustg_file_write(text, "[config.fax_export_dir]/fax_[faxid].html") + else if (istype(fax, /obj/item/weapon/photo)) + var/obj/item/weapon/photo/H = fax + fcopy(H.img, "[config.fax_export_dir]/photo_[faxid].png") + var/text = "[H.name]" \ + + "" \ + + "" \ + + "[H.scribble ? "
Written on the back:
[H.scribble]" : ""]"\ + + "" + rustg_file_write(text, "[config.fax_export_dir]/fax_[faxid].html") + return faxid +//CHOMPEdit End /** * Call the chat webhook to transmit a notification of an admin fax to the admin chat. */ /obj/machinery/photocopier/faxmachine/proc/message_chat_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/faxid, font_colour="#006100") + if(config.discord_faxes_disabled) //CHOMPEdit + return if (config.chat_webhook_url) spawn(0) var/query_string = "type=fax" @@ -46,8 +66,32 @@ query_string += "&sendername=[url_encode(sender.name)]" query_string += "&sentname=[url_encode(sent.name)]" world.Export("[config.chat_webhook_url]?[query_string]") - //YW EDIT - world.TgsTargetedChatBroadcast("FAX: [sanitize(faxname)] / [sanitize(sent.name)] - SENT BY: [sanitize(sender.name)] - FAXID: **[sanitize(faxid)]**", TRUE) + //YW EDIT //CHOMPEdit also + var/idlen = length(faxid) + 1 + if (istype(sent, /obj/item/weapon/paper_bundle)) + var/obj/item/weapon/paper_bundle/B = sent + faxid = copytext(faxid,1,idlen-2) + var/faxids = "FAXMULTIID: [faxid]_0" + var/contents = "" + + if((!config.nodebot_enabled) && config.discord_faxes_autoprint) + var/faxmsg = return_file_text("[config.fax_export_dir]/fax_[faxid]_0.html") + contents += "\nFAX: ```[strip_html_properly(faxmsg)]```" + + for(var/page = 1, page <= B.pages.len, page++) + var/curid = "[faxid]_[page]" + faxids+= "|[curid]" + if((!config.nodebot_enabled) && config.discord_faxes_autoprint) + var/faxmsg = return_file_text("[config.fax_export_dir]/fax_[curid].html") + contents += "\nFAX PAGE [page]: ```[strip_html_properly(faxmsg)]```" + + world.TgsTargetedChatBroadcast("MULTIFAX: [sanitize(faxname)] / [sanitize(sent.name)] - SENT BY: [sanitize(sender.name)] - [faxids] [contents]", TRUE) + else + var/contents = "" + if((!config.nodebot_enabled) && config.discord_faxes_autoprint) + var/faxmsg = return_file_text("[config.fax_export_dir]/fax_[faxid].html") + contents += "\nFAX: ```[strip_html_properly(faxmsg)]```" + world.TgsTargetedChatBroadcast("FAX: [sanitize(faxname)] / [sanitize(sent.name)] - SENT BY: [sanitize(sender.name)] - FAXID: **[sanitize(faxid)]** [contents]", TRUE) //YW EDIT END // diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 9182a17530..1b2624c125 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -21,50 +21,63 @@ return // don't set a label if(!labels_left) - to_chat(user, "No labels left.") + to_chat(user, SPAN_WARNING("\The [src] has no labels left.")) return if(!label || !length(label)) - to_chat(user, "No text set.") + to_chat(user, SPAN_WARNING("\The [src] has no label text set.")) return if(length(A.name) + length(label) > 64) - to_chat(user, "Label too big.") + to_chat(user, SPAN_WARNING("\The [src]'s label too big.")) + return + if(istype(A, /mob/living/silicon/robot/platform)) + var/mob/living/silicon/robot/platform/P = A + if(!P.allowed(user)) + to_chat(usr, SPAN_WARNING("Access denied.")) + else if(P.client || P.key) + to_chat(user, SPAN_NOTICE("You rename \the [P] to [label].")) + to_chat(P, SPAN_NOTICE("\The [user] renames you to [label].")) + P.custom_name = label + P.SetName(P.custom_name) + else + to_chat(user, SPAN_WARNING("\The [src] is inactive and cannot be renamed.")) return if(ishuman(A)) - to_chat(user, "The label refuses to stick to [A.name].") + to_chat(user, SPAN_WARNING("The label refuses to stick to [A.name].")) return if(issilicon(A)) - to_chat(user, "The label refuses to stick to [A.name].") + to_chat(user, SPAN_WARNING("The label refuses to stick to [A.name].")) return if(isobserver(A)) - to_chat(user, "[src] passes through [A.name].") + to_chat(user, SPAN_WARNING("[src] passes through [A.name].")) return if(istype(A, /obj/item/weapon/reagent_containers/glass)) - to_chat(user, "The label can't stick to the [A.name]. (Try using a pen)") + to_chat(user, SPAN_WARNING("The label can't stick to the [A.name] (Try using a pen).")) return if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/tray = A if(!tray.mechanical) - to_chat(user, "How are you going to label that?") + to_chat(user, SPAN_WARNING("How are you going to label that?")) return tray.labelled = label spawn(1) tray.update_icon() - user.visible_message("[user] labels [A] as [label].", \ - "You label [A] as [label].") + user.visible_message( \ + SPAN_NOTICE("\The [user] labels [A] as [label]."), \ + SPAN_NOTICE("You label [A] as [label].")) A.name = "[A.name] ([label])" /obj/item/weapon/hand_labeler/attack_self(mob/user as mob) mode = !mode icon_state = "labeler[mode]" if(mode) - to_chat(user, "You turn on \the [src].") + to_chat(user, SPAN_NOTICE("You turn on \the [src].")) //Now let them chose the text. var/str = sanitizeSafe(input(user,"Label text?","Set label",""), MAX_NAME_LEN) if(!str || !length(str)) - to_chat(user, "Invalid text.") + to_chat(user, SPAN_WARNING("Invalid text.")) return label = str - to_chat(user, "You set the text to '[str]'.") + to_chat(user, SPAN_NOTICE("You set the text to '[str]'.")) else - to_chat(user, "You turn off \the [src].") \ No newline at end of file + to_chat(user, SPAN_NOTICE("You turn off \the [src].")) \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4d3b2d27c5..15a8e702d4 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -368,8 +368,8 @@ t = replacetext(t, "\[/grid\]", "") t = replacetext(t, "\[row\]", "") t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[logo\]", "") - t = replacetext(t, "\[sglogo\]", "") + t = replacetext(t, "\[logo\]", "") //CHOMPEdit + t = replacetext(t, "\[sglogo\]", "") //CHOMPEdit t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 5aa1f6901f..713c8581d7 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -129,7 +129,7 @@ var/default_icon_state /obj/item/weapon/pen/blade/Initialize() - ..() + . = ..() active_icon_state = "[icon_state]-x" default_icon_state = icon_state diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 07009a99c0..ef19bc2322 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -286,7 +286,7 @@ temp_img = icon('icons/obj/butts_vr.dmi', "machine") if(SPECIES_WEREBEAST) temp_img = icon('icons/obj/butts_vr.dmi', "vulp") // Give Werewolves their own thicc'er than a boal of oatmeal ass sprite someday? - if(SPECIES_XENOHYBRID, SPECIES_XENO, SPECIES_XENO_DRONE, SPECIES_XENO_HUNTER, SPECIES_XENO_QUEEN, SPECIES_XENO_SENTINEL) // Xenos + Xenohybrids have their own asses, thanks to Pybro. + if(SPECIES_XENOHYBRID, SPECIES_GENA, SPECIES_GENA_DRONE, SPECIES_GENA_HUNTER, SPECIES_GENA_QUEEN, SPECIES_GENA_SENTINEL) // Xenos + Xenohybrids have their own asses, thanks to Pybro. CHOMPedit temp_img = icon('icons/obj/butts_vr.dmi', "xeno") if(SPECIES_ZORREN_HIGH) temp_img = icon('icons/obj/butts_vr.dmi', "vulp") // placeholder until we get zorren butts. diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm index 2ec6a4e536..d391419d91 100644 --- a/code/modules/pda/cart.dm +++ b/code/modules/pda/cart.dm @@ -154,7 +154,7 @@ var/list/civilian_cartridges = list( /obj/item/weapon/cartridge/signal/Initialize() radio = new /obj/item/radio/integrated/signal(src) - ..() + . = ..() /obj/item/weapon/cartridge/signal/science name = "\improper Signal Ace 2 cartridge" @@ -307,5 +307,4 @@ var/list/civilian_cartridges = list( name = "F.R.A.M.E. cartridge" icon_state = "cart" charges = 5 - var/telecrystals = 0 messenger_plugins = list(new/datum/data/pda/messenger_plugin/virus/frame) diff --git a/code/modules/pda/messenger_plugins.dm b/code/modules/pda/messenger_plugins.dm index 90cb9460a4..dd77e621a0 100644 --- a/code/modules/pda/messenger_plugins.dm +++ b/code/modules/pda/messenger_plugins.dm @@ -85,7 +85,4 @@ P.lock_code = lock_code // else // P.hidden_uplink.hidden_crystals += P.hidden_uplink.uses //Temporarially hide the PDA's crystals, so you can't steal telecrystals. - var/obj/item/weapon/cartridge/frame/parent_cart = pda.cartridge - P.hidden_uplink.uses = parent_cart.telecrystals - parent_cart.telecrystals = 0 P.hidden_uplink.active = TRUE diff --git a/code/modules/pda/pda.dm b/code/modules/pda/pda.dm index f05a1056fd..298e8efd13 100644 --- a/code/modules/pda/pda.dm +++ b/code/modules/pda/pda.dm @@ -11,7 +11,7 @@ var/global/list/obj/item/device/pda/PDAs = list() item_state = "electronic" w_class = ITEMSIZE_SMALL slot_flags = SLOT_ID | SLOT_BELT - sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/id.dmi') + sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/teshari/id.dmi') //Main variables var/pdachoice = 1 @@ -139,8 +139,8 @@ var/global/list/obj/item/device/pda/PDAs = list() desc = "A portable microcomputer by Thinktronic Systems, LTD. This model is a wrist-bound version." slot_flags = SLOT_ID | SLOT_BELT | SLOT_GLOVES sprite_sheets = list( - SPECIES_TESHARI = 'icons/mob/species/seromi/pda_wrist.dmi', - SPECIES_VR_TESHARI = 'icons/mob/species/seromi/pda_wrist.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/pda_wrist.dmi', + SPECIES_VR_TESHARI = 'icons/mob/species/teshari/pda_wrist.dmi', ) else icon = 'icons/obj/pda_old.dmi' diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm index 0d3b115a13..5a51c677f0 100644 --- a/code/modules/pda/radio.dm +++ b/code/modules/pda/radio.dm @@ -107,13 +107,11 @@ return ..() /obj/item/radio/integrated/signal/Initialize() - if(!radio_controller) - return - - if(src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ) - src.frequency = sanitize_frequency(src.frequency) - - set_frequency(frequency) + . = ..() + if(radio_controller) + if(src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ) + src.frequency = sanitize_frequency(src.frequency) + set_frequency(frequency) /obj/item/radio/integrated/signal/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) diff --git a/code/modules/persistence/filth.dm b/code/modules/persistence/filth.dm index a7aa9e9cd4..059f1b61fe 100644 --- a/code/modules/persistence/filth.dm +++ b/code/modules/persistence/filth.dm @@ -5,9 +5,9 @@ icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") color = "#464f33" - persistent = TRUE anchored = 1 + persistent = TRUE /obj/effect/decal/cleanable/filth/Initialize() . = ..() - alpha = rand(180,220) \ No newline at end of file + alpha = rand(180,220) diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 921142812d..e3f0b31810 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -278,8 +278,8 @@ var/datum/planet/sif/planet_sif = null transition_messages = list( "The sky is dark, and rain falls down upon you." ) -// outdoor_sounds_type = /datum/looping_sound/weather/rain -// indoor_sounds_type = /datum/looping_sound/weather/rain/indoors + outdoor_sounds_type = /datum/looping_sound/weather/rain + indoor_sounds_type = /datum/looping_sound/weather/rain/indoors /datum/weather/sif/rain/process_effects() ..() @@ -327,8 +327,8 @@ var/datum/planet/sif/planet_sif = null "Loud thunder is heard in the distance.", "A bright flash heralds the approach of a storm." ) -// outdoor_sounds_type = /datum/looping_sound/weather/rain -// indoor_sounds_type = /datum/looping_sound/weather/rain/indoors + outdoor_sounds_type = /datum/looping_sound/weather/rain + indoor_sounds_type = /datum/looping_sound/weather/rain/indoors transition_chances = list( diff --git a/code/modules/planet/virgo3b_vr.dm b/code/modules/planet/virgo3b_vr.dm index 26d33631a1..710f2698c0 100644 --- a/code/modules/planet/virgo3b_vr.dm +++ b/code/modules/planet/virgo3b_vr.dm @@ -265,6 +265,8 @@ var/datum/planet/virgo3b/planet_virgo3b = null transition_messages = list( "The sky is dark, and rain falls down upon you." ) + outdoor_sounds_type = /datum/looping_sound/weather/rain + indoor_sounds_type = /datum/looping_sound/weather/rain/indoors /datum/weather/virgo3b/rain/process_effects() ..() @@ -310,6 +312,8 @@ var/datum/planet/virgo3b/planet_virgo3b = null "Loud thunder is heard in the distance.", "A bright flash heralds the approach of a storm." ) + outdoor_sounds_type = /datum/looping_sound/weather/rain + indoor_sounds_type = /datum/looping_sound/weather/rain/indoors transition_chances = list( diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index ca6f96ec9b..052813ade7 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -62,6 +62,11 @@ charge = 0 update_icon() +/obj/item/weapon/cell/mech + name = "mecha power cell" + charge = 15000 + maxcharge = 15000 + /obj/item/weapon/cell/infinite name = "infinite-capacity power cell!" icon_state = "icell" diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index ebe3bbb744..e7a93f71a3 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -2,13 +2,13 @@ TODO README */ -var/list/fusion_cores = list() +GLOBAL_LIST_EMPTY(fusion_cores) #define MAX_FIELD_STR 1000 #define MIN_FIELD_STR 1 /obj/machinery/power/fusion_core - name = "\improper R-UST Mk. 8 Tokamak core" + name = "\improper R-UST Mk. 9 Tokamak core" desc = "An enormous solenoid for generating extremely high power electromagnetic fields. It includes a kinetic energy harvester." icon = 'icons/obj/machines/power/fusion.dmi' icon_state = "core0" @@ -20,16 +20,25 @@ var/list/fusion_cores = list() circuit = /obj/item/weapon/circuitboard/fusion_core + var/obj/item/hose_connector/output/Output + var/obj/effect/fusion_em_field/owned_field var/field_strength = 1//0.01 + var/target_field_strength = 1 var/id_tag + var/reactant_dump = FALSE // Does the tokomak actively try to syphon materials? + /obj/machinery/power/fusion_core/mapped anchored = 1 /obj/machinery/power/fusion_core/Initialize() . = ..() - fusion_cores += src + GLOB.fusion_cores += src + + Output = new(src) + create_reagents(10000) + default_apply_parts() /obj/machinery/power/fusion_core/mapped/Initialize() @@ -41,14 +50,31 @@ var/list/fusion_cores = list() FCC.connected_devices -= src if(FCC.cur_viewed_device == src) FCC.cur_viewed_device = null - fusion_cores -= src + GLOB.fusion_cores -= src return ..() +/obj/machinery/power/fusion_core/proc/check_core_status() + if(stat & BROKEN) + return + if(idle_power_usage > avail()) + return + . = 1 + /obj/machinery/power/fusion_core/process() if((stat & BROKEN) || !powernet || !owned_field) Shutdown() + + if(Output.get_pairing()) + reagents.trans_to_holder(Output.reagents, Output.reagents.maximum_volume) + if(prob(5)) + visible_message("\The [src] gurgles as it exports fluid.") + if(owned_field) + + set_strength(target_field_strength) + spawn(1) + owned_field.process() owned_field.stability_monitor() owned_field.radiation_scale() owned_field.temp_dump() @@ -95,10 +121,12 @@ var/list/fusion_cores = list() /obj/machinery/power/fusion_core/proc/set_strength(var/value) value = CLAMP(value, MIN_FIELD_STR, MAX_FIELD_STR) - field_strength = value - update_active_power_usage(5 * value) - if(owned_field) - owned_field.ChangeFieldStrength(value) + + if(field_strength != value) + field_strength = value + update_active_power_usage(5 * value) + if(owned_field) + owned_field.ChangeFieldStrength(value) /obj/machinery/power/fusion_core/attack_hand(var/mob/user) if(!Adjacent(user)) // As funny as it was for the AI to hug-kill the tokamak field from a distance... diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm index dc5e16c87e..e897dbd6ab 100644 --- a/code/modules/power/fusion/core/core_control.dm +++ b/code/modules/power/fusion/core/core_control.dm @@ -1,26 +1,47 @@ /obj/machinery/computer/fusion_core_control name = "\improper R-UST Mk. 8 core control" - icon = 'icons/obj/machines/power/fusion.dmi' - icon_state = "core_control" light_color = COLOR_ORANGE circuit = /obj/item/weapon/circuitboard/fusion_core_control - var/id_tag + + icon_keyboard = "tech_key" + icon_screen = "core_control" + + var/id_tag = "" var/scan_range = 25 var/list/connected_devices = list() var/obj/machinery/power/fusion_core/cur_viewed_device + var/datum/tgui_module/rustcore_monitor/monitor + +/obj/machinery/computer/fusion_core_control/New() + ..() + monitor = new(src) + monitor.core_tag = id_tag + +/obj/machinery/computer/fusion_core_control/Destroy() + QDEL_NULL(monitor) + ..() /obj/machinery/computer/fusion_core_control/attackby(var/obj/item/thing, var/mob/user) ..() if(istype(thing, /obj/item/device/multitool)) - var/new_ident = input("Enter a new ident tag.", "Core Control", id_tag) as null|text + var/new_ident = sanitize_text(input("Enter a new ident tag.", "Core Control", monitor.core_tag) as null|text) if(new_ident && user.Adjacent(src)) - id_tag = new_ident - cur_viewed_device = null + monitor.core_tag = new_ident +// id_tag = new_ident +// cur_viewed_device = null return /obj/machinery/computer/fusion_core_control/attack_ai(mob/user) attack_hand(user) +/obj/machinery/computer/fusion_core_control/attack_hand(var/mob/user as mob) + ..() + if(stat & (BROKEN|NOPOWER)) + return + + monitor.tgui_interact(user) + +/* /obj/machinery/computer/fusion_core_control/attack_hand(mob/user) add_fingerprint(user) interact(user) @@ -47,10 +68,11 @@ if(cur_viewed_device) dat += {" Back to overview
- Device ident '[cur_viewed_device.id_tag]' [cur_viewed_device.owned_field ? "active" : "inactive"].
+ Device ident '[cur_viewed_device.id_tag]' [cur_viewed_device.owned_field ? "Active" : "Inactive"].
Power status: [cur_viewed_device.avail()]/[cur_viewed_device.active_power_usage] W

- Bring field [cur_viewed_device.owned_field ? "offline" : "online"].
+ Field Status: [cur_viewed_device.owned_field ? "Online" : "Offline"].
+ Reactant Dump: [cur_viewed_device.reactant_dump ? "Active" : "Inactive"].

Field power density (W.m-3):
---- @@ -169,16 +191,16 @@ updateUsrDialog() return 1 + if(href_list["syphon"]) + cur_viewed_device.reactant_dump = !cur_viewed_device.reactant_dump + updateUsrDialog() +*/ + //Returns 1 if the machine can be interacted with via this console. /obj/machinery/computer/fusion_core_control/proc/check_core_status(var/obj/machinery/power/fusion_core/C) - if(isnull(C)) - return - if(C.stat & BROKEN) - return - if(C.idle_power_usage > C.avail()) - return - . = 1 + return istype(C) ? C.check_core_status() : FALSE +/* /obj/machinery/computer/fusion_core_control/update_icon() if(stat & (BROKEN)) icon = 'icons/obj/computer.dmi' @@ -194,3 +216,4 @@ icon = initial(icon) icon_state = initial(icon_state) set_light(light_range_on, light_power_on) +*/ diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm index 5444c46b03..0fb3c63b40 100644 --- a/code/modules/power/fusion/core/core_field.dm +++ b/code/modules/power/fusion/core/core_field.dm @@ -117,8 +117,6 @@ catcher.SetSize(7) particle_catchers.Add(catcher) - START_PROCESSING(SSobj, src) - /obj/effect/fusion_em_field/process() //make sure the field generator is still intact if(!owned_core || QDELETED(owned_core)) @@ -161,6 +159,13 @@ dormant_reactant_quantities[reactant] -= radiate radiation += radiate + if(owned_core.reactant_dump) + var/datum/material/Mat = get_material_by_name(reactant) + + // If the reactor won't be able to produce a sheet during shutdown with the material, it can syphon it from the field into internal storage. + if(!Mat && amount > 1000 && owned_core.reagents.add_reagent(reactant, 0.1)) // If you want to get ingots / sheets from the tokomak, you have to shut it down, hopefully safely. Reactor reactants are either gas with a corresponding reagent IE Oxygen, Phoron, a Material which condenses uniquely on its own, or just a reagent. + dormant_reactant_quantities[reactant] -= 1000 + var/use_range var/use_power if(plasma_temperature <= 6000) @@ -309,6 +314,21 @@ // Radiate all our unspent fuel and energy. for(var/particle in dormant_reactant_quantities) radiation += dormant_reactant_quantities[particle] + + var/datum/material/Mat = get_material_by_name(particle) + + if(Mat) + while(dormant_reactant_quantities[particle] > 0) + var/present_amount = dormant_reactant_quantities[particle] / 10000 // Reset this to the amount of the reagent present. + + if(present_amount >= 20 && Mat.stack_type) + var/obj/S = new Mat.stack_type + dormant_reactant_quantities[particle] -= 20 + S.throw_at_random(FALSE, 7, 3) + + else + dormant_reactant_quantities[particle] = 0 + dormant_reactant_quantities.Remove(particle) radiation += plasma_temperature/2 plasma_temperature = 0 @@ -496,7 +516,6 @@ if(owned_core) owned_core.owned_field = null owned_core = null - STOP_PROCESSING(SSobj, src) . = ..() /obj/effect/fusion_em_field/bullet_act(var/obj/item/projectile/Proj) @@ -579,8 +598,7 @@ RadiateAll() var/list/things_in_range = range(10, owned_core) var/list/turfs_in_range = list() - var/turf/T - for (T in things_in_range) + for (var/turf/T in things_in_range) turfs_in_range.Add(T) explosion(pick(things_in_range), -1, 5, 5, 5) @@ -605,8 +623,7 @@ set_light(15, 15, "#ff00d8") var/list/things_in_range = range(15, owned_core) var/list/turfs_in_range = list() - var/turf/T - for (T in things_in_range) + for (var/turf/T in things_in_range) turfs_in_range.Add(T) for(var/loopcount = 1 to 10) spawn(200) @@ -618,8 +635,7 @@ global_announcer.autosay("Warning! Quantum fluxuation detected! Flammable gas release expected.", "Field Stability Monitor") var/list/things_in_range = range(15, owned_core) var/list/turfs_in_range = list() - var/turf/T - for (T in things_in_range) + for (var/turf/T in things_in_range) turfs_in_range.Add(T) for(var/loopcount = 1 to 10) var/turf/TT = get_turf(pick(turfs_in_range)) @@ -660,8 +676,7 @@ RadiateAll() var/list/things_in_range = range(10, owned_core) var/list/turfs_in_range = list() - var/turf/T - for (T in things_in_range) + for (var/turf/T in things_in_range) turfs_in_range.Add(T) for(var/loopcount = 1 to 10) explosion(pick(things_in_range), -1, 5, 5, 5) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm index 740ef842c2..9a74cbddc1 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm @@ -10,7 +10,7 @@ var/fuel_type = "composite" var/fuel_colour var/radioactivity = 0 - var/const/initial_amount = 300 + var/const/initial_amount = 3000000 /obj/item/weapon/fuel_assembly/New(var/newloc, var/_material, var/_colour) fuel_type = _material diff --git a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm index a5abed3c2b..a8c4d0445a 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm @@ -22,8 +22,8 @@ if(thing.reagents.reagent_list.len > 1) to_chat(user, "The contents of \the [thing] are impure and cannot be used as fuel.") return 1 - if(thing.reagents.total_volume < 50) - to_chat(user, "You need at least fifty units of material to form a fuel rod.") + if(thing.reagents.total_volume < 300) + to_chat(user, "You need at least three hundred units of material to form a fuel rod.") return 1 var/datum/reagent/R = thing.reagents.reagent_list[1] visible_message("\The [src] compresses the contents of \the [thing] into a new fuel assembly.") @@ -97,4 +97,4 @@ usr.put_in_hands(S) verbs -= /obj/machinery/fusion_fuel_compressor/verb/eject_sheet blitzprogress = 0 -//CHOMPEdit End \ No newline at end of file +//CHOMPEdit End diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm index 54e0bfb024..b5d039d5b2 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm @@ -1,16 +1,35 @@ /obj/machinery/computer/fusion_fuel_control name = "fuel injection control computer" desc = "Displays information about the fuel rods." - icon = 'icons/obj/machines/power/fusion.dmi' - icon_state = "fuel" circuit = /obj/item/weapon/circuitboard/fusion_fuel_control + icon_keyboard = "tech_key" + icon_screen = "fuel_screen" + var/id_tag var/scan_range = 25 + var/datum/tgui_module/rustfuel_control/monitor -/obj/machinery/computer/fusion_fuel_control/attack_ai(mob/user) +/obj/machinery/computer/fusion_fuel_control/New() + ..() + monitor = new(src) + monitor.fuel_tag = id_tag + +/obj/machinery/computer/fusion_fuel_control/Destroy() + QDEL_NULL(monitor) + ..() + +/obj/machinery/computer/fusion_fuel_control/attack_ai(var/mob/user) attack_hand(user) +/obj/machinery/computer/fusion_fuel_control/attack_hand(var/mob/user as mob) + ..() + if(stat & (BROKEN|NOPOWER)) + return + + monitor.tgui_interact(user) + +/* /obj/machinery/computer/fusion_fuel_control/attack_hand(mob/user) add_fingerprint(user) interact(user) @@ -93,16 +112,17 @@ usr.unset_machine() updateDialog() - +*/ /obj/machinery/computer/fusion_fuel_control/attackby(var/obj/item/W, var/mob/user) ..() if(istype(W, /obj/item/device/multitool)) - var/new_ident = input("Enter a new ident tag.", "Fuel Control", id_tag) as null|text + var/new_ident = input("Enter a new ident tag.", "Fuel Control", monitor.fuel_tag) as null|text if(new_ident && user.Adjacent(src)) - id_tag = new_ident + monitor.fuel_tag = new_ident return +/* /obj/machinery/computer/fusion_fuel_control/update_icon() if(stat & (BROKEN)) icon = 'icons/obj/computer.dmi' @@ -118,3 +138,4 @@ icon = initial(icon) icon_state = initial(icon_state) set_light(light_range_on, light_power_on) +*/ diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index 7d4be64157..5ba257d8a6 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -1,4 +1,4 @@ -var/list/fuel_injectors = list() +GLOBAL_LIST_EMPTY(fuel_injectors) /obj/machinery/fusion_fuel_injector name = "fuel injector" @@ -13,21 +13,21 @@ var/list/fuel_injectors = list() circuit = /obj/item/weapon/circuitboard/fusion_injector - var/fuel_usage = 0.0001 + var/fuel_usage = 30 var/id_tag var/injecting = 0 var/obj/item/weapon/fuel_assembly/cur_assembly /obj/machinery/fusion_fuel_injector/Initialize() . = ..() - fuel_injectors += src + GLOB.fuel_injectors += src default_apply_parts() /obj/machinery/fusion_fuel_injector/Destroy() if(cur_assembly) cur_assembly.forceMove(get_turf(src)) cur_assembly = null - fuel_injectors -= src + GLOB.fuel_injectors -= src return ..() /obj/machinery/fusion_fuel_injector/mapped @@ -130,15 +130,14 @@ var/list/fuel_injectors = list() var/amount_left = 0 for(var/reagent in cur_assembly.rod_quantities) if(cur_assembly.rod_quantities[reagent] > 0) - var/amount = cur_assembly.rod_quantities[reagent] * fuel_usage - var/numparticles = round(amount * 1000) + var/numparticles = fuel_usage if(numparticles < 1) numparticles = 1 var/obj/effect/accelerated_particle/A = new/obj/effect/accelerated_particle(get_turf(src), dir) A.particle_type = reagent A.additional_particles = numparticles - 1 if(cur_assembly) - cur_assembly.rod_quantities[reagent] -= amount + cur_assembly.rod_quantities[reagent] -= fuel_usage amount_left += cur_assembly.rod_quantities[reagent] if(cur_assembly) cur_assembly.percent_depleted = amount_left / cur_assembly.initial_amount diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm index 0675bd90bb..9621234007 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron.dm @@ -1,4 +1,5 @@ -var/list/gyrotrons = list() + +GLOBAL_LIST_EMPTY(gyrotrons) /obj/machinery/power/emitter/gyrotron name = "gyrotron" @@ -21,18 +22,17 @@ var/list/gyrotrons = list() state = 2 /obj/machinery/power/emitter/gyrotron/Initialize() - gyrotrons += src - update_active_power_usage(mega_energy * 50000) + GLOB.gyrotrons += src default_apply_parts() - . = ..() - -/obj/machinery/power/emitter/gyrotron/Destroy() - gyrotrons -= src return ..() -/obj/machinery/power/emitter/gyrotron/process() - update_active_power_usage(mega_energy * 50000) - . = ..() +/obj/machinery/power/emitter/gyrotron/Destroy() + GLOB.gyrotrons -= src + return ..() + +/obj/machinery/power/emitter/gyrotron/proc/set_beam_power(var/new_power) + mega_energy = new_power + update_active_power_usage(mega_energy * initial(active_power_usage)) /obj/machinery/power/emitter/gyrotron/get_rand_burst_delay() return rate * 10 diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm index fd0674e409..1f06a4b6d1 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm @@ -1,17 +1,37 @@ /obj/machinery/computer/gyrotron_control name = "gyrotron control console" desc = "Used to control the R-UST stability beams." - icon = 'icons/obj/machines/power/fusion.dmi' - icon_state = "engine" light_color = COLOR_BLUE circuit = /obj/item/weapon/circuitboard/gyrotron_control + icon_keyboard = "generic_key" + icon_screen = "mass_driver" + var/id_tag var/scan_range = 25 + var/datum/tgui_module/gyrotron_control/monitor + +/obj/machinery/computer/gyrotron_control/New() + ..() + monitor = new(src) + monitor.gyro_tag = id_tag + monitor.scan_range = scan_range + +/obj/machinery/computer/gyrotron_control/Destroy() + QDEL_NULL(monitor) + ..() /obj/machinery/computer/gyrotron_control/attack_ai(var/mob/user) attack_hand(user) +/obj/machinery/computer/gyrotron_control/attack_hand(var/mob/user as mob) + ..() + if(stat & (BROKEN|NOPOWER)) + return + + monitor.tgui_interact(user) + +/* /obj/machinery/computer/gyrotron_control/attack_hand(var/mob/user) add_fingerprint(user) interact(user) @@ -94,15 +114,16 @@ return 1 return 0 +*/ /obj/machinery/computer/gyrotron_control/attackby(var/obj/item/W, var/mob/user) ..() if(istype(W, /obj/item/device/multitool)) - var/new_ident = input("Enter a new ident tag.", "Gyrotron Control", id_tag) as null|text + var/new_ident = input("Enter a new ident tag.", "Gyrotron Control", monitor.gyro_tag) as null|text if(new_ident && user.Adjacent(src)) - id_tag = new_ident + monitor.gyro_tag = new_ident return - +/* /obj/machinery/computer/gyrotron_control/update_icon() if(stat & (BROKEN)) icon = 'icons/obj/computer.dmi' @@ -118,3 +139,4 @@ icon = initial(icon) icon_state = initial(icon_state) set_light(light_range_on, light_power_on) +*/ diff --git a/code/modules/power/fusion/magpower.dm b/code/modules/power/fusion/magpower.dm index c6882c6eb3..9ebea0e4fc 100644 --- a/code/modules/power/fusion/magpower.dm +++ b/code/modules/power/fusion/magpower.dm @@ -13,19 +13,41 @@ var/active = 0 //are we even on? var/id_tag //needed for !!rasins!! -/obj/machinery/power/hydromagnetic_trap/process() - if(!powernet && anchored == 1) +/obj/machinery/power/hydromagnetic_trap/attackby(var/obj/item/W, var/mob/user) + if(default_unfasten_wrench(user, W)) return - spawn(1) - Active() - Search() + + return ..() + +/obj/machinery/power/hydromagnetic_trap/process() + if(anchored) + if(!powernet) + src.active = 0 + connect_to_network() + + if(powernet) + spawn(1) + Active() + Search() + + else + if(powernet) + active_field.Cut() + disconnect_from_network() /obj/machinery/power/hydromagnetic_trap/proc/Search()//let's not have +100 instances of the same field in active_field. things_in_range = range(7, src) - var/obj/effect/fusion_em_field/FFF - for (FFF in things_in_range) + for (var/obj/effect/fusion_em_field/FFF in things_in_range) fields_in_range.Add(FFF) - for (FFF in fields_in_range) + + listclearnulls(active_field) + listclearnulls(fields_in_range) + + for (var/obj/effect/fusion_em_field/FFF in fields_in_range) + if(get_dist(src, FFF) > 7) + fields_in_range.Remove(FFF) + continue + if (active_field.len > 0) return else if (active_field.len == 0) @@ -35,17 +57,14 @@ /obj/machinery/power/hydromagnetic_trap/proc/Link() //discover our EM field var/obj/effect/fusion_em_field/FFF for(FFF in fields_in_range) - if (FFF.id_tag != id_tag) - return active_field += FFF active = 1 return /obj/machinery/power/hydromagnetic_trap/proc/Active()//POWERRRRR - var/obj/effect/fusion_em_field/FF if (active == 0) return - for (FF in active_field) + for (var/obj/effect/fusion_em_field/FF in active_field) if (FF.plasma_temperature >= MINIMUM_PLASMA_TEMPERATURE) icon_state = "mag_trap1" add_avail(ENERGY_PER_K * FF.plasma_temperature) diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index 01fa9932d9..adff836cee 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -25,7 +25,7 @@ var/list/recipes // The list containing the Particle Smasher's recipes. /obj/machinery/particle_smasher/Initialize() - ..() + . = ..() storage = list() update_icon() prepare_recipes() diff --git a/code/modules/power/tesla/telsa_construction.dm b/code/modules/power/tesla/telsa_construction.dm index ba7b3c4d0e..b13c9357a0 100644 --- a/code/modules/power/tesla/telsa_construction.dm +++ b/code/modules/power/tesla/telsa_construction.dm @@ -23,7 +23,6 @@ name = T_BOARD("grounding rod") build_path = /obj/machinery/power/grounding_rod board_type = new /datum/frame/frame_types/machine - matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) req_components = list() /datum/category_item/autolathe/engineering/grounding_rod diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 1d5262044e..e93ee62c71 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -318,7 +318,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /obj/machinery/computer/turbine_computer/Initialize() - . = ..() + ..() return INITIALIZE_HINT_LATELOAD /obj/machinery/computer/turbine_computer/LateInitialize() diff --git a/code/modules/projectiles/ammunition/rounds.dm b/code/modules/projectiles/ammunition/rounds.dm index 02d4b4aa5e..fbcc6528cd 100644 --- a/code/modules/projectiles/ammunition/rounds.dm +++ b/code/modules/projectiles/ammunition/rounds.dm @@ -300,14 +300,15 @@ icon_state = "lcasing" caliber = "14.5mm" projectile_type = /obj/item/projectile/bullet/rifle/a145 - matter = list(DEFAULT_WALL_MATERIAL = 1250) + matter = list(MAT_TITANIUM = 2500, MAT_URANIUM = 1000, MAT_PLASTEEL = 1500) /obj/item/ammo_casing/a145/highvel desc = "A 14.5mm sabot shell." projectile_type = /obj/item/projectile/bullet/rifle/a145 + matter = list(MAT_TITANIUM = 2500, MAT_PLASTEEL = 1500) /obj/item/ammo_casing/a145/spent/Initialize() - ..() + . = ..() expend() /* diff --git a/code/modules/projectiles/ammunition/zz_autolathe_ch.dm b/code/modules/projectiles/ammunition/zz_autolathe_ch.dm index b9a0fdb5be..29265a3bbe 100644 --- a/code/modules/projectiles/ammunition/zz_autolathe_ch.dm +++ b/code/modules/projectiles/ammunition/zz_autolathe_ch.dm @@ -95,4 +95,109 @@ /datum/category_item/autolathe/arms/sks_762 name = "SKS Clip (10x 7.62x39 standard)" path = /obj/item/ammo_magazine/clip/sks + hidden = 1 + +/datum/category_item/autolathe/arms/sks_762_ap + name = "SKS Clip (10x 7.62x39 armor-piercing)" + path = /obj/item/ammo_magazine/clip/sks/ap + hidden = 1 + +/datum/category_item/autolathe/arms/mosin_762 + name = "Mosin Nagant Clip (5x 7.62x54mmR standard)" + path = /obj/item/ammo_magazine/clip/mosin + hidden = 1 + +/datum/category_item/autolathe/arms/mosin_762_ap + name = "Mosin Nagant Clip (5x 7.62x54mmR armor-piercing)" + path = /obj/item/ammo_magazine/clip/mosin + hidden = 1 + +/datum/category_item/autolathe/arms/t901_762 + name = "Type-901 magazine (7.62x51mm standard)" + path = /obj/item/ammo_magazine/type901 + hidden = 1 + +/datum/category_item/autolathe/arms/t901_762_ap + name = "Type-901 magazine (7.62x51mm armor-piercing)" + path = /obj/item/ammo_magazine/type901/ap + hidden = 1 + +/datum/category_item/autolathe/arms/awp_338 + name = "AWP magazine (.338 Lapua standard)" + path = /obj/item/ammo_magazine/awp + hidden = 1 + +/datum/category_item/autolathe/arms/awp_338_ap + name = "AWP magazine (.338 Lapua armor-piercing)" + path = /obj/item/ammo_magazine/awp/ap + hidden = 1 + +/datum/category_item/autolathe/arms/hectate_50bmg + name = "Hectate II magazine (.50 BMG standard)" + path = /obj/item/ammo_magazine/hectate + hidden = 1 + +/datum/category_item/autolathe/arms/hectate_50bmg_ap + name = "Hectate II magazine (.50 BMG armor-piercing)" + path = /obj/item/ammo_magazine/hectate/ap + hidden = 1 + +/datum/category_item/autolathe/arms/ppsh_762x25 + name = "PPSH drum Magazine (7.62x25mm Tokarev standard)" + path = /obj/item/ammo_magazine/ppsh + hidden = 1 + +/datum/category_item/autolathe/arms/plamya_9x39 + name = "Plamya drum magazine(9x39mm standard)" + path = /obj/item/ammo_magazine/plamya + hidden = 1 + +/datum/category_item/autolathe/arms/plamya_9x39_ap + name = "Plamya drum magazine(9x39mm armor-piercing)" + path = /obj/item/ammo_magazine/plamya/ap + hidden = 1 + +/datum/category_item/autolathe/arms/strela_12g + name = "Strela magazine (12 gauge buckshot)" + path = /obj/item/ammo_magazine/strela + hidden = 1 + +/datum/category_item/autolathe/arms/strela_12g_slug + name = "Strela magazine (12 gauge slug)" + path = /obj/item/ammo_magazine/strela/slug + hidden = 1 + +/datum/category_item/autolathe/arms/molniya_762 + name = "Molniya magazine box (7.62x51mm standard)" + path = /obj/item/ammo_magazine/molniya + hidden = 1 + +/datum/category_item/autolathe/arms/molniya_762_ap + name = "Molniya magazine box (7.62x51mm armor-piercing)" + path = /obj/item/ammo_magazine/molniya/ap + hidden = 1 + +/datum/category_item/autolathe/arms/ssp4_10mm + name = "SSP4 magazine (10mm standard)" + path = /obj/item/ammo_magazine/ssp4 + hidden = 1 + +/datum/category_item/autolathe/arms/makarov_9x18 + name = "Makarov magazine (9x18mm Makarov standard)" + path = /obj/item/ammo_magazine/makarov + hidden = 1 + +/datum/category_item/autolathe/arms/vp70_9mm + name = "VP70 magazine (18x 9x19mm standard)" + path = /obj/item/ammo_magazine/m9mm/vp70 + hidden = 1 + +/datum/category_item/autolathe/arms/vp70_9mm_ap + name = "VP70 magazine (18x 9x19mm armor-piercing)" + path = /obj/item/ammo_magazine/m9mm/vp70/ap + hidden = 1 + +/datum/category_item/autolathe/arms/vp70_9mm_hp + name = "VP70 magazine (18x 9x19mm hollow-point)" + path = /obj/item/ammo_magazine/m9mm/vp70/hp hidden = 1 \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/zz_magazines_ch.dm b/code/modules/projectiles/ammunition/zz_magazines_ch.dm index 24b1a7775d..bafe42fa04 100644 --- a/code/modules/projectiles/ammunition/zz_magazines_ch.dm +++ b/code/modules/projectiles/ammunition/zz_magazines_ch.dm @@ -40,8 +40,8 @@ /obj/item/ammo_magazine/mp5mag name = "mp5 magazine(9x19mm standard)" - icon = 'icons/obj/ammo_vr.dmi' - icon_state = "smg" + icon = 'icons/obj/ammo_ch.dmi' + icon_state = "mp5mag" max_ammo = 30 mag_type = MAGAZINE caliber = "9mm" @@ -120,6 +120,12 @@ matter = list(DEFAULT_WALL_MATERIAL = 1700) ammo_type = /obj/item/ammo_casing/a556/hp +/obj/item/ammo_magazine/m16/patriot + name = "Patriot magazine (5.56x45mm standard)" + matter = list(DEFAULT_WALL_MATERIAL = 5000) + max_ammo = 100 + icon_state = "patriotmag" + /obj/item/ammo_magazine/m41 name = "M41A magazine (10x24mm standard)" icon = 'icons/obj/ammo_ch.dmi' @@ -132,9 +138,172 @@ ammo_type = /obj/item/ammo_casing/a10x24 /obj/item/ammo_magazine/clip/sks - name = "Ammo clip(7.62x39mm)" + name = "Ammo clip(7.62x39mm standard)" icon_state = "gclip" max_ammo = 10 caliber = "7.62x39mm" + multiple_sprites = 1 matter = list(DEFAULT_WALL_MATERIAL = 400) + ammo_type = /obj/item/ammo_casing/a762x39 +/obj/item/ammo_magazine/clip/sks/ap + name = "Ammo clip(7.62x39mm armor-piercing)" + matter = list(DEFAULT_WALL_MATERIAL = 700) + ammo_type = /obj/item/ammo_casing/a762x39/ap + +/obj/item/ammo_magazine/clip/mosin + name = "Ammo clip(7.62x54mmR standard)" + icon_state = "clip_rifle" + max_ammo = 5 + caliber = "7.62x54mmR" + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 300) + ammo_type = /obj/item/ammo_casing/a762x54 + +/obj/item/ammo_magazine/clip/mosin/ap + name = "Ammo clip(7.62x54mmR armor-piercing)" + matter = list(DEFAULT_WALL_MATERIAL = 600) + ammo_type = /obj/item/ammo_casing/a762x54/ap + +/obj/item/ammo_magazine/type901 + name = "Type-901 magazine(7.62x51mm standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = "7.62mm" + icon_state = "762mag" + max_ammo = 30 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 2400) + ammo_type = /obj/item/ammo_casing/a762 + +/obj/item/ammo_magazine/type901/ap + name = "Type-901 magazine(7.62x51mm armor-piercing)" + matter = list(DEFAULT_WALL_MATERIAL = 3000) + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/awp + name = "AWP magazine(.338 Lapua standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = ".338" + icon_state = "awp" + max_ammo = 5 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 2400) + ammo_type = /obj/item/ammo_casing/a338 + +/obj/item/ammo_magazine/awp/ap + name = "AWP magazine(.338 Lapua armor-piercing)" + matter = list(DEFAULT_WALL_MATERIAL = 3000) + ammo_type = /obj/item/ammo_casing/a338/ap + +/obj/item/ammo_magazine/hectate + name = "Hectate II magazine(.50 BMG standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = ".50 BMG" + icon_state = "hectate" + max_ammo = 7 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 4000) + ammo_type = /obj/item/ammo_casing/a50bmg + +/obj/item/ammo_magazine/hectate/ap + name = "Hectate II magazine(.50 BMG armor-piercing)" + matter = list(DEFAULT_WALL_MATERIAL = 5000) + ammo_type = /obj/item/ammo_casing/a50bmg/ap + +/obj/item/ammo_magazine/ppsh + name = "PPSH-17b drum magazine(7.62x25mm Tokarev standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = "7.62x25mm" + icon_state = "ppshmag" + max_ammo = 71 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 1500) + ammo_type = /obj/item/ammo_casing/a762x25 + +/obj/item/ammo_magazine/plamya + name = "Plamya drum magazine(9x39mm standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = "9x39mm" + icon_state = "plamyamag" + max_ammo = 50 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 2500) + ammo_type = /obj/item/ammo_casing/a9x39 + +/obj/item/ammo_magazine/plamya/ap + name = "Plamya drum magazine(9x39mm armor-piercing)" + matter = list(DEFAULT_WALL_MATERIAL = 3000) + ammo_type = /obj/item/ammo_casing/a9x39/ap + +/obj/item/ammo_magazine/strela + name = "Strela magazine(12 gauge buckshot)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = "12g" + icon_state = "strelamag" + max_ammo = 7 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 800) + ammo_type = /obj/item/ammo_casing/a12g/pellet + +/obj/item/ammo_magazine/strela/slug + name = "Strela magazine(12 gauge slug)" + ammo_type = /obj/item/ammo_casing/a12g + +/obj/item/ammo_magazine/molniya + name = "Molniya magazine box(7.62x51mm standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = "7.62mm" + icon_state = "molniyamag" + max_ammo = 100 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 8000) + ammo_type = /obj/item/ammo_casing/a762 + +/obj/item/ammo_magazine/molniya/ap + name = "Molniya magazine box(7.62x51mm armor-piercing)" + matter = list(DEFAULT_WALL_MATERIAL = 10000) + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/ssp4 + name = "SSP4 magazine(10mm standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = "10mm" + icon_state = "10mmmag" + max_ammo = 8 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 400) + ammo_type = /obj/item/ammo_casing/a10mm + +/obj/item/ammo_magazine/makarov + name = "Makarov magazine(9x18mm Makarov standard)" + icon = 'icons/obj/ammo_ch.dmi' + caliber = "9x18mm" + icon_state = "9mmmag" + max_ammo = 8 + mag_type = MAGAZINE + multiple_sprites = 1 + matter = list(DEFAULT_WALL_MATERIAL = 400) + ammo_type = /obj/item/ammo_casing/a9x18 + +/obj/item/ammo_magazine/m9mm/vp70 + name = "VP70 magazine (18x 9x19mm standard)" + icon = 'icons/obj/ammo_ch.dmi' + icon_state = "9mmmag" + ammo_type = /obj/item/ammo_casing/a9mm + max_ammo = 18 + +/obj/item/ammo_magazine/m9mm/vp70/ap + name = "VP70 magazine (18x 9x19mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a9mm/ap + +/obj/item/ammo_magazine/m9mm/vp70/hp + name = "VP70 magazine (18x 9x19mm hollow-point)" + ammo_type = /obj/item/ammo_casing/a9mm/ap \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/zz_rounds_ch.dm b/code/modules/projectiles/ammunition/zz_rounds_ch.dm index 612c116a3d..ce9238e135 100644 --- a/code/modules/projectiles/ammunition/zz_rounds_ch.dm +++ b/code/modules/projectiles/ammunition/zz_rounds_ch.dm @@ -36,6 +36,16 @@ desc = "A rubber 5.7x28mm round" projectile_type = /obj/item/projectile/bullet/pistol/rubber +/obj/item/ammo_casing/a762x25 + desc = "A standard 7.62x25mm Tokarev round" + caliber = "7.62x25mm" + projectile_type = /obj/item/projectile/bullet/a762x25 + +/obj/item/ammo_casing/a9x18 + desc = "A standard 9x18mm Makarov round" + caliber = "9x18mm" + projectile_type = /obj/item/projectile/bullet/a9x18 + /obj/item/ammo_casing/a762x54 desc = "A standard 7.62x54mmR round" caliber = "7.62x54mmR" @@ -46,6 +56,24 @@ desc = "An armor piercing 7.62x54mmR round" projectile_type = /obj/item/projectile/bullet/rifle/a762x54/ap +/obj/item/ammo_casing/a338 + desc = "A standard .338 Lapua round" + caliber = ".338" + projectile_type = /obj/item/projectile/bullet/rifle/a338 + +/obj/item/ammo_casing/a338/ap + desc = "An armor piercing .338 Lapua round" + projectile_type = /obj/item/projectile/bullet/rifle/a338/ap + +/obj/item/ammo_casing/a50bmg + desc = "A standard .50 BMG round" + caliber = ".50 BMG" + projectile_type = /obj/item/projectile/bullet/rifle/a50bmg + +/obj/item/ammo_casing/a50bmg/ap + desc = "An armor piercing .50 BMG round" + projectile_type = /obj/item/projectile/bullet/rifle/a50bmg/ap + /obj/item/ammo_casing/a9x39 desc = "A standard 9x39mm round" caliber = "9x39mm" diff --git a/code/modules/projectiles/broken.dm b/code/modules/projectiles/broken.dm index 15f63f4c54..f972d1f6bd 100644 --- a/code/modules/projectiles/broken.dm +++ b/code/modules/projectiles/broken.dm @@ -18,7 +18,7 @@ setup_repair_needs() /obj/item/weapon/broken_gun/Initialize() - ..() + . = ..() spawn(30 SECONDS) if(!my_guntype && !QDELETED(src)) qdel(src) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm index 4f3a35c763..043a353015 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm @@ -233,22 +233,22 @@ K.damage += modifier -// //Cooldown -// /obj/item/borg/upgrade/modkit/cooldown -// name = "cooldown decrease" -// desc = "Decreases the cooldown of a kinetic accelerator." -// modifier = 2.5 + //Cooldown - CHOMPstation re-addition start +/obj/item/borg/upgrade/modkit/cooldown + name = "cooldown decrease" + desc = "Decreases the cooldown of a kinetic accelerator." + modifier = 2.5 -// /obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) -// . = ..() -// if(.) -// KA.overheat_time -= modifier +/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user) + . = ..() + if(.) + KA.fire_delay -= modifier -// /obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) -// KA.overheat_time += modifier -// ..() +/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA) + KA.fire_delay += modifier + ..() -//Cooldown +//Cooldown - CHOMPstation re-addition end /obj/item/borg/upgrade/modkit/efficiency name = "energy efficiency" desc = "Decreases the energy use of a kinetic accelerator." diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 442c739df9..96e4a1b42c 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -103,12 +103,12 @@ unlikely.\

\ An interesting note about this weapon, when compared to contemporary energy weapons, is \ - that this gun appears to be inferior to modern laser weapons. The beam fired has less \ - of an ability to harm, and the power consumption appears to be higher than average for \ - a human-made energy side-arm. One possible explaination is that the creators of this \ + that this gun appears to be only slightly superior to modern laser weapons. The beam fired has \ + roughly the same ability to harm, yet the power consumption is higher than average \ + for a human-made energy side-arm. One possible explaination is that the creators of this \ weapon, in their later years, had less of a need to optimize their capability for war, \ - and instead focused on other endeavors. Another explaination is that vast age of the weapon \ - may have caused it to degrade, yet still remain functional at a reduced capability." + and instead focused on other endeavors. Another explanation is that the vast age of the weapon \ + may have caused it to degrade, yet still remain functional at a reduced capability." //CHOMPedit changed description to be accurate with new projectile value = CATALOGUER_REWARD_MEDIUM /obj/item/weapon/gun/energy/alien @@ -117,13 +117,14 @@ catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol) icon_state = "alienpistol" item_state = "alienpistol" - fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose. - charge_cost = 480 // Five shots. + fire_delay = 9 //CHOMPedit changed cooldown from 10 to 9. + charge_cost = 380 // CHOMPedit changed from 480 to 380. Aka five shots to six shots. - projectile_type = /obj/item/projectile/beam/cyan + projectile_type = /obj/item/projectile/beam/precursor //CHOMPedit changed beam type cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien // Self charges. origin_tech = list(TECH_COMBAT = 8, TECH_MAGNET = 7) modifystate = "alienpistol" + battery_lock = 1 //CHOMPedit adds battery lock. /obj/item/weapon/gun/energy/captain @@ -159,7 +160,7 @@ w_class = ITEMSIZE_HUGE //CHOMP Edit. Lol a cannon used to be just large size? Are you kidding me? A CANNON. one_handed_penalty = 90 // The thing's heavy and huge. accuracy = 45 - charge_cost = 600 + charge_cost = 400 //CHOMP Edit. Let's give this thing some more shots, seeing as it needs to be recharged at a charger. /obj/item/weapon/gun/energy/lasercannon/mounted name = "mounted laser cannon" @@ -196,14 +197,16 @@ projectile_type = /obj/item/projectile/beam/sniper slot_flags = SLOT_BACK action_button_name = "Use Scope" - battery_lock = 1 - charge_cost = 600 - fire_delay = 35 + //Begin CHOMPstation Edit for making this thing not trash + //battery_lock = 0 + charge_cost = 360 + fire_delay = 40 force = 10 w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. - accuracy = -45 //shooting at the hip - scoped_accuracy = 50 + accuracy = -30 //shooting at the hip + scoped_accuracy = 100 one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. + //End CHOMP Edit. /obj/item/weapon/gun/energy/sniperrifle/ui_action_click() scope() @@ -302,4 +305,5 @@ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 1, TECH_MATERIAL = 4) projectile_type = /obj/item/projectile/scatter/laser - w_class = ITEMSIZE_HUGE //CHOMP Edit. \ No newline at end of file + w_class = ITEMSIZE_HUGE //CHOMP Edit. + slot_flags = SLOT_BELT|SLOT_BACK //CHOMP Edit because you can still holster it despite it not fitting in a backpack. \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/laser_ch.dm b/code/modules/projectiles/guns/energy/laser_ch.dm new file mode 100644 index 0000000000..949f3d8350 --- /dev/null +++ b/code/modules/projectiles/guns/energy/laser_ch.dm @@ -0,0 +1,84 @@ +/obj/item/weapon/gun/energy/laser + icon = 'icons/obj/64x32guns_ch.dmi' + icon_state = "lcarbine" + name = "NT LC-525 Laser Rifle" + desc = "A relatively new, mass produced Nanotrasen laser carbine designed to kill with concentrated energy blasts. Just like the G40E, it has two firemodes, standard, and suppressive, which fires more efficent but weaker beams." + icon_expected_width = 64 + var/is64x32 = TRUE + var/is64x32_override = FALSE + var/is_picked_up = FALSE + +/obj/item/weapon/gun/energy/laser/equipped() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/energy/laser/pickup() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/energy/laser/dropped() + . = ..() + if(!istype(loc,/mob/living)) + is_picked_up = FALSE + update_transform() + +/obj/item/weapon/gun/energy/laser/Initialize() + . = ..() + if((!(type == /obj/item/weapon/gun/energy/laser)) && !is64x32_override) + is64x32 = FALSE + if(icon_expected_width == 64) + icon_expected_width = 32 + if(icon == 'icons/obj/64x32guns_ch.dmi') + icon = 'icons/obj/gun.dmi' + if(is64x32) + update_transform() + +/obj/item/weapon/gun/energy/laser/update_transform() + . = ..() + if(is64x32) + if(is_picked_up) + transform = transform.Turn(-45) + transform = transform.Translate(-16,0) + +/obj/item/weapon/gun/energy/laser/empty + is64x32_override = TRUE + +/obj/item/weapon/gun/energy/laser/mounted + is64x32_override = TRUE + +/obj/item/weapon/gun/energy/laser/practice + is64x32_override = TRUE + +/obj/item/weapon/gun/energy/laser/vepr + name = "WKHM 'Vepr'" + desc = "The Vepr lasgun, in 40 Watt range. One of the most robust laser rifles out there, but not one that's commonly seen. This piece is WKHM's latest entry into the energy weapon market, competing with the Hephaestus Industries G40E. Uses its own proprietary energy cells. It has three settings, standard, suppressive, and burst. This one bears the 'WKHM Adamant' arkship's production stamp." + description_fluff = "WKHM, is a minor arms company that has been around for quite some time, established in 2408. Known for being one of the many suppliers of weapons to dangerous worlds on the rim, and a part of the FTU. They produce a large variety of firearms, strike craft, and armored vehicles to fufill various their various contracts, and are largely migrant, moving wherever the money is. Found almost entirely on mobile production ships and various escort craft. Identifiable by their logo, a red Omega symbol with a black or white W in the middle. The sheer quantity of their firearms produced ensures they can be found.. just about anywhere, and they are very sought after by pirates for their reliability." + icon_expected_width = 64 + icon_state = "vepr" + firemodes = list( + list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240), + list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), + list(mode_name="burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, charge_cost = 200), + ) + force = 8 + w_class = ITEMSIZE_HUGE //Probably gonna make it a rifle sooner or later //CHOMP Edit, and so I did. + slot_flags = SLOT_BELT|SLOT_BACK //CHOMP Edit. Let's make it so that if it doesn't fit in a backpack, it doesn't fit in a holster either. + is64x32_override = TRUE + accept_cell_type = /obj/item/weapon/cell/vepr + cell_type = /obj/item/weapon/cell/vepr + origin_tech = list(TECH_POWER = 4, TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ILLEGAL = 4) + +/obj/item/weapon/cell/vepr + icon = 'icons/obj/ammo_ch.dmi' + icon_state = "veprcell" + item_state = "egg6" + w_class = ITEMSIZE_SMALL + maxcharge = 7200 + charge_amount = 20 + matter = list("metal" = 350, "glass" = 50) + preserve_item = 1 + overlay_half_state = "veprcell_o1" + overlay_full_state = "veprcell_o2" + origin_tech = list(TECH_POWER = 6) diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index a2469fe417..1b80d65e64 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -31,6 +31,7 @@ charge_cost = 100 force = 8 w_class = ITEMSIZE_HUGE //Probably gonna make it a rifle sooner or later //CHOMP Edit, and so I did. + slot_flags = SLOT_BELT|SLOT_BACK //CHOMP Edit. Let's make it so that if it doesn't fit in a backpack, it doesn't fit in a holster either. fire_delay = 6 projectile_type = /obj/item/projectile/beam/stun/weak diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm index 33ba37ad40..2498aba776 100644 --- a/code/modules/projectiles/guns/energy/phase.dm +++ b/code/modules/projectiles/guns/energy/phase.dm @@ -13,6 +13,15 @@ one_handed_penalty = 15 recoil_mode = 0 //CHOMP Addition: Removes recoil for micros. +/obj/item/weapon/gun/energy/phasegun/mounted + self_recharge = 1 + use_external_power = 1 + one_handed_penalty = 0 + +/obj/item/weapon/gun/energy/phasegun/mounted/cyborg + charge_cost = 400 + recharge_time = 7 + /obj/item/weapon/gun/energy/phasegun/pistol name = "phase pistol" desc = "The RayZar EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife." diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm index 8497207f2e..4e93773451 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm @@ -15,10 +15,10 @@ load_type = /obj/item/weapon/rcd_ammo projectile_type = /obj/item/projectile/bullet/magnetic/slug - cell = /obj/item/weapon/cell/hyper + cell = /obj/item/weapon/cell/device/weapon //CHOMP Edit. capacitor = /obj/item/weapon/stock_parts/capacitor/adv loaded = /obj/item/weapon/rcd_ammo/large - removable_components = FALSE + removable_components = TRUE //CHOMP Edit. var/slowdown_held = 2 var/slowdown_worn = 1 @@ -83,11 +83,13 @@ icon_state = "flechette_gun" item_state = "z8carbine" - cell = /obj/item/weapon/cell/hyper + cell = /obj/item/weapon/cell/device/weapon //CHOMP Edit. capacitor = /obj/item/weapon/stock_parts/capacitor/adv + removable_components = TRUE //CHOMP Edit. fire_delay = 0 + w_class = ITEMSIZE_HUGE //CHOMP Edit. slot_flags = SLOT_BACK slowdown = 0 @@ -98,6 +100,7 @@ load_type = /obj/item/weapon/magnetic_ammo projectile_type = /obj/item/projectile/bullet/magnetic/flechette loaded = /obj/item/weapon/magnetic_ammo + removable_components = TRUE //CHOMP Edit. empty_sound = 'sound/weapons/smg_empty_alarm.ogg' firemodes = list( @@ -114,8 +117,9 @@ item_state = "combatrevolver" w_class = ITEMSIZE_SMALL - cell = /obj/item/weapon/cell/super + cell = /obj/item/weapon/cell/device/weapon //CHOMP Edit. capacitor = /obj/item/weapon/stock_parts/capacitor + removable_components = TRUE //CHOMPstation Edit fire_delay = 0 @@ -129,7 +133,6 @@ load_type = /obj/item/weapon/magnetic_ammo/pistol projectile_type = /obj/item/projectile/bullet/magnetic/flechette/small loaded = /obj/item/weapon/magnetic_ammo/pistol - removable_components = TRUE empty_sound = 'sound/weapons/smg_empty_alarm.ogg' firemodes = list( @@ -145,14 +148,14 @@ icon_state = "railgun_sec" item_state = "cshotgun" - removable_components = TRUE - cell = /obj/item/weapon/cell/device/weapon capacitor = /obj/item/weapon/stock_parts/capacitor + removable_components = TRUE //CHOMPstation Edit fire_delay = 8 slot_flags = SLOT_BACK + w_class = ITEMSIZE_HUGE //CHOMP Edit. slowdown = 0 slowdown_held = 0.3 @@ -182,6 +185,7 @@ cell = /obj/item/weapon/cell/device/weapon capacitor = /obj/item/weapon/stock_parts/capacitor + removable_components = TRUE //CHOMPstation Edit slot_flags = SLOT_BELT|SLOT_HOLSTER @@ -209,10 +213,11 @@ icon_state = "railgun_sifguard" item_state = "z8carbine" - cell = /obj/item/weapon/cell/high + cell = /obj/item/weapon/cell/device/weapon //CHOMP Edit. capacitor = /obj/item/weapon/stock_parts/capacitor/adv + removable_components = TRUE //CHOMPstation Edit. - slot_flags = SLOT_BACK + slot_flags = SLOT_BELT|SLOT_BACK //CHOMPstation Edit. This is a carbine. slowdown_held = 0.3 diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun_ch.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun_ch.dm new file mode 100644 index 0000000000..fa3eb3cd85 --- /dev/null +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun_ch.dm @@ -0,0 +1,43 @@ +/obj/item/weapon/gun/magnetic/railgun + name = "WKHM 'Strzyga' railgun" + desc = "A devastatingly powerful, and very expensive railgun built for long range engagements, and anti vehicle applications. Possibly one of the most powerful handheld weapons to date. Capable of punching a hole clean through a durasteel wall. The last thing the enemy will never see. 'DO NOT TOUCH THE RAILS' is stickered on the receiver. Chambers 16.5x122mm slugs. " + description_fluff = "WKHM, is a minor arms company that has been around for quite some time, established in 2408. Known for being one of the many suppliers of weapons to dangerous worlds on the rim, and a part of the FTU. They produce a large variety of firearms, strike craft, and armored vehicles to fufill various their various contracts, and are largely migrant, moving wherever the money is. Found almost entirely on mobile production ships and various escort craft. Identifiable by their logo, a red Omega symbol with a black or white W in the middle. The sheer quantity of their firearms produced ensures they can be found.. just about anywhere, and they are very sought after by pirates for their reliability." + icon = 'icons/obj/64x32guns_ch.dmi' + icon_state = "railgun-e" + icon_expected_width = 64 + var/is64x32 = TRUE + var/is64x32_override = FALSE + var/is_picked_up = FALSE + +/obj/item/weapon/gun/magnetic/railgun/equipped() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/magnetic/railgun/pickup() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/magnetic/railgun/dropped() + . = ..() + is_picked_up = FALSE + update_transform() + +/obj/item/weapon/gun/magnetic/railgun/Initialize() + . = ..() + if((!(type == /obj/item/weapon/gun/magnetic/railgun)) && !is64x32_override) + is64x32 = FALSE + if(icon_expected_width == 64) + icon_expected_width = 32 + if(icon == 'icons/obj/64x32guns_ch.dmi') + icon = 'icons/obj/railgun.dmi' + if(is64x32) + update_transform() + +/obj/item/weapon/gun/magnetic/railgun/update_transform() + . = ..() + if(is64x32) + if(is_picked_up) + transform = transform.Turn(-45) + transform = transform.Translate(-16,0) diff --git a/code/modules/projectiles/guns/projectile/zz_ballistics_ch.dm b/code/modules/projectiles/guns/projectile/zz_ballistics_ch.dm index 918249bfce..64fba106ed 100644 --- a/code/modules/projectiles/guns/projectile/zz_ballistics_ch.dm +++ b/code/modules/projectiles/guns/projectile/zz_ballistics_ch.dm @@ -66,6 +66,9 @@ icon_state = "asval" icon_expected_height = 32 icon_expected_width = 64 + firemodes = list() + var/is_picked_up = FALSE + var/is_long = TRUE /obj/item/weapon/gun/projectile/automatic/serdy/Initialize() . = ..() @@ -73,7 +76,33 @@ /obj/item/weapon/gun/projectile/automatic/serdy/update_transform() . = ..() + if(is_picked_up && is_long) + transform = transform.Turn(-45) transform = transform.Translate(-16,0) + +/obj/item/weapon/gun/projectile/automatic/serdy/equipped() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/projectile/automatic/serdy/pickup() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/projectile/automatic/serdy/dropped() + . = ..() + is_picked_up = FALSE + update_transform() + +/obj/item/weapon/gun/projectile/automatic/serdy/update_icon() + . = ..() + if(load_method == MAGAZINE) + icon_state = ammo_magazine ? "[initial(icon_state)]" : "[initial(icon_state)]-e" + else + icon_state = bolt_open ? "[initial(icon_state)]-e" : "[initial(icon_state)]" + + //AK Variants /obj/item/weapon/gun/projectile/automatic/serdy/asval @@ -92,6 +121,7 @@ auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK muzzle_velocity = 295 w_class = ITEMSIZE_HUGE + one_handed_penalty = 50 /obj/item/weapon/gun/projectile/automatic/serdy/krinkov name = "Krinkov" @@ -108,6 +138,7 @@ load_method = MAGAZINE auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK muzzle_velocity = 680 + is_long = FALSE /obj/item/weapon/gun/projectile/automatic/serdy/akm name = "AKM" @@ -125,6 +156,7 @@ auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK muzzle_velocity = 715 w_class = ITEMSIZE_HUGE + one_handed_penalty = 60 /obj/item/weapon/gun/projectile/automatic/serdy/scrapak name = "AKM" @@ -142,6 +174,7 @@ auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK muzzle_velocity = 700 w_class = ITEMSIZE_HUGE + one_handed_penalty = 70 // AR Variants @@ -179,12 +212,13 @@ load_method = MAGAZINE muzzle_velocity = 910 w_class = ITEMSIZE_HUGE + one_handed_penalty = 50 /obj/item/weapon/gun/projectile/automatic/serdy/patriot name = "Patriot" desc = "I raised you, and loved you, I've given you weapons, taught you techniques, endowed you with knowledge. There's nothing more for me to give you. All that's left for you to take is my life. 'Still in a dream' is stamped into the receiver, and it has no serial number. Chambered in 5.56x45mm." caliber = "5.56x45mm" - magazine_type = /obj/item/ammo_magazine/m16 + magazine_type = /obj/item/ammo_magazine/m16/patriot allowed_magazines = list(/obj/item/ammo_magazine/m16) icon_state="patriot" projectile_type = /obj/item/projectile/bullet/rifle/a556 @@ -196,6 +230,7 @@ load_method = MAGAZINE muzzle_velocity = 960 w_class = ITEMSIZE_HUGE + one_handed_penalty = 40 //Other rifles @@ -205,7 +240,7 @@ caliber = "10x24mm caseless" magazine_type = /obj/item/ammo_magazine/m41 allowed_magazines = list(/obj/item/ammo_magazine/m41) - icon_state="m41ab" + icon_state="m41b" projectile_type = /obj/item/projectile/bullet/rifle/a10x24 firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), @@ -213,6 +248,8 @@ ) load_method = MAGAZINE muzzle_velocity = 840 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 50 /obj/item/weapon/gun/projectile/automatic/serdy/m41a //This gun is pretty overpowered. Leaving it as an admin spawn. Might even interfere with lore. name = "M41A" @@ -228,6 +265,8 @@ ) load_method = MAGAZINE muzzle_velocity = 840 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 50 /obj/item/weapon/gun/projectile/automatic/serdy/sks //Reminder to myself to make sure this works and also to make sure that people are able to empty the internal mag name = "SKS" @@ -240,7 +279,396 @@ muzzle_velocity = 735 max_shells = 10 ammo_type = /obj/item/ammo_casing/a762x39 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 60 +/obj/item/weapon/gun/projectile/automatic/serdy/mosin + name = "Mosin Nagant" + desc = "A reproduction of some old russian bolt-action rifle from some backwater rimworld. Smells strongly of cosmoline. The inscriptions on it are in pan-slavic. Chambered in 7.62x54mmR." + caliber = "7.62x54mmR" + auto_loading_type = NO_AUTO_LOAD + load_method = SINGLE_CASING|SPEEDLOADER + only_open_load = TRUE + icon_state = "mosin" + projectile_type = /obj/item/projectile/bullet/rifle/a762x54 + muzzle_velocity = 865 + max_shells = 5 + ammo_type = /obj/item/ammo_casing/a762x54 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 70 + bolt_name = "bolt" + sound_eject = 'sound/weapons/ballistics/boltactionopen.ogg' + sound_chamber = 'sound/weapons/ballistics/boltactionclose.ogg' + +/obj/item/weapon/gun/projectile/automatic/serdy/mosin/scoped + name = "Scoped Mosin Nagant" + icon_state = "scopedmosin" + desc = "A reproduction of some old russian bolt-action rifle from some backwater rimworld. Smells strongly of cosmoline. The inscriptions on it are in pan-slavic. This one has a scope attached to it. Chambered in 7.62x54mmR." + action_button_name = "Use Scope" + accuracy = -15 + scoped_accuracy = 50 + one_handed_penalty = 70 + +/obj/item/weapon/gun/projectile/automatic/serdy/mosin/scoped/ui_action_click() + scope() + +/obj/item/weapon/gun/projectile/automatic/serdy/mosin/scoped/verb/scope() + set category = "Object" + set name = "Use Scope" + set popup_menu = 1 + + toggle_scope(2.0) + +/obj/item/weapon/gun/projectile/automatic/serdy/type901 + name = "Type 901 Assault rifle" + desc = "A heavy bullpup assault rifle of unknown make, with a very high muzzle velocity and fair accuracy. A favorite of scum and villainy everywhere due to its complete lack of identification markings. Popularized by the 2541 movie, 'Boarding Party'. Chambered in 7.62x51mm." + caliber = "7.62mm" + auto_loading_type = CLOSED_BOLT | LOCK_OPEN_EMPTY | LOCK_SLAPPABLE + magazine_type = /obj/item/ammo_magazine/type901 + allowed_magazines = list(/obj/item/ammo_magazine/type901) + icon_state = "type901" + projectile_type = /obj/item/projectile/bullet/rifle/a762 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + load_method = MAGAZINE + muzzle_velocity = 910 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 60 + +/obj/item/weapon/gun/projectile/automatic/serdy/type901/carbine + name = "Type 901-C Carbine" + desc = "A lightweight bullpup assault carbine of unknown make, with a very high muzzle velocity and fair accuracy. A favorite of scum and villainy everywhere due to its complete lack of identification markings. Popularized by the 2541 movie, 'Boarding Party'. This one is smaller and more compact than its larger counterpart. Chambered in 7.62x39mm." + icon_state = "type901b" + muzzle_velocity = 880 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 30 + +/obj/item/weapon/gun/projectile/automatic/serdy/awp + name = "AWP" + desc = "A galaxy-wide favorite for hunting, target shooting, and rushing B. Legend has it, this rifle originated from three guys in a garage. This one is a reproduction. It has 'Scarborough Arms - Per falcis, per pravitas' inscribed on the stock. Chambered in .338 Lapua." + caliber = ".338" + auto_loading_type = NO_AUTO_LOAD + magazine_type = /obj/item/ammo_magazine/awp + allowed_magazines = list(/obj/item/ammo_magazine/awp) + icon_state = "awp" + projectile_type = /obj/item/projectile/bullet/rifle/a338 + load_method = MAGAZINE + muzzle_velocity = 936 + action_button_name = "Use Scope" + accuracy = -30 + scoped_accuracy = 50 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 90 + bolt_name = "bolt" + sound_eject = 'sound/weapons/ballistics/boltactionopen.ogg' + sound_chamber = 'sound/weapons/ballistics/boltactionclose.ogg' + +/obj/item/weapon/gun/projectile/automatic/serdy/awp/ui_action_click() + scope() + +/obj/item/weapon/gun/projectile/automatic/serdy/awp/verb/scope() + set category = "Object" + set name = "Use Scope" + set popup_menu = 1 + + toggle_scope(2.0) + +/obj/item/weapon/gun/projectile/automatic/serdy/hectate + name = "Hectate II" + desc = "An old world anti material rifle. Ideal for dealing with mechs, armored personnel, and space dragons. Chambered in .50 BMG." + caliber = ".50 BMG" + auto_loading_type = NO_AUTO_LOAD + magazine_type = /obj/item/ammo_magazine/hectate + allowed_magazines = list(/obj/item/ammo_magazine/hectate) + icon_state = "hectate" + projectile_type = /obj/item/projectile/bullet/rifle/a50bmg + load_method = MAGAZINE + muzzle_velocity = 825 + action_button_name = "Use Scope" + accuracy = -60 + scoped_accuracy = 15 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 120 + bolt_name = "bolt" + sound_eject = 'sound/weapons/ballistics/boltactionopen.ogg' + sound_chamber = 'sound/weapons/ballistics/boltactionclose.ogg' + + +/obj/item/weapon/gun/projectile/automatic/serdy/hectate/ui_action_click() + scope() + +/obj/item/weapon/gun/projectile/automatic/serdy/hectate/verb/scope() + set category = "Object" + set name = "Use Scope" + set popup_menu = 1 + + toggle_scope(2.0) + +/obj/item/weapon/gun/projectile/automatic/serdy/memegun + name = "Hardbass Special" + desc = "Три полоÑки, три по три полоÑки Три полоÑки, три по три полоÑки Три полоÑки, три по три полоÑки Три полоÑки, три по три полоÑки Три полоÑки, три по три полоÑки Три полоÑки, три по три полоÑки. Chambered in 7.62x39mm" + caliber = "7.62x39mm" + magazine_type = /obj/item/ammo_magazine/akm + allowed_magazines = list(/obj/item/ammo_magazine/akm) + icon_state = "memegun" + projectile_type = /obj/item/projectile/bullet/rifle/a762x39 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + load_method = MAGAZINE + auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK + muzzle_velocity = 715 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 40 + +/obj/item/weapon/gun/projectile/automatic/serdy/tkb408 + name = "TKB-408" + desc ="An odd, bullpup, slavic assault rifle from some distant rimworld. Very sturdy, unbeleivably reliable. Chambered in 7.62x39mm." + caliber = "7.62x39mm" + magazine_type = /obj/item/ammo_magazine/akm + allowed_magazines = list(/obj/item/ammo_magazine/akm) + icon_state = "tkb" + projectile_type = /obj/item/projectile/bullet/rifle/a762x39 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + load_method = MAGAZINE + auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK + muzzle_velocity = 750 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 60 + +/obj/item/weapon/gun/projectile/automatic/serdy/groza + name = "OTs-14" + desc = "A strangely ergonomic bullpup version of an AK. Commonly found in Pan-slavic speaking regions of space. All of the inscriptions on this thing are in pan-slavic. Chambered in 7.62x39mm." + caliber = "7.62x39mm" + magazine_type = /obj/item/ammo_magazine/akm + allowed_magazines = list(/obj/item/ammo_magazine/akm) + icon_state = "groza" + projectile_type = /obj/item/projectile/bullet/rifle/a762x39 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + load_method = MAGAZINE + auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK + muzzle_velocity = 685 + +/obj/item/weapon/gun/projectile/automatic/serdy/plamya + name = "WKHM 'Plamya' Mk. 1" + desc = "The original Plamya assault rifle, produced by WKHM back in the 2330's. Highly sought after for their collectability, and their superb reliability. They don't quite make them like they used to. It may not fire as fast as the newer ones, but these old models haven't survived this long for no reason. This one has a classic walnut thumbhole stock and foregrip. It has a heavy titanium chassis, durasteel bolt, and the original style 'PPSh' heatshield. The gun is dated 2336, and bears the 'WKHM Endurance' arkship's production stamp on the buttstock. 'A light in the dark' is stamped into the receiver. Chambered in 9x39mm." + description_fluff = "WKHM, is a minor arms company that has been around for quite some time, established in 2408. Known for being one of the many suppliers of weapons to dangerous worlds on the rim, and a part of the FTU. They produce a large variety of firearms, strike craft, and armored vehicles to fufill various their various contracts, and are largely migrant, moving wherever the money is. Found almost entirely on mobile production ships and various escort craft. Identifiable by their logo, a red Omega symbol with a black or white W in the middle. The sheer quantity of their firearms produced ensures they can be found.. just about anywhere, and they are very sought after by pirates for their reliability." + caliber = "9x39mm" + magazine_type = /obj/item/ammo_magazine/plamya + allowed_magazines = list(/obj/item/ammo_magazine/plamya) + icon_state = "plamyac" + projectile_type = /obj/item/projectile/bullet/rifle/a9x39 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="5-round bursts", burst=5, fire_delay=0.5, move_delay=3.5, burst_accuracy=list(0,-10,-15,-20,-25), dispersion=list(0.0, 0.3, 0.6, 0.9, 1.1)) + ) + load_method = MAGAZINE + auto_loading_type = CLOSED_BOLT | LOCK_OPEN_EMPTY | LOCK_SLAPPABLE + muzzle_velocity = 285 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 50 + +/obj/item/weapon/gun/projectile/automatic/serdy/plamya/mk2 + name = "WKHM 'Plamya' Mk. 2" + desc = "An old school assault rifle. A favorite on the rimworld for it's blisteringly high rate of fire. One of the best selling products of W-K Heavy Manufacturing. Virtually impossible to break. The gold standard, with a rosewood thumbhole stock, a full length barrel, and an improved heatshield. The most mass produced firearm in WKHM's lineup. This one bears the 'WKHM Adamant' arkship's production stamp. Chambered in 9x39mm." + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="5-round bursts", burst=5, fire_delay=0.5, move_delay=3.5, burst_accuracy=list(0,-5,-10,-10,-15), dispersion=list(0.0, 0.2, 0.35, 0.5, 0.6)) + ) + muzzle_velocity = 305 + +/obj/item/weapon/gun/projectile/automatic/serdy/plamya/mk3 + name = "WKHM 'Plamya' Mk. 3" + desc = "An old school assault rifle with a modern twist. A favorite on the rimworld for it's blisteringly high rate of fire. One of the best selling products of W-K Heavy Manufacturing. Virtually impossible to break. This is a newer variant, with a fully synthetic stock, and a shorter barrel. The serial number and production stamp has been sanded off. Chambered in 9x39mm." + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="5-round bursts", burst=5, fire_delay=0.5, move_delay=3.5, burst_accuracy=list(0,-7.5,-10,-15,-20), dispersion=list(0.0, 0.2, 0.4, 0.6, 0.7)) + ) + muzzle_velocity = 290 + +//Auto-shotgun, closer to the rifles than anything else though. + +/obj/item/weapon/gun/projectile/automatic/serdy/strela + name = "WKHM 'Strela'" + desc = "A fully automatic, 12 gauge assault shotgun, that goes by many names. The Strela, The Bear, The Mule- The list goes on. If the Plamya is the scalpel, This heavy chunk of forged steel and titanium is the sledgehammer. Bring a shoulder pad and some tramadol. This one has a nice walnut thumbhole stock, and an AK style fore end. It also bears the 'WKHM Endurance' arkship's production stamp. Chambered in 12 gauge." + description_fluff = "WKHM, is a minor arms company that has been around for quite some time, established in 2408. Known for being one of the many suppliers of weapons to dangerous worlds on the rim, and a part of the FTU. They produce a large variety of firearms, strike craft, and armored vehicles to fufill various their various contracts, and are largely migrant, moving wherever the money is. Found almost entirely on mobile production ships and various escort craft. Identifiable by their logo, a red Omega symbol with a black or white W in the middle. The sheer quantity of their firearms produced ensures they can be found.. just about anywhere, and they are very sought after by pirates for their reliability." + caliber = "12g" + magazine_type = /obj/item/ammo_magazine/strela + allowed_magazines = list(/obj/item/ammo_magazine/strela) + icon_state = "strela" + projectile_type = /obj/item/projectile/bullet/shotgun + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="2-round bursts", burst=2, fire_delay=null, move_delay=3, burst_accuracy=list(0,-5), dispersion=list(0.0, 0.2)), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + load_method = MAGAZINE + auto_loading_type = CLOSED_BOLT | LOCK_OPEN_EMPTY | LOCK_SLAPPABLE + muzzle_velocity = 470 + w_class = ITEMSIZE_HUGE + one_handed_penalty = 50 + +//SMGs + +/obj/item/weapon/gun/projectile/automatic/serdy/ppsh + name = "PPSh-17b" + desc = "A cheap remake of the venerable russian PPSh-41. Empties a 71 round magazine in less than 10 seconds. Compensates for poor accuracy with volume of bullet. Every inscription on this thing is in pan-slavic. Chambered in 7.62x25mm Tokarev." + caliber = "7.62x25mm" + magazine_type = /obj/item/ammo_magazine/ppsh + allowed_magazines = list(/obj/item/ammo_magazine/ppsh) + icon_state="ppsh" + projectile_type = /obj/item/projectile/bullet/a762x25 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + auto_loading_type = OPEN_BOLT + load_method = MAGAZINE + muzzle_velocity = 488 + +/obj/item/weapon/gun/projectile/automatic/serdy/mp5 + name = "MP5" + desc = "A favorite of law enforcement and corporate security across the galaxy for centuries. This old H&K design has survived the test of time. And while in many places it has been replaced long ago, it still stands as a reliable weapon platform. No need to fix what isn't broken. Chambered in 9mm." + caliber = "9mm" + magazine_type = /obj/item/ammo_magazine/mp5mag + allowed_magazines = list(/obj/item/ammo_magazine/mp5mag) + icon_state="mp5" + projectile_type = /obj/item/projectile/bullet/pistol + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + load_method = MAGAZINE + muzzle_velocity = 400 + is_long = FALSE + +/obj/item/weapon/gun/projectile/automatic/serdy/vityaz + name = "WKHM 'Vityaz'" + desc = "A swarm of angry bees. The Plamya's baby brother. With 12 total moving parts, including the trigger mechanism, this gun was built with one purpose. Longevity and reliability. Commonly found in the hands of private security, criminals, and law enforcement alike across many worlds. This one is unmarked. Chambered in 10mm." + description_fluff = "WKHM, is a minor arms company that has been around for quite some time, established in 2408. Known for being one of the many suppliers of weapons to dangerous worlds on the rim, and a part of the FTU. They produce a large variety of firearms, strike craft, and armored vehicles to fufill various their various contracts, and are largely migrant, moving wherever the money is. Found almost entirely on mobile production ships and various escort craft. Identifiable by their logo, a red Omega symbol with a black or white W in the middle. The sheer quantity of their firearms produced ensures they can be found.. just about anywhere, and they are very sought after by pirates for their reliability." + caliber = "10mm" + magazine_type = /obj/item/ammo_magazine/m10mm + allowed_magazines = list(/obj/item/ammo_magazine/m10mm) + icon_state = "vityaz" + projectile_type = /obj/item/projectile/bullet/a10mm + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-10,-10), dispersion=list(0.0, 0.3, 0.6)) + ) + load_method = MAGAZINE + auto_loading_type = CLOSED_BOLT | LOCK_OPEN_EMPTY | LOCK_SLAPPABLE + muzzle_velocity = 430 + is_long = FALSE + +//LMGs + +/obj/item/weapon/gun/projectile/automatic/serdy/molniya + name = "WKHM 'Molniya'" + desc = "A light machinegun manufactured by WKHM for various paramilitaries, private security companies, and rimworld governments. Big, heavy, and with a fire rate similar to that of an MG42. Often used in emplacements and on top of armored vehicles, or as a squad support weapon. Nicknamed the 'Pig' or the 'Sawzall', this one has a solid oak stock, and bears the 'WKHM Adamant' arkship's production stamp. If you ever see this gun, there is no doubt shit's about to go down. Chambered in 7.62x51mm." + description_fluff = "WKHM, is a minor arms company that has been around for quite some time, established in 2408. Known for being one of the many suppliers of weapons to dangerous worlds on the rim, and a part of the FTU. They produce a large variety of firearms, strike craft, and armored vehicles to fufill various their various contracts, and are largely migrant, moving wherever the money is. Found almost entirely on mobile production ships and various escort craft. Identifiable by their logo, a red Omega symbol with a black or white W in the middle. The sheer quantity of their firearms produced ensures they can be found.. just about anywhere, and they are very sought after by pirates for their reliability." + caliber = "7.62mm" + magazine_type = /obj/item/ammo_magazine/molniya + allowed_magazines = list(/obj/item/ammo_magazine/molniya) + icon_state = "molniya" + projectile_type = /obj/item/projectile/bullet/rifle/a762 + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-15,-15), dispersion=list(0.0, 0.6, 1.0)), + list(mode_name="short bursts", burst=5, move_delay=6, burst_accuracy = list(0,-15,-15,-30,-30), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)) + ) + load_method = MAGAZINE + auto_loading_type = OPEN_BOLT + muzzle_velocity = 860 + one_handed_penalty = 90 + +//Pistols + +/obj/item/weapon/gun/projectile/automatic/serdy/ssp4 + name = "WKHM SSP4" + desc = "A unique, high end service pistol carried by W-K security personnel in the outer rim, and various law enforcement agencies across the galaxy. Features a hidden ejector port, and an integral laser sight. Surprisingly reliable despite its unorthodox design. This one bears the 'WKHM Obsidian' arkship's production stamp. Chambered in 10mm." + description_fluff = "WKHM, is a minor arms company that has been around for quite some time, established in 2408. Known for being one of the many suppliers of weapons to dangerous worlds on the rim, and a part of the FTU. They produce a large variety of firearms, strike craft, and armored vehicles to fufill various their various contracts, and are largely migrant, moving wherever the money is. Found almost entirely on mobile production ships and various escort craft. Identifiable by their logo, a red Omega symbol with a black or white W in the middle. The sheer quantity of their firearms produced ensures they can be found.. just about anywhere, and they are very sought after by pirates for their reliability." + caliber = "10mm" + magazine_type = /obj/item/ammo_magazine/ssp4 + allowed_magazines = list(/obj/item/ammo_magazine/ssp4) + icon_state = "ssp4" + projectile_type = /obj/item/projectile/bullet/a10mm + load_method = MAGAZINE + bolt_name="slide" + bolt_release = "slide release" + auto_loading_type = CLOSED_BOLT | LOCK_OPEN_EMPTY + muzzle_velocity = 405 + is_long = FALSE + +/obj/item/weapon/gun/projectile/automatic/serdy/ssp4/silenced + name = "WKHM SSP4-S" + desc = "A unique, high end service pistol carried by W-K security personnel in the outer rim, and various law enforcement agencies across the galaxy. Features a hidden ejector port, and an integral laser sight. Surprisingly reliable despite its unorthodox design. This one is unmarked and is suppressed. Due to the minimal amount of moving parts, this gun is almost completely silent when used with subsonic ammunition. Chambered in 10mm." + silenced = 1 + icon_state = "ssp4s" + +/obj/item/weapon/gun/projectile/serdy_pistols + icon = 'icons/obj/gun_ch.dmi' + bolt_name="slide" + bolt_release = "slide release" + auto_loading_type = CLOSED_BOLT | LOCK_OPEN_EMPTY + load_method = MAGAZINE + +/obj/item/weapon/gun/projectile/serdy_pistols/makarov + name = "Makarov PM" + desc = "The venerable Makarov. An easily concealable 9x18mm pistol design from Russia. This one is old and worn, but still reliable as ever. Chambered in 9x18mm makarov." + icon_state = "makarov" + caliber = "9x18mm" + magazine_type = /obj/item/ammo_magazine/makarov + allowed_magazines = list(/obj/item/ammo_magazine/makarov) + projectile_type = /obj/item/projectile/bullet/a9x18 + muzzle_velocity = 315 + +/obj/item/weapon/gun/projectile/serdy_pistols/vp70m + name = "VP70M" + desc = "Old Matilda. An ancient design, one of the first, if not the first entirely polymer framed pistols. Can commonly be found in the hands of.. well, anybody with access to a 3d printer. The designs for this pistol are absolutely everywhere, and it's still a favorite to this day, 500 some-odd years later. Chambered in 9mm." + icon_state = "vp70" + caliber = "9mm" + magazine_type = /obj/item/ammo_magazine/m9mm/vp70 + allowed_magazines = list(/obj/item/ammo_magazine/m9mm) + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-20,-40), dispersion=list(0.0, 0.9, 1.8)) + ) + projectile_type = /obj/item/projectile/bullet/pistol + muzzle_velocity = 365 + +/obj/item/weapon/gun/projectile/serdy_pistols/glock71 + name = "Glock 71" + desc = "Following the same design for centuries, the Glock 71 is one of the most reliable sidearms you can buy for cheap these days. These things are everywhere, and for good reason. Chambered in 9mm." + icon_state = "glock" + caliber = "9mm" + magazine_type = /obj/item/ammo_magazine/m9mm/large + allowed_magazines = list(/obj/item/ammo_magazine/m9mm) + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-20,-40), dispersion=list(0.0, 0.9, 1.8)) + ) + projectile_type = /obj/item/projectile/bullet/pistol + muzzle_velocity = 375 + +/obj/item/weapon/gun/projectile/revolver/nagant + name = "nagant revolver" + desc = "A 7 shot, gas-seal revolver designed to have increased muzzle velocity by not allowing excess gasses to escape out of the sides of the cylinder. One of the few revolvers that can be suppressed. Good luck finding a suppressor for one, though. Chambered in .357." + icon = 'icons/obj/gun_ch.dmi' + icon_state = "nagant" + max_shells = 7 + +/obj/item/weapon/gun/projectile/revolver/nagant/skinned + name = "nagant revolver" + icon_state = "nagantb" //Time to give all these existing guns some new properties. //automatic.dm @@ -258,6 +686,22 @@ /obj/item/weapon/gun/projectile/automatic/sts35 muzzle_velocity = 900 //Based off AK-74 + icon = 'icons/obj/64x32guns_ch.dmi' + icon_state = "sts35" + icon_expected_height = 32 + icon_expected_width = 64 + +/obj/item/weapon/gun/projectile/automatic/sts35/update_icon() + . = ..() + icon_state = ammo_magazine ? "[initial(icon_state)]" : "[initial(icon_state)]-e" + +/obj/item/weapon/gun/projectile/automatic/sts35/Initialize() + . = ..() + update_transform() + +/obj/item/weapon/gun/projectile/automatic/sts35/update_transform() + . = ..() + transform = transform.Translate(-16,0) /obj/item/weapon/gun/projectile/automatic/wt550 muzzle_velocity = 375 //Guestimation @@ -317,6 +761,10 @@ //boltaction.dm /obj/item/weapon/gun/projectile/shotgun/pump/rifle muzzle_velocity = 860 //Guestimation + is64x32 = FALSE + icon_expected_height = 32 + icon_expected_width = 32 + icon = 'icons/obj/gun.dmi' //caseless.dm /obj/item/weapon/gun/projectile/caseless @@ -338,6 +786,26 @@ bolt_release = "slide release" auto_loading_type = CLOSED_BOLT | LOCK_OPEN_EMPTY muzzle_velocity = 253 //M1911 + icon = 'icons/obj/gun_ch.dmi' + icon_state = "m1911" + +/obj/item/weapon/gun/projectile/colt/Initialize() + .=..() + update_icon() + +/obj/item/weapon/gun/projectile/colt/update_icon() + if(ammo_magazine) + if(unique_reskin) + icon = 'icons/obj/gun.dmi' + icon_state = unique_reskin + else + icon_state = initial(icon_state) + else + if(unique_reskin) + icon = 'icons/obj/gun.dmi' + icon_state = "[unique_reskin]-e" + else + icon_state = "[initial(icon_state)]-e" /obj/item/weapon/gun/projectile/sec bolt_name="slide" @@ -467,6 +935,7 @@ sound_ejectchamber = 'sound/weapons/ballistics/rifle_ejectchamber.ogg' sound_eject = 'sound/weapons/ballistics/rifle_eject.ogg' sound_chamber = 'sound/weapons/ballistics/rifle_chamber.ogg' + only_open_load = TRUE /obj/item/weapon/gun/projectile/revolvingrifle manual_chamber = FALSE @@ -478,10 +947,53 @@ /obj/item/weapon/gun/projectile/shotgun/pump manual_chamber = FALSE + icon = 'icons/obj/64x32guns_ch.dmi' + icon_state = "winchester" + icon_expected_height = 32 + icon_expected_width = 64 + pump_animation = "winchester-pump" + var/is64x32 = TRUE + var/is_picked_up = FALSE + +/obj/item/weapon/gun/projectile/shotgun/pump/Initialize() + . = ..() + if(is64x32) + update_transform() + +/obj/item/weapon/gun/projectile/shotgun/pump/equipped() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/projectile/shotgun/pump/pickup() + . = ..() + is_picked_up = TRUE + update_transform() + +/obj/item/weapon/gun/projectile/shotgun/pump/dropped() + . = ..() + is_picked_up = FALSE + update_transform() + +/obj/item/weapon/gun/projectile/shotgun/pump/update_transform() + . = ..() + if(is64x32) + if(is_picked_up) + transform = transform.Turn(-45) + transform = transform.Translate(-16,0) + +/obj/item/weapon/gun/projectile/shotgun/pump/combat + icon = 'icons/obj/64x32guns_ch.dmi' /obj/item/weapon/gun/projectile/shotgun/doublebarrel manual_chamber = FALSE +//shotgun_vr.dm +/obj/item/weapon/gun/projectile/shotgun/pump/USDF + is64x32 = FALSE + icon_expected_height = 32 + icon_expected_width = 32 + //shotgun_yw.dm /obj/item/weapon/gun/projectile/revolvershotgun manual_chamber = FALSE diff --git a/code/modules/projectiles/guns/projectile_ch.dm b/code/modules/projectiles/guns/projectile_ch.dm index 3d878f84a3..c28ba77a72 100644 --- a/code/modules/projectiles/guns/projectile_ch.dm +++ b/code/modules/projectiles/guns/projectile_ch.dm @@ -20,6 +20,7 @@ /obj/item/weapon/gun/projectile var/manual_chamber = TRUE + var/only_open_load = FALSE var/auto_loading_type = CLOSED_BOLT | LOCK_MANUAL_LOCK | LOCK_SLAPPABLE var/bolt_name = "bolt" var/bolt_open = FALSE @@ -69,7 +70,7 @@ if(chambered) chambered.expend() if(!manual_chamber) process_chambered() - if(manual_chamber) + if(manual_chamber && auto_loading_type) bolt_toggle() /obj/item/weapon/gun/projectile/attack_self(mob/user as mob) @@ -84,6 +85,7 @@ /obj/item/weapon/gun/projectile/proc/bolt_handle(mob/user) var/previous_chambered = chambered var/result = bolt_toggle(TRUE) + update_icon() if(!result) to_chat(user,"Nothing happens.") else @@ -159,10 +161,10 @@ else bolt_open = TRUE var/ejected = process_chambered() - var/chambering = chamber_bullet() + var/output = BOLT_OPENED if(ejected) output |= BOLT_CASING_EJECTED - if(chambering) output |= BOLT_CASING_CHAMBERED + //if(chambering) output |= BOLT_CASING_CHAMBERED return output else if(auto_loading_type) @@ -192,7 +194,10 @@ return BOLT_CLOSED else bolt_open = FALSE - return BOLT_CLOSED + var/output = BOLT_CLOSED + var/chambering = chamber_bullet() + if(chambering) output |= BOLT_CASING_CHAMBERED + return output /obj/item/weapon/gun/projectile/process_chambered() @@ -250,6 +255,8 @@ return null /obj/item/weapon/gun/projectile/proc/chamber_bullet() + if(chambered) + return 0 var/obj/item/ammo_casing/to_chamber if(loaded.len) to_chamber = loaded[1] //load next casing. @@ -288,6 +295,9 @@ bolt_toggle() playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) if(SPEEDLOADER) + if(only_open_load && !bolt_open) + to_chat(user, "[src] must have its bolt open to be loaded!") + return if(loaded.len >= max_shells) to_chat(user, "[src] is full!") return @@ -340,6 +350,9 @@ return else return + if(only_open_load && !bolt_open) + to_chat(user, "[src] must have its bolt open to be loaded!") + return if(loaded.len >= max_shells) to_chat(user, "[src] is full.") return @@ -411,11 +424,29 @@ else if(CHECK_BITFIELD(auto_loading_type,CLOSED_BOLT) && bolt_open) to_chat(user,"This is a closed bolt gun! You need to close the bolt before firing it!") return 0 + else if(bolt_open) + to_chat(user,"This is a manual action gun, the bolt or chamber must be closed before firing it!") + return 0 else return 1 else return 1 +/obj/item/weapon/gun/projectile/unload_ammo(mob/user, var/allow_dump=1) + if(manual_chamber && only_open_load && !bolt_open) + to_chat(user,"You must open the bolt to load or unload this gun!") + else + return ..() + +/obj/item/weapon/gun/projectile/handle_click_empty(mob/user) + if (user) + user.visible_message("*click click*", "*click*") + else + src.visible_message("*click click*") + playsound(src, 'sound/weapons/empty.ogg', 100, 1) + if(!manual_chamber) + process_chambered() + /obj/item/weapon/gun/projectile/New(loc, var/starts_loaded = 1) ..() if(manual_chamber) @@ -451,4 +482,4 @@ P.velocity = initial(P.velocity) if(!istype(P)) return - P.sub_velocity(P.velocity - 35) \ No newline at end of file + P.sub_velocity(P.velocity - 35) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 8c888fee3e..f65b0b3c9d 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -1,267 +1,280 @@ -/obj/item/projectile/beam - name = "laser" - icon_state = "laser" - fire_sound = 'sound/weapons/Laser.ogg' - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 40 - damage_type = BURN - check_armour = "laser" - eyeblur = 4 - var/frequency = 1 - hitscan = 1 - embed_chance = 0 - invisibility = 99 //beam projectiles are invisible as they are rendered by the effect engine - light_range = 2 - light_power = 0.5 - light_color = "#FF0D00" - hitsound = 'sound/weapons/sear.ogg' - hitsound_wall = 'sound/weapons/effects/searwall.ogg' - - muzzle_type = /obj/effect/projectile/muzzle/laser - tracer_type = /obj/effect/projectile/tracer/laser - impact_type = /obj/effect/projectile/impact/laser - -/obj/item/projectile/beam/practice - name = "laser" - icon_state = "laser" - damage = 0 - damage_type = BURN - check_armour = "laser" - eyeblur = 2 - -/obj/item/projectile/beam/weaklaser - name = "weak laser" - icon_state = "laser" - damage = 15 - -/obj/item/projectile/beam/smalllaser - damage = 25 - -/obj/item/projectile/beam/burstlaser - damage = 30 - armor_penetration = 10 - - -/obj/item/projectile/beam/midlaser - damage = 40 - armor_penetration = 10 - -/obj/item/projectile/beam/heavylaser - name = "heavy laser" - icon_state = "heavylaser" - fire_sound = 'sound/weapons/lasercannonfire.ogg' - damage = 60 - armor_penetration = 30 - light_range = 3 - light_power = 1 - light_color = "#FF0D00" - - muzzle_type = /obj/effect/projectile/muzzle/laser_heavy - tracer_type = /obj/effect/projectile/tracer/laser_heavy - impact_type = /obj/effect/projectile/impact/laser_heavy - -/obj/item/projectile/beam/heavylaser/fakeemitter - name = "emitter beam" - icon_state = "emitter" - fire_sound = 'sound/weapons/emitter.ogg' - light_color = "#00CC33" - excavation_amount = 140 // 2 shots to dig a standard rock turf. Superior due to being a mounted tool beam, to make it actually viable. - - muzzle_type = /obj/effect/projectile/muzzle/emitter - tracer_type = /obj/effect/projectile/tracer/emitter - impact_type = /obj/effect/projectile/impact/emitter - -/obj/item/projectile/beam/heavylaser/cannon - damage = 80 - armor_penetration = 50 - light_color = "#FF0D00" - -/obj/item/projectile/beam/xray - name = "xray beam" - icon_state = "xray" - fire_sound = 'sound/weapons/eluger.ogg' - damage = 25 - armor_penetration = 50 - light_color = "#00CC33" - - muzzle_type = /obj/effect/projectile/muzzle/xray - tracer_type = /obj/effect/projectile/tracer/xray - impact_type = /obj/effect/projectile/impact/xray - -/obj/item/projectile/beam/gamma - name = "gamma beam" - icon_state = "xray" - fire_sound = 'sound/weapons/eluger.ogg' - damage = 10 - armor_penetration = 90 - irradiate = 20 - light_color = "#00CC33" - - muzzle_type = /obj/effect/projectile/muzzle/xray - tracer_type = /obj/effect/projectile/tracer/xray - impact_type = /obj/effect/projectile/impact/xray - -/obj/item/projectile/beam/cyan - name = "cyan beam" - icon_state = "cyan" - fire_sound = 'sound/weapons/eluger.ogg' - damage = 40 - light_color = "#00C6FF" - - muzzle_type = /obj/effect/projectile/muzzle/laser_omni - tracer_type = /obj/effect/projectile/tracer/laser_omni - impact_type = /obj/effect/projectile/impact/laser_omni - -/obj/item/projectile/beam/pulse - name = "pulse" - icon_state = "u_laser" - fire_sound='sound/weapons/gauss_shoot.ogg' // Needs a more meaty sound than what pulse.ogg currently is; this will be a placeholder for now. - damage = 100 //Badmin toy, don't care - armor_penetration = 100 - light_color = "#0066FF" - - muzzle_type = /obj/effect/projectile/muzzle/laser_pulse - tracer_type = /obj/effect/projectile/tracer/laser_pulse - impact_type = /obj/effect/projectile/impact/laser_pulse - -/obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0) - if(isturf(target)) - target.ex_act(2) - ..() - -/obj/item/projectile/beam/emitter - name = "emitter beam" - icon_state = "emitter" - fire_sound = 'sound/weapons/emitter.ogg' - damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm - light_color = "#00CC33" - excavation_amount = 70 // 3 shots to mine a turf - - muzzle_type = /obj/effect/projectile/muzzle/emitter - tracer_type = /obj/effect/projectile/tracer/emitter - impact_type = /obj/effect/projectile/impact/emitter - -/obj/item/projectile/beam/lasertag - name = "lasertag beam" - damage = 0 - eyeblur = 0 - no_attack_log = 1 - damage_type = BURN - check_armour = "laser" - - combustion = FALSE - -/obj/item/projectile/beam/lasertag/blue - icon_state = "bluelaser" - light_color = "#0066FF" - - muzzle_type = /obj/effect/projectile/muzzle/laser_blue - tracer_type = /obj/effect/projectile/tracer/laser_blue - impact_type = /obj/effect/projectile/impact/laser_blue - -/obj/item/projectile/beam/lasertag/blue/on_hit(var/atom/target, var/blocked = 0) - if(ishuman(target)) - var/mob/living/carbon/human/M = target - if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) - M.Weaken(5) - return 1 - -/obj/item/projectile/beam/lasertag/red - icon_state = "laser" - light_color = "#FF0D00" - -/obj/item/projectile/beam/lasertag/red/on_hit(var/atom/target, var/blocked = 0) - if(ishuman(target)) - var/mob/living/carbon/human/M = target - if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) - M.Weaken(5) - return 1 - -/obj/item/projectile/beam/lasertag/omni//A laser tag bolt that stuns EVERYONE - icon_state = "omnilaser" - light_color = "#00C6FF" - - muzzle_type = /obj/effect/projectile/muzzle/laser_omni - tracer_type = /obj/effect/projectile/tracer/laser_omni - impact_type = /obj/effect/projectile/impact/laser_omni - -/obj/item/projectile/beam/lasertag/omni/on_hit(var/atom/target, var/blocked = 0) - if(ishuman(target)) - var/mob/living/carbon/human/M = target - if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag))) - M.Weaken(5) - return 1 - -/obj/item/projectile/beam/sniper - name = "sniper beam" - icon_state = "xray" - fire_sound = 'sound/weapons/gauss_shoot.ogg' - damage = 50 - armor_penetration = 10 - light_color = "#00CC33" - - muzzle_type = /obj/effect/projectile/muzzle/xray - tracer_type = /obj/effect/projectile/tracer/xray - impact_type = /obj/effect/projectile/impact/xray - -/obj/item/projectile/beam/stun - name = "stun beam" - icon_state = "stun" - fire_sound = 'sound/weapons/Taser.ogg' - nodamage = 1 - taser_effect = 1 - agony = 40 - damage_type = HALLOSS - light_color = "#FFFFFF" - hitsound = 'sound/weapons/zapbang.ogg' - - combustion = FALSE - - muzzle_type = /obj/effect/projectile/muzzle/stun - tracer_type = /obj/effect/projectile/tracer/stun - impact_type = /obj/effect/projectile/impact/stun - -/obj/item/projectile/beam/stun/weak - name = "weak stun beam" - icon_state = "stun" - agony = 25 - -/obj/item/projectile/beam/stun/med - name = "stun beam" - icon_state = "stun" - agony = 30 - -/obj/item/projectile/beam/stun/disabler - muzzle_type = /obj/effect/projectile/muzzle/laser_omni - tracer_type = /obj/effect/projectile/tracer/laser_omni - impact_type = /obj/effect/projectile/impact/laser_omni - -/obj/item/projectile/beam/stun/disabler/on_hit(atom/target, blocked = 0, def_zone) - . = ..(target, blocked, def_zone) - - if(. && istype(target, /mob/living/silicon/robot) && prob(agony)) - var/mob/living/silicon/robot/R = target - var/drainamt = agony * (rand(5, 15) / 10) - R.drain_power(0, 0, drainamt) - if(istype(firer, /mob/living/silicon/robot)) // Mischevious sappers, the swarm drones are. - var/mob/living/silicon/robot/A = firer - if(A.cell) - A.cell.give(drainamt * 2) - -/obj/item/projectile/beam/shock - name = "shock beam" - icon_state = "lightning" - damage_type = ELECTROCUTE - - muzzle_type = /obj/effect/projectile/muzzle/lightning - tracer_type = /obj/effect/projectile/tracer/lightning - impact_type = /obj/effect/projectile/impact/lightning - - damage = 30 - agony = 15 - eyeblur = 2 - hitsound = 'sound/weapons/zapbang.ogg' - -/obj/item/projectile/beam/shock/weak - damage = 5 - agony = 10 +/obj/item/projectile/beam + name = "laser" + icon_state = "laser" + fire_sound = 'sound/weapons/Laser.ogg' + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 40 + damage_type = BURN + check_armour = "laser" + eyeblur = 4 + var/frequency = 1 + hitscan = 1 + embed_chance = 0 + invisibility = 99 //beam projectiles are invisible as they are rendered by the effect engine + light_range = 2 + light_power = 0.5 + light_color = "#FF0D00" + hitsound = 'sound/weapons/sear.ogg' + hitsound_wall = 'sound/weapons/effects/searwall.ogg' + + muzzle_type = /obj/effect/projectile/muzzle/laser + tracer_type = /obj/effect/projectile/tracer/laser + impact_type = /obj/effect/projectile/impact/laser + +/obj/item/projectile/beam/practice + name = "laser" + icon_state = "laser" + damage = 0 + damage_type = BURN + check_armour = "laser" + eyeblur = 2 + +/obj/item/projectile/beam/weaklaser + name = "weak laser" + icon_state = "laser" + damage = 15 + +/obj/item/projectile/beam/smalllaser + damage = 25 + +/obj/item/projectile/beam/burstlaser + damage = 30 + armor_penetration = 10 + + +/obj/item/projectile/beam/midlaser + damage = 40 + armor_penetration = 10 + +/obj/item/projectile/beam/heavylaser + name = "heavy laser" + icon_state = "heavylaser" + fire_sound = 'sound/weapons/lasercannonfire.ogg' + damage = 60 + armor_penetration = 30 + light_range = 3 + light_power = 1 + light_color = "#FF0D00" + + muzzle_type = /obj/effect/projectile/muzzle/laser_heavy + tracer_type = /obj/effect/projectile/tracer/laser_heavy + impact_type = /obj/effect/projectile/impact/laser_heavy + +/obj/item/projectile/beam/heavylaser/fakeemitter + name = "emitter beam" + icon_state = "emitter" + fire_sound = 'sound/weapons/emitter.ogg' + light_color = "#00CC33" + excavation_amount = 140 // 2 shots to dig a standard rock turf. Superior due to being a mounted tool beam, to make it actually viable. + + muzzle_type = /obj/effect/projectile/muzzle/emitter + tracer_type = /obj/effect/projectile/tracer/emitter + impact_type = /obj/effect/projectile/impact/emitter + +/obj/item/projectile/beam/heavylaser/cannon + damage = 80 + armor_penetration = 50 + light_color = "#FF0D00" + +/obj/item/projectile/beam/xray + name = "xray beam" + icon_state = "xray" + fire_sound = 'sound/weapons/eluger.ogg' + damage = 25 + armor_penetration = 50 + light_color = "#00CC33" + + muzzle_type = /obj/effect/projectile/muzzle/xray + tracer_type = /obj/effect/projectile/tracer/xray + impact_type = /obj/effect/projectile/impact/xray + +/obj/item/projectile/beam/gamma + name = "gamma beam" + icon_state = "xray" + fire_sound = 'sound/weapons/eluger.ogg' + damage = 12 //CHOMPedit + armor_penetration = 90 + irradiate = 20 + light_color = "#00CC33" + + muzzle_type = /obj/effect/projectile/muzzle/xray + tracer_type = /obj/effect/projectile/tracer/xray + impact_type = /obj/effect/projectile/impact/xray + +/obj/item/projectile/beam/cyan + name = "cyan beam" + icon_state = "cyan" + fire_sound = 'sound/weapons/eluger.ogg' + damage = 40 + light_color = "#00C6FF" + + muzzle_type = /obj/effect/projectile/muzzle/laser_omni + tracer_type = /obj/effect/projectile/tracer/laser_omni + impact_type = /obj/effect/projectile/impact/laser_omni + +/obj/item/projectile/beam/pulse + name = "pulse" + icon_state = "u_laser" + fire_sound='sound/weapons/gauss_shoot.ogg' // Needs a more meaty sound than what pulse.ogg currently is; this will be a placeholder for now. + damage = 100 //Badmin toy, don't care + armor_penetration = 100 + light_color = "#0066FF" + + muzzle_type = /obj/effect/projectile/muzzle/laser_pulse + tracer_type = /obj/effect/projectile/tracer/laser_pulse + impact_type = /obj/effect/projectile/impact/laser_pulse + +/obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0) + if(isturf(target)) + target.ex_act(2) + ..() + +/obj/item/projectile/beam/emitter + name = "emitter beam" + icon_state = "emitter" + fire_sound = 'sound/weapons/emitter.ogg' + damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm + light_color = "#00CC33" + excavation_amount = 70 // 3 shots to mine a turf + + muzzle_type = /obj/effect/projectile/muzzle/emitter + tracer_type = /obj/effect/projectile/tracer/emitter + impact_type = /obj/effect/projectile/impact/emitter + +/obj/item/projectile/beam/lasertag + name = "lasertag beam" + damage = 0 + eyeblur = 0 + no_attack_log = 1 + damage_type = BURN + check_armour = "laser" + + combustion = FALSE + +/obj/item/projectile/beam/lasertag/blue + icon_state = "bluelaser" + light_color = "#0066FF" + + muzzle_type = /obj/effect/projectile/muzzle/laser_blue + tracer_type = /obj/effect/projectile/tracer/laser_blue + impact_type = /obj/effect/projectile/impact/laser_blue + +/obj/item/projectile/beam/lasertag/blue/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) + var/mob/living/carbon/human/M = target + if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) + M.Weaken(5) + return 1 + +/obj/item/projectile/beam/lasertag/red + icon_state = "laser" + light_color = "#FF0D00" + +/obj/item/projectile/beam/lasertag/red/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) + var/mob/living/carbon/human/M = target + if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) + M.Weaken(5) + return 1 + +/obj/item/projectile/beam/lasertag/omni//A laser tag bolt that stuns EVERYONE + icon_state = "omnilaser" + light_color = "#00C6FF" + + muzzle_type = /obj/effect/projectile/muzzle/laser_omni + tracer_type = /obj/effect/projectile/tracer/laser_omni + impact_type = /obj/effect/projectile/impact/laser_omni + +/obj/item/projectile/beam/lasertag/omni/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) + var/mob/living/carbon/human/M = target + if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag))) + M.Weaken(5) + return 1 + +/obj/item/projectile/beam/sniper + name = "sniper beam" + icon_state = "xray" + fire_sound = 'sound/weapons/gauss_shoot.ogg' + damage = 50 + armor_penetration = 10 + light_color = "#00CC33" + + muzzle_type = /obj/effect/projectile/muzzle/xray + tracer_type = /obj/effect/projectile/tracer/xray + impact_type = /obj/effect/projectile/impact/xray + +/obj/item/projectile/beam/stun + name = "stun beam" + icon_state = "stun" + fire_sound = 'sound/weapons/Taser.ogg' + nodamage = 1 + taser_effect = 1 + agony = 40 + damage_type = HALLOSS + light_color = "#FFFFFF" + hitsound = 'sound/weapons/zapbang.ogg' + + combustion = FALSE + + muzzle_type = /obj/effect/projectile/muzzle/stun + tracer_type = /obj/effect/projectile/tracer/stun + impact_type = /obj/effect/projectile/impact/stun + +/obj/item/projectile/beam/stun/weak + name = "weak stun beam" + icon_state = "stun" + agony = 25 + +/obj/item/projectile/beam/stun/med + name = "stun beam" + icon_state = "stun" + agony = 30 + +/obj/item/projectile/beam/stun/disabler + muzzle_type = /obj/effect/projectile/muzzle/laser_omni + tracer_type = /obj/effect/projectile/tracer/laser_omni + impact_type = /obj/effect/projectile/impact/laser_omni + +/obj/item/projectile/beam/stun/disabler/on_hit(atom/target, blocked = 0, def_zone) + . = ..(target, blocked, def_zone) + + if(. && istype(target, /mob/living/silicon/robot) && prob(agony)) + var/mob/living/silicon/robot/R = target + var/drainamt = agony * (rand(5, 15) / 10) + R.drain_power(0, 0, drainamt) + if(istype(firer, /mob/living/silicon/robot)) // Mischevious sappers, the swarm drones are. + var/mob/living/silicon/robot/A = firer + if(A.cell) + A.cell.give(drainamt * 2) + +/obj/item/projectile/beam/shock + name = "shock beam" + icon_state = "lightning" + damage_type = ELECTROCUTE + + muzzle_type = /obj/effect/projectile/muzzle/lightning + tracer_type = /obj/effect/projectile/tracer/lightning + impact_type = /obj/effect/projectile/impact/lightning + + damage = 30 + agony = 15 + eyeblur = 2 + hitsound = 'sound/weapons/zapbang.ogg' + +/obj/item/projectile/beam/shock/weak + damage = 5 + agony = 10 + +/obj/item/projectile/beam/precursor //CHOMPedit added Precursor beam + name = "precursor beam" + icon_state = "alien beam" + fire_sound = 'sound/weapons/MediumLaser.ogg' + light_color = "#FF0099" + + muzzle_type = /obj/effect/projectile/muzzle/precursor + tracer_type = /obj/effect/projectile/tracer/precursor + impact_type = /obj/effect/projectile/impact/precursor + + damage = 48 + armor_penetration = 10 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets_ch.dm b/code/modules/projectiles/projectile/bullets_ch.dm index f44b8ea67a..e5ef0bb8a5 100644 --- a/code/modules/projectiles/projectile/bullets_ch.dm +++ b/code/modules/projectiles/projectile/bullets_ch.dm @@ -126,6 +126,18 @@ only use the hollow_point and armor_penetration values.*/ hollow_point = TRUE armor_penetration = -50 +/obj/item/projectile/bullet/a762x25 + fire_sound = 'sound/weapons/gunshot2.ogg' + diam = 7.92 + grains = 85 + velocity = 469 + +/obj/item/projectile/bullet/a9x18 + fire_sound = 'sound/weapons/gunshot2.ogg' + diam = 9.27 + grains = 95 + velocity = 319 + /obj/item/projectile/bullet/a10mm fire_sound = 'sound/weapons/gunshot2.ogg' diam = 10.17 @@ -322,6 +334,30 @@ only use the hollow_point and armor_penetration values.*/ /obj/item/projectile/bullet/rifle/a762x54/ap armor_penetration = 50 +/obj/item/projectile/bullet/rifle/a338 + fire_sound = 'sound/weapons/ballistics/a762x54.ogg' + damage = 45 + diam = 8.61 + grains = 250 + velocity = 921 + hitscan = 1 + penetrating = 2 + +/obj/item/projectile/bullet/rifle/a338/ap + armor_penetration = 50 + +/obj/item/projectile/bullet/rifle/a50bmg + fire_sound = 'sound/weapons/ballistics/a145.ogg' + damage = 65 + diam = 13 + grains = 750 + velocity = 860 + hitscan = 1 + penetrating = 2 + +/obj/item/projectile/bullet/rifle/a50bmg/ap + armor_penetration = 50 + //NOTE: Ammo casings and magazines used to be in this part of the file. They have been moved to respective files in the projectiles/ammunition folder. //Various "We're not dealing with this shit because of how bad it is" (Some of these may be implemented into the new system with later updates) diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index de8173a26a..4881154d60 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -64,6 +64,13 @@ T.resources["hydrogen"] = 0 T.resources["verdantium"] = 0 T.resources["lead"] = 0 + T.resources["copper"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources["tin"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + T.resources["bauxite"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + T.resources["rutile"] = 0 + T.resources["void opal"] = 0 + T.resources["quartz"] = 0 + T.resources["painite"] = 0 else if(current_cell < deep_val) // Rare metals. T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) @@ -76,6 +83,13 @@ T.resources["diamond"] = 0 T.resources["hematite"] = 0 T.resources["marble"] = 0 + T.resources["copper"] = 0 + T.resources["tin"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + T.resources["bauxite"] = 0 + T.resources["rutile"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + T.resources["void opal"] = 0 + T.resources["quartz"] = 0 + T.resources["painite"] = 0 else // Deep metals. T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) @@ -88,6 +102,13 @@ T.resources["hematite"] = 0 T.resources["gold"] = 0 T.resources["silver"] = 0 + T.resources["copper"] = 0 + T.resources["tin"] = 0 + T.resources["bauxite"] = 0 + T.resources["rutile"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + T.resources["void opal"] = 0 + T.resources["quartz"] = 0 + T.resources["painite"] = 0 return /datum/random_map/noise/ore/get_map_char(var/value) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index b96e223ed9..797ffc4371 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -1,496 +1,518 @@ -#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times - -/datum/reagents - var/list/datum/reagent/reagent_list = list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - -/datum/reagents/New(var/max = 100, atom/A = null) - ..() - maximum_volume = max - my_atom = A - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!SSchemistry.chemical_reagents) - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - var/paths = typesof(/datum/reagent) - /datum/reagent - SSchemistry.chemical_reagents = list() - for(var/path in paths) - var/datum/reagent/D = new path() - if(!D.name) - continue - SSchemistry.chemical_reagents[D.id] = D - -/datum/reagents/Destroy() - STOP_PROCESSING(SSchemistry, src) - for(var/datum/reagent/R in reagent_list) - qdel(R) - reagent_list = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - return ..() - -/* Internal procs */ - -/datum/reagents/proc/get_free_space() // Returns free space. - return maximum_volume - total_volume - -/datum/reagents/proc/get_master_reagent() // Returns reference to the reagent with the biggest volume. - var/the_reagent = null - var/the_volume = 0 - - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_reagent = A - - return the_reagent - -/datum/reagents/proc/get_master_reagent_name() // Returns the name of the reagent with the biggest volume. - var/the_name = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_name = A.name - - return the_name - -/datum/reagents/proc/get_master_reagent_id() // Returns the id of the reagent with the biggest volume. - var/the_id = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_id = A.id - - return the_id - -/datum/reagents/proc/update_total() // Updates volume. - total_volume = 0 - for(var/datum/reagent/R in reagent_list) - if(R.volume < MINIMUM_CHEMICAL_VOLUME) - del_reagent(R.id) - else - total_volume += R.volume - return - -/datum/reagents/proc/handle_reactions() - if(QDELETED(my_atom)) - return FALSE - if(my_atom.flags & NOREACT) - return FALSE - var/reaction_occurred - var/list/eligible_reactions = list() - var/list/effect_reactions = list() - do - reaction_occurred = FALSE - for(var/i in reagent_list) - var/datum/reagent/R = i - if(SSchemistry.chemical_reactions_by_reagent[R.id]) - eligible_reactions |= SSchemistry.chemical_reactions_by_reagent[R.id] - - for(var/i in eligible_reactions) - var/datum/chemical_reaction/C = i - if(C.can_happen(src) && C.process(src)) - effect_reactions |= C - reaction_occurred = TRUE - eligible_reactions.len = 0 - while(reaction_occurred) - for(var/i in effect_reactions) - var/datum/chemical_reaction/C = i - C.post_reaction(src) - update_total() - -/* Holder-to-chemical */ - -/datum/reagents/proc/add_reagent(var/id, var/amount, var/data = null, var/safety = 0) - if(!isnum(amount) || amount <= 0) - return 0 - - update_total() - amount = min(amount, get_free_space()) - - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - if(current.id == "blood") - if(!isnull(data["species"]) && !isnull(current.data["species"]) && data["species"] != current.data["species"]) // Species bloodtypes are already incompatible, this just stops it from mixing into the one already in a container. - continue - - current.volume += amount - if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful - current.mix_data(data, amount) - update_total() - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - var/datum/reagent/D = SSchemistry.chemical_reagents[id] - if(D) - var/datum/reagent/R = new D.type() - reagent_list += R - R.holder = src - R.volume = amount - R.initialize_data(data) - update_total() - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - else - crash_with("[my_atom] attempted to add a reagent called '[id]' which doesn't exist. ([usr])") - return 0 - -/datum/reagents/proc/isolate_reagent(reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/remove_reagent(var/id, var/amount, var/safety = 0) - if(!isnum(amount)) - return 0 - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - current.volume -= amount // It can go negative, but it doesn't matter - update_total() // Because this proc will delete it then - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - return 0 - -/datum/reagents/proc/del_reagent(var/id) - for(var/datum/reagent/current in reagent_list) - if (current.id == id) - current.on_remove(my_atom) //YW Edit: Calls on_remove before the last of the thing is done, used in phorochemistry - reagent_list -= current - qdel(current) - update_total() - if(my_atom) - my_atom.on_reagent_change() - return 0 - -/datum/reagents/proc/has_reagent(var/id, var/amount = 0) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - if(current.volume >= amount) - return 1 - else - return 0 - return 0 - -/datum/reagents/proc/has_any_reagent(var/list/check_reagents) - for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) - return 1 - else - return 0 - return 0 - -/datum/reagents/proc/has_all_reagents(var/list/check_reagents) - //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list - var/missing = check_reagents.len - for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) - missing-- - return !missing - -/datum/reagents/proc/clear_reagents() - for(var/datum/reagent/current in reagent_list) - del_reagent(current.id) - return - -/datum/reagents/proc/get_reagent_amount(var/id) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - return current.volume - return 0 - -/datum/reagents/proc/get_data(var/id) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - return current.get_data() - return 0 - -/datum/reagents/proc/get_reagents() - . = list() - for(var/datum/reagent/current in reagent_list) - . += "[current.id] ([current.volume])" - return english_list(., "EMPTY", "", ", ", ", ") - -/* Holder-to-holder and similar procs */ - -/datum/reagents/proc/remove_any(var/amount = 1) // Removes up to [amount] of reagents from [src]. Returns actual amount removed. - amount = min(amount, total_volume) - - if(!amount) - return - - var/part = amount / total_volume - - for(var/datum/reagent/current in reagent_list) - var/amount_to_remove = current.volume * part - remove_reagent(current.id, amount_to_remove, 1) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). - if(!target || !istype(target)) - return - - amount = max(0, min(amount, total_volume, target.get_free_space() / multiplier)) - - if(!amount) - return - - var/part = amount / total_volume - - for(var/datum/reagent/current in reagent_list) - var/amount_to_transfer = current.volume * part - target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), safety = 1) // We don't react until everything is in place - if(!copy) - remove_reagent(current.id, amount_to_transfer, 1) - - if(!copy) - handle_reactions() - target.handle_reactions() - return amount - -/* Holder-to-atom and similar procs */ - -//The general proc for applying reagents to things. This proc assumes the reagents are being applied externally, -//not directly injected into the contents. It first calls touch, then the appropriate trans_to_*() or splash_mob(). -//If for some reason touch effects are bypassed (e.g. injecting stuff directly into a reagent container or person), -//call the appropriate trans_to_*() proc. -/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) - touch(target) //First, handle mere touch effects - - if(ismob(target)) - return splash_mob(target, amount, copy) - if(isturf(target)) - return trans_to_turf(target, amount, multiplier, copy) - if(isobj(target) && target.is_open_container()) - return trans_to_obj(target, amount, multiplier, copy) - return 0 - -//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well. -/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60) - var/spill = 0 - if(!isturf(target) && target.loc) - spill = amount*(rand(min_spill, max_spill)/100) - amount -= spill - if(spill) - splash(target.loc, spill, multiplier, copy, min_spill, max_spill) - - trans_to(target, amount, multiplier, copy) - -/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) - if (!target) - return - - var/datum/reagent/transfering_reagent = get_reagent(rtype) - - if (istype(target, /atom)) - var/atom/A = target - if (!A.reagents || !A.simulated) - return - - amount = min(amount, transfering_reagent.volume) - - if(!amount) - return - - - var/datum/reagents/F = new /datum/reagents(amount) - var/tmpdata = get_data(rtype) - F.add_reagent(rtype, amount, tmpdata) - remove_reagent(rtype, amount) - - - if (istype(target, /atom)) - return F.trans_to(target, amount) // Let this proc check the atom's type - else if (istype(target, /datum/reagents)) - return F.trans_to_holder(target, amount) - -/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) - if (!target || !target.reagents) - return - - amount = min(amount, get_reagent_amount(id)) - - if(!amount) - return - - var/datum/reagents/F = new /datum/reagents(amount) - var/tmpdata = get_data(id) - F.add_reagent(id, amount, tmpdata) - remove_reagent(id, amount) - - return F.trans_to(target, amount) // Let this proc check the atom's type - -// When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. -// This does not handle transferring reagents to things. -// For example, splashing someone with water will get them wet and extinguish them if they are on fire, -// even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. -/datum/reagents/proc/touch(var/atom/target, var/amount) - if(ismob(target)) - touch_mob(target, amount) - if(isturf(target)) - touch_turf(target, amount) - if(isobj(target)) - touch_obj(target, amount) - return - -/datum/reagents/proc/touch_mob(var/mob/target) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_mob(target, current.volume) - - update_total() - -/datum/reagents/proc/touch_turf(var/turf/target, var/amount) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_turf(target, amount) - - update_total() - -/datum/reagents/proc/touch_obj(var/obj/target, var/amount) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_obj(target, amount) - - update_total() - -// Attempts to place a reagent on the mob's skin. -// Reagents are not guaranteed to transfer to the target. -// Do not call this directly, call trans_to() instead. -/datum/reagents/proc/splash_mob(var/mob/target, var/amount = 1, var/copy = 0) - var/perm = 1 - if(isliving(target)) //will we ever even need to tranfer reagents to non-living mobs? - var/mob/living/L = target - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(0, null, null, null, "the spray") == 1) //If they block the spray, it does nothing. - amount = 0 - perm = L.reagent_permeability() - return trans_to_mob(target, amount, CHEM_TOUCH, perm, copy) - -/datum/reagents/proc/trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0) // Transfer after checking into which holder... - if(!target || !istype(target)) - return - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(type == CHEM_BLOOD) - var/datum/reagents/R = C.reagents - return trans_to_holder(R, amount, multiplier, copy) - if(type == CHEM_INGEST) - var/datum/reagents/R = C.ingested - return C.ingest(src, R, amount, multiplier, copy) - if(type == CHEM_TOUCH) - var/datum/reagents/R = C.touching - return trans_to_holder(R, amount, multiplier, copy) - else - var/datum/reagents/R = new /datum/reagents(amount) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_mob(target) - -/datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Turfs don't have any reagents (at least, for now). Just touch it. - if(!target) - return - - var/datum/reagents/R = new /datum/reagents(amount * multiplier) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_turf(target, amount) - return - -/datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Objects may or may not; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. - if(!target) - return - - if(!target.reagents) - var/datum/reagents/R = new /datum/reagents(amount * multiplier) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_obj(target, amount) - return - - return trans_to_holder(target.reagents, amount, multiplier, copy) - -/* Atom reagent creation - use it all the time */ - -/atom/proc/create_reagents(var/max_vol) - reagents = new/datum/reagents(max_vol, src) - -// Aurora Cooking Port -/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID - for(var/datum/reagent/A in reagent_list) - if (A.id == id) - return A - - return null - -//Spreads the contents of this reagent holder all over the vicinity of the target turf. -/datum/reagents/proc/splash_area(var/turf/epicentre, var/range = 3, var/portion = 1.0, var/multiplier = 1, var/copy = 0) - var/list/things = dview(range, epicentre, INVISIBILITY_LIGHTING) - var/list/turfs = list() - for (var/turf/T in things) - turfs += T - if (!turfs.len) - return//Nowhere to splash to, somehow - //Create a temporary holder to hold all the amount that will be spread - var/datum/reagents/R = new /datum/reagents(total_volume * portion * multiplier) - trans_to_holder(R, total_volume * portion, multiplier, copy) - //The exact amount that will be given to each turf - var/turfportion = R.total_volume / turfs.len - for (var/turf/T in turfs) - var/datum/reagents/TR = new /datum/reagents(turfportion) - R.trans_to_holder(TR, turfportion, 1, 0) - TR.splash_turf(T) - qdel(R) - - -//Spreads the contents of this reagent holder all over the target turf, dividing among things in it. -//50% is divided between mobs, 20% between objects, and whatever is left on the turf itself -/datum/reagents/proc/splash_turf(var/turf/T, var/amount = null, var/multiplier = 1, var/copy = 0) - if (isnull(amount)) - amount = total_volume - else - amount = min(amount, total_volume) - if (amount <= 0) - return - var/list/mobs = list() - for (var/mob/M in T) - mobs += M - var/list/objs = list() - for (var/obj/O in T) - objs += O - if (objs.len) - var/objportion = (amount * 0.2) / objs.len - for (var/o in objs) - var/obj/O = o - trans_to(O, objportion, multiplier, copy) - amount = min(amount, total_volume) - if (mobs.len) - var/mobportion = (amount * 0.5) / mobs.len - for (var/m in mobs) - var/mob/M = m - trans_to(M, mobportion, multiplier, copy) - trans_to(T, total_volume, multiplier, copy) - if (total_volume <= 0) - qdel(src) \ No newline at end of file +#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times + +/datum/reagents + var/list/datum/reagent/reagent_list = list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + +/datum/reagents/New(var/max = 100, atom/A = null) + ..() + maximum_volume = max + my_atom = A + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!SSchemistry.chemical_reagents) + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + var/paths = typesof(/datum/reagent) - /datum/reagent + SSchemistry.chemical_reagents = list() + for(var/path in paths) + var/datum/reagent/D = new path() + if(!D.name) + continue + SSchemistry.chemical_reagents[D.id] = D + +/datum/reagents/Destroy() + STOP_PROCESSING(SSchemistry, src) + for(var/datum/reagent/R in reagent_list) + qdel(R) + reagent_list = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + return ..() + +/* Internal procs */ + +/datum/reagents/proc/get_free_space() // Returns free space. + return maximum_volume - total_volume + +/datum/reagents/proc/get_master_reagent() // Returns reference to the reagent with the biggest volume. + var/the_reagent = null + var/the_volume = 0 + + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_reagent = A + + return the_reagent + +/datum/reagents/proc/get_master_reagent_name() // Returns the name of the reagent with the biggest volume. + var/the_name = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_name = A.name + + return the_name + +/datum/reagents/proc/get_master_reagent_id() // Returns the id of the reagent with the biggest volume. + var/the_id = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_id = A.id + + return the_id + +/datum/reagents/proc/update_total() // Updates volume. + total_volume = 0 + for(var/datum/reagent/R in reagent_list) + if(R.volume < MINIMUM_CHEMICAL_VOLUME) + del_reagent(R.id) + else + total_volume += R.volume + return + +/datum/reagents/proc/handle_reactions() + if(QDELETED(my_atom)) + return FALSE + if(my_atom.flags & NOREACT) + return FALSE + var/reaction_occurred + var/list/eligible_reactions = list() + var/list/effect_reactions = list() + do + reaction_occurred = FALSE + for(var/i in reagent_list) + var/datum/reagent/R = i + if(SSchemistry.chemical_reactions_by_reagent[R.id]) + eligible_reactions |= SSchemistry.chemical_reactions_by_reagent[R.id] + + for(var/i in eligible_reactions) + var/datum/chemical_reaction/C = i + if(C.can_happen(src) && C.process(src)) + effect_reactions |= C + reaction_occurred = TRUE + eligible_reactions.len = 0 + while(reaction_occurred) + for(var/i in effect_reactions) + var/datum/chemical_reaction/C = i + C.post_reaction(src) + update_total() + +/* Holder-to-chemical */ + +/datum/reagents/proc/add_reagent(var/id, var/amount, var/data = null, var/safety = 0) + if(!isnum(amount) || amount <= 0) + return 0 + + update_total() + amount = min(amount, get_free_space()) + + if(istype(my_atom,/obj/item/weapon/reagent_containers/food)) //The following code is targeted specifically at getting allergen reagents into food items, since for the most part they're not applied by default. + var/list/add_reagents = list() + var/totalnum = 0 + + for(var/item in data) //Try to find the ID + var/add_reagent_id = null + if(item in SSchemistry.chemical_reagents) + add_reagent_id = item + else if("[item]juice" in SSchemistry.chemical_reagents) + add_reagent_id = "[item]juice" + if(add_reagent_id) //If we did find it, add it to our list of reagents to add, and add the number to our total. + add_reagents[add_reagent_id] += data[item] + totalnum += data[item] + + if(totalnum) + var/multconst = amount/totalnum //We're going to add these extra reagents so that they share the ratio described, but only add up to 1x the existing amount at the most + for(var/item in add_reagents) + add_reagent(item,add_reagents[item]*multconst) + + + + + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + if(current.id == "blood") + if(LAZYLEN(data) && !isnull(data["species"]) && !isnull(current.data["species"]) && data["species"] != current.data["species"]) // Species bloodtypes are already incompatible, this just stops it from mixing into the one already in a container. + continue + + current.volume += amount + if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful + current.mix_data(data, amount) + update_total() + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + var/datum/reagent/D = SSchemistry.chemical_reagents[id] + if(D) + var/datum/reagent/R = new D.type() + reagent_list += R + R.holder = src + R.volume = amount + R.initialize_data(data) + update_total() + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + else + crash_with("[my_atom] attempted to add a reagent called '[id]' which doesn't exist. ([usr])") + return 0 + +/datum/reagents/proc/isolate_reagent(reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/remove_reagent(var/id, var/amount, var/safety = 0) + if(!isnum(amount)) + return 0 + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + current.volume -= amount // It can go negative, but it doesn't matter + update_total() // Because this proc will delete it then + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + return 0 + +/datum/reagents/proc/del_reagent(var/id) + for(var/datum/reagent/current in reagent_list) + if (current.id == id) + current.on_remove(my_atom) //YW Edit: Calls on_remove before the last of the thing is done, used in phorochemistry + reagent_list -= current + qdel(current) + update_total() + if(my_atom) + my_atom.on_reagent_change() + return 0 + +/datum/reagents/proc/has_reagent(var/id, var/amount = 0) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + if(current.volume >= amount) + return 1 + else + return 0 + return 0 + +/datum/reagents/proc/has_any_reagent(var/list/check_reagents) + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + return 1 + else + return 0 + return 0 + +/datum/reagents/proc/has_all_reagents(var/list/check_reagents) + //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list + var/missing = check_reagents.len + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + missing-- + return !missing + +/datum/reagents/proc/clear_reagents() + for(var/datum/reagent/current in reagent_list) + del_reagent(current.id) + return + +/datum/reagents/proc/get_reagent_amount(var/id) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + return current.volume + return 0 + +/datum/reagents/proc/get_data(var/id) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + return current.get_data() + return 0 + +/datum/reagents/proc/get_reagents() + . = list() + for(var/datum/reagent/current in reagent_list) + . += "[current.id] ([current.volume])" + return english_list(., "EMPTY", "", ", ", ", ") + +/* Holder-to-holder and similar procs */ + +/datum/reagents/proc/remove_any(var/amount = 1) // Removes up to [amount] of reagents from [src]. Returns actual amount removed. + amount = min(amount, total_volume) + + if(!amount) + return + + var/part = amount / total_volume + + for(var/datum/reagent/current in reagent_list) + var/amount_to_remove = current.volume * part + remove_reagent(current.id, amount_to_remove, 1) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). + if(!target || !istype(target)) + return + + amount = max(0, min(amount, total_volume, target.get_free_space() / multiplier)) + + if(!amount) + return + + var/part = amount / total_volume + + for(var/datum/reagent/current in reagent_list) + var/amount_to_transfer = current.volume * part + target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), safety = 1) // We don't react until everything is in place + if(!copy) + remove_reagent(current.id, amount_to_transfer, 1) + + if(!copy) + handle_reactions() + target.handle_reactions() + return amount + +/* Holder-to-atom and similar procs */ + +//The general proc for applying reagents to things. This proc assumes the reagents are being applied externally, +//not directly injected into the contents. It first calls touch, then the appropriate trans_to_*() or splash_mob(). +//If for some reason touch effects are bypassed (e.g. injecting stuff directly into a reagent container or person), +//call the appropriate trans_to_*() proc. +/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) + touch(target) //First, handle mere touch effects + + if(ismob(target)) + return splash_mob(target, amount, copy) + if(isturf(target)) + return trans_to_turf(target, amount, multiplier, copy) + if(isobj(target) && target.is_open_container()) + return trans_to_obj(target, amount, multiplier, copy) + return 0 + +//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well. +/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60) + var/spill = 0 + if(!isturf(target) && target.loc) + spill = amount*(rand(min_spill, max_spill)/100) + amount -= spill + if(spill) + splash(target.loc, spill, multiplier, copy, min_spill, max_spill) + + trans_to(target, amount, multiplier, copy) + +/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) + if (!target) + return + + var/datum/reagent/transfering_reagent = get_reagent(rtype) + + if (istype(target, /atom)) + var/atom/A = target + if (!A.reagents || !A.simulated) + return + + amount = min(amount, transfering_reagent.volume) + + if(!amount) + return + + + var/datum/reagents/F = new /datum/reagents(amount) + var/tmpdata = get_data(rtype) + F.add_reagent(rtype, amount, tmpdata) + remove_reagent(rtype, amount) + + + if (istype(target, /atom)) + return F.trans_to(target, amount) // Let this proc check the atom's type + else if (istype(target, /datum/reagents)) + return F.trans_to_holder(target, amount) + +/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) + if (!target || !target.reagents) + return + + amount = min(amount, get_reagent_amount(id)) + + if(!amount) + return + + var/datum/reagents/F = new /datum/reagents(amount) + var/tmpdata = get_data(id) + F.add_reagent(id, amount, tmpdata) + remove_reagent(id, amount) + + return F.trans_to(target, amount) // Let this proc check the atom's type + +// When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. +// This does not handle transferring reagents to things. +// For example, splashing someone with water will get them wet and extinguish them if they are on fire, +// even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. +/datum/reagents/proc/touch(var/atom/target, var/amount) + if(ismob(target)) + touch_mob(target, amount) + if(isturf(target)) + touch_turf(target, amount) + if(isobj(target)) + touch_obj(target, amount) + return + +/datum/reagents/proc/touch_mob(var/mob/target) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_mob(target, current.volume) + + update_total() + +/datum/reagents/proc/touch_turf(var/turf/target, var/amount) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_turf(target, amount) + + update_total() + +/datum/reagents/proc/touch_obj(var/obj/target, var/amount) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_obj(target, amount) + + update_total() + +// Attempts to place a reagent on the mob's skin. +// Reagents are not guaranteed to transfer to the target. +// Do not call this directly, call trans_to() instead. +/datum/reagents/proc/splash_mob(var/mob/target, var/amount = 1, var/copy = 0) + var/perm = 1 + if(isliving(target)) //will we ever even need to tranfer reagents to non-living mobs? + var/mob/living/L = target + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.check_shields(0, null, null, null, "the spray") == 1) //If they block the spray, it does nothing. + amount = 0 + perm = L.reagent_permeability() + return trans_to_mob(target, amount, CHEM_TOUCH, perm, copy) + +/datum/reagents/proc/trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0) // Transfer after checking into which holder... + if(!target || !istype(target)) + return + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(type == CHEM_BLOOD) + var/datum/reagents/R = C.reagents + return trans_to_holder(R, amount, multiplier, copy) + if(type == CHEM_INGEST) + var/datum/reagents/R = C.ingested + return C.ingest(src, R, amount, multiplier, copy) + if(type == CHEM_TOUCH) + var/datum/reagents/R = C.touching + return trans_to_holder(R, amount, multiplier, copy) + else + var/datum/reagents/R = new /datum/reagents(amount) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_mob(target) + +/datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Turfs don't have any reagents (at least, for now). Just touch it. + if(!target) + return + + var/datum/reagents/R = new /datum/reagents(amount * multiplier) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_turf(target, amount) + return + +/datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Objects may or may not; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. + if(!target) + return + + if(!target.reagents) + var/datum/reagents/R = new /datum/reagents(amount * multiplier) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_obj(target, amount) + return + + return trans_to_holder(target.reagents, amount, multiplier, copy) + +/* Atom reagent creation - use it all the time */ + +/atom/proc/create_reagents(var/max_vol) + reagents = new/datum/reagents(max_vol, src) + +// Aurora Cooking Port +/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID + for(var/datum/reagent/A in reagent_list) + if (A.id == id) + return A + + return null + +//Spreads the contents of this reagent holder all over the vicinity of the target turf. +/datum/reagents/proc/splash_area(var/turf/epicentre, var/range = 3, var/portion = 1.0, var/multiplier = 1, var/copy = 0) + var/list/things = dview(range, epicentre, INVISIBILITY_LIGHTING) + var/list/turfs = list() + for (var/turf/T in things) + turfs += T + if (!turfs.len) + return//Nowhere to splash to, somehow + //Create a temporary holder to hold all the amount that will be spread + var/datum/reagents/R = new /datum/reagents(total_volume * portion * multiplier) + trans_to_holder(R, total_volume * portion, multiplier, copy) + //The exact amount that will be given to each turf + var/turfportion = R.total_volume / turfs.len + for (var/turf/T in turfs) + var/datum/reagents/TR = new /datum/reagents(turfportion) + R.trans_to_holder(TR, turfportion, 1, 0) + TR.splash_turf(T) + qdel(R) + + +//Spreads the contents of this reagent holder all over the target turf, dividing among things in it. +//50% is divided between mobs, 20% between objects, and whatever is left on the turf itself +/datum/reagents/proc/splash_turf(var/turf/T, var/amount = null, var/multiplier = 1, var/copy = 0) + if (isnull(amount)) + amount = total_volume + else + amount = min(amount, total_volume) + if (amount <= 0) + return + var/list/mobs = list() + for (var/mob/M in T) + mobs += M + var/list/objs = list() + for (var/obj/O in T) + objs += O + if (objs.len) + var/objportion = (amount * 0.2) / objs.len + for (var/o in objs) + var/obj/O = o + trans_to(O, objportion, multiplier, copy) + amount = min(amount, total_volume) + if (mobs.len) + var/mobportion = (amount * 0.5) / mobs.len + for (var/m in mobs) + var/mob/M = m + trans_to(M, mobportion, multiplier, copy) + trans_to(T, total_volume, multiplier, copy) + if (total_volume <= 0) + qdel(src) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 3f5cde18ae..b570b31c31 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -25,6 +25,9 @@ var/affects_dead = 0 // Does this chem process inside a corpse? var/affects_robots = 0 // Does this chem process inside a Synth? + + var/allergen_type = GENERIC // What potential allergens does this contain? + var/allergen_factor = 1 // If the potential allergens are mixed and low-volume, they're a bit less dangerous. Needed for drinks because they're a single reagent compared to food which contains multiple seperate reagents. var/cup_icon_state = null var/cup_name = null @@ -159,6 +162,26 @@ affect_touch(M, alien, removed) if(overdose && (volume > overdose * M?.species.chemOD_threshold) && (active_metab.metabolism_class != CHEM_TOUCH && !can_overdose_touch)) overdose(M, alien, removed) + if(M.species.allergens & allergen_type) //uhoh, we can't handle this! + var/damage_severity = M.species.allergen_damage_severity*allergen_factor + var/disable_severity = M.species.allergen_disable_severity*allergen_factor + if(M.species.allergen_reaction & AG_TOX_DMG) + M.adjustToxLoss(damage_severity) + if(M.species.allergen_reaction & AG_OXY_DMG) + M.adjustOxyLoss(damage_severity) + if(prob(2.5*disable_severity)) + M.emote(pick("cough","gasp","choke")) + if(M.species.allergen_reaction & AG_EMOTE) + if(prob(2.5*disable_severity)) //this has a higher base chance, but not *too* high + M.emote(pick("pale","shiver","twitch")) + if(M.species.allergen_reaction & AG_PAIN) + M.adjustHalLoss(disable_severity) + if(M.species.allergen_reaction & AG_WEAKEN) + M.Weaken(disable_severity) + if(M.species.allergen_reaction & AG_BLURRY) + M.eye_blurry = max(M.eye_blurry, disable_severity) + if(M.species.allergen_reaction & AG_SLEEPY) + M.drowsyness = max(M.drowsyness, disable_severity) remove_self(removed) return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index e636a28d0a..4b2744c823 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -46,7 +46,7 @@ var/is_vampire = 0 //VOREStation Edit START if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.gets_food_nutrition == 0) + if(H.species.organic_food_coeff == 0) H.adjust_nutrition(removed) is_vampire = 1 //VOREStation Edit END if(alien == IS_SLIME) // Treat it like nutriment for the jello, but not equivalent. diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index f326dcf9af..a7513d0773 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -16,6 +16,18 @@ reagent_state = SOLID color = "#e9e6e4" +//VOREStation Edit +/datum/reagent/calcium/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(ishuman(M) && rand(1,10000) == 1) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/O in H.bad_external_organs) + if(O.status & ORGAN_BROKEN) + O.mend_fracture() + H.custom_pain("You feel the agonizing power of calcium mending your bones!",60) + H.AdjustWeakened(1) + break // Only mend one bone, whichever comes first in the list +//VOREStation Edit End + /datum/reagent/carbon name = "Carbon" id = "carbon" @@ -91,6 +103,7 @@ glass_name = "ethanol" glass_desc = "A well-known alcohol with a variety of applications." + allergen_factor = 0.5 //simulates mixed drinks containing less of the allergen, as they have only a single actual reagent unlike food /datum/reagent/ethanol/touch_mob(var/mob/living/L, var/amount) if(istype(L)) @@ -142,7 +155,8 @@ /datum/reagent/ethanol/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(issmall(M)) removed *= 2 - M.adjust_nutrition(nutriment_factor * removed) + if(!(M.species.allergens & allergen_type)) //assuming it doesn't cause a horrible reaction, we get the nutrition effects + M.adjust_nutrition(nutriment_factor * removed) var/strength_mod = 1 * M.species.alcohol_mod if(alien == IS_SKRELL) strength_mod *= 5 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 5185e5a8f4..47395f4a3d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -11,6 +11,7 @@ var/nutriment_factor = 30 // Per unit var/injectable = 0 color = "#664330" + affects_robots = 1 //VOREStation Edit /datum/reagent/nutriment/mix_data(var/list/newdata, var/newamount) @@ -37,10 +38,15 @@ data -= taste /datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(!injectable && alien != IS_SLIME && alien != IS_CHIMERA) //VOREStation Edit + if(!injectable && alien != IS_SLIME && alien != IS_CHIMERA && !M.isSynthetic()) //VOREStation Edit M.adjustToxLoss(0.1 * removed) return affect_ingest(M, alien, removed) + //VOREStation Edits Start + if(M.isSynthetic() && M.nutrition < 500) + M.adjust_nutrition((nutriment_factor * removed) * M.species.synthetic_food_coeff) + //VOREStation Edits End + ..() /datum/reagent/nutriment/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) switch(alien) @@ -48,10 +54,13 @@ if(IS_UNATHI) removed *= 0.5 if(IS_CHIMERA) removed *= 0.25 //VOREStation Edit if(issmall(M)) removed *= 2 // Small bodymass, more effect from lower volume. - M.heal_organ_damage(0.5 * removed, 0) - if(M.species.gets_food_nutrition) //VOREStation edit. If this is set to 0, they don't get nutrition from food. - M.adjust_nutrition(nutriment_factor * removed) // For hunger and fatness - M.add_chemical_effect(CE_BLOODRESTORE, 4 * removed) + //VOREStation Edits Start + if(!M.isSynthetic()) + if(!(M.species.allergens & allergen_type)) //assuming it doesn't cause a horrible reaction, we'll be ok! + M.heal_organ_damage(0.5 * removed, 0) + M.adjust_nutrition((nutriment_factor * removed) * M.species.organic_food_coeff) + M.add_chemical_effect(CE_BLOODRESTORE, 4 * removed) + //VOREStation Edits Stop // Aurora Cooking Port Insertion Begin @@ -115,6 +124,7 @@ icon_raw = "batter_raw" icon_cooked = "batter_cooked" coated_adj = "battered" + allergen_type = GRAINS | EGGS //Made with flour(grain), and eggs(eggs) /datum/reagent/nutriment/coating/beerbatter name = "beer batter mix" @@ -125,6 +135,7 @@ icon_raw = "batter_raw" icon_cooked = "batter_cooked" coated_adj = "beer-battered" + allergen_type = GRAINS | EGGS //Made with flour(grain), eggs(eggs), and beer(grain) /datum/reagent/nutriment/coating/beerbatter/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -228,6 +239,7 @@ id = "cornoil" description = "An oil derived from various types of corn." reagent_state = LIQUID + allergen_type = VEGETABLE //Corn is a vegetable /datum/reagent/nutriment/triglyceride/oil/peanut name = "Peanut Oil" @@ -237,6 +249,7 @@ taste_mult = 0.3 nutriment_factor = 15 color = "#4F3500" + allergen_type = SEEDS //Peanut oil would come from peanuts, hence seeds. // Aurora Cooking Port Insertion End @@ -253,11 +266,10 @@ id = "protein" taste_description = "some sort of meat" color = "#440000" + allergen_type = MEAT //"Animal protein" implies it comes from animals, therefore meat. /datum/reagent/nutriment/protein/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) switch(alien) - if(IS_SKRELL) - M.adjustToxLoss(0.5 * removed) if(IS_TESHARI) ..(M, alien, removed*1.2) // Teshari get a bit more nutrition from meat. if(IS_UNATHI) @@ -269,41 +281,40 @@ else ..() -/datum/reagent/nutriment/protein/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(alien && alien == IS_SKRELL) - M.adjustToxLoss(2 * removed) - return - ..() - /datum/reagent/nutriment/protein/tofu name = "tofu protein" id = "tofu" color = "#fdffa8" taste_description = "tofu" + allergen_type = BEANS //Made from soy beans /datum/reagent/nutriment/protein/seafood name = "seafood protein" id = "seafood" color = "#f5f4e9" taste_description = "fish" + allergen_type = FISH //I suppose the fish allergy likely refers to seafood in general. -/datum/reagent/nutriment/protein/cheese // Also bad for skrell. +/datum/reagent/nutriment/protein/cheese name = "cheese" id = "cheese" color = "#EDB91F" taste_description = "cheese" + allergen_type = DAIRY //Cheese is made from dairy -/datum/reagent/nutriment/protein/egg // Also bad for skrell. +/datum/reagent/nutriment/protein/egg name = "egg yolk" id = "egg" taste_description = "egg" color = "#FFFFAA" + allergen_type = EGGS //Eggs contain egg /datum/reagent/nutriment/protein/murk name = "murkfin protein" id = "murk_protein" taste_description = "mud" color = "#664330" + allergen_type = FISH //Murkfin is fish /datum/reagent/nutriment/honey name = "Honey" @@ -341,6 +352,7 @@ taste_description = "unmistakably mayonnaise" nutriment_factor = 10 color = "#FFFFFF" + allergen_type = EGGS //Mayo is made from eggs /datum/reagent/nutriment/yeast name = "Yeast" @@ -358,6 +370,7 @@ reagent_state = SOLID nutriment_factor = 1 color = "#FFFFFF" + allergen_type = GRAINS //Flour is made from grain /datum/reagent/nutriment/flour/touch_turf(var/turf/simulated/T) if(!istype(T, /turf/space)) @@ -371,6 +384,7 @@ taste_mult = 1.3 nutriment_factor = 1 color = "#482000" + allergen_type = COFFEE //Again, coffee contains coffee /datum/reagent/nutriment/tea name = "Tea Powder" @@ -397,6 +411,7 @@ description = "Dehydrated, powdered juice of some kind." taste_mult = 1.3 nutriment_factor = 1 + allergen_type = FRUIT //I suppose it's implied here that the juice is from dehydrated fruit. /datum/reagent/nutriment/instantjuice/grape name = "Grape Juice Powder" @@ -427,7 +442,7 @@ color = "#c07c40" /datum/reagent/nutriment/soysauce - name = "Soysauce" + name = "Soy Sauce" id = "soysauce" description = "A salty sauce made from the soy plant." taste_description = "umami" @@ -435,6 +450,8 @@ reagent_state = LIQUID nutriment_factor = 2 color = "#792300" + allergen_type = BEANS //Soy (beans) + /datum/reagent/nutriment/ketchup name = "Ketchup" @@ -444,6 +461,16 @@ reagent_state = LIQUID nutriment_factor = 5 color = "#731008" + allergen_type = FRUIT //Tomatoes are a fruit. + +/datum/reagent/nutriment/barbecue + name = "Barbeque Sauce" + id = "barbecue" + description = "Barbecue sauce for barbecues and long shifts." + taste_description = "barbeque" + reagent_state = LIQUID + nutriment_factor = 5 + color = "#4F330F" /datum/reagent/nutriment/rice name = "Rice" @@ -464,6 +491,7 @@ reagent_state = LIQUID nutriment_factor = 1 color = "#801E28" + allergen_type = FRUIT //Cherries are fruits /datum/reagent/nutriment/peanutbutter name = "Peanut Butter" @@ -474,6 +502,7 @@ reagent_state = LIQUID nutriment_factor = 30 color = "#4F3500" + allergen_type = SEEDS //Peanuts(seeds) /datum/reagent/nutriment/vanilla name = "Vanilla Extract" @@ -519,6 +548,7 @@ reagent_state = LIQUID nutriment_factor = 2 color = "#899613" + allergen_type = DAIRY //incase anyone is dumb enough to drink it - it does contain milk! /datum/reagent/nutriment/sprinkles name = "Sprinkles" @@ -860,7 +890,8 @@ return /datum/reagent/drink/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) - M.adjust_nutrition(nutrition * removed) + if(!(M.species.allergens & allergen_type)) + M.adjust_nutrition(nutrition * removed) M.dizziness = max(0, M.dizziness + adj_dizzy) M.drowsyness = max(0, M.drowsyness + adj_drowsy) M.AdjustSleeping(adj_sleepy) @@ -869,7 +900,7 @@ if(adj_temp < 0 && M.bodytemperature > 310) M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT)) if(issmall(M)) removed *= 2 //CHOMP Station addition Small bodymass, more effect from lower volume. - if(M.species.gets_food_nutrition) //CHOMPStation addition. If this is set to 0, they don't get nutrition from food. + if(M.species.organic_food_coeff) //CHOMPStation addition. If this is set to 0, they don't get nutrition from food. M.nutrition += nutriment_factor * removed //CHOMPStation addition For hunger and fatness /* VOREStation Removal if(alien == IS_SLIME && water_based) @@ -890,6 +921,7 @@ glass_name = "banana juice" glass_desc = "The raw essence of a banana. HONK!" + allergen_type = FRUIT //Bananas are fruit /datum/reagent/drink/juice/berry name = "Berry Juice" @@ -900,6 +932,7 @@ glass_name = "berry juice" glass_desc = "Berry juice. Or maybe it's jam. Who cares?" + allergen_type = FRUIT //Berries are fruit /datum/reagent/drink/juice/pineapple name = "Pineapple Juice" @@ -910,6 +943,7 @@ glass_name = "pineapple juice" glass_desc = "Pineapple juice. Or maybe it's spineapple. Who cares?" + allergen_type = FRUIT //Pineapples are fruit /datum/reagent/drink/juice/carrot name = "Carrot juice" @@ -920,6 +954,7 @@ glass_name = "carrot juice" glass_desc = "It is just like a carrot but without crunching." + allergen_type = VEGETABLE //Carrots are vegetables /datum/reagent/drink/juice/carrot/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -931,9 +966,11 @@ description = "It's grrrrrape!" taste_description = "grapes" color = "#863333" + var/sugary = TRUE ///So non-sugary juices don't make Unathi snooze. glass_name = "grape juice" glass_desc = "It's grrrrrape!" + allergen_type = FRUIT //Grapes are fruit /datum/reagent/drink/juice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -942,21 +979,20 @@ if(issmall(M)) effective_dose *= 2 -/* //VOREStation Removal - Assuming all juice has sugar is silly if(alien == IS_UNATHI) - if(effective_dose < 2) - if(effective_dose == metabolism * 2 || prob(5)) - M.emote("yawn") - else if(effective_dose < 5) - M.eye_blurry = max(M.eye_blurry, 10) - else if(effective_dose < 20) - if(prob(50)) - M.Weaken(2) - M.drowsyness = max(M.drowsyness, 20) - else - M.Sleeping(20) - M.drowsyness = max(M.drowsyness, 60) -*/ + if(sugary == TRUE) + if(effective_dose < 2) + if(effective_dose == metabolism * 2 || prob(5)) + M.emote("yawn") + else if(effective_dose < 5) + M.eye_blurry = max(M.eye_blurry, 10) + else if(effective_dose < 20) + if(prob(50)) + M.Weaken(2) + M.drowsyness = max(M.drowsyness, 20) + else + M.Sleeping(20) + M.drowsyness = max(M.drowsyness, 60) /datum/reagent/drink/juice/lemon name = "Lemon Juice" @@ -968,6 +1004,8 @@ glass_name = "lemon juice" glass_desc = "Sour..." + allergen_type = FRUIT //Lemons are fruit + /datum/reagent/drink/juice/apple name = "Apple Juice" @@ -979,6 +1017,7 @@ glass_name = "apple juice" glass_desc = "An earth favorite." + allergen_type = FRUIT //Apples are fruit /datum/reagent/drink/juice/lime name = "Lime Juice" @@ -990,6 +1029,7 @@ glass_name = "lime juice" glass_desc = "A glass of sweet-sour lime juice" + allergen_type = FRUIT //Limes are fruit /datum/reagent/drink/juice/lime/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1006,6 +1046,7 @@ glass_name = "orange juice" glass_desc = "Vitamins! Yay!" + allergen_type = FRUIT //Oranges are fruit /datum/reagent/drink/orangejuice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1031,9 +1072,11 @@ taste_description = "potatoes" nutrition = 2 color = "#302000" + sugary = FALSE glass_name = "potato juice" glass_desc = "Juice from a potato. Bleh." + allergen_type = VEGETABLE //Potatoes are vegetables /datum/reagent/drink/juice/tomato name = "Tomato Juice" @@ -1041,9 +1084,11 @@ description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" taste_description = "tomatoes" color = "#731008" + sugary = FALSE glass_name = "tomato juice" glass_desc = "Are you sure this is tomato juice?" + allergen_type = FRUIT //Yes tomatoes are a fruit /datum/reagent/drink/juice/tomato/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1060,6 +1105,7 @@ glass_name = "watermelon juice" glass_desc = "Delicious juice made from watermelon." + allergen_type = FRUIT //Watermelon is a fruit // Everything else @@ -1076,6 +1122,7 @@ cup_icon_state = "cup_cream" cup_name = "cup of milk" cup_desc = "White and nutritious goodness!" + allergen_type = DAIRY //Milk is dairy /datum/reagent/drink/milk/chocolate name = "Chocolate Milk" @@ -1091,13 +1138,22 @@ glass_name = "chocolate milk" glass_desc = "Deliciously fattening!" - /datum/reagent/drink/milk/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) return M.heal_organ_damage(0.5 * removed, 0) holder.remove_reagent("capsaicin", 10 * removed) + //VOREStation Edit + if(ishuman(M) && rand(1,10000) == 1) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/O in H.bad_external_organs) + if(O.status & ORGAN_BROKEN) + O.mend_fracture() + H.custom_pain("You feel the agonizing power of calcium mending your bones!",60) + H.AdjustWeakened(1) + break // Only mend one bone, whichever comes first in the list + //VOREStation Edit End /datum/reagent/drink/milk/cream name = "Cream" @@ -1112,6 +1168,7 @@ cup_icon_state = "cup_cream" cup_name = "cup of cream" cup_desc = "Ewwww..." + allergen_type = DAIRY //Cream is dairy /datum/reagent/drink/milk/soymilk name = "Soy Milk" @@ -1126,6 +1183,7 @@ cup_icon_state = "cup_cream" cup_name = "cup of milk" cup_desc = "White and nutritious goodness!" + allergen_type = BEANS //Would be made from soy beans /datum/reagent/drink/tea name = "Tea" @@ -1210,6 +1268,7 @@ cup_name = "cup of lemon tea" cup_desc = "A tasty mixture of lemon and tea. It's apparently good for you!" + allergen_type = FRUIT //Made with lemon juice /datum/reagent/drink/tea/limetea name = "Lime Tea" @@ -1223,6 +1282,7 @@ cup_name = "cup of lime tea" cup_desc = "A tasty mixture of lime and tea. It's apparently good for you!" + allergen_type = FRUIT //Made with lime juice /datum/reagent/drink/tea/orangetea name = "Orange Tea" @@ -1236,6 +1296,7 @@ cup_name = "cup of orange tea" cup_desc = "A tasty mixture of orange and tea. It's apparently good for you!" + allergen_type = FRUIT //Made with orange juice /datum/reagent/drink/tea/berrytea name = "Berry Tea" @@ -1249,6 +1310,7 @@ cup_name = "cup of berry tea" cup_desc = "A tasty mixture of berries and tea. It's apparently good for you!" + allergen_type = FRUIT //Made with berry juice /datum/reagent/drink/greentea name = "Green Tea" @@ -1295,12 +1357,13 @@ glass_name = "coffee" glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - + allergen_type = COFFEE //Apparently coffee contains coffee /datum/reagent/drink/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return ..() + //if(alien == IS_TAJARA) //VOREStation Edit Begin //M.adjustToxLoss(0.5 * removed) //M.make_jittery(4) //extra sensitive to caffine @@ -1309,6 +1372,7 @@ /datum/reagent/drink/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() + //if(alien == IS_TAJARA) //M.adjustToxLoss(2 * removed) //M.make_jittery(4) @@ -1361,11 +1425,11 @@ glass_desc = "A nice and refreshing beverage while you are reading." glass_name = "soy latte" - glass_desc = "A nice and refrshing beverage while you are reading." cup_icon_state = "cup_latte" cup_name = "cup of soy latte" cup_desc = "A nice and refreshing beverage while you are reading." + allergen_type = COFFEE|BEANS //Soy(beans) and coffee /datum/reagent/drink/coffee/soy_latte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1385,6 +1449,7 @@ cup_icon_state = "cup_latte" cup_name = "cup of cafe latte" cup_desc = "A nice and refreshing beverage while you are reading." + allergen_type = COFFEE|DAIRY //Cream and coffee /datum/reagent/drink/coffee/cafe_latte/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1405,6 +1470,7 @@ glass_name = "decaf coffee" glass_desc = "Basically just brown, bitter water." + allergen_type = COFFEE //Decaf coffee would still likely trigger allergy symptoms. /datum/reagent/drink/hot_coco name = "Hot Chocolate" @@ -1449,6 +1515,7 @@ glass_name = "grape soda" glass_desc = "Looks like a delicious drink!" glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with grape juice /datum/reagent/drink/soda/tonic name = "Tonic Water" @@ -1477,6 +1544,7 @@ glass_name = "lemonade" glass_desc = "Oh the nostalgia..." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with lemon juice /datum/reagent/drink/soda/melonade name = "Melonade" @@ -1490,6 +1558,7 @@ glass_name = "melonade" glass_desc = "Oh the.. nostalgia?" glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with watermelon juice /datum/reagent/drink/soda/appleade name = "Appleade" @@ -1503,19 +1572,21 @@ glass_name = "appleade" glass_desc = "Applejuice, improved." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with apple juice /datum/reagent/drink/soda/pineappleade name = "Pineappleade" id = "pineappleade" - description = "Spineapple, juiced up." + description = "Pineapple, juiced up." taste_description = "sweet`n`sour pineapples" nutriment_factor = 5 //CHOMPStation addition color = "#FFFF00" adj_temp = -5 glass_name = "pineappleade" - glass_desc = "Spineapple, juiced up." + glass_desc = "Pineapple, juiced up." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with pineapple juice /datum/reagent/drink/soda/kiraspecial name = "Kira Special" @@ -1529,6 +1600,7 @@ glass_name = "Kira Special" glass_desc = "Long live the guy who everyone had mistaken for a girl. Baka!" glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made from orange and lime juice /datum/reagent/drink/soda/brownstar name = "Brown Star" @@ -1541,6 +1613,7 @@ glass_name = "Brown Star" glass_desc = "It's not what it sounds like..." + allergen_type = FRUIT //Made with orangejuice and cola /datum/reagent/drink/milkshake name = "Milkshake" @@ -1552,6 +1625,7 @@ glass_name = "milkshake" glass_desc = "Glorious brainfreezing mixture." + allergen_type = DAIRY //Made with dairy products /datum/reagent/milkshake/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1584,6 +1658,7 @@ glass_name = "Chocolate Milkshake" glass_desc = "A refreshing chocolate milkshake, just like mom used to make." + allergen_type = DAIRY //Made with dairy products /datum/reagent/drink/milkshake/berryshake name = "Berry Milkshake" @@ -1595,6 +1670,7 @@ glass_name = "Berry Milkshake" glass_desc = "A refreshing berry milkshake, just like mom used to make." + allergen_type = FRUIT|DAIRY //Made with berry juice and dairy products /datum/reagent/drink/milkshake/coffeeshake name = "Coffee Milkshake" @@ -1607,9 +1683,9 @@ adj_drowsy = -3 adj_sleepy = -2 - glass_name = "Coffee Milkshake" glass_desc = "An energizing coffee milkshake, perfect for hot days at work.." + allergen_type = DAIRY|COFFEE //Made with coffee and dairy products /datum/reagent/drink/milkshake/coffeeshake/overdose(var/mob/living/carbon/M, var/alien) M.make_jittery(5) @@ -1623,6 +1699,7 @@ glass_name = "Peanut Milkshake" glass_desc = "Savory cream in an ice-cold stature." + allergen_type = SEEDS|DAIRY //Made with peanutbutter(seeds) and dairy products /datum/reagent/drink/rewriter name = "Rewriter" @@ -1635,6 +1712,7 @@ glass_name = "Rewriter" glass_desc = "The secret of the sanctuary of the Libarian..." + allergen_type = FRUIT|COFFEE //Made with space mountain wind (Fruit) /datum/reagent/drink/rewriter/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1662,7 +1740,7 @@ M.dizziness += 5 M.drowsyness = 0 -/datum/reagent/drink/grenadine +/datum/reagent/drink/grenadine //Description implies that the grenadine we would be working with does not contain fruit, so no allergens. name = "Grenadine Syrup" id = "grenadine" description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?" @@ -1702,6 +1780,7 @@ glass_name = "Space Mountain Wind" glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Fruit allergens because citrus is implied to come from limes/lemons /datum/reagent/drink/soda/dr_gibb name = "Dr. Gibb" @@ -1728,6 +1807,7 @@ glass_name = "Space-up" glass_desc = "Space-up. It helps keep your cool." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT /datum/reagent/drink/soda/lemon_lime name = "Lemon-Lime" @@ -1741,6 +1821,7 @@ glass_name = "lemon lime soda" glass_desc = "A tangy substance made of 0.5% natural citrus!" glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with lemon and lime juice /datum/reagent/drink/soda/gingerale name = "Ginger Ale" @@ -1799,6 +1880,7 @@ glass_name = "roy rogers" glass_desc = "I'm a cowboy, on a steel horse I ride" glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with lemon lime /datum/reagent/drink/collins_mix name = "Collins Mix" @@ -1812,6 +1894,7 @@ glass_name = "collins mix" glass_desc = "Best hope it isn't a hoax." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with lemon lime /datum/reagent/drink/arnold_palmer name = "Arnold Palmer" @@ -1825,6 +1908,7 @@ glass_name = "arnold palmer" glass_desc = "Tastes just like the old man." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with lemonade /datum/reagent/drink/doctor_delight name = "The Doctor's Delight" @@ -1837,6 +1921,7 @@ glass_name = "The Doctor's Delight" glass_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place." + allergen_type = FRUIT|DAIRY //Made from several fruit juices, and cream. /datum/reagent/drink/doctor_delight/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1946,6 +2031,7 @@ glass_name = "Dream Cream" glass_desc = "A smoothy, silky mix of honey and dairy." + allergen_type = DAIRY //Made using dairy /datum/reagent/drink/soda/vilelemon name = "Vile Lemon" @@ -1958,6 +2044,7 @@ glass_name = "Vile Lemon" glass_desc = "A sour, fizzy drink with lemonade and lemonlime." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made from lemonade /datum/reagent/drink/entdraught name = "Ent's Draught" @@ -1969,6 +2056,7 @@ glass_name = "Ent's Draught" glass_desc = "You can almost smell the tranquility emanating from this." + //allergen_type = FRUIT Sorry to break the news, chief. Honey is not a fruit. /datum/reagent/drink/lovepotion name = "Love Potion" @@ -1979,6 +2067,7 @@ glass_name = "Love Potion" glass_desc = "Love me tender, love me sweet." + allergen_type = FRUIT|DAIRY //Made from cream(dairy) and berryjuice(fruit) /datum/reagent/drink/oilslick name = "Oil Slick" @@ -1992,6 +2081,7 @@ glass_name = "Oil Slick" glass_desc = "A concoction that should probably be in an engine, rather than your stomach." glass_icon = DRINK_ICON_NOISY + allergen_type = VEGETABLE //Made from corn oil /datum/reagent/drink/slimeslammer name = "Slick Slimes Slammer" @@ -2005,6 +2095,7 @@ glass_name = "Slick Slime Slammer" glass_desc = "A concoction that should probably be in an engine, rather than your stomach. Still." glass_icon = DRINK_ICON_NOISY + allergen_type = VEGETABLE|SEEDS //Made from corn oil and peanutbutter /datum/reagent/drink/eggnog name = "Eggnog" @@ -2015,6 +2106,7 @@ glass_name = "Eggnog" glass_desc = "You can't egg-nore the holiday cheer all around you" + allergen_type = DAIRY|EGGS //Eggnog is made with dairy and eggs. /datum/reagent/drink/nuclearwaste name = "Nuclear Waste" @@ -2029,6 +2121,7 @@ glass_desc = "Sadly, no super powers." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) + allergen_type = VEGETABLE //Made from oilslick, so has the same allergens. /datum/reagent/drink/nuclearwaste/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2055,6 +2148,7 @@ glass_desc = "A pitiful sludge that looks vaguely like a soda.. if you look at it a certain way." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) + allergen_type = VEGETABLE //Made from corn oil /datum/reagent/drink/sodaoil/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -2084,6 +2178,7 @@ glass_name = "mojito" glass_desc = "Mint, bubbly water, and citrus, made for sailing." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with lime juice /datum/reagent/drink/sexonthebeach name = "Virgin Sex On The Beach" @@ -2094,6 +2189,7 @@ glass_name = "sex on the beach" glass_desc = "A secret combination of orange juice and pomegranate." + allergen_type = FRUIT //Made with orange juice /datum/reagent/drink/driverspunch name = "Driver's Punch" @@ -2105,6 +2201,7 @@ glass_name = "driver`s punch" glass_desc = "A fruity punch!" glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with appleade and orange juice /datum/reagent/drink/mintapplesparkle name = "Mint Apple Sparkle" @@ -2116,6 +2213,7 @@ glass_name = "mint apple sparkle" glass_desc = "Delicious appleade with a touch of mint." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with appleade /datum/reagent/drink/berrycordial name = "Berry Cordial" @@ -2127,6 +2225,7 @@ glass_name = "berry cordial" glass_desc = "How berry cordial of you." glass_icon = DRINK_ICON_NOISY + allergen_type = FRUIT //Made with berry and lemonjuice /datum/reagent/drink/tropicalfizz name = "Tropical Fizz" @@ -2139,6 +2238,7 @@ glass_desc = "One sip and you're in the bahamas." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made with several fruit juices /datum/reagent/drink/fauxfizz name = "Faux Fizz" @@ -2152,6 +2252,7 @@ glass_desc = "One sip and you're in the bahamas... maybe." glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //made with several fruit juices /* Alcohol */ @@ -2181,6 +2282,8 @@ glass_name = "ale" glass_desc = "A freezing pint of delicious ale" + allergen_type = GRAINS //Barley is grain + /datum/reagent/ethanol/beer name = "Beer" id = "beer" @@ -2193,6 +2296,8 @@ glass_name = "beer" glass_desc = "A freezing pint of beer" + allergen_type = GRAINS //Made from grains + /datum/reagent/ethanol/beer/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) @@ -2211,6 +2316,8 @@ glass_name = "lite beer" glass_desc = "A freezing pint of lite beer" + allergen_type = GRAINS //Made from grains + /datum/reagent/ethanol/bluecuracao name = "Blue Curacao" id = "bluecuracao" @@ -2223,6 +2330,8 @@ glass_name = "blue curacao" glass_desc = "Exotically blue, fruity drink, distilled from oranges." + allergen_type = FRUIT //Made from oranges(fruit) + /datum/reagent/ethanol/cognac name = "Cognac" id = "cognac" @@ -2235,6 +2344,8 @@ glass_name = "cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." + allergen_type = FRUIT //Cognac is made from wine which is made from grapes. + /datum/reagent/ethanol/deadrum name = "Deadrum" id = "deadrum" @@ -2275,9 +2386,12 @@ glass_name = "gin" glass_desc = "A crystal clear glass of Griffeater gin." + allergen_type = FRUIT //Made from juniper berries + //Base type for alchoholic drinks containing coffee /datum/reagent/ethanol/coffee overdose = 45 + allergen_type = COFFEE //Contains coffee or is made from coffee /datum/reagent/ethanol/coffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -2288,6 +2402,7 @@ M.AdjustSleeping(-2) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + //if(alien == IS_TAJARA) //M.adjustToxLoss(0.5 * removed) //M.make_jittery(4) //extra sensitive to caffine @@ -2297,7 +2412,6 @@ //M.adjustToxLoss(2 * removed) //M.make_jittery(4) //return - ..() /datum/reagent/ethanol/coffee/overdose(var/mob/living/carbon/M, var/alien) if(alien == IS_DIONA) @@ -2331,6 +2445,8 @@ glass_name = "melon liquor" glass_desc = "A relatively sweet and fruity 46 proof liquor." + allergen_type = FRUIT //Made from watermelons + /datum/reagent/ethanol/melonspritzer name = "Melon Spritzer" id = "melonspritzer" @@ -2343,6 +2459,8 @@ glass_desc = "Melons: Citrus style." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made from watermelon juice, apple juice, and lime juice + /datum/reagent/ethanol/rum name = "Rum" id = "rum" @@ -2355,7 +2473,7 @@ glass_name = "rum" glass_desc = "Makes you want to buy a ship and just go pillaging." -/datum/reagent/ethanol/sake +/datum/reagent/ethanol/sake //Made from rice, yes. Rice is technically a grain, but also kinda a psuedo-grain, so I don't count it for grain allergies. name = "Sake" id = "sake" description = "Anime's favorite drink." @@ -2377,6 +2495,8 @@ glass_name = "sex on the beach" glass_desc = "A concoction of vodka and a secret combination of orange juice and pomegranate." + allergen_type = FRUIT //Made from orange juice + /datum/reagent/ethanol/tequila name = "Tequila" id = "tequilla" @@ -2420,6 +2540,7 @@ glass_name = "vermouth" glass_desc = "You wonder why you're even drinking this straight." + allergen_type = FRUIT //Vermouth is made from wine which is made from grapes(fruit) /datum/reagent/ethanol/vodka name = "Vodka" @@ -2432,6 +2553,8 @@ glass_name = "vodka" glass_desc = "The glass contain wodka. Xynta." + allergen_type = GRAINS //Vodka is made from grains + /datum/reagent/ethanol/vodka/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() M.apply_effect(max(M.radiation - 1 * removed, 0), IRRADIATE, check_protection = 0) @@ -2447,6 +2570,8 @@ glass_name = "whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." + allergen_type = GRAINS //Whiskey is also made from grain. + /datum/reagent/ethanol/wine name = "Wine" id = "wine" @@ -2458,6 +2583,8 @@ glass_name = "wine" glass_desc = "A very classy looking drink." + allergen_type = FRUIT //Wine is made from grapes (fruit) + /datum/reagent/ethanol/wine/champagne name = "Champagne" id = "champagne" @@ -2468,6 +2595,7 @@ glass_name = "champagne" glass_desc = "An even classier looking drink." + allergen_type = FRUIT //Still wine, and still made from grapes (fruit) /datum/reagent/ethanol/cider name = "Cider" @@ -2481,6 +2609,8 @@ glass_desc = "The second most Irish drink." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made from fruit + // Cocktails @@ -2496,6 +2626,8 @@ glass_name = "Acid Spit" glass_desc = "A drink from the company archives. Made from live aliens." + allergen_type = FRUIT //Made from wine (fruit) + /datum/reagent/ethanol/alliescocktail name = "Allies Cocktail" id = "alliescocktail" @@ -2507,6 +2639,8 @@ glass_name = "Allies cocktail" glass_desc = "A drink made from your allies." + allergen_type = GRAINS|FRUIT //Made from vodka(grain) as well as martini(vermouth(fruit) and gin(fruit)) + /datum/reagent/ethanol/aloe name = "Aloe" id = "aloe" @@ -2518,6 +2652,8 @@ glass_name = "Aloe" glass_desc = "Very, very, very good." + allergen_type = FRUIT|DAIRY|GRAINS //Made from cream(dairy), whiskey(grains), and watermelon juice(fruit) + /datum/reagent/ethanol/amasec name = "Amasec" id = "amasec" @@ -2530,6 +2666,8 @@ glass_name = "Amasec" glass_desc = "Always handy before combat!" + allergen_type = FRUIT|GRAINS //Made from wine(fruit) and vodka(grains) + /datum/reagent/ethanol/andalusia name = "Andalusia" id = "andalusia" @@ -2541,6 +2679,8 @@ glass_name = "Andalusia" glass_desc = "A nice, strange named drink." + allergen_type = GRAINS|FRUIT //Made from whiskey(grains) and lemonjuice (fruit) + /datum/reagent/ethanol/antifreeze name = "Anti-freeze" id = "antifreeze" @@ -2554,6 +2694,8 @@ glass_name = "Anti-freeze" glass_desc = "The ultimate refreshment." + allergen_type = GRAINS|DAIRY //Made from vodka(grains) and cream(dairy) + /datum/reagent/ethanol/atomicbomb name = "Atomic Bomb" id = "atomicbomb" @@ -2567,6 +2709,8 @@ glass_name = "Atomic Bomb" glass_desc = "We cannot take legal responsibility for your actions after imbibing." + allergen_type = COFFEE|DAIRY|FRUIT|GRAINS //Made from b52 which contains kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) + /datum/reagent/ethanol/coffee/b52 name = "B-52" id = "b52" @@ -2579,6 +2723,8 @@ glass_name = "B-52" glass_desc = "Kahlua, Irish cream, and cognac. You will get bombed." + allergen_type = COFFEE|DAIRY|FRUIT|GRAINS //Made from kahlua(coffee), cognac(fruit), and irish cream(Whiskey(grains),cream(dairy)) + /datum/reagent/ethanol/bahama_mama name = "Bahama mama" id = "bahama_mama" @@ -2590,6 +2736,8 @@ glass_name = "Bahama Mama" glass_desc = "Tropical cocktail." + allergen_type = FRUIT //Made from orange juice and lime juice + /datum/reagent/ethanol/bananahonk name = "Banana Mama" id = "bananahonk" @@ -2602,6 +2750,8 @@ glass_name = "Banana Honk" glass_desc = "A drink from Banana Heaven." + allergen_type = FRUIT|DAIRY //Made from banana juice(fruit) and cream(dairy) + /datum/reagent/ethanol/barefoot name = "Barefoot" id = "barefoot" @@ -2613,6 +2763,8 @@ glass_name = "Barefoot" glass_desc = "Barefoot and pregnant." + allergen_type = DAIRY|FRUIT //Made from berry juice (fruit), cream(dairy), and vermouth(fruit) + /datum/reagent/ethanol/beepsky_smash name = "Beepsky Smash" id = "beepskysmash" @@ -2626,6 +2778,8 @@ glass_name = "Beepsky Smash" glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." + allergen_type = FRUIT|GRAINS //Made from whiskey(grains), and limejuice(fruit) + /datum/reagent/ethanol/beepsky_smash/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() M.Stun(2) @@ -2642,6 +2796,8 @@ glass_name = "bilk" glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + allergen_type = GRAINS|DAIRY //Made from milk(dairy) and beer(grains) + /datum/reagent/ethanol/black_russian name = "Black Russian" id = "blackrussian" @@ -2653,6 +2809,8 @@ glass_name = "Black Russian" glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." + allergen_type = COFFEE|GRAINS //Made from vodka(grains) and kahlua(coffee) + /datum/reagent/ethanol/bloody_mary name = "Bloody Mary" id = "bloodymary" @@ -2664,6 +2822,8 @@ glass_name = "Bloody Mary" glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + allergen_type = GRAINS|FRUIT //Made from vodka (grains), tomato juice(fruit), and lime juice(fruit) + /datum/reagent/ethanol/booger name = "Booger" id = "booger" @@ -2675,7 +2835,9 @@ glass_name = "Booger" glass_desc = "Ewww..." -/datum/reagent/ethanol/coffee/brave_bull + allergen_type = DAIRY|FRUIT //Made from cream(dairy), banana juice(fruit), and watermelon juice(fruit) + +/datum/reagent/ethanol/coffee/brave_bull //Since it's under the /coffee subtype, it already has coffee allergens. name = "Brave Bull" id = "bravebull" description = "It's just as effective as Dutch-Courage!" @@ -2698,6 +2860,8 @@ glass_name = "Changeling Sting" glass_desc = "A stingy drink." + allergen_type = FRUIT|GRAINS //Made from screwdriver(vodka(grains), orange juice(fruit)), lime juice(fruit), and lemon juice(fruit) + /datum/reagent/ethanol/martini name = "Classic Martini" id = "martini" @@ -2709,6 +2873,8 @@ glass_name = "classic martini" glass_desc = "Damn, the bartender even stirred it, not shook it." + allergen_type = FRUIT //Made from gin(fruit) and vermouth(fruit) + /datum/reagent/ethanol/cuba_libre name = "Cuba Libre" id = "cubalibre" @@ -2733,6 +2899,7 @@ glass_name = "Demons' Blood" glass_desc = "Just looking at this thing makes the hair on the back of your neck stand up." + allergen_type = FRUIT //Made from space mountain wind(fruit) /datum/reagent/ethanol/devilskiss name = "Devils Kiss" @@ -2744,6 +2911,7 @@ glass_name = "Devil's Kiss" glass_desc = "Creepy time!" + allergen_type = COFFEE //Made from kahlua (Coffee) /datum/reagent/ethanol/driestmartini name = "Driest Martini" @@ -2756,6 +2924,7 @@ glass_name = "Driest Martini" glass_desc = "Only for the experienced. You think you see sand floating in the glass." + allergen_type = FRUIT //Made from gin(fruit) /datum/reagent/ethanol/ginfizz name = "Gin Fizz" @@ -2768,6 +2937,8 @@ glass_name = "gin fizz" glass_desc = "Refreshingly lemony, deliciously dry." + allergen_type = FRUIT //Made from gin(fruit) and lime juice(fruit) + /datum/reagent/ethanol/grog name = "Grog" id = "grog" @@ -2777,7 +2948,6 @@ color = "#FFBB00" strength = 100 - glass_name = "grog" glass_desc = "A fine and cepa drink for Space." @@ -2792,6 +2962,8 @@ glass_name = "Erika Surprise" glass_desc = "The surprise is, it's green!" + allergen_type = GRAINS|FRUIT //Made from ale (grains), lime juice (fruit), whiskey(grains), banana juice(fruit) + /datum/reagent/ethanol/gargle_blaster name = "Pan-Galactic Gargle Blaster" id = "gargleblaster" @@ -2806,6 +2978,8 @@ glass_name = "Pan-Galactic Gargle Blaster" glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." + allergen_type = FRUIT|GRAINS //Made from vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) + /datum/reagent/ethanol/gintonic name = "Gin and Tonic" id = "gintonic" @@ -2817,6 +2991,8 @@ glass_name = "gin and tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." + allergen_type = FRUIT //Made from gin(fruit) + /datum/reagent/ethanol/goldschlager name = "Goldschlager" id = "goldschlager" @@ -2829,6 +3005,8 @@ glass_name = "Goldschlager" glass_desc = "100 proof that teen girls will drink anything with gold in it." + allergen_type = GRAINS //Made from vodka(grains) + /datum/reagent/ethanol/hippies_delight name = "Hippies' Delight" id = "hippiesdelight" @@ -2842,6 +3020,9 @@ glass_name = "Hippie's Delight" glass_desc = "A drink enjoyed by people during the 1960's." + allergen_type = FRUIT|GRAINS //Made from gargle blaster which contains vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) + //Also, yes. Mushrooms produce psilocybin; however, it's also still just a chemical compound, and not necessarily going to trigger a fungi allergy. + /datum/reagent/ethanol/hooch name = "Hooch" id = "hooch" @@ -2867,6 +3048,7 @@ glass_name = "iced beer" glass_desc = "A beer so frosty, the air around it freezes." glass_special = list(DRINK_ICE) + allergen_type = GRAINS //Made from beer(grains) /datum/reagent/ethanol/irishcarbomb name = "Irish Car Bomb" @@ -2879,6 +3061,8 @@ glass_name = "Irish Car Bomb" glass_desc = "An irish car bomb." + allergen_type = DAIRY|GRAINS //Made from ale(grains) and irish cream(whiskey(grains), cream(dairy)) + /datum/reagent/ethanol/coffee/irishcoffee name = "Irish Coffee" id = "irishcoffee" @@ -2890,6 +3074,8 @@ glass_name = "Irish coffee" glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + allergen_type = COFFEE|DAIRY|GRAINS //Made from Coffee(coffee) and irish cream(whiskey(grains), cream(dairy)) + /datum/reagent/ethanol/irish_cream name = "Irish Cream" id = "irishcream" @@ -2901,6 +3087,8 @@ glass_name = "Irish cream" glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + allergen_type = DAIRY|GRAINS //Made from cream(dairy) and whiskey(grains) + /datum/reagent/ethanol/longislandicedtea name = "Long Island Iced Tea" id = "longislandicedtea" @@ -2912,6 +3100,8 @@ glass_name = "Long Island iced tea" glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + allergen_type = GRAINS|FRUIT //Made from vodka(grains) and gin(fruit) + /datum/reagent/ethanol/manhattan name = "Manhattan" id = "manhattan" @@ -2923,6 +3113,8 @@ glass_name = "Manhattan" glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." + allergen_type = GRAINS|FRUIT //Made from whiskey(grains), and vermouth(fruit) + /datum/reagent/ethanol/manhattan_proj name = "Manhattan Project" id = "manhattan_proj" @@ -2934,6 +3126,7 @@ glass_name = "Manhattan Project" glass_desc = "A scientist's drink of choice, for thinking how to blow up the station." + allergen_type = GRAINS|FRUIT //Made from manhattan which is made from whiskey(grains), and vermouth(fruit) /datum/reagent/ethanol/manly_dorf name = "The Manly Dorf" @@ -2946,6 +3139,8 @@ glass_name = "The Manly Dorf" glass_desc = "A manly concotion made from Ale and Beer. Intended for true men only." + allergen_type = GRAINS //Made from beer(grains) and ale(grains) + /datum/reagent/ethanol/margarita name = "Margarita" id = "margarita" @@ -2957,6 +3152,8 @@ glass_name = "margarita" glass_desc = "On the rocks with salt on the rim. Arriba~!" + allergen_type = FRUIT //Made from lime juice(fruit) + /datum/reagent/ethanol/mead name = "Mead" id = "mead" @@ -2996,6 +3193,8 @@ glass_icon = DRINK_ICON_NOISY glass_special = list("neuroright") + allergen_type = FRUIT|GRAINS //Made from gargle blaster which is made from vodka(grains), gin(fruit), whiskey(grains), cognac(fruit), and lime juice(fruit) + /datum/reagent/ethanol/neurotoxin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() M.Weaken(3) @@ -3022,6 +3221,7 @@ glass_name = "???" glass_desc = "A black ichor with an oily purple sheer on top. Are you sure you should drink this?" + allergen_type = FRUIT //Made from berries which are fruit /datum/reagent/ethanol/pwine/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -3060,6 +3260,8 @@ glass_name = "Sbiten" glass_desc = "A spicy mix of Vodka and Spice. Very hot." + allergen_type = GRAINS //Made from vodka(grains) + /datum/reagent/ethanol/screwdrivercocktail name = "Screwdriver" id = "screwdrivercocktail" @@ -3071,6 +3273,8 @@ glass_name = "Screwdriver" glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + allergen_type = FRUIT|GRAINS //Made from vodka(grains) and orange juice(fruit) + /datum/reagent/ethanol/silencer name = "Silencer" id = "silencer" @@ -3083,6 +3287,7 @@ glass_name = "Silencer" glass_desc = "A drink from mime Heaven." + allergen_type = DAIRY //Made from cream (dairy) /datum/reagent/ethanol/singulo name = "Singulo" @@ -3095,6 +3300,8 @@ glass_name = "Singulo" glass_desc = "A blue-space beverage." + allergen_type = GRAINS|FRUIT //Made from vodka(grains) and wine(fruit) + /datum/reagent/ethanol/snowwhite name = "Snow White" id = "snowwhite" @@ -3107,6 +3314,8 @@ glass_name = "Snow White" glass_desc = "A cold refreshment." + allergen_type = COFFEE|FRUIT //made from Pineapple juice(fruit), lemon_lime(fruit), and kahlua(coffee) + /datum/reagent/ethanol/suidream name = "Sui Dream" id = "suidream" @@ -3119,6 +3328,8 @@ glass_name = "Sui Dream" glass_desc = "A froofy, fruity, and sweet mixed drink. Understanding the name only brings shame." + allergen_type = FRUIT //Made from blue curacao(fruit) and melon liquor(fruit) + /datum/reagent/ethanol/syndicatebomb name = "Syndicate Bomb" id = "syndicatebomb" @@ -3130,6 +3341,8 @@ glass_name = "Syndicate Bomb" glass_desc = "Tastes like terrorism!" + allergen_type = GRAINS //Made from beer(grain) and whiskeycola(whiskey(grain)) + /datum/reagent/ethanol/tequilla_sunrise name = "Tequila Sunrise" id = "tequillasunrise" @@ -3153,6 +3366,8 @@ glass_name = "Three Mile Island iced tea" glass_desc = "A glass of this is sure to prevent a meltdown." + allergen_type = GRAINS|FRUIT //Made from long island iced tea(vodka(grains) and gin(fruit)) + /datum/reagent/ethanol/toxins_special name = "Toxins Special" id = "phoronspecial" @@ -3167,6 +3382,8 @@ glass_name = "Toxins Special" glass_desc = "Whoah, this thing is on fire!" + allergen_type = FRUIT //Made from vermouth(fruit) + /datum/reagent/ethanol/vodkamartini name = "Vodka Martini" id = "vodkamartini" @@ -3178,6 +3395,7 @@ glass_name = "vodka martini" glass_desc ="A bastardization of the classic martini. Still great." + allergen_type = GRAINS|FRUIT //made from vodka(grains) and vermouth(fruit) /datum/reagent/ethanol/vodkatonic name = "Vodka and Tonic" @@ -3190,6 +3408,7 @@ glass_name = "vodka and tonic" glass_desc = "For when a gin and tonic isn't Russian enough." + allergen_type = GRAINS //Made from vodka(grains) /datum/reagent/ethanol/white_russian name = "White Russian" @@ -3202,6 +3421,7 @@ glass_name = "White Russian" glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." + allergen_type = COFFEE|GRAINS|DAIRY //Made from black russian(vodka(grains), kahlua(coffee)) and cream(dairy) /datum/reagent/ethanol/whiskey_cola name = "Whiskey Cola" @@ -3215,6 +3435,7 @@ glass_name = "whiskey cola" glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." + allergen_type = GRAINS //Made from whiskey(grains) /datum/reagent/ethanol/whiskeysoda name = "Whiskey Soda" @@ -3228,6 +3449,8 @@ glass_name = "whiskey soda" glass_desc = "Ultimate refreshment." + allergen_type = GRAINS //Made from whiskey(grains) + /datum/reagent/ethanol/specialwhiskey // I have no idea what this is and where it comes from name = "Special Blend Whiskey" id = "specialwhiskey" @@ -3239,6 +3462,8 @@ glass_name = "special blend whiskey" glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." + allergen_type = GRAINS //Whiskey(grains) + /datum/reagent/ethanol/unathiliquor name = "Redeemer's Brew" id = "unathiliquor" @@ -3275,6 +3500,8 @@ glass_name = "Sake Bomb" glass_desc = "Some sake mixed into a pint of beer." + allergen_type = GRAINS //Made from beer(grains) + /datum/reagent/ethanol/tamagozake name = "Tamagozake" id = "tamagozake" @@ -3286,6 +3513,7 @@ glass_name = "Tamagozake" glass_desc = "An egg cracked into sake and sugar." + allergen_type = EGGS //Made with eggs /datum/reagent/ethanol/ginzamary name = "Ginza Mary" @@ -3298,6 +3526,8 @@ glass_name = "Ginza Mary" glass_desc = "Tomato juice, vodka, and sake make something not quite completely unlike a Bloody Mary." + allergen_type = FRUIT|GRAINS //Made from vodka(grains) and tomatojuice(fruit) + /datum/reagent/ethanol/tokyorose name = "Tokyo Rose" id = "tokyorose" @@ -3309,6 +3539,8 @@ glass_name = "Tokyo Rose" glass_desc = "It's kinda pretty!" + allergen_type = FRUIT //Made from berryjuice + /datum/reagent/ethanol/saketini name = "Saketini" id = "saketini" @@ -3320,16 +3552,20 @@ glass_name = "Saketini" glass_desc = "What are you doing drinking this outside of New Kyoto?" + allergen_type = FRUIT //Made from gin(fruit) + /datum/reagent/ethanol/coffee/elysiumfacepunch name = "Elysium Facepunch" id = "elysiumfacepunch" - description = "A lothesome cocktail favored by Heaven's skeleton shift workers." + description = "A loathesome cocktail favored by Heaven's skeleton shift workers." taste_description = "sour coffee" color = "#8f7729" strength = 20 glass_name = "Elysium Facepunch" - glass_desc = "A lothesome cocktail favored by Heaven's skeleton shift workers." + glass_desc = "A loathesome cocktail favored by Heaven's skeleton shift workers." + + allergen_type = COFFEE|FRUIT //Made from kahlua(Coffee) and lemonjuice(fruit) /datum/reagent/ethanol/erebusmoonrise name = "Erebus Moonrise" @@ -3342,6 +3578,8 @@ glass_name = "Erebus Moonrise" glass_desc = "A deeply alcoholic mix, popular in Nyx." + allergen_type = GRAINS //Made from whiskey(grains) and Vodka(grains) + /datum/reagent/ethanol/balloon name = "Balloon" id = "balloon" @@ -3353,6 +3591,8 @@ glass_name = "Balloon" glass_desc = "A strange drink invented in the aerostats of Venus." + allergen_type = DAIRY|FRUIT //Made from blue curacao(fruit) and cream(dairy) + /datum/reagent/ethanol/natunabrandy name = "Natuna Brandy" id = "natunabrandy" @@ -3365,6 +3605,8 @@ glass_desc = "On Natuna, they do the best with what they have." glass_special = list(DRINK_FIZZ) + allergen_type = GRAINS //Made from beer(grains) + /datum/reagent/ethanol/euphoria name = "Euphoria" id = "euphoria" @@ -3376,6 +3618,8 @@ glass_name = "Euphoria" glass_desc = "Invented by a Eutopian marketing team, this is one of the most expensive cocktails in existence." + allergen_type = GRAINS|FRUIT //Made from specialwhiskey(grain) and cognac(fruit) + /datum/reagent/ethanol/xanaducannon name = "Xanadu Cannon" id = "xanaducannon" @@ -3388,6 +3632,8 @@ glass_name = "Xanadu Cannon" glass_desc = "Common in the entertainment districts of Titan." + allergen_type = GRAINS //Made from ale(grain) + /datum/reagent/ethanol/debugger name = "Debugger" id = "debugger" @@ -3399,6 +3645,7 @@ glass_name = "Debugger" glass_desc = "From Shelf. Not for human consumption." + allergen_type = VEGETABLE //Made from corn oil(vegetable) /datum/reagent/ethanol/spacersbrew name = "Spacer's Brew" @@ -3412,6 +3659,8 @@ glass_name = "Spacer's Brew" glass_desc = "Ethanol and orange soda. A common emergency drink on frontier colonies." + allergen_type = FRUIT //Made from brownstar(orange juice(fruit)) + /datum/reagent/ethanol/binmanbliss name = "Binman Bliss" id = "binmanbliss" @@ -3434,16 +3683,18 @@ glass_name = "Chrysanthemum" glass_desc = "An exotic cocktail from New Kyoto." + allergen_type = FRUIT //Made from melon liquor(fruit) + /datum/reagent/ethanol/bitters name = "Bitters" id = "bitters" - description = "A blend of fermented fruits and herbs, commonly used in cocktails." + description = "An aromatic, typically alcohol-based infusions of bittering botanticals and flavoring agents like fruit peels, spices, dried flowers, and herbs." taste_description = "sharp bitterness" color = "#9b6241" // rgb(155, 98, 65) strength = 50 glass_name = "Bitters" - glass_desc = "A blend of fermented fruits and herbs, commonly used in cocktails." + glass_desc = "An aromatic, typically alcohol-based infusions of bittering botanticals and flavoring agents like fruit peels, spices, dried flowers, and herbs." /datum/reagent/ethanol/soemmerfire name = "Soemmer Fire" @@ -3456,6 +3707,8 @@ glass_name = "Soemmer Fire" glass_desc = "A painfully hot mixed drink, for when you absolutely need to hurt right now." + allergen_type = GRAINS|FRUIT //Made from manhattan(whiskey(grains), vermouth(fruit)) + /datum/reagent/drink/soemmerfire/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) @@ -3473,6 +3726,8 @@ glass_name = "Wine Brandy" glass_desc = "A very classy looking after-dinner drink." + allergen_type = FRUIT //Made from wine, which is made from fruit + /datum/reagent/ethanol/morningafter name = "Morning After" id = "morningafter" @@ -3484,6 +3739,8 @@ glass_name = "Morning After" glass_desc = "The finest hair of the dog, coming up!" + allergen_type = GRAINS|COFFEE //Made from sbiten(vodka(grain)) and coffee(coffee) + /datum/reagent/ethanol/vesper name = "Vesper" id = "vesper" @@ -3495,6 +3752,8 @@ glass_name = "Vesper" glass_desc = "A dry martini, ice cold and well shaken." + allergen_type = FRUIT|GRAINS //Made from wine(fruit), vodka(grain), and gin(fruit) + /datum/reagent/ethanol/rotgut name = "Rotgut Fever Dream" id = "rotgut" @@ -3507,6 +3766,8 @@ glass_name = "Rotgut Fever Dream" glass_desc = "Why are you doing this to yourself?" + allergen_type = GRAINS //Made from whiskey(grains) and vodka(grains) + /datum/reagent/ethanol/voxdelight name = "Vox's Delight" id = "voxdelight" @@ -3538,6 +3799,8 @@ glass_name = "Screaming Viking" glass_desc = "A boozy, citrus-packed brew." + allergen_type = FRUIT|GRAINS //Made from martini(gin(fruit), vermouth(fruit)), vodka tonic(vodka(grain)), and lime juice(fruit) + /datum/reagent/ethanol/robustin name = "Robustin" id = "robustin" @@ -3549,6 +3812,8 @@ glass_name = "Robustin" glass_desc = "A bootleg brew of all the worst things on station." + allergen_type = GRAINS|DAIRY //Made from antifreeze(vodka(grains),cream(dairy)) and vodka(grains) + /datum/reagent/ethanol/virginsip name = "Virgin Sip" id = "virginsip" @@ -3560,6 +3825,8 @@ glass_name = "Virgin Sip" glass_desc = "A perfect martini, watered down and ruined." + allergen_type = FRUIT //Made from driest martini(gin(fruit)) + /datum/reagent/ethanol/jellyshot name = "Jelly Shot" id = "jellyshot" @@ -3571,6 +3838,8 @@ glass_name = "Jelly Shot" glass_desc = "A thick and vibrant alcoholic gel, perfect for the night life." + allergen_type = FRUIT|GRAINS //Made from cherry jelly(fruit), and vodka(grains) + /datum/reagent/ethanol/slimeshot name = "Named Bullet" id = "slimeshot" @@ -3582,6 +3851,8 @@ glass_name = "Named Bullet" glass_desc = "A thick slime jelly shot. You can feel your death approaching." + allergen_type = GRAINS //Made from vodka(grains) + /datum/reagent/drink/slimeshot/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) @@ -3591,13 +3862,15 @@ /datum/reagent/ethanol/cloverclub name = "Clover Club" id = "cloverclub" - description = "A light and refreshing rasberry cocktail." + description = "A light and refreshing raspberry cocktail." taste_description = "sweet raspberry" color = "#dd00a6" // rgb(221, 0, 166) strength = 30 glass_name = "Clover Club" - glass_desc = "A light and refreshing rasberry cocktail." + glass_desc = "A light and refreshing raspberry cocktail." + + allergen_type = FRUIT //Made from berry juice(fruit), lemon juice(fruit), and gin(fruit) /datum/reagent/ethanol/negroni name = "Negroni" @@ -3610,6 +3883,8 @@ glass_name = "Negroni" glass_desc = "A dark, complicated blend, perfect for relaxing nights by the fire." + allergen_type = FRUIT //Made from gin(fruit) and vermouth(fruit) + /datum/reagent/ethanol/whiskeysour name = "Whiskey Sour" id = "whiskeysour" @@ -3621,6 +3896,8 @@ glass_name = "Whiskey Sour" glass_desc = "A smokey, refreshing lemoned whiskey." + allergen_type = GRAINS|FRUIT //Made from whiskey(grains) and lemon juice(fruit) + /datum/reagent/ethanol/oldfashioned name = "Old Fashioned" id = "oldfashioned" @@ -3632,6 +3909,8 @@ glass_name = "Old Fashioned" glass_desc = "A classic mix of whiskey and sugar... simple and direct." + allergen_type = GRAINS //Made from whiskey(grains) + /datum/reagent/ethanol/daiquiri name = "Daiquiri" id = "daiquiri" @@ -3643,6 +3922,8 @@ glass_name = "Daiquiri" glass_desc = "Refeshing rum and citrus. Time for a tropical get away." + allergen_type = FRUIT //Made from lime juice(fruit) + /datum/reagent/ethanol/mojito name = "Mojito" id = "mojito" @@ -3655,6 +3936,8 @@ glass_desc = "Minty rum and citrus, made for sailing." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made from lime juice(fruit) + /datum/reagent/ethanol/paloma name = "Paloma" id = "paloma" @@ -3667,6 +3950,8 @@ glass_desc = "Tequila and citrus, iced just right..." glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made from orange juice(fruit) + /datum/reagent/ethanol/piscosour name = "Pisco Sour" id = "piscosour" @@ -3678,6 +3963,8 @@ glass_name = "Pisco Sour" glass_desc = "South American bliss, served ice cold." + allergen_type = FRUIT //Made from wine brandy(fruit), and lemon juice(fruit) + /datum/reagent/ethanol/coldfront name = "Cold Front" id = "coldfront" @@ -3691,6 +3978,8 @@ glass_name = "Cold Front" glass_desc = "Minty, rich, and painfully cold. It's a blizzard in a cup." + allergen_type = COFFEE //Made from iced coffee(coffee) + /datum/reagent/ethanol/mintjulep name = "Mint Julep" id = "mintjulep" @@ -3726,6 +4015,8 @@ glass_desc = "The glass is barely able to contain the wodka. Xynta." glass_special = list(DRINK_FIZZ) + allergen_type = GRAINS //Made from vodka(grain) + /datum/reagent/ethanol/godka/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() M.apply_effect(max(M.radiation - 5 * removed, 0), IRRADIATE, check_protection = 0) @@ -3754,6 +4045,8 @@ glass_desc = "A very pious looking drink." glass_icon = DRINK_ICON_NOISY + allergen_type = FRUIT //Made from grapes(fruit) + /datum/reagent/ethanol/holy_mary name = "Holy Mary" id = "holymary" @@ -3765,6 +4058,8 @@ glass_name = "Holy Mary" glass_desc = "Angel's Ichor, mixed with Vodka and a lil' bit of lime. Tastes like liquid ascension." + allergen_type = FRUIT|GRAINS //Made from vodka(grain), holy wine(fruit), and lime juice(fruit) + /datum/reagent/ethanol/angelswrath name = "Angels Wrath" id = "angelswrath" @@ -3780,6 +4075,8 @@ glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) + allergen_type = FRUIT //Made from space mountain wind(fruit), and holy wine(fruit) + /datum/reagent/ethanol/angelskiss name = "Angels Kiss" id = "angelskiss" @@ -3791,6 +4088,8 @@ glass_name = "Angel's Kiss" glass_desc = "Miracle time!" + allergen_type = FRUIT|COFFEE //Made from holy wine(fruit), and kahlua(coffee) + /datum/reagent/ethanol/ichor_mead name = "Ichor Mead" id = "ichor_mead" @@ -3802,6 +4101,8 @@ glass_name = "Ichor Mead" glass_desc = "A trip to Valhalla." + allergen_type = FRUIT //Made from holy wine(fruit) + /datum/reagent/ethanol/schnapps_pep name = "Peppermint Schnapps" id = "schnapps_pep" @@ -3824,6 +4125,8 @@ glass_name = "peach schnapps" glass_desc = "A glass of peach schnapps. It seems like it'd be better, mixed." + allergen_type = FRUIT //Made from peach(fruit) + /datum/reagent/ethanol/schnapps_lem name = "Lemonade Schnapps" id = "schnapps_lem" @@ -3835,6 +4138,19 @@ glass_name = "lemonade schnapps" glass_desc = "A glass of lemonade schnapps. It seems like it'd be better, mixed." + allergen_type = FRUIT //Made from lemons(fruit) + +/datum/reagent/ethanol/jager + name = "Schuss Konig" + id = "jager" + description = "A complex alcohol that leaves you feeling all warm inside." + taste_description = "complex, rich alcohol" + color = "#7f6906" + strength = 25 + + glass_name = "schusskonig" + glass_desc = "A glass of schusskonig digestif. Good for shooting or mixing." + /datum/reagent/ethanol/fusionnaire name = "Fusionnaire" id = "fusionnaire" @@ -3846,6 +4162,8 @@ glass_name = "fusionnaire" glass_desc = "A relatively new cocktail, mostly served in the bars of NanoTrasen owned stations." + allergen_type = FRUIT|GRAINS //Made from lemon juice(fruit), vodka(grains), and lemon schnapps(fruit) + /datum/reagent/ethanol/deathbell name = "Deathbell" id = "deathbell" @@ -3860,6 +4178,8 @@ glass_name = "Deathbell" glass_desc = "The perfect blend of the most alcoholic things a bartender can get their hands on." + allergen_type = GRAINS|DAIRY|FRUIT //Made from antifreeze(vodka(grains),cream(dairy)), gargleblaster(vodka(grains),gin(fruit),whiskey(grains),cognac(fruit),lime juice(fruit)), and syndicate bomb(beer(grain),whiskeycola(whiskey(grain))) + /datum/reagent/ethanol/deathbell/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm index d1a165af09..28084273ed 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks_vr.dm @@ -125,7 +125,7 @@ /datum/reagent/ethanol/monstertamer/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() - if(M.species.gets_food_nutrition) //it's still food! + if(M.species.organic_food_coeff) //it's still food! switch(alien) if(IS_DIONA) //Diona don't get any nutrition from nutriment or protein. if(IS_SKRELL) @@ -151,7 +151,7 @@ ..() if(alien == IS_SKRELL) M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein. - if(M.species.gets_food_nutrition) + if(M.species.organic_food_coeff) if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein M.adjust_nutrition(alt_nutriment_factor * removed) @@ -429,7 +429,7 @@ /datum/reagent/ethanol/hairoftherat/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() - if(M.species.gets_food_nutrition) //it's still food! + if(M.species.organic_food_coeff) //it's still food! switch(alien) if(IS_DIONA) //Diona don't get any nutrition from nutriment or protein. if(IS_SKRELL) @@ -455,6 +455,6 @@ ..() if(alien == IS_SKRELL) M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein. - if(M.species.gets_food_nutrition) + if(M.species.organic_food_coeff) if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein - M.nutrition += (alt_nutriment_factor * removed) + M.nutrition += (alt_nutriment_factor * removed) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm index 2f7e4e577a..2d336597fb 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm @@ -13,9 +13,9 @@ if(M.confused) M.Confuse(-8*removed) if(M.eye_blurry) - M.eye_blurry = max(M.eye_blurry - 8*removed, 0) + M.eye_blurry = max(M.eye_blurry - 25*removed, 0) if(M.jitteriness) - M.make_jittery(max(M.jitteriness - 8*removed,0)) + M.make_jittery(max(M.jitteriness - 25*removed,0)) /datum/reagent/numbing_enzyme name = "Numbing Enzyme" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 9f4ae5d150..7c63381900 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -373,6 +373,11 @@ color = "#A5F0EE" touch_met = 50 +/datum/reagent/space_cleaner/touch_mob(var/mob/M) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.clean_blood() + /datum/reagent/space_cleaner/touch_obj(var/obj/O) O.clean_blood() diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm index a47070d617..02334afe15 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm @@ -13,7 +13,7 @@ mrate_static = TRUE /datum/reagent/macrocillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(M.size_multiplier < RESIZE_HUGE) + if(M.size_range_check(M.size_multiplier)) M.resize(M.size_multiplier+0.01, FALSE)//Incrrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy. return @@ -27,7 +27,7 @@ mrate_static = TRUE /datum/reagent/microcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(M.size_multiplier > RESIZE_TINY) + if(M.size_range_check(M.size_multiplier)) M.resize(M.size_multiplier-0.01, FALSE) //Decrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy. return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 7f6f9dbba7..0db705b730 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1292,6 +1292,13 @@ required_reagents = list("tomatojuice" = 2, "water" = 1, "sugar" = 1) result_amount = 4 +/datum/chemical_reaction/food/barbecue + name = "Barbeque Sauce" + id = "barbecue" + result = "barbecue" + required_reagents = list("tomatojuice" = 2, "applejuice" = 1, "sugar" = 1, "spacespice" = 1) + result_amount = 4 + /datum/chemical_reaction/food/peanutbutter name = "Peanut Butter" id = "peanutbutter" diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm index 5d37f8510c..4bd8bd163e 100644 --- a/code/modules/reagents/distilling/distilling.dm +++ b/code/modules/reagents/distilling/distilling.dm @@ -74,7 +74,7 @@ ..() /obj/machinery/portable_atmospherics/powered/reagent_distillery/Initialize() - ..() + . = ..() Reservoir = new (src) Reservoir.Master = src diff --git a/code/modules/reagents/hoses/connector.dm b/code/modules/reagents/hoses/connector.dm index bac7fc7c6a..e165877041 100644 --- a/code/modules/reagents/hoses/connector.dm +++ b/code/modules/reagents/hoses/connector.dm @@ -53,7 +53,7 @@ ..() /obj/item/hose_connector/Initialize() - ..() + . = ..() create_reagents(100) @@ -105,7 +105,7 @@ ..() /obj/item/hose_connector/input/active/Initialize() - ..() + . = ..() START_PROCESSING(SSobj, src) if(!isturf(loc)) @@ -127,7 +127,7 @@ ..() /obj/item/hose_connector/output/active/Initialize() - ..() + . = ..() START_PROCESSING(SSobj, src) if(!isturf(loc)) diff --git a/code/modules/reagents/reagent_containers/hypospray_vr.dm b/code/modules/reagents/reagent_containers/hypospray_vr.dm index ff2586c528..e0556a27d2 100644 --- a/code/modules/reagents/reagent_containers/hypospray_vr.dm +++ b/code/modules/reagents/reagent_containers/hypospray_vr.dm @@ -23,14 +23,11 @@ desc = "Contains emergency autoinjectors." icon_state = "syringe" max_storage_space = ITEMSIZE_COST_SMALL * 7 // 14 - -/obj/item/weapon/storage/box/traumainjectors/Initialize() - ..() - for (var/i = 1 to 4) - new /obj/item/weapon/reagent_containers/hypospray/autoinjector/trauma(src) - for (var/i = 1 to 2) - new /obj/item/weapon/reagent_containers/hypospray/autoinjector/detox(src) - new /obj/item/weapon/reagent_containers/hypospray/autoinjector/burn(src) + starts_with = list( + /obj/item/weapon/reagent_containers/hypospray/autoinjector/trauma = 4, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/detox = 2, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/burn = 1 + ) /obj/item/weapon/reagent_containers/hypospray var/prototype = 0 diff --git a/code/modules/reagents/reagent_containers/pill_vr.dm b/code/modules/reagents/reagent_containers/pill_vr.dm index bb445cde4c..b7789b18ce 100644 --- a/code/modules/reagents/reagent_containers/pill_vr.dm +++ b/code/modules/reagents/reagent_containers/pill_vr.dm @@ -4,7 +4,7 @@ icon_state = "pill10" /obj/item/weapon/reagent_containers/pill/nutriment/Initialize() - ..() + . = ..() reagents.add_reagent("nutriment", 30) /obj/item/weapon/reagent_containers/pill/protein @@ -13,7 +13,7 @@ icon_state = "pill24" /obj/item/weapon/reagent_containers/pill/protein/Initialize() - ..() + . = ..() reagents.add_reagent("protein", 30) /obj/item/weapon/reagent_containers/pill/rezadone @@ -22,7 +22,7 @@ icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/rezadone/Initialize() - ..() + . = ..() reagents.add_reagent("rezadone", 5) color = reagents.get_color() @@ -32,7 +32,7 @@ icon_state = "pill10" /obj/item/weapon/reagent_containers/pill/peridaxon/Initialize() - ..() + . = ..() reagents.add_reagent("peridaxon", 10) /obj/item/weapon/reagent_containers/pill/carthatoline @@ -41,7 +41,7 @@ icon_state = "pill4" /obj/item/weapon/reagent_containers/pill/carthatoline/Initialize() - ..() + . = ..() reagents.add_reagent("carthatoline", 15) color = reagents.get_color() @@ -51,7 +51,7 @@ icon_state = "pill3" /obj/item/weapon/reagent_containers/pill/alkysine/Initialize() - ..() + . = ..() reagents.add_reagent("alkysine", 10) color = reagents.get_color() @@ -61,7 +61,7 @@ icon_state = "pill3" /obj/item/weapon/reagent_containers/pill/imidazoline/Initialize() - ..() + . = ..() reagents.add_reagent("imidazoline", 15) color = reagents.get_color() @@ -71,7 +71,7 @@ icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/osteodaxon/Initialize() - ..() + . = ..() reagents.add_reagent("osteodaxon", 15) reagents.add_reagent("inaprovaline", 10) color = reagents.get_color() @@ -82,7 +82,7 @@ icon_state = "pill1" /obj/item/weapon/reagent_containers/pill/myelamine/Initialize() - ..() + . = ..() reagents.add_reagent("myelamine", 15) reagents.add_reagent("inaprovaline", 10) color = reagents.get_color() @@ -93,7 +93,7 @@ icon_state = "pill4" /obj/item/weapon/reagent_containers/pill/hyronalin/Initialize() - ..() + . = ..() reagents.add_reagent("hyronalin", 15) color = reagents.get_color() @@ -103,7 +103,7 @@ icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/arithrazine/Initialize() - ..() + . = ..() reagents.add_reagent("arithrazine", 5) color = reagents.get_color() @@ -113,7 +113,7 @@ icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/corophizine/Initialize() - ..() + . = ..() reagents.add_reagent("corophizine", 5) color = reagents.get_color() @@ -123,7 +123,7 @@ icon_state = "pill1" /obj/item/weapon/reagent_containers/pill/vermicetol/Initialize() - ..() + . = ..() reagents.add_reagent("vermicetol", 15) color = reagents.get_color() @@ -133,7 +133,7 @@ icon_state = "pill1" /obj/item/weapon/reagent_containers/pill/healing_nanites/Initialize() - ..() + . = ..() reagents.add_reagent("healing_nanites", 30) color = reagents.get_color() @@ -144,7 +144,7 @@ icon_state = "pill3" /obj/item/weapon/reagent_containers/pill/sleevingcure/Initialize() - ..() + . = ..() reagents.add_reagent("sleevingcure", 1) color = reagents.get_color() */ //CHOMPStation removal end diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index eb4bba2387..fe0a4c1381 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -226,7 +226,7 @@ var/obj/item/hose_connector/input/active/InputSocket /obj/item/weapon/reagent_containers/spray/chemsprayer/hosed/Initialize() - ..() + . = ..() InputSocket = new(src) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 5c780cea57..61520505b5 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -134,6 +134,18 @@ /obj/structure/reagent_dispensers/foam/Initialize() . = ..() reagents.add_reagent("firefoam",1000) + +/obj/structure/reagent_dispensers/fueltank/barrel + name = "hazardous barrel" + desc = "An open-topped barrel full of nasty-looking liquid." + icon_state = "barrel" + modded = TRUE + +/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (W.is_wrench()) //can't wrench it shut, it's always open + return + return ..() + //VOREStation Add End diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 1d41d2003f..699a0cf2c4 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -260,24 +260,24 @@ /obj/machinery/disposal/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) - return TRUE - - if(usr.loc == src && !issilicon(usr)) + return + + if(usr.loc == src) to_chat(usr, "You cannot reach the controls from inside.") return TRUE if(mode==-1 && action != "eject") // If the mode is -1, only allow ejection to_chat(usr, "The disposal units power is disabled.") - return TRUE - + return + if(stat & BROKEN) - return TRUE - + return + add_fingerprint(usr) if(flushing) return - + if(isturf(loc)) if(action == "pumpOn") mode = 1 @@ -295,9 +295,9 @@ if(action == "eject") eject() - + return TRUE - + // src.add_fingerprint(user) // if(stat & BROKEN) @@ -394,7 +394,7 @@ // flush handle if(flush) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle") + overlays += image(src.icon, "[initial(icon_state)]-handle") // only handle is shown if no power if(stat & NOPOWER || mode == -1) @@ -402,13 +402,13 @@ // check for items in disposal - occupied light if(contents.len > 0) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-full") + overlays += image(src.icon, "[initial(icon_state)]-full") // charging and ready light if(mode == 1) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-charge") + overlays += image(src.icon, "[initial(icon_state)]-charge") else if(mode == 2) - overlays += image('icons/obj/pipes/disposal.dmi', "dispover-ready") + overlays += image(src.icon, "[initial(icon_state)]-ready") // timed process // charge the gas reservoir and perform flush if ready @@ -541,6 +541,35 @@ else return ..(mover, target) +/obj/machinery/disposal/wall + name = "inset disposal unit" + icon_state = "wall" + + density = FALSE + +/obj/machinery/disposal/wall/Initialize() + . = ..() + + spawn(1 SECOND) // Fixfix for weird interaction with buildmode or other late-spawning. + update() + +/obj/machinery/disposal/wall/update() + ..() + + switch(dir) + if(1) + pixel_x = 0 + pixel_y = -32 + if(2) + pixel_x = 0 + pixel_y = 32 + if(4) + pixel_x = -32 + pixel_y = 0 + if(8) + pixel_x = 32 + pixel_y = 0 + // virtual disposal object // travels through pipes in lieu of actual items // contents will be items flushed by the disposal @@ -1365,7 +1394,7 @@ var/obj/linked // the linked obj/machinery/disposal or obj/disposaloutlet /obj/structure/disposalpipe/trunk/Initialize() - ..() //Lateload below + ..() dpdir = dir return INITIALIZE_HINT_LATELOAD diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index d0aaebb7d8..d419829bab 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -26,6 +26,16 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). /obj/machinery/r_n_d/circuit_imprinter/Initialize() . = ..() + + spawn() // Go through all materials, and add them to the possible storage, but hide them unless we contain them. + for(var/Name in name_to_material) + if(Name in materials) + continue + + hidden_materials |= Name + + materials[Name] = 0 + default_apply_parts() /obj/machinery/r_n_d/circuit_imprinter/process() diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index b150d04cfb..b3756e59fe 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -67,9 +67,19 @@ other types of metals and chemistry for reagents). /datum/design/item build_type = PROTOLATHE -//Make sure items don't get free power +//Make sure items don't get free power, or resources. Also make things be recycled with proper values. /datum/design/item/Fabricate() var/obj/item/I = ..() + + if(LAZYLEN(materials)) + if(!LAZYLEN(I.matter)) + I.matter = list() + else + I.matter.Cut() + + for(var/matname in materials) + I.matter[matname] = materials[matname] + var/obj/item/weapon/cell/C = I.get_cell() if(C) C.charge = 0 diff --git a/code/modules/research/designs/HUDs.dm b/code/modules/research/designs/HUDs.dm index 4a6648f26a..e108575653 100644 --- a/code/modules/research/designs/HUDs.dm +++ b/code/modules/research/designs/HUDs.dm @@ -1,7 +1,7 @@ // HUDs /datum/design/item/hud - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 10) /datum/design/item/hud/AssembleDesignName() ..() @@ -42,6 +42,6 @@ name = "graviton visor" id = "graviton_goggles" req_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3, TECH_PHORON = 3) - materials = list(MAT_PLASTEEL = 2000, "glass" = 3000, MAT_PHORON = 1500) + materials = list(MAT_PLASTEEL = 2000, "glass" = 3000, MAT_PHORON = 1500, MAT_COPPER = 10) build_path = /obj/item/clothing/glasses/graviton sort_string = "EAAAE" \ No newline at end of file diff --git a/code/modules/research/designs/ai_holders.dm b/code/modules/research/designs/ai_holders.dm index 7cf36c5bb6..b4215d91b2 100644 --- a/code/modules/research/designs/ai_holders.dm +++ b/code/modules/research/designs/ai_holders.dm @@ -8,7 +8,7 @@ id = "mmi" req_tech = list(TECH_DATA = 2, TECH_BIO = 3) build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, MAT_COPPER = 200) build_path = /obj/item/device/mmi category = list("Misc") sort_string = "SAAAA" @@ -18,7 +18,7 @@ id = "posibrain" req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) + materials = list(MAT_TITANIUM = 2000, "glass" = 1000, "silver" = 500, "gold" = 500, "phoron" = 500, MAT_DIAMOND = 100) build_path = /obj/item/device/mmi/digital/posibrain category = list("Misc") sort_string = "SAAAB" @@ -28,7 +28,7 @@ id = "dronebrain" req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_DATA = 4) build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, MAT_COPPER = 100) build_path = /obj/item/device/mmi/digital/robot category = list("Misc") sort_string = "SAAAC" @@ -37,7 +37,7 @@ name = "'pAI', personal artificial intelligence device" id = "paicard" req_tech = list(TECH_DATA = 2) - materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500) + materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500, MAT_COPPER = 250) build_path = /obj/item/device/paicard sort_string = "SBAAA" @@ -46,6 +46,6 @@ desc = "Allows for the construction of an intelliCore." id = "intellicore" req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) - materials = list("glass" = 1000, "gold" = 200) + materials = list(MAT_TITANIUM = 2500, MAT_ALUMINIUM = 500, "glass" = 500, "gold" = 200) build_path = /obj/item/device/aicard sort_string = "SCAAA" \ No newline at end of file diff --git a/code/modules/research/designs/bag_of_holding.dm b/code/modules/research/designs/bag_of_holding.dm index 744bbca5a3..dc4fb6b053 100644 --- a/code/modules/research/designs/bag_of_holding.dm +++ b/code/modules/research/designs/bag_of_holding.dm @@ -9,7 +9,7 @@ desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy." id = "bag_holding" req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) - materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) + materials = list(MAT_TITANIUM = 2000, "gold" = 1000, "diamond" = 1500, "uranium" = 250) build_path = /obj/item/weapon/storage/backpack/holding sort_string = "QAAAA" @@ -18,6 +18,6 @@ desc = "A minaturized prototype of the popular Bag of Holding, the Dufflebag of Holding is, functionally, identical to the bag of holding, but comes in a more stylish and compact form." id = "dufflebag_holding" req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) - materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) + materials = list(MAT_TITANIUM = 2000, "gold" = 1000, "diamond" = 1500, "uranium" = 250) build_path = /obj/item/weapon/storage/backpack/holding/duffle sort_string = "QAAAB" \ No newline at end of file diff --git a/code/modules/research/designs/bio_devices.dm b/code/modules/research/designs/bio_devices.dm index 8762364105..f0c53b0bb3 100644 --- a/code/modules/research/designs/bio_devices.dm +++ b/code/modules/research/designs/bio_devices.dm @@ -1,5 +1,5 @@ /datum/design/item/biotech - materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20, MAT_COPPER = 10) /datum/design/item/biotech/AssembleDesignName() ..() @@ -39,7 +39,7 @@ desc = "A hand-held scanner able to diagnose robotic injuries." id = "robot_scanner" req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200, MAT_COPPER = 20) build_path = /obj/item/device/robotanalyzer sort_string = "JAACA" @@ -47,7 +47,7 @@ desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." id = "nanopaste" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000, MAT_COPPER = 15) build_path = /obj/item/stack/nanopaste sort_string = "JAACB" @@ -55,7 +55,7 @@ desc = "A device capable of quickly scanning all relevant data about a plant." id = "plant_analyzer" req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500, MAT_COPPER = 10) build_path = /obj/item/device/analyzer/plant_analyzer sort_string = "JAADA" diff --git a/code/modules/research/designs/bio_devices_vr.dm b/code/modules/research/designs/bio_devices_vr.dm index 2deb1854f9..996aab3c6d 100644 --- a/code/modules/research/designs/bio_devices_vr.dm +++ b/code/modules/research/designs/bio_devices_vr.dm @@ -2,7 +2,7 @@ name = "nanite implant framework" id = "nif" req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, "uranium" = 6000, "diamond" = 6000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, MAT_COPPER = 2000, "uranium" = 5000, "diamond" = 5000) build_path = /obj/item/device/nif sort_string = "JVAAA" @@ -10,7 +10,7 @@ name = "bioadaptive NIF" id = "bioadapnif" req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "uranium" = 10000, "diamond" = 10000) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, MAT_COPPER = 2000, "uranium" = 10000, "diamond" = 10000) build_path = /obj/item/device/nif/bioadap sort_string = "JVAAB" @@ -18,6 +18,6 @@ name = "adv. NIF repair tool" id = "anrt" req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) - materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 3000, "uranium" = 2000, "diamond" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 3000, MAT_COPPER = 4000, "uranium" = 2000, "diamond" = 2000) build_path = /obj/item/device/nifrepairer sort_string = "JVABA" \ No newline at end of file diff --git a/code/modules/research/designs/circuits/ai_modules.dm b/code/modules/research/designs/circuits/ai_modules.dm index 378a4fde0d..456acb1b92 100644 --- a/code/modules/research/designs/circuits/ai_modules.dm +++ b/code/modules/research/designs/circuits/ai_modules.dm @@ -1,6 +1,6 @@ /datum/design/aimodule build_type = IMPRINTER - materials = list("glass" = 2000, "gold" = 100) + materials = list("glass" = 1800, MAT_COPPER = 200, "gold" = 100) /datum/design/aimodule/AssembleDesignName() name = "AI module design ([name])" diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm index 6f17943484..615d3e5197 100644 --- a/code/modules/research/designs/circuits/circuits.dm +++ b/code/modules/research/designs/circuits/circuits.dm @@ -5,7 +5,7 @@ CIRCUITS BELOW /datum/design/circuit build_type = IMPRINTER req_tech = list(TECH_DATA = 2) - materials = list("glass" = 2000) + materials = list("glass" = 1850, MAT_COPPER = 150) chemicals = list("sacid" = 20) time = 5 @@ -493,7 +493,7 @@ CIRCUITS BELOW name = "'Durand' central control" id = "durand_main" req_tech = list(TECH_DATA = 4) - materials = list("glass" = 2000, MAT_GRAPHITE = 1250) + materials = list("glass" = 2000, MAT_GRAPHITE = 1250, MAT_COPPER = 100) chemicals = list("sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/main sort_string = "NAADA" @@ -502,7 +502,7 @@ CIRCUITS BELOW name = "'Durand' peripherals control" id = "durand_peri" req_tech = list(TECH_DATA = 4) - materials = list("glass" = 2000, MAT_GRAPHITE = 1250) + materials = list("glass" = 2000, MAT_GRAPHITE = 1250, MAT_COPPER = 100) chemicals = list("sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals sort_string = "NAADB" @@ -511,7 +511,7 @@ CIRCUITS BELOW name = "'Durand' weapon control and targeting" id = "durand_targ" req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) - materials = list("glass" = 2000, MAT_GRAPHITE = 1250) + materials = list("glass" = 2000, MAT_GRAPHITE = 1250, MAT_COPPER = 100) chemicals = list("sacid" = 20) build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting sort_string = "NAADC" @@ -576,6 +576,36 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/telecomms/exonet_node sort_string = "PAAAH" +/datum/design/circuit/shield + req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) + materials = list("glass" = 2000, MAT_COPPER = 100, "gold" = 1000) + +/datum/design/circuit/shield/AssembleDesignName() + name = "Shield generator circuit design ([name])" +/datum/design/circuit/shield/AssembleDesignDesc() + if(!desc) + desc = "Allows for the construction of \a [name] shield generator." + +/datum/design/circuit/shield/bubble + name = "bubble (OBSOLETE)" //VOREStation Edit + id = "shield_gen" + build_path = /obj/item/weapon/circuitboard/shield_gen + sort_string = "VAAAZ" // Duplicate string, really need to redo this whole thing + +/datum/design/circuit/shield/hull + name = "hull (OBSOLETE)" //VOREStation Edit + id = "shield_gen_ex" + build_path = /obj/item/weapon/circuitboard/shield_gen_ex + sort_string = "VAAAB" + +/datum/design/circuit/shield/capacitor + name = "capacitor (OBSOLETE)" //VOREStation Edit" + desc = "Allows for the construction of a shield capacitor circuit board." + id = "shield_cap" + req_tech = list(TECH_MAGNET = 3, TECH_POWER = 4) + build_path = /obj/item/weapon/circuitboard/shield_cap + sort_string = "VAAAC" + /datum/design/circuit/ntnet_relay name = "NTNet Quantum Relay" id = "ntnet_relay" diff --git a/code/modules/research/designs/circuits/disks.dm b/code/modules/research/designs/circuits/disks.dm index 2a3c2df83f..fd834fc55f 100644 --- a/code/modules/research/designs/circuits/disks.dm +++ b/code/modules/research/designs/circuits/disks.dm @@ -2,7 +2,7 @@ /datum/design/circuit/disk build_type = IMPRINTER req_tech = list(TECH_DATA = 3) - materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 1000) + materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 1000, MAT_COPPER = 150) chemicals = list("pacid" = 10) time = 5 diff --git a/code/modules/research/designs/engineering.dm b/code/modules/research/designs/engineering.dm index 909fa83680..b341754f75 100644 --- a/code/modules/research/designs/engineering.dm +++ b/code/modules/research/designs/engineering.dm @@ -9,7 +9,7 @@ desc = "A welding tool that generate fuel for itself." id = "expwelder" req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100) + materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100, MAT_COPPER = 10) build_path = /obj/item/weapon/weldingtool/experimental sort_string = "NAAAA" @@ -18,7 +18,7 @@ desc = "A simple powered hand drill." id = "handdrill" req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) + materials = list(MAT_ALUMINIUM = 300, "silver" = 100, MAT_COPPER = 10) build_path = /obj/item/weapon/tool/screwdriver/power sort_string = "NAAAB" @@ -27,7 +27,7 @@ desc = "A set of jaws of life, compressed through the magic of science." id = "jawslife" req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) + materials = list(MAT_ALUMINIUM = 300, MAT_TITANIUM = 100, MAT_COPPER = 10) build_path = /obj/item/weapon/tool/crowbar/power sort_string = "NAAAC" // YW addition begins @@ -48,8 +48,17 @@ materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500, "silver" = 300, "phoron" = 300, "diamond" = 500) //Probably change the price in the future just put something for now build_path = /obj/item/weapon/rms sort_string = "NAAAB" - // YW addition end + +/datum/design/item/tool/rpd + name = "Rapid Pipe Dispenser" + desc = "A counterpart to the rapid construction device that allows creating and placing atmospheric and disposal pipes." + id = "rapidpipedispenser" + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_GLASS = 2000) + build_path = /obj/item/weapon/pipe_dispenser + sort_string = "NAAAD" + // Other devices /datum/design/item/engineering/AssembleDesignName() @@ -61,7 +70,7 @@ desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." id = "tscanner" req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_COPPER = 10) build_path = /obj/item/device/t_scanner sort_string = "NBAAA" @@ -70,7 +79,7 @@ desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." id = "upgradedtscanner" req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150) + materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150, MAT_COPPER = 10) build_path = /obj/item/device/t_scanner/upgraded sort_string = "NBAAB" @@ -79,7 +88,7 @@ desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." id = "advancedtscanner" req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6) - materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50) + materials = list(MAT_ALUMINIUM = 1250, "phoron" = 500, "silver" = 50) build_path = /obj/item/device/t_scanner/advanced sort_string = "NBAAC" @@ -88,6 +97,6 @@ desc = "A hand-held environmental scanner which reports current gas levels." id = "atmosanalyzer" req_tech = list(TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 100) + materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 100, MAT_COPPER = 10) build_path = /obj/item/device/analyzer sort_string = "NBABA" diff --git a/code/modules/research/designs/implants.dm b/code/modules/research/designs/implants.dm index 4c4b5ba801..b6279e62e1 100644 --- a/code/modules/research/designs/implants.dm +++ b/code/modules/research/designs/implants.dm @@ -1,7 +1,7 @@ // Implants /datum/design/item/implant - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 5) /datum/design/item/implant/AssembleDesignName() ..() @@ -17,6 +17,7 @@ /datum/design/item/implant/freedom name = "freedom" id = "implant_free" - req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3) + req_tech = list(TECH_MATERIAL = 3, TECH_ILLEGAL = 2, TECH_BIO = 3) build_path = /obj/item/weapon/implantcase/freedom - sort_string = "MFAAB" \ No newline at end of file + sort_string = "MFAAB" + materials = list(MAT_TITANIUM = 50, "glass" = 50, MAT_COPPER = 5) diff --git a/code/modules/research/designs/implants_vr.dm b/code/modules/research/designs/implants_vr.dm index 07b4a37f05..937d93e563 100644 --- a/code/modules/research/designs/implants_vr.dm +++ b/code/modules/research/designs/implants_vr.dm @@ -10,7 +10,7 @@ name = "Size control implant" id = "implant_size" req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_DATA = 4, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "silver" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, MAT_COPPER = 2000, "silver" = 2000) build_path = /obj/item/weapon/implanter/sizecontrol sort_string = "MFAVB" diff --git a/code/modules/research/designs/locator_devices.dm b/code/modules/research/designs/locator_devices.dm index b6f149393c..b59af1ec4b 100644 --- a/code/modules/research/designs/locator_devices.dm +++ b/code/modules/research/designs/locator_devices.dm @@ -2,7 +2,7 @@ /datum/design/item/gps req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500) + materials = list(DEFAULT_WALL_MATERIAL = 500, MAT_COPPER = 5) /datum/design/item/gps/AssembleDesignName() ..() @@ -67,7 +67,7 @@ desc = "Used to scan and locate signals on a particular frequency." id = "beacon_locator" req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) - materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500, MAT_COPPER = 150) build_path = /obj/item/device/beacon_locator sort_string = "DBAAA" @@ -75,6 +75,6 @@ name = "Bluespace tracking beacon" id = "beacon" req_tech = list(TECH_BLUESPACE = 1) - materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10) + materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10, MAT_COPPER = 5) build_path = /obj/item/device/radio/beacon sort_string = "DBABA" \ No newline at end of file diff --git a/code/modules/research/designs/medical.dm b/code/modules/research/designs/medical.dm index 13c7307d70..a3cd5ea51c 100644 --- a/code/modules/research/designs/medical.dm +++ b/code/modules/research/designs/medical.dm @@ -12,7 +12,7 @@ desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." id = "scalpel_laser1" req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500) + materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, MAT_COPPER = 120) build_path = /obj/item/weapon/surgical/scalpel/laser1 sort_string = "KAAAA" @@ -75,7 +75,7 @@ desc = "A hand-held body scanner able to distinguish vital signs of the subject." id = "medical_analyzer" req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500, MAT_COPPER = 20) build_path = /obj/item/device/healthanalyzer sort_string = "KBAAA" @@ -121,6 +121,6 @@ desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system." id = "roller_bed" req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000, MAT_COPPER = 100) build_path = /obj/item/roller/adv sort_string = "KCAAA" diff --git a/code/modules/research/designs/medical_vr.dm b/code/modules/research/designs/medical_vr.dm index aeb485e296..3de9ba7aa6 100644 --- a/code/modules/research/designs/medical_vr.dm +++ b/code/modules/research/designs/medical_vr.dm @@ -17,7 +17,7 @@ name = "SleeveMate 3700" id = "sleevemate" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 4000, MAT_COPPER = 1000) build_path = /obj/item/device/sleevemate sort_string = "KCAVA" @@ -26,7 +26,7 @@ desc = "This prototype hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients." id = "protohypospray" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 2, TECH_BIO = 4, TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1500, "silver" = 2000, "gold" = 1500, "uranium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1500, MAT_COPPER = 500, "silver" = 2000, "gold" = 1500, "uranium" = 1000) build_path = /obj/item/weapon/reagent_containers/hypospray/science sort_string = "KCAVB" @@ -41,7 +41,7 @@ name = "cell-loaded medigun" id = "cell_medigun" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 3, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 8000, "plastic" = 8000, "glass" = 5000, "silver" = 1000, "gold" = 1000, "uranium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "plastic" = 8000, "glass" = 5000, MAT_COPPER = 500, "silver" = 750, "gold" = 750, "uranium" = 1000) build_path = /obj/item/weapon/gun/projectile/cell_loaded/medical sort_string = "KVAAA" @@ -97,7 +97,7 @@ name = "TOXIN" id = "ml3m_cell_toxin" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500) build_path = /obj/item/ammo_casing/microbattery/medical/toxin sort_string = "KVCBA" @@ -105,7 +105,7 @@ name = "OMNI" id = "ml3m_cell_omni" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500) build_path = /obj/item/ammo_casing/microbattery/medical/omni sort_string = "KVCBB" @@ -113,7 +113,7 @@ name = "ANTIRAD" id = "ml3m_cell_antirad" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500) build_path = /obj/item/ammo_casing/microbattery/medical/antirad sort_string = "KVCBC" @@ -123,7 +123,7 @@ name = "BRUTE-II" id = "ml3m_cell_brute2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500, "gold" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/brute2 sort_string = "KVCCA" @@ -131,7 +131,7 @@ name = "BURN-II" id = "ml3m_cell_burn2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500, "gold" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/burn2 sort_string = "KVCCB" @@ -139,7 +139,7 @@ name = "STABILIZE-II" id = "ml3m_cell_stabilize2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "silver" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500, "silver" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/stabilize2 sort_string = "KVCCC" @@ -147,7 +147,7 @@ name = "OMNI-II" id = "ml3m_cell_omni2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500, "uranium" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/omni2 sort_string = "KVCCD" @@ -157,7 +157,7 @@ name = "TOXIN-II" id = "ml3m_cell_toxin2" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 4000, "silver" = 4000, "diamond" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500, "uranium" = 1000, "silver" = 1000, "diamond" = 500) build_path = /obj/item/ammo_casing/microbattery/medical/toxin2 sort_string = "KVCDA" /* @@ -165,7 +165,7 @@ name = "HASTE" id = "ml3m_cell_haste" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "silver" = 1000, "diamond" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500, "gold" = 1000, "silver" = 1000, "diamond" = 500) build_path = /obj/item/ammo_casing/microbattery/medical/haste sort_string = "KVCDB" @@ -173,7 +173,7 @@ name = "RESIST" id = "ml3m_cell_resist" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "uranium" = 1000, "diamond" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 500, "gold" = 1000, "uranium" = 1000, "diamond" = 500) build_path = /obj/item/ammo_casing/microbattery/medical/resist sort_string = "KVCDC" */ @@ -181,7 +181,7 @@ name = "CORPSE MEND" id = "ml3m_cell_corpse_mend" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "phoron" = 3000, "diamond" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 1000, "phoron" = 3000, "diamond" = 2500) build_path = /obj/item/ammo_casing/microbattery/medical/corpse_mend sort_string = "KVCDD" @@ -191,7 +191,7 @@ name = "BRUTE-III" id = "ml3m_cell_brute3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 1000, "diamond" = 500, "verdantium" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/brute3 sort_string = "KVCEA" @@ -199,7 +199,7 @@ name = "BURN-III" id = "ml3m_cell_burn3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 1000, "diamond" = 500, "verdantium" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/burn3 sort_string = "KVCEB" @@ -207,7 +207,7 @@ name = "TOXIN-III" id = "ml3m_cell_toxin3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 1000, "diamond" = 500, "verdantium" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/toxin3 sort_string = "KVCEC" @@ -215,7 +215,7 @@ name = "OMNI-III" id = "ml3m_cell_omni3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 1000, "diamond" = 500, "verdantium" = 1000) build_path = /obj/item/ammo_casing/microbattery/medical/omni3 sort_string = "KVCED" @@ -225,7 +225,7 @@ name = "SHRINK" id = "ml3m_cell_shrink" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 2000) build_path = /obj/item/ammo_casing/microbattery/medical/shrink sort_string = "KVCOA" @@ -233,7 +233,7 @@ name = "GROW" id = "ml3m_cell_grow" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 2000) build_path = /obj/item/ammo_casing/microbattery/medical/grow sort_string = "KVCOB" @@ -241,7 +241,7 @@ name = "NORMALSIZE" id = "ml3m_cell_normalsize" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, MAT_COPPER = 2000) build_path = /obj/item/ammo_casing/microbattery/medical/normalsize sort_string = "KVCOC" */ diff --git a/code/modules/research/designs/mining_toys.dm b/code/modules/research/designs/mining_toys.dm index 61be9cd871..4fb754b145 100644 --- a/code/modules/research/designs/mining_toys.dm +++ b/code/modules/research/designs/mining_toys.dm @@ -7,14 +7,14 @@ /datum/design/item/weapon/mining/drill id = "drill" req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners. + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000, MAT_COPPER = 10) //expensive, but no need for miners. build_path = /obj/item/weapon/pickaxe/drill sort_string = "FAAAA" /datum/design/item/weapon/mining/jackhammer id = "jackhammer" req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500, MAT_COPPER = 20) build_path = /obj/item/weapon/pickaxe/jackhammer sort_string = "FAAAB" @@ -28,14 +28,14 @@ /datum/design/item/weapon/mining/pick_diamond id = "pick_diamond" req_tech = list(TECH_MATERIAL = 6) - materials = list("diamond" = 3000) + materials = list(MAT_WOOD = 2000, "diamond" = 3000) build_path = /obj/item/weapon/pickaxe/diamond sort_string = "FAAAD" /datum/design/item/weapon/mining/drill_diamond id = "drill_diamond" req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000) + materials = list(MAT_ALUMINIUM = 2000, DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "diamond" = 2000, MAT_COPPER = 50) build_path = /obj/item/weapon/pickaxe/diamonddrill sort_string = "FAAAE" @@ -45,6 +45,24 @@ desc = "Used to check spatial depth and density of rock outcroppings." id = "depth_scanner" req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000, MAT_COPPER = 50) build_path = /obj/item/device/depth_scanner sort_string = "FBAAA" + +/datum/design/item/weapon/mining/mining_scanner + id = "mining_scanner" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_BLUESPACE = 1) + materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500, MAT_COPPER = 250) + build_path = /obj/item/weapon/mining_scanner/advanced + sort_string = "FBAAB" + +// CHOMPstation addition +/datum/design/item/weapon/mining/satchel_holding + name = "Satchel of Holding" + desc = "An ore satchel that opens into a localized pocket of bluespace." + id = "satchel_bspace" + req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) + materials = list("gold" = 2500, "diamond" = 1000, "uranium" = 250) + build_path = /obj/item/weapon/storage/bag/ore/holding + sort_string = "FBAAC" +// CHOMPstation addition end diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm index 2ce34f3485..83a433a4e3 100644 --- a/code/modules/research/designs/misc.dm +++ b/code/modules/research/designs/misc.dm @@ -8,7 +8,7 @@ name = "Communicator" id = "communicator" req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500, MAT_COPPER = 50) build_path = /obj/item/device/communicator sort_string = "TAAAA" @@ -17,7 +17,7 @@ datum/design/item/general/laserpointer desc = "Don't shine it in your eyes!" id = "laser_pointer" req_tech = list(TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 100, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 100, "glass" = 50, MAT_COPPER = 10) build_path = /obj/item/device/laser_pointer sort_string = "TAABA" @@ -25,7 +25,7 @@ datum/design/item/general/laserpointer name = "handheld translator" id = "translator" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000, MAT_COPPER = 50) build_path = /obj/item/device/universal_translator sort_string = "TAACA" @@ -33,7 +33,7 @@ datum/design/item/general/laserpointer name = "earpiece translator" id = "ear_translator" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5) //It's been hella miniaturized. - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "gold" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "gold" = 1000, MAT_COPPER = 50) build_path = /obj/item/device/universal_translator/ear sort_string = "TAACB" @@ -51,7 +51,7 @@ datum/design/item/general/laserpointer desc = "Allows for deciphering the binary channel on-the-fly." id = "binaryencrypt" req_tech = list(TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300) + materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300, MAT_COPPER = 30) build_path = /obj/item/device/encryptionkey/binary sort_string = "TBAAA" @@ -60,7 +60,7 @@ datum/design/item/general/laserpointer desc = "A kit of dangerous, high-tech equipment with changeable looks." id = "chameleon" req_tech = list(TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500) + materials = list(MAT_PLASTIC = 500, MAT_COPPER = 500, DEFAULT_WALL_MATERIAL = 500) build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon sort_string = "TBAAB" diff --git a/code/modules/research/designs/misc_vr.dm b/code/modules/research/designs/misc_vr.dm index d26f24ed59..bd0aff6942 100644 --- a/code/modules/research/designs/misc_vr.dm +++ b/code/modules/research/designs/misc_vr.dm @@ -1,24 +1,32 @@ +/datum/design/item/general/hyperfiber_jumpsuit + name = "HYPER jumpsuit" + id = "hfjumpsuit" + req_tech = list(TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 1000) + build_path = /obj/item/clothing/under/hyperfiber + sort_string = "TAVAA" + /datum/design/item/general/bluespace_jumpsuit name = "Bluespace jumpsuit" id = "bsjumpsuit" req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2) materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_GLASS = 4000) - build_path = /obj/item/clothing/under/bluespace + build_path = /obj/item/clothing/under/hyperfiber/bluespace sort_string = "TAVAA" /datum/design/item/general/sizegun name = "Size gun" id = "sizegun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 2000, MAT_URANIUM = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 2000, MAT_COPPER = 2000) build_path = /obj/item/weapon/gun/energy/sizegun - sort_string = "TAVAB" + sort_string = "TAVBA" /datum/design/item/general/bodysnatcher name = "Body Snatcher" id = "bodysnatcher" req_tech = list(TECH_MAGNET = 3, TECH_BIO = 3, TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_GLASS = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_GLASS = 4000, MAT_COPPER = 2000) build_path = /obj/item/device/bodysnatcher sort_string = "TBVAA" @@ -26,14 +34,14 @@ name = "Inducer (Scientific)" id = "inducersci" req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 5, TECH_POWER = 6) - materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GLASS = 2000, MAT_URANIUM = 4000, MAT_PHORON = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 7000, MAT_GLASS = 2000, MAT_COPPER = 2000, MAT_URANIUM = 3000, MAT_PHORON = 4000) build_path = /obj/item/weapon/inducer/sci - sort_string = "TAVAB" + sort_string = "TCVAA" /datum/design/item/general/inducer_eng name = "Inducer (Industrial)" id = "inducerind" req_tech = list(TECH_BLUESPACE = 5, TECH_MATERIAL = 7, TECH_POWER = 7) - materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_GLASS = 2000, MAT_URANIUM = 2000, MAT_TITANIUM = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 2500, MAT_GLASS = 2000, MAT_COPPER = 2000, MAT_URANIUM = 1500, MAT_TITANIUM = 1000) build_path = /obj/item/weapon/inducer/unloaded - sort_string = "TAVAC" + sort_string = "TCVAB" diff --git a/code/modules/research/designs/modular_computer.dm b/code/modules/research/designs/modular_computer.dm index e78a776c1c..0a3f2a1eec 100644 --- a/code/modules/research/designs/modular_computer.dm +++ b/code/modules/research/designs/modular_computer.dm @@ -9,14 +9,14 @@ name = "basic hard drive" id = "hdd_basic" req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100, MAT_COPPER = 50) build_path = /obj/item/weapon/computer_hardware/hard_drive/ sort_string = "VAAAA" /datum/design/item/modularcomponent/disk/advanced name = "advanced hard drive" id = "hdd_advanced" - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200, MAT_COPPER = 50) build_path = /obj/item/weapon/computer_hardware/hard_drive/advanced sort_string = "VAAAB" @@ -24,7 +24,7 @@ name = "super hard drive" id = "hdd_super" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 400) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 400, MAT_COPPER = 50) build_path = /obj/item/weapon/computer_hardware/hard_drive/super sort_string = "VAAAC" @@ -32,7 +32,7 @@ name = "cluster hard drive" id = "hdd_cluster" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) - materials = list(DEFAULT_WALL_MATERIAL = 16000, "glass" = 800) + materials = list(DEFAULT_WALL_MATERIAL = 16000, "glass" = 800, MAT_COPPER = 40) build_path = /obj/item/weapon/computer_hardware/hard_drive/cluster sort_string = "VAAAD" @@ -40,7 +40,7 @@ name = "small hard drive" id = "hdd_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200, MAT_COPPER = 30) build_path = /obj/item/weapon/computer_hardware/hard_drive/small sort_string = "VAAAE" @@ -48,7 +48,7 @@ name = "micro hard drive" id = "hdd_micro" req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100, MAT_COPPER = 20) build_path = /obj/item/weapon/computer_hardware/hard_drive/micro sort_string = "VAAAF" @@ -58,7 +58,7 @@ name = "basic network card" id = "netcard_basic" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 100) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 100, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/network_card sort_string = "VBAAA" @@ -66,7 +66,7 @@ name = "advanced network card" id = "netcard_advanced" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/network_card/advanced sort_string = "VBAAB" @@ -74,7 +74,7 @@ name = "wired network card" id = "netcard_wired" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 400) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 400, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/network_card/wired sort_string = "VBAAC" @@ -84,7 +84,7 @@ name = "standard battery module" id = "bat_normal" req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) - materials = list(DEFAULT_WALL_MATERIAL = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/battery_module sort_string = "VCAAA" @@ -92,7 +92,7 @@ name = "advanced battery module" id = "bat_advanced" req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/battery_module/advanced sort_string = "VCAAB" @@ -100,7 +100,7 @@ name = "super battery module" id = "bat_super" req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 8000) + materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/battery_module/super sort_string = "VCAAC" @@ -108,7 +108,7 @@ name = "ultra battery module" id = "bat_ultra" req_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4) - materials = list(DEFAULT_WALL_MATERIAL = 16000) + materials = list(DEFAULT_WALL_MATERIAL = 16000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/battery_module/ultra sort_string = "VCAAD" @@ -116,7 +116,7 @@ name = "nano battery module" id = "bat_nano" req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) - materials = list(DEFAULT_WALL_MATERIAL = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/battery_module/nano sort_string = "VCAAE" @@ -124,7 +124,7 @@ name = "micro battery module" id = "bat_micro" req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/battery_module/micro sort_string = "VCAAF" @@ -134,7 +134,7 @@ name = "computer processor unit" id = "cpu_normal" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 8000) + materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/processor_unit sort_string = "VDAAA" @@ -142,7 +142,7 @@ name = "computer microprocessor unit" id = "cpu_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/processor_unit/small sort_string = "VDAAB" @@ -150,7 +150,7 @@ name = "computer photonic processor unit" id = "pcpu_normal" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) - materials = list(DEFAULT_WALL_MATERIAL = 32000, glass = 8000) + materials = list(DEFAULT_WALL_MATERIAL = 32000, glass = 8000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic sort_string = "VDAAC" @@ -158,7 +158,7 @@ name = "computer photonic microprocessor unit" id = "pcpu_small" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small sort_string = "VDAAD" @@ -168,7 +168,7 @@ name = "RFID card slot" id = "cardslot" req_tech = list(TECH_DATA = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/card_slot sort_string = "VEAAA" @@ -176,7 +176,7 @@ name = "nano printer" id = "nanoprinter" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 3000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/nano_printer sort_string = "VEAAB" @@ -184,7 +184,7 @@ name = "tesla link" id = "teslalink" req_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10000) + materials = list(DEFAULT_WALL_MATERIAL = 10000, MAT_PHORON = 350, MAT_GOLD = 500) build_path = /obj/item/weapon/computer_hardware/tesla_link sort_string = "VEAAC" @@ -198,7 +198,7 @@ name = "basic data crystal" id = "portadrive_basic" req_tech = list(TECH_DATA = 1) - materials = list("glass" = 8000) + materials = list("glass" = 8000, MAT_COPPER = 10) build_path = /obj/item/weapon/computer_hardware/hard_drive/portable sort_string = "VFAAA" @@ -206,7 +206,7 @@ name = "advanced data crystal" id = "portadrive_advanced" req_tech = list(TECH_DATA = 2) - materials = list("glass" = 16000) + materials = list("glass" = 16000, MAT_COPPER = 20) build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced sort_string = "VFAAB" @@ -214,6 +214,6 @@ name = "super data crystal" id = "portadrive_super" req_tech = list(TECH_DATA = 4) - materials = list("glass" = 32000) + materials = list("glass" = 32000, MAT_COPPER = 60) build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super sort_string = "VFAAC" diff --git a/code/modules/research/designs/pdas.dm b/code/modules/research/designs/pdas.dm index 78fd01ec23..fe5d9b432e 100644 --- a/code/modules/research/designs/pdas.dm +++ b/code/modules/research/designs/pdas.dm @@ -5,7 +5,7 @@ desc = "Cheaper than whiny non-digital assistants." id = "pda" req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 10) build_path = /obj/item/device/pda sort_string = "WAAAA" diff --git a/code/modules/research/designs/power_cells.dm b/code/modules/research/designs/power_cells.dm index 748541d520..c372fd9d63 100644 --- a/code/modules/research/designs/power_cells.dm +++ b/code/modules/research/designs/power_cells.dm @@ -20,7 +20,7 @@ build_type = PROTOLATHE | MECHFAB id = "basic_cell" req_tech = list(TECH_POWER = 1) - materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50, MAT_COPPER = 15) build_path = /obj/item/weapon/cell category = list("Misc") sort_string = "BAAAA" @@ -30,7 +30,7 @@ build_type = PROTOLATHE | MECHFAB id = "high_cell" req_tech = list(TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60, MAT_COPPER = 15) build_path = /obj/item/weapon/cell/high category = list("Misc") sort_string = "BAAAB" @@ -39,7 +39,7 @@ name = "super-capacity" id = "super_cell" req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70, MAT_COPPER = 15) build_path = /obj/item/weapon/cell/super category = list("Misc") sort_string = "BAAAC" @@ -57,7 +57,7 @@ name = "device" build_type = PROTOLATHE id = "device" - materials = list(DEFAULT_WALL_MATERIAL = 350, "glass" = 25) + materials = list(DEFAULT_WALL_MATERIAL = 350, "glass" = 25, MAT_COPPER = 5) build_path = /obj/item/weapon/cell/device category = list("Misc") sort_string = "BAABA" @@ -67,7 +67,7 @@ name = "device, advanced" build_type = PROTOLATHE id = "advance_device" - materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50, MAT_COPPER = 15) build_path = /obj/item/weapon/cell/device/weapon category = list("Misc") sort_string = "BAABB" @@ -76,7 +76,7 @@ name = "device, super" id = "super_device" req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70, "gold" = 50, "silver" = 20,) + materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70, "gold" = 50, "silver" = 20, MAT_COPPER = 15) build_path = /obj/item/weapon/cell/device/super category = list("Misc") sort_string = "BAABC" @@ -85,7 +85,7 @@ name = "device, hyper" id = "hyper_device" req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 1400, "glass" = 1400, "gold" = 150, "silver" = 150) + materials = list(DEFAULT_WALL_MATERIAL = 1400, "glass" = 1400, "gold" = 150, "silver" = 150, MAT_COPPER = 50) build_path = /obj/item/weapon/cell/device/hyper category = list("Misc") sort_string = "BAABD" diff --git a/code/modules/research/designs/stock_parts.dm b/code/modules/research/designs/stock_parts.dm index 18e3c01616..2fc1e8dbff 100644 --- a/code/modules/research/designs/stock_parts.dm +++ b/code/modules/research/designs/stock_parts.dm @@ -40,14 +40,14 @@ /datum/design/item/stock_part/hyper_matter_bin id = "hyper_matter_bin" req_tech = list(TECH_MATERIAL = 6, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 60, MAT_DURASTEEL = 75) + materials = list(MAT_ALUMINIUM = 200, MAT_VERDANTIUM = 60, MAT_TITANIUM = 75) build_path = /obj/item/weapon/stock_parts/matter_bin/hyper sort_string = "AAAAD" /datum/design/item/stock_part/omni_matter_bin id = "omni_matter_bin" req_tech = list(TECH_MATERIAL = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 100, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + materials = list(MAT_TITANIUM = 2000, MAT_PLASTEEL = 100, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/matter_bin/omni sort_string = "AAAAE" @@ -77,14 +77,14 @@ /datum/design/item/stock_part/hyper_mani id = "hyper_mani" req_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 50) + materials = list(MAT_ALUMINIUM = 200, MAT_VERDANTIUM = 50, MAT_TITANIUM = 50) build_path = /obj/item/weapon/stock_parts/manipulator/hyper sort_string = "AAABD" /datum/design/item/stock_part/omni_mani id = "omni_mani" req_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + materials = list(MAT_ALUMINIUM = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/manipulator/omni sort_string = "AAABE" @@ -93,14 +93,14 @@ /datum/design/item/stock_part/basic_capacitor id = "basic_capacitor" req_tech = list(TECH_POWER = 1) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 10) build_path = /obj/item/weapon/stock_parts/capacitor sort_string = "AAACA" /datum/design/item/stock_part/adv_capacitor id = "adv_capacitor" req_tech = list(TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, MAT_COPPER = 10) build_path = /obj/item/weapon/stock_parts/capacitor/adv sort_string = "AAACB" @@ -114,7 +114,7 @@ /datum/design/item/stock_part/hyper_capacitor id = "hyper_capacitor" req_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_DURASTEEL = 25) + materials = list(MAT_ALUMINIUM = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_TITANIUM = 25) build_path = /obj/item/weapon/stock_parts/capacitor/hyper sort_string = "AAACD" @@ -130,14 +130,14 @@ /datum/design/item/stock_part/basic_sensor id = "basic_sensor" req_tech = list(TECH_MAGNET = 1) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, MAT_COPPER = 10) build_path = /obj/item/weapon/stock_parts/scanning_module sort_string = "AAADA" /datum/design/item/stock_part/adv_sensor id = "adv_sensor" req_tech = list(TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, MAT_COPPER = 10) build_path = /obj/item/weapon/stock_parts/scanning_module/adv sort_string = "AAADB" @@ -151,14 +151,14 @@ /datum/design/item/stock_part/hyper_sensor id = "hyper_sensor" req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 4, TECH_ARCANE = 1) - materials = list(DEFAULT_WALL_MATERIAL = 50, MAT_GLASS = 20, MAT_SILVER = 50, MAT_VERDANTIUM = 40, MAT_DURASTEEL = 50) + materials = list(MAT_ALUMINIUM = 50, MAT_GLASS = 20, MAT_SILVER = 50, MAT_VERDANTIUM = 40, MAT_TITANIUM = 50) build_path = /obj/item/weapon/stock_parts/scanning_module/hyper sort_string = "AAADD" /datum/design/item/stock_part/omni_sensor id = "omni_sensor" req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) - materials = list(DEFAULT_WALL_MATERIAL = 1000, MAT_PLASTEEL = 500, MAT_GLASS = 750, MAT_SILVER = 500, MAT_MORPHIUM = 60, MAT_DURASTEEL = 100) + materials = list(MAT_ALUMINIUM = 1000, MAT_TITANIUM = 500, MAT_GLASS = 750, MAT_SILVER = 500, MAT_MORPHIUM = 60, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/scanning_module/omni sort_string = "AAADE" @@ -188,14 +188,14 @@ /datum/design/item/stock_part/hyper_micro_laser id = "hyper_micro_laser" req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 6, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 100) + materials = list(MAT_ALUMINIUM = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_TITANIUM = 100) build_path = /obj/item/weapon/stock_parts/micro_laser/hyper sort_string = "AAAED" /datum/design/item/stock_part/omni_micro_laser id = "omni_micro_laser" req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100) + materials = list(MAT_TITANIUM = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/micro_laser/omni sort_string = "AAAEE" diff --git a/code/modules/research/designs/weapons.dm b/code/modules/research/designs/weapons.dm index 8ccda5b7f0..117f5620b3 100644 --- a/code/modules/research/designs/weapons.dm +++ b/code/modules/research/designs/weapons.dm @@ -22,21 +22,21 @@ /datum/design/item/weapon/energy/stunrevolver id = "stunrevolver" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 30) build_path = /obj/item/weapon/gun/energy/stunrevolver sort_string = "MAAAA" /datum/design/item/weapon/energy/nuclear_gun id = "nuclear_gun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500, MAT_COPPER = 50) build_path = /obj/item/weapon/gun/energy/gun/nuclear sort_string = "MAAAB" /datum/design/item/weapon/energy/phoronpistol id = "ppistol" req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000, MAT_COPPER = 50) build_path = /obj/item/weapon/gun/energy/toxgun sort_string = "MAAAC" @@ -44,14 +44,14 @@ desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core." id = "lasercannon" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) + materials = list(MAT_TITANIUM = 5000, MAT_BOROSILICATE = 1000, "diamond" = 2000, MAT_COPPER = 50) build_path = /obj/item/weapon/gun/energy/lasercannon sort_string = "MAAAD" /datum/design/item/weapon/energy/decloner id = "decloner" req_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6) - materials = list("gold" = 5000,"uranium" = 10000) + materials = list(MAT_TITANIUM = 2750, "gold" = 5000,"uranium" = 10000) build_path = /obj/item/weapon/gun/energy/decloner sort_string = "MAAAE" @@ -59,14 +59,14 @@ desc = "A gun that shoots high-powered glass-encased energy temperature bullets." id = "temp_gun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000) + materials = list(MAT_ALUMINIUM = 5000, "glass" = 500, "silver" = 3000) build_path = /obj/item/weapon/gun/energy/temperature sort_string = "MAAAF" /datum/design/item/weapon/energy/flora_gun id = "flora_gun" req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) + materials = list(MAT_ALUMINIUM = 2000, "glass" = 500, "uranium" = 500) build_path = /obj/item/weapon/gun/energy/floragun sort_string = "MAAAG" @@ -117,6 +117,15 @@ build_path = /obj/item/weapon/storage/box/empshells sort_string = "MABBC" +/datum/design/item/weapon/ballistic/ammo/ptrshell + name = "14.5mm shell" + desc = "A dense-core projectile fired from a small cannon." + id = "ptrshell" + req_tech = list(TECH_COMBAT = 7, TECH_ILLEGAL = 4) + materials = list(MAT_TITANIUM = 4000, MAT_URANIUM = 500, MAT_PLASTEEL = 500) + build_path = /obj/item/ammo_casing/a145 + sort_string = "MABBD" + // Phase weapons /datum/design/item/weapon/phase/AssembleDesignName() @@ -127,14 +136,14 @@ /datum/design/item/weapon/phase/phase_pistol id = "phasepistol" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 30) build_path = /obj/item/weapon/gun/energy/phasegun/pistol sort_string = "MACAA" /datum/design/item/weapon/phase/phase_carbine id = "phasecarbine" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500, MAT_COPPER = 40) build_path = /obj/item/weapon/gun/energy/phasegun sort_string = "MACAB" @@ -158,7 +167,7 @@ /datum/design/item/weapon/rapidsyringe id = "rapidsyringe" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, MAT_COPPER = 20) build_path = /obj/item/weapon/gun/launcher/syringe/rapid sort_string = "MADAA" @@ -174,7 +183,7 @@ desc = "An advanced chem spraying device." id = "chemsprayer" req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, MAT_COPPER = 30) build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer sort_string = "MADAC" diff --git a/code/modules/research/designs/weapons_vr.dm b/code/modules/research/designs/weapons_vr.dm index 6962d2d869..6a1dcbdf0b 100644 --- a/code/modules/research/designs/weapons_vr.dm +++ b/code/modules/research/designs/weapons_vr.dm @@ -13,7 +13,7 @@ desc = "The 'Protector' is an advanced energy gun that cannot be fired in lethal mode on low security alert levels, but features DNA locking and a powerful stun." id = "protector" req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "silver" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, MAT_COPPER = 500, "silver" = 1000) build_path = /obj/item/weapon/gun/energy/gun/protector sort_string = "MAAVA" @@ -21,7 +21,7 @@ desc = "A 'Sickshot' is a 4-shot energy revolver that causes nausea and confusion." id = "sickshot" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000, MAT_COPPER = 500) build_path = /obj/item/weapon/gun/energy/sickshot sort_string = "MAAVB" @@ -29,7 +29,7 @@ desc = "The \"Varmint Catcher\" is an energy net projector designed to immobilize dangerous wildlife." id = "netgun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 3000, MAT_COPPER = 500) build_path = /obj/item/weapon/gun/energy/netgun sort_string = "MAAVC" @@ -53,7 +53,7 @@ name = "Advanced anti-particle rifle" id = "advparticle" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 5, TECH_POWER = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "gold" = 1000, "uranium" = 750) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, MAT_COPPER = 250, "gold" = 1000, "uranium" = 750) build_path = /obj/item/weapon/gun/energy/particle/advanced sort_string = "MAAUA" @@ -61,7 +61,7 @@ name = "Anti-particle cannon" id = "particlecannon" req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1500, "gold" = 2000, "uranium" = 1000, "diamond" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1500, MAT_COPPER = 1000, "gold" = 2000, "uranium" = 1000, "diamond" = 2000) build_path = /obj/item/weapon/gun/energy/particle/cannon sort_string = "MAAUB" @@ -83,7 +83,7 @@ name = "cell-loaded revolver" id = "nsfw_prototype" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 4, TECH_COMBAT = 7) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6000, "phoron" = 8000, "uranium" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6000, MAT_COPPER = 4000, "phoron" = 6000, "uranium" = 2000) build_path = /obj/item/weapon/gun/projectile/cell_loaded/combat/prototype sort_string = "MAVAA" @@ -103,7 +103,7 @@ name = "STUN" id = "nsfw_cell_stun" req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 2, TECH_POWER = 3, TECH_COMBAT = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, MAT_COPPER = 1000) build_path = /obj/item/ammo_casing/microbattery/combat/stun sort_string = "MAVCA" @@ -111,7 +111,7 @@ name = "LETHAL" id = "nsfw_cell_lethal" req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 3, TECH_COMBAT = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "phoron" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, MAT_COPPER = 1000, "phoron" = 2000) build_path = /obj/item/ammo_casing/microbattery/combat/lethal sort_string = "MAVCB" @@ -119,7 +119,7 @@ name = "NET" id = "nsfw_cell_net" req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 3, TECH_COMBAT = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "uranium" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, MAT_COPPER = 1000, "uranium" = 2000) build_path = /obj/item/ammo_casing/microbattery/combat/net sort_string = "MAVCC" @@ -127,7 +127,7 @@ name = "ION" id = "nsfw_cell_ion" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 5, TECH_COMBAT = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, MAT_COPPER = 1000, "silver" = 3000) build_path = /obj/item/ammo_casing/microbattery/combat/ion sort_string = "MAVCD" @@ -135,7 +135,7 @@ name = "SCATTERSTUN" id = "nsfw_cell_shotstun" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 6, TECH_COMBAT = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 2000, "gold" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, MAT_COPPER = 2000, "silver" = 2000, "gold" = 2000) build_path = /obj/item/ammo_casing/microbattery/combat/shotstun sort_string = "MAVCE" @@ -143,7 +143,7 @@ name = "XRAY" id = "nsfw_cell_xray" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 5, TECH_COMBAT = 7) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 1000, "gold" = 1000, "uranium" = 1000, "phoron" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, MAT_COPPER = 2000, "silver" = 1000, "gold" = 1000, "uranium" = 1000, "phoron" = 1000) build_path = /obj/item/ammo_casing/microbattery/combat/xray sort_string = "MAVCF" */ @@ -154,7 +154,7 @@ name = "STRIPPER" id = "nsfw_cell_stripper" req_tech = list(TECH_MATERIAL = 7, TECH_BIO = 4, TECH_POWER = 4, TECH_COMBAT = 4, TECH_ILLEGAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "uranium" = 2000, "phoron" = 2000, "diamond" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, MAT_COPPER = 2000, "uranium" = 2000, "phoron" = 2000, "diamond" = 500) build_path = /obj/item/ammo_casing/microbattery/combat/stripper sort_string = "MAVCG" diff --git a/code/modules/research/designs/xenoarch_toys.dm b/code/modules/research/designs/xenoarch_toys.dm index 7c69090b1b..99292d08f3 100644 --- a/code/modules/research/designs/xenoarch_toys.dm +++ b/code/modules/research/designs/xenoarch_toys.dm @@ -9,7 +9,7 @@ id = "ano_scanner" desc = "Aids in triangulation of exotic particles." req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000, MAT_COPPER = 20) build_path = /obj/item/device/ano_scanner sort_string = "GAAAA" @@ -18,7 +18,7 @@ id = "xenoarch_multitool" req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) build_path = /obj/item/device/xenoarch_multi_tool - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500, MAT_COPPER = 40) sort_string = "GAAAB" /datum/design/item/weapon/xenoarch/excavationdrill @@ -26,6 +26,6 @@ id = "excavationdrill" req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000, MAT_COPPER = 30) build_path = /obj/item/weapon/pickaxe/excavationdrill sort_string = "GAAAC" \ No newline at end of file diff --git a/code/modules/research/designs/xenobio_toys.dm b/code/modules/research/designs/xenobio_toys.dm index 917f8ba6c3..feb8d04f2c 100644 --- a/code/modules/research/designs/xenobio_toys.dm +++ b/code/modules/research/designs/xenobio_toys.dm @@ -7,14 +7,14 @@ /datum/design/item/weapon/xenobio/slimebaton id = "slimebaton" req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_POWER = 3, TECH_COMBAT = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, MAT_COPPER = 30) build_path = /obj/item/weapon/melee/baton/slime sort_string = "HAAAA" /datum/design/item/weapon/xenobio/slimetaser id = "slimetaser" req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 5000, MAT_COPPER = 40) build_path = /obj/item/weapon/gun/energy/taser/xeno sort_string = "HAAAB" @@ -25,6 +25,6 @@ desc = "A hand-held body scanner able to learn information about slimes." id = "slime_scanner" req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500, MAT_COPPER = 30) build_path = /obj/item/device/slime_scanner sort_string = "HBAAA" \ No newline at end of file diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 53a0c98ddf..7087cd7fed 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -357,11 +357,13 @@ name = "PBT \"Pacifier\" Mounted Taser" id = "mech_taser" build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser + materials = list(DEFAULT_WALL_MATERIAL = 6500, MAT_COPPER = 1000) /datum/design/item/mecha/rigged_taser name = "Jury-Rigged Taser" id = "mech_taser-r" build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser/rigged + materials = list(DEFAULT_WALL_MATERIAL = 6500, MAT_COPPER = 200) /datum/design/item/mecha/shocker name = "Exosuit Electrifier" @@ -435,6 +437,13 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/xray materials = list(DEFAULT_WALL_MATERIAL = 9000, "glass" = 3000, "phoron" = 1000, "silver" = 1500, "gold" = 2500, "plastic" = 2000) +/datum/design/item/mecha/weapon/laser_gamma //CHOMPedit begin : add Gamma Laser + name = "GA-X \"Render\" Experimental Gamma Laser" + id = "mech_laser_gamma" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_PHORON = 4, TECH_POWER = 5, TECH_ILLEGAL = 3) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/gamma + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 4000, "phoron" = 2500, "silver" = 1000, "gold" = 500, "uranium" = 3000) //CHOMPedit end + /datum/design/item/mecha/weapon/rigged_laser_xray name = "Jury-Rigged Xray Rifle" id = "mech_laser_xray-r" @@ -566,7 +575,7 @@ desc = "Automated repair droid, exosuits' best companion. BEEP BOOP" id = "mech_repair_droid" req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 7500, "gold" = 750, "silver" = 1500, "glass" = 3750) + materials = list(DEFAULT_WALL_MATERIAL = 7500, "gold" = 750, "silver" = 1500, MAT_ALUMINIUM = 3750) build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid /datum/design/item/mecha/combat_shield @@ -590,7 +599,7 @@ desc = "Deploys a small medical drone capable of patching small wounds in order to stabilize nearby patients." id = "mech_med_droid" req_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_BIO = 5, TECH_DATA = 4, TECH_ARCANE = 1) - materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_SILVER = 3000, MAT_VERDANTIUM = 2500, MAT_GLASS = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_ALUMINIUM = 3750, MAT_VERDANTIUM = 2500, MAT_GLASS = 3000) build_path = /obj/item/mecha_parts/mecha_equipment/crisis_drone /datum/design/item/mecha/rad_drone @@ -598,7 +607,7 @@ desc = "Deploys a small hazmat drone capable of purging minor radiation damage in order to stabilize nearby patients." id = "mech_rad_droid" req_tech = list(TECH_PHORON = 4, TECH_MAGNET = 5, TECH_BIO = 6, TECH_DATA = 4, TECH_ARCANE = 1) - materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_URANIUM = 3000, MAT_VERDANTIUM = 2500, MAT_GLASS = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 8000, MAT_GOLD = 2000, MAT_ALUMINIUM = 2500, MAT_URANIUM = 1000, MAT_VERDANTIUM = 1000, MAT_GLASS = 3000) build_path = /obj/item/mecha_parts/mecha_equipment/crisis_drone/rad /datum/design/item/mecha/medanalyzer @@ -606,7 +615,7 @@ desc = "An advanced mech-mounted device that is not quite as powerful as a stationary body scanner, though still suitably powerful." id = "mech_med_analyzer" req_tech = list(TECH_PHORON = 4, TECH_MAGNET = 5, TECH_BIO = 5, TECH_DATA = 4) - materials = list(MAT_PLASTEEL = 4500, MAT_GOLD = 2000, MAT_URANIUM = 3000, MAT_GLASS = 3000) + materials = list(MAT_ALUMINIUM = 4500, MAT_GOLD = 2000, MAT_URANIUM = 3000, MAT_GLASS = 3000) build_path = /obj/item/mecha_parts/mecha_equipment/tool/powertool/medanalyzer /datum/design/item/mecha/jetpack @@ -615,7 +624,7 @@ id = "mech_jetpack" req_tech = list(TECH_ENGINEERING = 3, TECH_MAGNET = 4) //One less magnet than the actual got-damn teleporter. build_path = /obj/item/mecha_parts/mecha_equipment/tool/jetpack - materials = list(DEFAULT_WALL_MATERIAL = 7500, "silver" = 300, "glass" = 600) + materials = list(MAT_ALUMINIUM = 7500, "silver" = 300, "glass" = 600) /datum/design/item/mecha/phoron_generator desc = "Phoron Reactor" @@ -660,7 +669,7 @@ desc = "A heavy duty bore. Bigger, better, stronger than the core sampler, but not quite as good as a large drill." id = "mech_ground_drill" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 2, TECH_PHORON = 1) - materials = list(DEFAULT_WALL_MATERIAL = 7000, "silver" = 3000, "phoron" = 2000) + materials = list(MAT_ALUMINIUM = 5000, "silver" = 3000, DEFAULT_WALL_MATERIAL = 2000) build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/bore /datum/design/item/mecha/orescanner @@ -668,7 +677,7 @@ desc = "A hefty device used to scan for subterranean veins of ore." id = "mech_ore_scanner" req_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 1000) + materials = list(MAT_ALUMINIUM = 3000, MAT_COPPER = 1000, "glass" = 1000) build_path = /obj/item/mecha_parts/mecha_equipment/tool/orescanner /datum/design/item/mecha/advorescanner @@ -676,7 +685,7 @@ desc = "A hefty device used to scan for the exact volumes of subterranean veins of ore." id = "mech_ore_scanner_adv" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_POWER = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "osmium" = 3000, "silver" = 1000) + materials = list(MAT_ALUMINIUM = 5000, "osmium" = 3000, "silver" = 1000) build_path = /obj/item/mecha_parts/mecha_equipment/tool/orescanner/advanced /datum/design/item/mecha/runningboard @@ -748,15 +757,15 @@ desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy." id = "mech_generator_nuclear" req_tech = list(TECH_POWER= 3, TECH_ENGINEERING = 3, TECH_MATERIAL = 3) - materials = list(DEFAULT_WALL_MATERIAL = 7500, "silver" = 375, "glass" = 750) + materials = list(MAT_ALUMINIUM = 7500, "silver" = 375, MAT_LEAD = 1250) build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear /datum/design/item/mecha/speedboost_ripley name = "Ripley Leg Actuator Overdrive" desc = "System enhancements and overdrives to make a mech's legs move faster." id = "mech_speedboost_ripley" - req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4, TECH_ENGINEERING = 4) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 1000, "gold" = 1000) + req_tech = list( TECH_POWER = 5, TECH_MATERIAL = 4, TECH_ENGINEERING = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, MAT_ALUMINIUM = 1000, "gold" = 1000) build_path = /obj/item/mecha_parts/mecha_equipment/speedboost /datum/design/item/synthetic_flash @@ -782,7 +791,7 @@ desc = "A space-bike's un-assembled frame." id = "vehicle_chassis_spacebike" req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 6, TECH_BLUESPACE = 3, TECH_PHORON = 3) - materials = list(DEFAULT_WALL_MATERIAL = 12000, "silver" = 3000, "phoron" = 3000, "osmium" = 1000) + materials = list(MAT_ALUMINIUM = 9000, "silver" = 3000, "phoron" = 3000, "osmium" = 1000) build_path = /obj/item/weapon/vehicle_assembly/spacebike /datum/design/item/mechfab/vehicle/quadbike_chassis @@ -924,7 +933,7 @@ desc = "A compact cleaning-foam grenade system for a hardsuit." id = "rig_grenade_cleanfoam" req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2, TECH_POWER = 2) - materials = list(MAT_PLASTEEL = 2000, MAT_GLASS = 1000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 750) + materials = list(MAT_ALUMINIUM = 2000, MAT_GLASS = 1000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 750) build_path = /obj/item/rig_module/cleaner_launcher /datum/design/item/mechfab/rigsuit/taser @@ -932,7 +941,7 @@ desc = "A compact taser system for a hardsuit." id = "rig_gun_taser" req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 3, TECH_MAGNET = 2, TECH_POWER = 3, TECH_COMBAT = 2) - materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500) + materials = list(MAT_ALUMINIUM = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500) build_path = /obj/item/rig_module/mounted/taser /datum/design/item/mechfab/rigsuit/egun @@ -956,7 +965,7 @@ desc = "A compact overclocking system for a hardsuit." id = "rig_component_sprinter" req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_BIO = 4, TECH_POWER = 4) - materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_VERDANTIUM = 1000) + materials = list(MAT_ALUMINIUM = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_VERDANTIUM = 1000) build_path = /obj/item/rig_module/sprinter /datum/design/item/mechfab/rigsuit/meson @@ -964,7 +973,7 @@ desc = "A compact meson visor for a hardsuit." id = "rig_component_meson" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 5, TECH_MAGNET = 3, TECH_POWER = 4) - materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500) + materials = list(MAT_ALUMINIUM = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500) build_path = /obj/item/rig_module/vision/meson /datum/design/item/mechfab/rigsuit/material @@ -972,7 +981,7 @@ desc = "A compact material visor for a hardsuit." id = "rig_component_material" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 5, TECH_MAGNET = 3, TECH_POWER = 4) - materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500) + materials = list(MAT_ALUMINIUM = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500) build_path = /obj/item/rig_module/vision/material /datum/design/item/mechfab/rigsuit/nvg @@ -980,7 +989,7 @@ desc = "A compact night-vision visor for a hardsuit." id = "rig_component_nvg" req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 6, TECH_MAGNET = 4, TECH_POWER = 5) - materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500, MAT_URANIUM = 1000) + materials = list(MAT_ALUMINIUM = 2000, MAT_GRAPHITE = 1500, MAT_OSMIUM = 500, MAT_URANIUM = 1000) build_path = /obj/item/rig_module/vision/nvg /datum/design/item/mechfab/rigsuit/sechud @@ -988,7 +997,7 @@ desc = "A compact security visor for a hardsuit." id = "rig_component_sechud" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_MAGNET = 3, TECH_POWER = 2) - materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_SILVER = 500) + materials = list(MAT_ALUMINIUM = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_SILVER = 500) build_path = /obj/item/rig_module/vision/sechud /datum/design/item/mechfab/rigsuit/medhud @@ -996,7 +1005,7 @@ desc = "A compact medical visor for a hardsuit." id = "rig_component_medhud" req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_MAGNET = 3, TECH_BIO = 2) - materials = list(MAT_PLASTEEL = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_SILVER = 500) + materials = list(MAT_ALUMINIUM = 2000, MAT_GRAPHITE = 1500, MAT_PLASTIC = 500, MAT_SILVER = 500) build_path = /obj/item/rig_module/vision/medhud /datum/design/item/mechfab/rigsuit/voice @@ -1028,7 +1037,7 @@ desc = "A compact chemical injector network for a hardsuit." id = "rig_component_chemicals" req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_MAGNET = 5, TECH_BIO = 4) - materials = list(MAT_PLASTEEL = 3000, MAT_GRAPHITE = 2000, MAT_PLASTIC = 3500, MAT_SILVER = 1750, MAT_GOLD = 1250) + materials = list(MAT_ALUMINIUM = 3000, MAT_GRAPHITE = 2000, MAT_PLASTIC = 3500, MAT_SILVER = 1750, MAT_GOLD = 1250) build_path = /obj/item/rig_module/chem_dispenser/injector/advanced/empty /datum/design/item/mechfab/rigsuit/teleporter @@ -1045,7 +1054,7 @@ build_path = /obj/item/device/uav time = 20 req_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 5, TECH_PHORON = 3, TECH_MAGNET = 4, TECH_POWER = 6) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6000, "silver" = 4000) + materials = list(MAT_ALUMINIUM = 5000, "glass" = 6000, MAT_COPPER = 4000) // Exosuit Internals @@ -1067,7 +1076,7 @@ category = list("Exosuit Internals") id = "exo_int_armor_lightweight" req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, MAT_PLASTIC = 3000) + materials = list(MAT_ALUMINIUM = 5000, MAT_PLASTIC = 3000) build_path = /obj/item/mecha_parts/component/armor/lightweight /datum/design/item/mechfab/exointernal/reinf_armor @@ -1193,4 +1202,4 @@ id = "exo_int_actuator_overclock" req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4) materials = list(MAT_PLASTEEL = 10000, MAT_OSMIUM = 3000, MAT_GOLD = 5000) - build_path = /obj/item/mecha_parts/component/actuator/hispeed \ No newline at end of file + build_path = /obj/item/mecha_parts/component/actuator/hispeed diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 8f932b0082..5fc685bf1d 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -357,10 +357,15 @@ build_path = /obj/item/robot_parts/robot_component/camera /datum/design/item/prosfab/cyborg/component/armour - name = "Armour Plating" + name = "Armour Plating (Robot)" id = "armour" build_path = /obj/item/robot_parts/robot_component/armour +/datum/design/item/prosfab/cyborg/component/armour_heavy + name = "Armour Plating (Platform)" + id = "platform_armour" + build_path = /obj/item/robot_parts/robot_component/armour_platform + /datum/design/item/prosfab/cyborg/component/ai_shell name = "AI Remote Interface" id = "mmi_ai_shell" diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index d12441c8fe..97a8274391 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -40,6 +40,16 @@ /obj/machinery/r_n_d/protolathe/Initialize() . = ..() + +// Go through all materials, and add them to the possible storage, but hide them unless we contain them. + for(var/Name in name_to_material) + if(Name in materials) + continue + + hidden_materials |= Name + + materials[Name] = 0 + default_apply_parts() /obj/machinery/r_n_d/protolathe/process() @@ -246,4 +256,4 @@ return materials[material] -= ejected * S.perunit if(recursive && materials[material] >= S.perunit) - eject_materials(material, -1) \ No newline at end of file + eject_materials(material, -1) diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 663df30bf7..8e4578fd25 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -224,6 +224,7 @@ mannequin.real_name = "Stock [S.name] Body" mannequin.name = mannequin.real_name mannequin.dna.real_name = mannequin.real_name + mannequin.dna.base_species = mannequin.species active_br = new(mannequin, FALSE, FALSE) active_br.speciesname = "Custom Sleeve" update_preview_icon() @@ -384,9 +385,6 @@ ASSERT(istype(B)) var/datum/category_item/player_setup_item/general/basic/G = CG.items_by_name["Basic"] ASSERT(istype(G)) - CG = CC.categories_by_name["VORE"] - var/datum/category_item/player_setup_item/vore/ears/E = CG.items_by_name["Appearance"] - ASSERT(istype(E)) if(params["target_href"] == "bio_gender") var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", active_br.bodygender) as null|anything in G.get_genders() @@ -407,12 +405,6 @@ active_br.mydna.dna.ResetUIFrom(mannequin) update_preview_icon() return 1 - action = E.OnTopic(list2params(href_list), href_list, user) - if(action & TOPIC_UPDATE_PREVIEW && mannequin && active_br) - E.copy_to_mob(mannequin) - active_br.mydna.dna.ResetUIFrom(mannequin) - update_preview_icon() - return 1 // Fake subtype of preferences we can use to steal code from player_setup /datum/preferences/designer/New() diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index 535b53b028..7c2893a21c 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -11,6 +11,7 @@ /datum/category_item/catalogue/technology/resleeving) icon = 'icons/vore/custom_items_vr.dmi' icon_state = "backup_implant" + known_implant = TRUE /obj/item/weapon/implant/backup/get_data() var/dat = {" diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 5600260149..4d911b1c3b 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -142,7 +142,7 @@ return INITIALIZE_HINT_LATELOAD /obj/effect/shuttle_landmark/automatic/clearing/LateInitialize() - ..() + . = ..() for(var/turf/T in range(radius, src)) if(T.density) T.ChangeTurf(get_base_turf_by_area(T)) diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index acc7dc3461..ea11f21d48 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -131,14 +131,14 @@ return autopilot = TRUE autopilot_delay = initial(autopilot_delay) - shuttle_controller.process_shuttles |= src + SSshuttles.process_shuttles |= src if(process_state == IDLE_STATE) process_state = DO_AUTOPILOT else if(!autopilot) return autopilot = FALSE - shuttle_controller.process_shuttles -= src + SSshuttles.process_shuttles -= src if (process_state == DO_AUTOPILOT) process_state = initial(process_state) @@ -196,7 +196,7 @@ log_shuttle("[my_area] shuttle computer couldn't find [lost] sensor!") /obj/machinery/computer/shuttle_control/web/attackby(obj/I, mob/user) - var/datum/shuttle/autodock/web_shuttle/shuttle = shuttle_controller.shuttles[shuttle_tag] + var/datum/shuttle/autodock/web_shuttle/shuttle = SSshuttles.shuttles[shuttle_tag] if(shuttle && istype(I,/obj/item/clothing/head/pilot)) var/obj/item/clothing/head/pilot/H = I H.shuttle_comp = src @@ -418,7 +418,7 @@ // This is called whenever a shuttle is initialized. If its our shuttle, do our thing! /obj/shuttle_connector/proc/setup_routes(var/new_shuttle) - var/datum/shuttle/autodock/web_shuttle/ES = shuttle_controller.shuttles[shuttle_name] + var/datum/shuttle/autodock/web_shuttle/ES = SSshuttles.shuttles[shuttle_name] if(ES != new_shuttle) return // Its not our shuttle! Ignore! if(destinations && istype(ES)) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index 9ed0ce520d..ecbf191741 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -59,6 +59,13 @@ "You have attached [target]'s [E.name] to the [E.amputation_point].") user.drop_from_inventory(E) E.replaced(target) + + // Modular bodyparts (like prosthetics) do not need to be reconnected. + if(E.get_modular_limb_category() != MODULAR_BODYPART_INVALID) + E.status &= ~ORGAN_CUT_AWAY + for(var/obj/item/organ/external/child in E.children) + child.status &= ~ORGAN_CUT_AWAY + target.update_icons_body(FALSE) target.updatehealth() target.UpdateDamageIcon() diff --git a/code/modules/tgs/LICENSE b/code/modules/tgs/LICENSE new file mode 100644 index 0000000000..221f9e1deb --- /dev/null +++ b/code/modules/tgs/LICENSE @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2017 Jordan Brown + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md new file mode 100644 index 0000000000..445cee41f5 --- /dev/null +++ b/code/modules/tgs/README.md @@ -0,0 +1,13 @@ +# DMAPI Internals + +This folder should be placed on it's own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. + +- [includes.dm](./includes.dm) is the file that should be included by DM code, it handles including the rest. +- The [core](./core) folder includes all code not directly part of any API version. +- The other versioned folders contain code for the different DMAPI versions. + - [v3210](./v3210) contains the final TGS3 API. + - [v4](./v4) is the legacy DMAPI 4 (Used in TGS 4.0.X versions). + - [v5](./v5) is the current DMAPI version used by TGS4 >=4.1. +- [LICENSE](./LICENSE) is the MIT license for the DMAPI. + +APIs communicate with TGS in two ways. All versions implement TGS -> DM communication using /world/Topic. DM -> TGS communication, called the bridge method, is different for each version. diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md new file mode 100644 index 0000000000..aa3c7a9c9d --- /dev/null +++ b/code/modules/tgs/core/README.md @@ -0,0 +1,8 @@ +# Core DMAPI functions + +This folder contains all DMAPI code not directly involved in an API. + +- [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals. +- [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code. +- [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement. +- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition \ No newline at end of file diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 0c1117e6bb..41a0473394 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -8,8 +8,6 @@ TGS_ERROR_LOG("Invalid minimum_required_security_level: [minimum_required_security_level]!") return -#define TGS_V3_API //yw edit FORCE THIS SHIT ON HOLY FUCK - #ifdef TGS_V3_API if(minimum_required_security_level != TGS_SECURITY_TRUSTED) TGS_WARNING_LOG("V3 DMAPI requires trusted security!") @@ -42,7 +40,7 @@ if(5) api_datum = /datum/tgs_api/v5 - var/datum/tgs_version/max_api_version = TgsMaximumAPIVersion(); + var/datum/tgs_version/max_api_version = TgsMaximumApiVersion(); if(version.suite != null && version.minor != null && version.patch != null && version.deprecated_patch != null && version.deprefixed_parameter > max_api_version.deprefixed_parameter) TGS_ERROR_LOG("Detected unknown API version! Defaulting to latest. Update the DMAPI to fix this problem.") api_datum = /datum/tgs_api/latest @@ -66,10 +64,10 @@ TGS_WRITE_GLOBAL(tgs, null) TGS_ERROR_LOG("Failed to activate API!") -/world/TgsMaximumAPIVersion() +/world/TgsMaximumApiVersion() return new /datum/tgs_version("5.x.x") -/world/TgsMinimumAPIVersion() +/world/TgsMinimumApiVersion() return new /datum/tgs_version("3.2.x") /world/TgsInitializationComplete() @@ -156,30 +154,3 @@ var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) api.SecurityLevel() - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index ccc75fe344..4d37ed662d 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -50,35 +50,8 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/ChatTargetedBroadcast(message, admin_only) return TGS_UNIMPLEMENTED -/datum/tgs_api/proc/ChatPrivateMessage(message, admin_only) +/datum/tgs_api/proc/ChatPrivateMessage(message, datum/tgs_chat_user/user) return TGS_UNIMPLEMENTED /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm index 66c79c3aea..d884c67477 100644 --- a/code/modules/tgs/includes.dm +++ b/code/modules/tgs/includes.dm @@ -3,8 +3,6 @@ #include "core\datum.dm" #include "core\tgs_version.dm" -#define TGS_V3_API //YW edit makes sure it gets loaded - #ifdef TGS_V3_API #include "v3210\api.dm" #include "v3210\commands.dm" @@ -18,31 +16,5 @@ #include "v5\api_vgs.dm" // VOREStation Edit - Include here so it has access to v5 defines #include "v5\commands.dm" #include "v5\chat_commands.dm" -#include "v5\undef.dm" - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ +#include "v5\chat_commands_zz_ch.dm" +#include "v5\undefs.dm" diff --git a/code/modules/tgs/v3210/README.md b/code/modules/tgs/v3210/README.md new file mode 100644 index 0000000000..f96e7cf3b3 --- /dev/null +++ b/code/modules/tgs/v3210/README.md @@ -0,0 +1,6 @@ +# DMAPI V3 + +This DMAPI implements bridge using file output which TGS monitors for. + +- [api.dm](./api.dm) contains the bulk of the API code. +- [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s. diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index 0fc0076c8b..6382325100 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -39,7 +39,7 @@ var/warned_custom_commands = FALSE /datum/tgs_api/v3210/ApiVersion() - return new /datum/tgs_version("3.2.1.0") + return new /datum/tgs_version("3.2.1.3") /datum/tgs_api/v3210/proc/trim_left(text) for (var/i = 1 to length(text)) @@ -62,7 +62,7 @@ comms_key = world.params[SERVICE_WORLD_PARAM] instance_name = world.params[SERVICE_INSTANCE_PARAM] if(!instance_name) - instance_name = "TG Station Server" //maybe just upgraded + instance_name = "TG Station Server" //maybe just upgraded var/list/logs = file2list(".git/logs/HEAD") if(logs.len) @@ -92,14 +92,14 @@ if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL)) TGS_ERROR_LOG("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.") return - call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval + call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval return TRUE /datum/tgs_api/v3210/OnTopic(T) var/list/params = params2list(T) var/their_sCK = params[SERVICE_CMD_PARAM_KEY] if(!their_sCK) - return FALSE //continue world/Topic + return FALSE //continue world/Topic if(their_sCK != comms_key) return "Invalid comms key!"; @@ -160,7 +160,7 @@ var/datum/tgs_revision_information/test_merge/tm = new tm.number = text2num(I) var/list/entry = json[I] - tm.pull_request_commit = entry["commit"] + tm.head_commit = entry["commit"] tm.author = entry["author"] tm.title = entry["title"] . += tm @@ -176,11 +176,11 @@ return ri /datum/tgs_api/v3210/EndProcess() - sleep(world.tick_lag) //flush the buffers + sleep(world.tick_lag) //flush the buffers ExportService(SERVICE_REQUEST_KILL_PROCESS) /datum/tgs_api/v3210/ChatChannelInfo() - return list() + return list() // :omegalul: /datum/tgs_api/v3210/ChatBroadcast(message, list/channels) if(channels) @@ -226,30 +226,3 @@ #undef SERVICE_REQUEST_API_VERSION #undef SERVICE_RETURN_SUCCESS - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm index 5046631981..4ccfc1a8a6 100644 --- a/code/modules/tgs/v3210/commands.dm +++ b/code/modules/tgs/v3210/commands.dm @@ -19,7 +19,7 @@ TGS_ERROR_LOG("Custom command [command_name] can't be used as it is empty or contains illegal characters!") warned_command_names[command_name] = TRUE continue - + if(command_name_types[command_name]) if(warnings_only) TGS_ERROR_LOG("Custom commands [command_name_types[command_name]] and [stc] have the same name, only [command_name_types[command_name]] will be available!") @@ -42,37 +42,11 @@ var/datum/tgs_chat_command/stc = new command_type var/datum/tgs_chat_user/user = new user.friendly_name = sender + + // Discord hack, fix the mention if it's only numbers (fuck you IRC trolls) + var/regex/discord_id_regex = regex(@"^[0-9]+$") + if(findtext(sender, discord_id_regex)) + sender = "<@[sender]>" + user.mention = sender return stc.Run(user, params) || TRUE - -/* - -#undef SERVICE_JSON_PARAM_HELPTEXT -#undef SERVICE_JSON_PARAM_ADMINONLY -#undef SERVICE_JSON_PARAM_REQUIREDPARAMETERS - -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/v4/README.md b/code/modules/tgs/v4/README.md new file mode 100644 index 0000000000..78191447b2 --- /dev/null +++ b/code/modules/tgs/v4/README.md @@ -0,0 +1,6 @@ +# DMAPI V4 + +This DMAPI implements bridge requests using file output which TGS monitors for. It has a safe mode restriction. + +- [api.dm](./api.dm) contains the bulk of the API code. +- [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s. diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index ba18aab688..0e37a7aa24 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -50,6 +50,10 @@ return new /datum/tgs_version("4.0.0.0") /datum/tgs_api/v4/OnWorldNew(minimum_required_security_level) + if(minimum_required_security_level == TGS_SECURITY_ULTRASAFE) + TGS_WARNING_LOG("V4 DMAPI requires safe security!") + minimum_required_security_level = TGS_SECURITY_SAFE + json_path = world.params[TGS4_PARAM_INFO_JSON] if(!json_path) TGS_ERROR_LOG("Missing [TGS4_PARAM_INFO_JSON] world parameter!") @@ -88,7 +92,7 @@ var/list/json = cached_json["testMerges"] for(var/entry in json) var/datum/tgs_revision_information/test_merge/tm = new - tm.time_merged = text2num(entry["timeMerged"]) + tm.timestamp = text2num(entry["timeMerged"]) var/list/revInfo = entry["revision"] if(revInfo) @@ -100,7 +104,7 @@ tm.url = entry["url"] tm.author = entry["author"] tm.number = entry["number"] - tm.pull_request_commit = entry["pullRequestRevision"] + tm.head_commit = entry["pullRequestRevision"] tm.comment = entry["comment"] cached_test_merges += tm @@ -110,18 +114,11 @@ /datum/tgs_api/v4/OnInitializationComplete() Export(TGS4_COMM_SERVER_PRIMED) - var/tgs4_secret_sleep_offline_sauce = 24051994 - var/old_sleep_offline = world.sleep_offline - world.sleep_offline = tgs4_secret_sleep_offline_sauce - sleep(1) - if(world.sleep_offline == tgs4_secret_sleep_offline_sauce) //if not someone changed it - world.sleep_offline = old_sleep_offline - /datum/tgs_api/v4/OnTopic(T) var/list/params = params2list(T) var/their_sCK = params[TGS4_INTEROP_ACCESS_IDENTIFIER] if(!their_sCK) - return FALSE //continue world/Topic + return FALSE //continue world/Topic if(their_sCK != access_identifier) return "Invalid comms key!"; @@ -195,7 +192,7 @@ //request a new port export_lock = FALSE - var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose + var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose if(!new_port_json) TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]") @@ -238,7 +235,7 @@ var/port = result[TGS4_PARAMETER_DATA] if(!isnum(port)) - return //this is valid, server may just want use to reboot + return //this is valid, server may just want use to reboot if(port == 0) //to byond 0 means any port and "none" means close vOv @@ -251,7 +248,7 @@ return instance_name /datum/tgs_api/v4/TestMerges() - return cached_test_merges + return cached_test_merges.Copy() /datum/tgs_api/v4/EndProcess() Export(TGS4_COMM_END_PROCESS) @@ -310,30 +307,3 @@ /datum/tgs_api/v4/SecurityLevel() return security_level - -/* -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/v4/commands.dm b/code/modules/tgs/v4/commands.dm index 1d9951bc04..4ca1500167 100644 --- a/code/modules/tgs/v4/commands.dm +++ b/code/modules/tgs/v4/commands.dm @@ -39,31 +39,3 @@ result = "" return result return "Unknown command: [command]!" - -/* - -The MIT License - -Copyright (c) 2017 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/v5/README.md b/code/modules/tgs/v5/README.md new file mode 100644 index 0000000000..5b48d57a1f --- /dev/null +++ b/code/modules/tgs/v5/README.md @@ -0,0 +1,8 @@ +# DMAPI V5 + +This DMAPI implements bridge requests using HTTP GET requests to TGS. It has no security restrictions. + +- [_defines.dm](./_defines.dm) contains constant definitions. +- [api.dm](./api.dm) contains the bulk of the API code. +- [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s. +- [undefs.dm](./undefs.dm) Undoes the work of `_defines.dm`. diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index ce6f4b109d..87c20e1a6b 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -13,13 +13,14 @@ #define DMAPI5_BRIDGE_COMMAND_ADD_MEMBER_ROLE 6 // VOREStation Edit #define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" +#define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" + #define DMAPI5_RESPONSE_ERROR_MESSAGE "errorMessage" #define DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE "commandType" #define DMAPI5_BRIDGE_PARAMETER_CURRENT_PORT "currentPort" #define DMAPI5_BRIDGE_PARAMETER_VERSION "version" #define DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE "chatMessage" -#define DMAPI5_BRIDGE_PARAMETER_CUSTOM_COMMANDS "customCommands" #define DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL "minimumSecurityLevel" #define DMAPI5_BRIDGE_PARAMETER_CHAT_USER_ID "chatUserId" // VOREStation Edit @@ -81,6 +82,7 @@ #define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses" #define DMAPI5_REVISION_INFORMATION_COMMIT_SHA "commitSha" +#define DMAPI5_REVISION_INFORMATION_TIMESTAMP "timestamp" #define DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA "originCommitSha" #define DMAPI5_CHAT_USER_ID "id" @@ -98,30 +100,3 @@ #define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name" #define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText" #define DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY "adminOnly" - -/* -The MIT License - -Copyright (c) 2020 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index d0d6f2d081..704ff873c0 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -15,8 +15,12 @@ var/datum/tgs_revision_information/revision var/list/chat_channels + var/initialized = FALSE + /datum/tgs_api/v5/ApiVersion() - return new /datum/tgs_version("5.1.1") + return new /datum/tgs_version( + #include "interop_version.dm" + ) /datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) server_port = world.params[DMAPI5_PARAM_SERVER_PORT] @@ -24,7 +28,7 @@ var/datum/tgs_version/api_version = ApiVersion() version = null - var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_BRIDGE_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) + var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) if(!istype(bridge_response)) TGS_ERROR_LOG("Failed initial bridge request!") return FALSE @@ -46,6 +50,7 @@ if(istype(revisionData)) revision = new revision.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA] + revision.timestamp = revisionData[DMAPI5_REVISION_INFORMATION_TIMESTAMP] revision.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA] else TGS_ERROR_LOG("Failed to decode [DMAPI5_RUNTIME_INFORMATION_REVISION] from runtime information!") @@ -61,15 +66,18 @@ if(revInfo) tm.commit = revisionData[DMAPI5_REVISION_INFORMATION_COMMIT_SHA] tm.origin_commit = revisionData[DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA] + tm.timestamp = entry[DMAPI5_REVISION_INFORMATION_TIMESTAMP] else TGS_WARNING_LOG("Failed to decode [DMAPI5_TEST_MERGE_REVISION] from test merge #[tm.number]!") - tm.time_merged = text2num(entry[DMAPI5_TEST_MERGE_TIME_MERGED]) + if(!tm.timestamp) + tm.timestamp = entry[DMAPI5_TEST_MERGE_TIME_MERGED] + tm.title = entry[DMAPI5_TEST_MERGE_TITLE_AT_MERGE] tm.body = entry[DMAPI5_TEST_MERGE_BODY_AT_MERGE] tm.url = entry[DMAPI5_TEST_MERGE_URL] tm.author = entry[DMAPI5_TEST_MERGE_AUTHOR] - tm.pull_request_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION] + tm.head_commit = entry[DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION] tm.comment = entry[DMAPI5_TEST_MERGE_COMMENT] test_merges += tm @@ -79,6 +87,7 @@ chat_channels = list() DecodeChannels(runtime_information) + initialized = TRUE return TRUE /datum/tgs_api/v5/proc/RequireInitialBridgeResponse() @@ -88,13 +97,6 @@ /datum/tgs_api/v5/OnInitializationComplete() Bridge(DMAPI5_BRIDGE_COMMAND_PRIME) - var/tgs4_secret_sleep_offline_sauce = 29051994 - var/old_sleep_offline = world.sleep_offline - world.sleep_offline = tgs4_secret_sleep_offline_sauce - sleep(1) - if(world.sleep_offline == tgs4_secret_sleep_offline_sauce) //if not someone changed it - world.sleep_offline = old_sleep_offline - /datum/tgs_api/v5/proc/TopicResponse(error_message = null) var/list/response = list() response[DMAPI5_RESPONSE_ERROR_MESSAGE] = error_message @@ -105,12 +107,16 @@ var/list/params = params2list(T) var/json = params[DMAPI5_TOPIC_DATA] if(!json) - return FALSE //continue world/Topic + return FALSE // continue to /world/Topic var/list/topic_parameters = json_decode(json) if(!topic_parameters) return TopicResponse("Invalid topic parameters json!"); + if(!initialized) + TGS_WARNING_LOG("Missed topic due to not being initialized: [T]") + return TRUE // too early to handle, but it's still our responsibility + var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] if(their_sCK != access_identifier) return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] from: [json]!"); @@ -125,11 +131,6 @@ if(!result) result = TopicResponse("Error running chat command!") return result - // VOREStation Edit Start - GetChatCommands command - if(DMAPI5_TOPIC_COMMAND_GET_CHAT_COMMANDS) - var/topic_response = list(DMAPI5_BRIDGE_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands()) - return json_encode(topic_response) - // VOREStation Edit - End if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION) intercepted_message_queue = list() var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION] @@ -206,17 +207,27 @@ if(DMAPI5_TOPIC_COMMAND_HEARTBEAT) return TopicResponse() if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) + var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] + var/error_message = null + if (new_port != null) + if (!isnum(new_port) || !(new_port > 0)) + error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]" + else + server_port = new_port + var/new_version_string = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION] if (!istext(new_version_string)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]") + if(error_message != null) + error_message += ", " + error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]" + else + var/datum/tgs_version/new_version = new(new_version_string) + if (event_handler) + event_handler.HandleEvent(TGS_EVENT_WATCHDOG_REATTACH, new_version) - var/datum/tgs_version/new_version = new(new_version_string) - if (event_handler) - event_handler.HandleEvent(TGS_EVENT_WATCHDOG_REATTACH, new_version) + version = new_version - version = new_version - - return TopicResponse() + return json_encode(list(DMAPI5_RESPONSE_ERROR_MESSAGE = error_message, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) return TopicResponse("Unknown command: [command]") @@ -262,7 +273,7 @@ var/port = result[DMAPI5_BRIDGE_RESPONSE_NEW_PORT] if(!isnum(port)) - return //this is valid, server may just want use to reboot + return //this is valid, server may just want use to reboot if(port == 0) //to byond 0 means any port and "none" means close vOv @@ -277,7 +288,7 @@ /datum/tgs_api/v5/TestMerges() RequireInitialBridgeResponse() - return test_merges + return test_merges.Copy() /datum/tgs_api/v5/EndProcess() Bridge(DMAPI5_BRIDGE_COMMAND_KILL) @@ -322,7 +333,7 @@ /datum/tgs_api/v5/ChatChannelInfo() RequireInitialBridgeResponse() - return chat_channels + return chat_channels.Copy() /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS] @@ -348,30 +359,3 @@ /datum/tgs_api/v5/SecurityLevel() RequireInitialBridgeResponse() return security_level - -/* -The MIT License - -Copyright (c) 2020 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/v5/chat_commands_zz_ch.dm b/code/modules/tgs/v5/chat_commands_zz_ch.dm new file mode 100644 index 0000000000..436320985d --- /dev/null +++ b/code/modules/tgs/v5/chat_commands_zz_ch.dm @@ -0,0 +1,110 @@ +/datum/tgs_chat_command/sharktest + name = "flip" + help_text = "babies first TGS command" + admin_only = FALSE + +/datum/tgs_chat_command/sharktest/Run(datum/tgs_chat_user/sender, params) + var/x + if(params != "tails" && params != "heads") + return "```You need to guess!\n either heads or tails!```" + if(prob(50)) + if(params == "tails") + x = "correct" + else + x = "wrong" + return "```Tails. [x]!```" + + if(params == "tails") + x = "wrong" + else + x = "correct" + return "```Heads. [x]!```" + +/datum/tgs_chat_command/sharktest/alias + name = "coin" + +/datum/tgs_chat_command/manifest + name = "manifest" + help_text = "Shows the current crew manifest" + admin_only = FALSE + +/proc/ManifestToHtml() + var/html = "" + if(data_core) + html = data_core.get_manifest(FALSE,TRUE,snowflake = TRUE) + else + html = "ERROR: NO DATACORE" //Could make the error more fancy later + rustg_file_write(html,"[config.nodebot_location]\\html.html") + +/datum/tgs_chat_command/manifest/Run(datum/tgs_chat_user/sender, params) + if(config.nodebot_enabled) + ManifestToHtml() + return "!!ManifestCompiled" + else + var/outp = "Crew Manifest:" + var/list/total = list() + if(data_core) + data_core.get_manifest_list() + for(var/list/item in PDA_Manifest) + outp += "\n__**[item["cat"]]:**__" + for(var/list/person in item["elems"]) + total |= person + outp += "\n[person["name"]] -:- [person["rank"]]" + + return "**Total crew members:** [total.len]\n" + outp + + +/datum/tgs_chat_command/discordping + name = "discordping" + help_text = "Pings the discord associated with the associated ckey" + admin_only = TRUE + +/datum/tgs_chat_command/discordping/Run(datum/tgs_chat_user/sender, params) + var/key_to_find = "[ckey(params)]" + + // They didn't provide anything worth looking up. + if(!length(key_to_find)) + return "[sender.friendly_name], you need to provide a Byond username at the end of the command. It can be in 'key' format (with spaces and characters) or 'ckey' format (without spaces or special characters)." + + var/DBQuery/query = SSdbcore.NewQuery("SELECT discord_id FROM erro_player WHERE ckey = :t_ckey",list("t_ckey" = key_to_find)) + query.Execute() + + if(!query.NextRow()) + qdel(query) + return "[sender.friendly_name], the server's database is either not responding or there's no such ckey in the database." + + if(!query.item[1]) + qdel(query) + return "[sender.friendly_name], [key_to_find] is in the database, but has no discord ID associated with them." + var/discord_id = query.item[1] + qdel(query) + return "[key_to_find]'s discord is <@[discord_id]>" + +/datum/tgs_chat_command/getkey + name = "getkey" + help_text = "Finds the key associated with a discord id" + admin_only = TRUE + +/datum/tgs_chat_command/getkey/Run(datum/tgs_chat_user/sender, params) + if(!params) + return "[sender.friendly_name], you need to provide a Discord ID at the end of the command. To obtain someone's Discord ID, you need to enable developer mode on discord, and then right click on their name and click Copy ID." + + var/DBQuery/query = SSdbcore.NewQuery("SELECT ckey FROM erro_player WHERE discord_id = :t_discord", list("t_discord"=params)) + query.Execute() + + if(!query.NextRow()) + qdel(query) + return "[sender.friendly_name], the server's database is either not responding or there's no such Discord ID in the database." + + var/user_key = query.item[1] + qdel(query) + return "<@[params]>'s ckey is [user_key]" + +//modded fax code to properly handle non existing files before accessing the void +/datum/tgs_chat_command/readfax/Run(sender, params) + var/list/all_params = splittext(params, " ") + var/faxid = all_params[1] + if(!all_params[1] || !fexists("[config.fax_export_dir]/fax_[faxid].html")) + return "I’m sorry Dave, I’m afraid I can’t do that" + var/faxmsg = return_file_text("[config.fax_export_dir]/fax_[faxid].html") + return "FAX: ```[strip_html_properly(faxmsg)]```" diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm index 2775157656..6d31dd3422 100644 --- a/code/modules/tgs/v5/commands.dm +++ b/code/modules/tgs/v5/commands.dm @@ -38,31 +38,3 @@ topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = text_response return json_encode(topic_response) return TopicResponse("Unknown custom chat command: [command]!") - -/* - -The MIT License - -Copyright (c) 2020 Jordan Brown - -Permission is hereby granted, free of charge, -to any person obtaining a copy of this software and -associated documentation files (the "Software"), to -deal in the Software without restriction, including -without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom -the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ diff --git a/code/modules/tgs/v5/interop_version.dm b/code/modules/tgs/v5/interop_version.dm new file mode 100644 index 0000000000..c7bf62ecae --- /dev/null +++ b/code/modules/tgs/v5/interop_version.dm @@ -0,0 +1 @@ +"5.3.0" diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm new file mode 100644 index 0000000000..5885a60e75 --- /dev/null +++ b/code/modules/tgs/v5/undefs.dm @@ -0,0 +1,99 @@ +#undef DMAPI5_PARAM_SERVER_PORT +#undef DMAPI5_PARAM_ACCESS_IDENTIFIER + +#undef DMAPI5_BRIDGE_DATA +#undef DMAPI5_TOPIC_DATA + +#undef DMAPI5_BRIDGE_COMMAND_PORT_UPDATE +#undef DMAPI5_BRIDGE_COMMAND_STARTUP +#undef DMAPI5_BRIDGE_COMMAND_PRIME +#undef DMAPI5_BRIDGE_COMMAND_REBOOT +#undef DMAPI5_BRIDGE_COMMAND_KILL +#undef DMAPI5_BRIDGE_COMMAND_CHAT_SEND + +#undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER +#undef DMAPI5_PARAMETER_CUSTOM_COMMANDS + +#undef DMAPI5_RESPONSE_ERROR_MESSAGE + +#undef DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE +#undef DMAPI5_BRIDGE_PARAMETER_CURRENT_PORT +#undef DMAPI5_BRIDGE_PARAMETER_VERSION +#undef DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE +#undef DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL + +#undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT +#undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION + +#undef DMAPI5_CHAT_MESSAGE_TEXT +#undef DMAPI5_CHAT_MESSAGE_CHANNEL_IDS + +#undef DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER +#undef DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION +#undef DMAPI5_RUNTIME_INFORMATION_SERVER_PORT +#undef DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY +#undef DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME +#undef DMAPI5_RUNTIME_INFORMATION_REVISION +#undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES +#undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL + +#undef DMAPI5_CHAT_UPDATE_CHANNELS + +#undef DMAPI5_TEST_MERGE_TIME_MERGED +#undef DMAPI5_TEST_MERGE_REVISION +#undef DMAPI5_TEST_MERGE_TITLE_AT_MERGE +#undef DMAPI5_TEST_MERGE_BODY_AT_MERGE +#undef DMAPI5_TEST_MERGE_URL +#undef DMAPI5_TEST_MERGE_AUTHOR +#undef DMAPI5_TEST_MERGE_NUMBER +#undef DMAPI5_TEST_MERGE_PULL_REQUEST_REVISION +#undef DMAPI5_TEST_MERGE_COMMENT + +#undef DMAPI5_CHAT_COMMAND_NAME +#undef DMAPI5_CHAT_COMMAND_PARAMS +#undef DMAPI5_CHAT_COMMAND_USER + +#undef DMAPI5_EVENT_NOTIFICATION_TYPE +#undef DMAPI5_EVENT_NOTIFICATION_PARAMETERS + +#undef DMAPI5_TOPIC_COMMAND_CHAT_COMMAND +#undef DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION +#undef DMAPI5_TOPIC_COMMAND_CHANGE_PORT +#undef DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE +#undef DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED +#undef DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE +#undef DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE +#undef DMAPI5_TOPIC_COMMAND_HEARTBEAT +#undef DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH + +#undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE +#undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND +#undef DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION +#undef DMAPI5_TOPIC_PARAMETER_NEW_PORT +#undef DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE +#undef DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME +#undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE +#undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION + +#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE +#undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES + +#undef DMAPI5_REVISION_INFORMATION_COMMIT_SHA +#undef DMAPI5_REVISION_INFORMATION_TIMESTAMP +#undef DMAPI5_REVISION_INFORMATION_ORIGIN_COMMIT_SHA + +#undef DMAPI5_CHAT_USER_ID +#undef DMAPI5_CHAT_USER_FRIENDLY_NAME +#undef DMAPI5_CHAT_USER_MENTION +#undef DMAPI5_CHAT_USER_CHANNEL + +#undef DMAPI5_CHAT_CHANNEL_ID +#undef DMAPI5_CHAT_CHANNEL_FRIENDLY_NAME +#undef DMAPI5_CHAT_CHANNEL_CONNECTION_NAME +#undef DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL +#undef DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL +#undef DMAPI5_CHAT_CHANNEL_TAG + +#undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME +#undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT +#undef DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY diff --git a/code/modules/tgui/modules/_base.dm b/code/modules/tgui/modules/_base.dm index 7cece1c097..52891ab18d 100644 --- a/code/modules/tgui/modules/_base.dm +++ b/code/modules/tgui/modules/_base.dm @@ -78,52 +78,11 @@ Code is pretty much ripped verbatim from nano modules, but with un-needed stuff return TRUE // Just a nice little default interact in case the subtypes don't need any special behavior here -/datum/tgui_module/tgui_interact(mob/user, datum/tgui/ui = null) +/datum/tgui_module/tgui_interact(mob/user, datum/tgui/ui = null, datum/tgui/parent_ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, tgui_id, name) + ui = new(user, src, tgui_id, name, parent_ui) ui.open() -// This is a helper for anything that wants to render the map. -/datum/tgui_module/proc/get_plane_masters() - . = list() - // 'Utility' planes - . += new /obj/screen/plane_master/fullbright //Lighting system (lighting_overlay objects) - . += new /obj/screen/plane_master/lighting //Lighting system (but different!) - . += new /obj/screen/plane_master/ghosts //Ghosts! - . += new /obj/screen/plane_master{plane = PLANE_AI_EYE} //AI Eye! - - . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS} //Status is the synth/human icon left side of medhuds - . += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH} //Health bar - . += new /obj/screen/plane_master{plane = PLANE_CH_LIFE} //Alive-or-not icon - . += new /obj/screen/plane_master{plane = PLANE_CH_ID} //Job ID icon - . += new /obj/screen/plane_master{plane = PLANE_CH_WANTED} //Wanted status - . += new /obj/screen/plane_master{plane = PLANE_CH_IMPLOYAL} //Loyalty implants - . += new /obj/screen/plane_master{plane = PLANE_CH_IMPTRACK} //Tracking implants - . += new /obj/screen/plane_master{plane = PLANE_CH_IMPCHEM} //Chemical implants - . += new /obj/screen/plane_master{plane = PLANE_CH_SPECIAL} //"Special" role stuff - . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS_OOC} //OOC status HUD - - . += new /obj/screen/plane_master{plane = PLANE_ADMIN1} //For admin use - . += new /obj/screen/plane_master{plane = PLANE_ADMIN2} //For admin use - . += new /obj/screen/plane_master{plane = PLANE_ADMIN3} //For admin use - - . += new /obj/screen/plane_master{plane = PLANE_MESONS} //Meson-specific things like open ceilings. - . += new /obj/screen/plane_master{plane = PLANE_BUILDMODE} //Things that only show up while in build mode - - // Real tangible stuff planes - . += new /obj/screen/plane_master/main{plane = TURF_PLANE} - . += new /obj/screen/plane_master/main{plane = OBJ_PLANE} - . += new /obj/screen/plane_master/main{plane = MOB_PLANE} - . += new /obj/screen/plane_master/cloaked //Cloaked atoms! - - //VOREStation Add - Random other plane masters - . += new /obj/screen/plane_master{plane = PLANE_CH_STATUS_R} //Right-side status icon - . += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH_VR} //Health bar but transparent at 100 - . += new /obj/screen/plane_master{plane = PLANE_CH_BACKUP} //Backup implant status - . += new /obj/screen/plane_master{plane = PLANE_CH_VANTAG} //Vore Antags - . += new /obj/screen/plane_master{plane = PLANE_AUGMENTED} //Augmented reality - //VOREStation Add End - /datum/tgui_module/proc/relaymove(mob/user, direction) return FALSE diff --git a/code/modules/tgui/modules/admin_shuttle_controller.dm b/code/modules/tgui/modules/admin_shuttle_controller.dm new file mode 100644 index 0000000000..20e5c47367 --- /dev/null +++ b/code/modules/tgui/modules/admin_shuttle_controller.dm @@ -0,0 +1,102 @@ +/* This is an admin tool to control all shuttles, including overmap & classic. */ + +/datum/tgui_module/admin_shuttle_controller + name = "Admin Shuttle Controller" + tgui_id = "AdminShuttleController" + +/datum/tgui_module/admin_shuttle_controller/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + var/list/shuttles = list() + for(var/shuttle_name in SSshuttles.shuttles) + var/datum/shuttle/S = SSshuttles.shuttles[shuttle_name] + shuttles.Add(list(list( + "name" = shuttle_name, + "ref" = REF(S), + "current_location" = S.get_location_name(), + "status" = S.moving_status, + ))) + data["shuttles"] = shuttles + + var/list/overmap_ships = list() + for(var/ship in SSshuttles.ships) + var/obj/effect/overmap/visitable/ship/S = ship + overmap_ships.Add(list(list( + "name" = S.scanner_name || S.name, + "ref" = REF(S), + ))) + data["overmap_ships"] = overmap_ships + + return data + +/datum/tgui_module/admin_shuttle_controller/tgui_state(mob/user) + return GLOB.tgui_admin_state + +/datum/tgui_module/admin_shuttle_controller/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return + + switch(action) + if("adminobserve") + var/datum/shuttle/S = locate(params["ref"]) + if(istype(S)) + var/client/C = usr.client + if(!isobserver(usr)) + C.admin_ghost() + spawn(2) + C.jumptoturf(get_turf(S.current_location)) + else if(istype(S, /obj/effect/overmap/visitable)) + var/obj/effect/overmap/visitable/V = S + var/client/C = usr.client + if(!isobserver(usr)) + C.admin_ghost() + spawn(2) + var/atom/target + if(LAZYLEN(V.generic_waypoints)) + target = V.generic_waypoints[1] + else if(LAZYLEN(V.restricted_waypoints)) + target = V.restricted_waypoints[1] + else + to_chat(C, "Unable to jump to [V].") + return FALSE + var/turf/T = get_turf(target) + if(!istype(T)) + to_chat(C, "Unable to jump to [V].") + return FALSE + C.jumptoturf(T) + return TRUE + if("classicmove") + var/datum/shuttle/S = locate(params["ref"]) + if(istype(S, /datum/shuttle/autodock/multi)) + var/datum/shuttle/autodock/multi/shuttle = S + var/dest_key = input("Choose shuttle destination", "Shuttle Destination") as null|anything in shuttle.get_destinations() + if(dest_key) + shuttle.set_destination(dest_key, usr) + shuttle.launch(src) + else if(istype(S, /datum/shuttle/autodock/overmap)) + var/datum/shuttle/autodock/overmap/shuttle = S + var/list/possible_d = shuttle.get_possible_destinations() + var/D + if(!LAZYLEN(possible_d)) + to_chat(usr, "There are no possible destinations for [shuttle] ([shuttle.type])") + return FALSE + D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d + if(D) + shuttle.set_destination(possible_d[D]) + shuttle.launch() + else if(istype(S, /datum/shuttle/autodock)) + var/datum/shuttle/autodock/shuttle = S + if(alert(usr, "Are you sure you want to launch [shuttle]?", "Launching Shuttle", "Yes", "No") == "Yes") + shuttle.launch(src) + else + to_chat(usr, "The shuttle control panel isn't quite sure how to move [S] ([S?.type]).") + return FALSE + to_chat(usr, "Launching shuttle [S].") + return TRUE + if("overmap_control") + var/obj/effect/overmap/visitable/ship/V = locate(params["ref"]) + if(istype(V)) + var/datum/tgui_module/ship/fullmonty/F = new(src, V) + F.tgui_interact(usr, null, ui) + + return TRUE diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index ab75e1d67c..e9478c3c31 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -20,10 +20,8 @@ var/list/cam_plane_masters var/obj/screen/background/cam_background var/obj/screen/skybox/local_skybox - // Needed for moving camera support - var/camera_diff_x = -1 - var/camera_diff_y = -1 - var/camera_diff_z = -1 + // Stuff for moving cameras + var/turf/last_camera_turf var/list/valid_earstyles = list() var/list/valid_tailstyles = list() @@ -44,8 +42,8 @@ cam_screen.assigned_map = map_name cam_screen.del_on_map_removal = FALSE cam_screen.screen_loc = "[map_name]:1,1" - - cam_plane_masters = get_plane_masters() + + cam_plane_masters = get_tgui_plane_masters() for(var/plane in cam_plane_masters) var/obj/screen/instance = plane @@ -62,14 +60,18 @@ cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE - reload_cameraview() + update_active_camera_screen() owner = H + if(owner) + GLOB.moved_event.register(owner, src, .proc/update_active_camera_screen) check_whitelist = check_species_whitelist whitelist = species_whitelist blacklist = species_blacklist /datum/tgui_module/appearance_changer/Destroy() + GLOB.moved_event.unregister(owner, src, .proc/update_active_camera_screen) + last_camera_turf = null qdel(cam_screen) QDEL_LIST(cam_plane_masters) qdel(cam_background) @@ -281,13 +283,13 @@ if(!ishuman(user)) return TRUE target = user - + if(!target || !target.species) return ui = SStgui.try_update_ui(user, src, ui) + update_active_camera_screen() if(!ui) - reload_cameraview() // Register map objects user.client.register_map_obj(cam_screen) for(var/plane in cam_plane_masters) @@ -332,7 +334,7 @@ /datum/tgui_module/appearance_changer/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - differential_check() + generate_data(user) var/mob/living/carbon/human/target = owner if(customize_usr) @@ -375,11 +377,11 @@ data["change_skin_color"] = can_change_skin_color() if(data["change_skin_color"]) data["skin_color"] = rgb(target.r_skin, target.g_skin, target.b_skin) - + data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR) if(data["change_eye_color"]) data["eye_color"] = rgb(target.r_eyes, target.g_eyes, target.b_eyes) - + data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) if(data["change_hair_color"]) data["hair_color"] = rgb(target.r_hair, target.g_hair, target.b_hair) @@ -391,7 +393,7 @@ data["wing_color"] = rgb(target.r_wing, target.g_wing, target.b_wing) data["wing2_color"] = rgb(target.r_wing2, target.g_wing2, target.b_wing2) // VOREStation Add End - + data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR) if(data["change_facial_hair_color"]) data["facial_hair_color"] = rgb(target.r_facial, target.g_facial, target.b_facial) @@ -402,26 +404,15 @@ data["mapRef"] = map_name return data -/datum/tgui_module/appearance_changer/proc/differential_check() - var/turf/T = get_turf(customize_usr ? tgui_host() : owner) - if(T) - var/new_x = T.x - var/new_y = T.y - var/new_z = T.z - if((new_x != camera_diff_x) || (new_y != camera_diff_y) || (new_z != camera_diff_z)) - reload_cameraview() - -/datum/tgui_module/appearance_changer/proc/reload_cameraview() - var/turf/camTurf = get_turf(customize_usr ? tgui_host() : owner) - if(!camTurf) +/datum/tgui_module/appearance_changer/proc/update_active_camera_screen() + var/turf/newturf = get_turf(customize_usr ? tgui_host() : owner) + if(newturf == last_camera_turf) return - camera_diff_x = camTurf.x - camera_diff_y = camTurf.y - camera_diff_z = camTurf.z + last_camera_turf = newturf var/list/visible_turfs = list() - for(var/turf/T in range(1, camTurf)) + for(var/turf/T in range(1, newturf)) visible_turfs += T cam_screen.vis_contents = visible_turfs @@ -429,9 +420,9 @@ cam_background.fill_rect(1, 1, 3, 3) local_skybox.cut_overlays() - local_skybox.add_overlay(SSskybox.get_skybox(get_z(camTurf))) + local_skybox.add_overlay(SSskybox.get_skybox(get_z(newturf))) local_skybox.scale_to_view(3) - local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - camTurf.x, (world.maxy>>1) - camTurf.y) + local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - newturf.x, (world.maxy>>1) - newturf.y) /datum/tgui_module/appearance_changer/proc/update_dna() var/mob/living/carbon/human/target = owner @@ -488,10 +479,10 @@ target = user if(!target) return - + if(!LAZYLEN(valid_species)) valid_species = target.generate_valid_species(check_whitelist, whitelist, blacklist) - + if(!LAZYLEN(valid_hairstyles) || !LAZYLEN(valid_facial_hairstyles)) valid_hairstyles = target.generate_valid_hairstyles(check_gender = 0) valid_facial_hairstyles = target.generate_valid_facial_hairstyles() diff --git a/code/modules/tgui/modules/appearance_changer_vr.dm b/code/modules/tgui/modules/appearance_changer_vr.dm index 93ee4cfdf2..d5ace1b7e7 100644 --- a/code/modules/tgui/modules/appearance_changer_vr.dm +++ b/code/modules/tgui/modules/appearance_changer_vr.dm @@ -10,7 +10,7 @@ return STATUS_CLOSE return ..() -/datum/tgui_module/appearance_changer/vore/reload_cameraview() +/datum/tgui_module/appearance_changer/vore/update_active_camera_screen() cam_screen.vis_contents = list(owner) cam_background.icon_state = "clear" cam_background.fill_rect(1, 1, 1, 1) @@ -42,4 +42,4 @@ to_chat(O, "You tingle as you make noticeable changes to your captive's body.") if(APPEARANCECHANGER_CHANGED_EYES) to_chat(M, "You feel lightheaded and drowsy...") - to_chat(O, "You feel warm as you make subtle changes to your captive's body.") \ No newline at end of file + to_chat(O, "You feel warm as you make subtle changes to your captive's body.") diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm index dbb3c7ae97..86eb923c1c 100644 --- a/code/modules/tgui/modules/camera.dm +++ b/code/modules/tgui/modules/camera.dm @@ -18,10 +18,8 @@ var/obj/screen/background/cam_background var/obj/screen/background/cam_foreground var/obj/screen/skybox/local_skybox - // Needed for moving camera support - var/camera_diff_x = -1 - var/camera_diff_y = -1 - var/camera_diff_z = -1 + // Stuff for moving cameras + var/turf/last_camera_turf /datum/tgui_module/camera/New(host, list/network_computer) . = ..() @@ -37,7 +35,7 @@ cam_screen.del_on_map_removal = FALSE cam_screen.screen_loc = "[map_name]:1,1" - cam_plane_masters = get_plane_masters() + cam_plane_masters = get_tgui_plane_masters() for(var/plane in cam_plane_masters) var/obj/screen/instance = plane @@ -70,6 +68,10 @@ cam_foreground.add_overlay(noise) /datum/tgui_module/camera/Destroy() + if(active_camera) + GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) + active_camera = null + last_camera_turf = null qdel(cam_screen) QDEL_LIST(cam_plane_masters) qdel(cam_background) @@ -106,7 +108,6 @@ var/list/data = list() data["activeCamera"] = null if(active_camera) - differential_check() data["activeCamera"] = list( name = active_camera.c_tag, status = active_camera.status, @@ -139,9 +140,12 @@ var/c_tag = params["name"] var/list/cameras = get_available_cameras(usr) var/obj/machinery/camera/C = cameras["[ckey(c_tag)]"] + if(active_camera) + GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) active_camera = C + GLOB.moved_event.register(active_camera, src, .proc/update_active_camera_screen) playsound(tgui_host(), get_sfx("terminal_type"), 25, FALSE) - reload_cameraview() + update_active_camera_screen() return TRUE if(action == "pan") @@ -163,36 +167,34 @@ target = C if(target) + if(active_camera) + GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) active_camera = target + GLOB.moved_event.register(active_camera, src, .proc/update_active_camera_screen) playsound(tgui_host(), get_sfx("terminal_type"), 25, FALSE) - reload_cameraview() + update_active_camera_screen() . = TRUE -/datum/tgui_module/camera/proc/differential_check() - var/turf/T = get_turf(active_camera) - if(T) - var/new_x = T.x - var/new_y = T.y - var/new_z = T.z - if((new_x != camera_diff_x) || (new_y != camera_diff_y) || (new_z != camera_diff_z)) - reload_cameraview() - -/datum/tgui_module/camera/proc/reload_cameraview() +/datum/tgui_module/camera/proc/update_active_camera_screen() // Show static if can't use the camera if(!active_camera?.can_use()) show_camera_static() return TRUE - var/turf/camTurf = get_turf(active_camera) + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + // Most security cameras will end here as they're not moving. + var/turf/newturf = get_turf(active_camera) + if(newturf == last_camera_turf) + return - camera_diff_x = camTurf.x - camera_diff_y = camTurf.y - camera_diff_z = camTurf.z + // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. + last_camera_turf = get_turf(active_camera) var/list/visible_turfs = list() for(var/turf/T in (active_camera.isXRay() \ - ? range(active_camera.view_range, camTurf) \ - : view(active_camera.view_range, camTurf))) + ? range(active_camera.view_range, newturf) \ + : view(active_camera.view_range, newturf))) visible_turfs += T var/list/bbox = get_bbox_of_atoms(visible_turfs) @@ -206,9 +208,9 @@ cam_foreground.fill_rect(1, 1, size_x, size_y) local_skybox.cut_overlays() - local_skybox.add_overlay(SSskybox.get_skybox(get_z(camTurf))) + local_skybox.add_overlay(SSskybox.get_skybox(get_z(newturf))) local_skybox.scale_to_view(size_x) - local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - camTurf.x, (world.maxy>>1) - camTurf.y) + local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - newturf.x, (world.maxy>>1) - newturf.y) // Returns the list of cameras accessible from this computer // This proc operates in two distinct ways depending on the context in which the module is created. @@ -271,6 +273,8 @@ user.client.clear_map(map_name) // Turn off the console if(length(concurrent_users) == 0 && is_living) + if(active_camera) + GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) active_camera = null playsound(tgui_host(), 'sound/machines/terminal_off.ogg', 25, FALSE) diff --git a/code/modules/tgui/modules/gyrotron_control.dm b/code/modules/tgui/modules/gyrotron_control.dm new file mode 100644 index 0000000000..fd8c14bb85 --- /dev/null +++ b/code/modules/tgui/modules/gyrotron_control.dm @@ -0,0 +1,68 @@ +/datum/tgui_module/gyrotron_control + name = "Gyrotron Control" + tgui_id = "GyrotronControl" + + var/gyro_tag = "" + var/scan_range = 25 + +/datum/tgui_module/gyrotron_control/tgui_act(action, params) + if(..()) + return TRUE + + // If the command requires a gyrotron, and we can't find it, we don't need to check any further + var/obj/machinery/power/emitter/gyrotron/G = null + if(params["gyro"]) + G = locate(params["gyro"]) in GLOB.gyrotrons + if(!istype(G)) + return FALSE + + switch(action) + if("set_tag") + var/new_ident = sanitize_text(input("Enter a new ident tag.", "Gyrotron Control", gyro_tag) as null|text) + if(new_ident) + gyro_tag = new_ident + return TRUE + + if("toggle_active") + G.activate(usr) + return TRUE + + if("set_str") + var/new_strength = params["str"] + if(istext(new_strength)) + new_strength = text2num(new_strength) + if(new_strength) + G.set_beam_power(new_strength) + return TRUE + + if("set_rate") + var/new_delay = params["rate"] + if(istext(new_delay)) + new_delay = text2num(new_delay) + if(new_delay) + G.rate = new_delay + return TRUE + +/datum/tgui_module/gyrotron_control/tgui_data(mob/user) + var/list/data = list() + var/list/gyros = list() + + for(var/obj/machinery/power/emitter/gyrotron/G in GLOB.gyrotrons) + if(G.id_tag == gyro_tag)// && (get_dist(get_turf(G), get_turf(src)) <= scan_range)) + gyros.Add(list(list( + "name" = G.name, + "active" = G.active, + "strength" = G.mega_energy, + "fire_delay" = G.rate, + "deployed" = (G.state == 2), + "x" = G.x, + "y" = G.y, + "z" = G.z, + "ref" = "\ref[G]" + ))) + + data["gyros"] = gyros + return data + +/datum/tgui_module/gyrotron_control/ntos + ntos = TRUE diff --git a/code/modules/tgui/modules/ntos-only/cardmod.dm b/code/modules/tgui/modules/ntos-only/cardmod.dm index c5aecd8808..a05dbf0ff7 100644 --- a/code/modules/tgui/modules/ntos-only/cardmod.dm +++ b/code/modules/tgui/modules/ntos-only/cardmod.dm @@ -167,7 +167,7 @@ if("modify") if(computer && computer.card_slot) if(id_card) - data_core.manifest_modify(id_card.registered_name, id_card.assignment) + data_core.manifest_modify(id_card.registered_name, id_card.assignment, id_card.rank) computer.proc_eject_id(usr) . = TRUE if("terminate") diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm index 3b157fc0c2..2e566e1267 100644 --- a/code/modules/tgui/modules/overmap.dm +++ b/code/modules/tgui/modules/overmap.dm @@ -52,7 +52,7 @@ /datum/tgui_module/ship/proc/look(var/mob/user) if(linked) - user.set_machine(tgui_host()) + user.set_machine(src) user.reset_view(linked) user.set_viewsize(world.view + extra_view) GLOB.moved_event.register(user, src, /datum/tgui_module/ship/proc/unlook) @@ -134,4 +134,327 @@ return TRUE /datum/tgui_module/ship/nav/ntos - ntos = TRUE \ No newline at end of file + ntos = TRUE + +// Full monty control computer +/datum/tgui_module/ship/fullmonty + name = "Full Monty Overmap Control" + tgui_id = "OvermapFull" + // HELM + var/autopilot = 0 + var/autopilot_disabled = TRUE + var/list/known_sectors = list() + var/dx //desitnation + var/dy //coordinates + var/speedlimit = 1/(20 SECONDS) //top speed for autopilot, 5 + var/accellimit = 0.001 //manual limiter for acceleration + // SENSORS + var/obj/machinery/shipsensors/sensors + +/datum/tgui_module/ship/fullmonty/tgui_state(mob/user) + return GLOB.tgui_admin_state + +/datum/tgui_module/ship/fullmonty/New(host, obj/effect/overmap/visitable/ship/new_linked) + . = ..() + if(!istype(new_linked)) + CRASH("Warning, [new_linked] is not an overmap ship! Something went horribly wrong for [usr]!") + return + linked = new_linked + name = initial(name) + " ([linked.name])" + // HELM + var/area/overmap/map = locate() in world + for(var/obj/effect/overmap/visitable/sector/S in map) + if(S.known) + var/datum/computer_file/data/waypoint/R = new() + R.fields["name"] = S.name + R.fields["x"] = S.x + R.fields["y"] = S.y + known_sectors[S.name] = R + // SENSORS + for(var/obj/machinery/shipsensors/S in global.machines) + if(linked.check_ownership(S)) + sensors = S + break + +/datum/tgui_module/ship/fullmonty/relaymove(var/mob/user, direction) + if(viewing_overmap(user) && linked) + direction = turn(direction,pick(90,-90)) + linked.relaymove(user, direction, accellimit) + return 1 + return ..() + +// Beware ye eyes. This holds all of the data from helm, engine, and sensor control all at once. +/datum/tgui_module/ship/fullmonty/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + // HELM + var/turf/T = get_turf(linked) + var/obj/effect/overmap/visitable/sector/current_sector = locate() in T + + data["sector"] = current_sector ? current_sector.name : "Deep Space" + data["sector_info"] = current_sector ? current_sector.desc : "Not Available" + data["landed"] = linked.get_landed_info() + data["s_x"] = linked.x + data["s_y"] = linked.y + data["dest"] = dy && dx + data["d_x"] = dx + data["d_y"] = dy + data["speedlimit"] = speedlimit ? speedlimit*1000 : "Halted" + data["accel"] = min(round(linked.get_acceleration()*1000, 0.01),accellimit*1000) + data["heading"] = linked.get_heading_degrees() + data["autopilot_disabled"] = autopilot_disabled + data["autopilot"] = autopilot + data["manual_control"] = viewing_overmap(user) + data["canburn"] = linked.can_burn() + data["accellimit"] = accellimit*1000 + + var/speed = round(linked.get_speed()*1000, 0.01) + var/speed_color = null + if(linked.get_speed() < SHIP_SPEED_SLOW) + speed_color = "good" + if(linked.get_speed() > SHIP_SPEED_FAST) + speed_color = "average" + data["speed"] = speed + data["speed_color"] = speed_color + + if(linked.get_speed()) + data["ETAnext"] = "[round(linked.ETA()/10)] seconds" + else + data["ETAnext"] = "N/A" + + var/list/locations[0] + for (var/key in known_sectors) + var/datum/computer_file/data/waypoint/R = known_sectors[key] + var/list/rdata[0] + rdata["name"] = R.fields["name"] + rdata["x"] = R.fields["x"] + rdata["y"] = R.fields["y"] + rdata["reference"] = "\ref[R]" + locations.Add(list(rdata)) + + data["locations"] = locations + + // ENGINES + data["global_state"] = linked.engines_state + data["global_limit"] = round(linked.thrust_limit*100) + var/total_thrust = 0 + + var/list/enginfo = list() + for(var/datum/ship_engine/E in linked.engines) + var/list/rdata = list() + rdata["eng_type"] = E.name + rdata["eng_on"] = E.is_on() + rdata["eng_thrust"] = E.get_thrust() + rdata["eng_thrust_limiter"] = round(E.get_thrust_limit()*100) + var/list/status = E.get_status() + if(!islist(status)) + log_runtime(EXCEPTION("Warning, ship [E.name] (\ref[E]) for [linked.name] returned a non-list status!")) + status = list("Error") + rdata["eng_status"] = status + rdata["eng_reference"] = "\ref[E]" + total_thrust += E.get_thrust() + enginfo.Add(list(rdata)) + + data["engines_info"] = enginfo + data["total_thrust"] = total_thrust + + // SENSORS + data["viewing"] = viewing_overmap(user) + data["on"] = 0 + data["range"] = "N/A" + data["health"] = 0 + data["max_health"] = 0 + data["heat"] = 0 + data["critical_heat"] = 0 + data["status"] = "MISSING" + data["contacts"] = list() + + if(sensors) + data["on"] = sensors.use_power + data["range"] = sensors.range + data["health"] = sensors.health + data["max_health"] = sensors.max_health + data["heat"] = sensors.heat + data["critical_heat"] = sensors.critical_heat + if(sensors.health == 0) + data["status"] = "DESTROYED" + else if(!sensors.powered()) + data["status"] = "NO POWER" + else if(!sensors.in_vacuum()) + data["status"] = "VACUUM SEAL BROKEN" + else + data["status"] = "OK" + var/list/contacts = list() + for(var/obj/effect/overmap/O in view(7,linked)) + if(linked == O) + continue + if(!O.scannable) + continue + var/bearing = round(90 - ATAN2(O.x - linked.x, O.y - linked.y),5) + if(bearing < 0) + bearing += 360 + contacts.Add(list(list("name"=O.name, "ref"="\ref[O]", "bearing"=bearing))) + data["contacts"] = contacts + + + return data + +// Beware ye eyes. This holds all of the ACTIONS from helm, engine, and sensor control all at once. +/datum/tgui_module/ship/fullmonty/tgui_act(action, params) + if(..()) + return TRUE + + switch(action) + /* HELM */ + if("add") + var/datum/computer_file/data/waypoint/R = new() + var/sec_name = input("Input navigation entry name", "New navigation entry", "Sector #[known_sectors.len]") as text + if(!sec_name) + sec_name = "Sector #[known_sectors.len]" + R.fields["name"] = sec_name + if(sec_name in known_sectors) + to_chat(usr, "Sector with that name already exists, please input a different name.") + return TRUE + switch(params["add"]) + if("current") + R.fields["x"] = linked.x + R.fields["y"] = linked.y + if("new") + var/newx = input("Input new entry x coordinate", "Coordinate input", linked.x) as num + var/newy = input("Input new entry y coordinate", "Coordinate input", linked.y) as num + R.fields["x"] = CLAMP(newx, 1, world.maxx) + R.fields["y"] = CLAMP(newy, 1, world.maxy) + known_sectors[sec_name] = R + . = TRUE + + if("remove") + var/datum/computer_file/data/waypoint/R = locate(params["remove"]) + if(R) + known_sectors.Remove(R.fields["name"]) + qdel(R) + . = TRUE + + if("setcoord") + if(params["setx"]) + var/newx = input("Input new destiniation x coordinate", "Coordinate input", dx) as num|null + if(newx) + dx = CLAMP(newx, 1, world.maxx) + + if(params["sety"]) + var/newy = input("Input new destiniation y coordinate", "Coordinate input", dy) as num|null + if(newy) + dy = CLAMP(newy, 1, world.maxy) + . = TRUE + + if("setds") + dx = text2num(params["x"]) + dy = text2num(params["y"]) + . = TRUE + + if("reset") + dx = 0 + dy = 0 + . = TRUE + + if("speedlimit") + var/newlimit = input("Input new speed limit for autopilot (0 to brake)", "Autopilot speed limit", speedlimit*1000) as num|null + if(newlimit) + speedlimit = CLAMP(newlimit/1000, 0, 100) + . = TRUE + + if("accellimit") + var/newlimit = input("Input new acceleration limit", "Acceleration limit", accellimit*1000) as num|null + if(newlimit) + accellimit = max(newlimit/1000, 0) + . = TRUE + + if("move") + var/ndir = text2num(params["dir"]) + ndir = turn(ndir,pick(90,-90)) + linked.relaymove(usr, ndir, accellimit) + . = TRUE + + if("brake") + linked.decelerate() + . = TRUE + + if("apilot") + if(autopilot_disabled) + autopilot = FALSE + else + autopilot = !autopilot + . = TRUE + + if("apilot_lock") + autopilot_disabled = !autopilot_disabled + autopilot = FALSE + . = TRUE + + if("manual") + viewing_overmap(usr) ? unlook(usr) : look(usr) + . = TRUE + /* END HELM */ + /* ENGINES */ + if("global_toggle") + linked.engines_state = !linked.engines_state + for(var/datum/ship_engine/E in linked.engines) + if(linked.engines_state == !E.is_on()) + E.toggle() + . = TRUE + + if("set_global_limit") + var/newlim = input("Input new thrust limit (0..100%)", "Thrust limit", linked.thrust_limit*100) as num + linked.thrust_limit = clamp(newlim/100, 0, 1) + for(var/datum/ship_engine/E in linked.engines) + E.set_thrust_limit(linked.thrust_limit) + . = TRUE + + if("global_limit") + linked.thrust_limit = clamp(linked.thrust_limit + text2num(params["global_limit"]), 0, 1) + for(var/datum/ship_engine/E in linked.engines) + E.set_thrust_limit(linked.thrust_limit) + . = TRUE + + if("set_limit") + var/datum/ship_engine/E = locate(params["engine"]) + var/newlim = input("Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit()) as num + var/limit = clamp(newlim/100, 0, 1) + if(istype(E)) + E.set_thrust_limit(limit) + . = TRUE + + if("limit") + var/datum/ship_engine/E = locate(params["engine"]) + var/limit = clamp(E.get_thrust_limit() + text2num(params["limit"]), 0, 1) + if(istype(E)) + E.set_thrust_limit(limit) + . = TRUE + + if("toggle_engine") + var/datum/ship_engine/E = locate(params["engine"]) + if(istype(E)) + E.toggle() + . = TRUE + /* END ENGINES */ + /* SENSORS */ + if("range") + var/nrange = input("Set new sensors range", "Sensor range", sensors.range) as num|null + if(nrange) + sensors.set_range(CLAMP(nrange, 1, world.view)) + . = TRUE + if("toggle_sensor") + sensors.toggle() + . = TRUE + if("viewing") + if(usr && !isAI(usr)) + viewing_overmap(usr) ? unlook(usr) : look(usr) + . = TRUE + /* END SENSORS */ + +// We don't want these to do anything. +/datum/tgui_module/ship/fullmonty/sync_linked() + return +/datum/tgui_module/ship/fullmonty/attempt_hook_up_recursive() + return +/datum/tgui_module/ship/fullmonty/attempt_hook_up() + return \ No newline at end of file diff --git a/code/modules/tgui/modules/rustcore_monitor.dm b/code/modules/tgui/modules/rustcore_monitor.dm new file mode 100644 index 0000000000..d4ea472a5b --- /dev/null +++ b/code/modules/tgui/modules/rustcore_monitor.dm @@ -0,0 +1,73 @@ +/datum/tgui_module/rustcore_monitor + name = "R-UST Core Monitoring" + tgui_id = "RustCoreMonitor" + + var/core_tag = "" + +/datum/tgui_module/rustcore_monitor/tgui_act(action, params) + if(..()) + return TRUE + + var/obj/machinery/power/fusion_core/C = null + if(params["core"]) + C = locate(params["core"]) in GLOB.fusion_cores + if(!istype(C)) + return FALSE + + switch(action) + if("toggle_active") + if(!C.Startup()) //Startup() whilst the device is active will return null. + C.Shutdown() + return TRUE + + if("toggle_reactantdump") + C.reactant_dump = !C.reactant_dump + return TRUE + + if("set_tag") + var/new_ident = sanitize_text(input("Enter a new ident tag.", "Core Control", core_tag) as null|text) + if(new_ident) + core_tag = new_ident + return TRUE + + if("set_fieldstr") + var/new_strength = params["fieldstr"] + C.target_field_strength = new_strength + return TRUE + +/datum/tgui_module/rustcore_monitor/tgui_data(mob/user) + var/list/data = list() + var/list/cores = list() + + for(var/obj/machinery/power/fusion_core/C in GLOB.fusion_cores) + if(C.id_tag == core_tag) + + var/list/reactants = list() + + if(C.owned_field) + for(var/reagent in C.owned_field.dormant_reactant_quantities) + reactants.Add(list(list( + "name" = reagent, + "amount" = C.owned_field.dormant_reactant_quantities[reagent] + ))) + + cores.Add(list(list( + "name" = C.name, + "has_field" = C.owned_field ? TRUE : FALSE, + "reactant_dump" = C.reactant_dump, + "core_operational" = C.check_core_status(), + "field_instability" = (C.owned_field ? "[C.owned_field.percent_unstable * 100]%" : "ERROR"), + "field_temperature" = (C.owned_field ? "[C.owned_field.plasma_temperature + 295]K" : "ERROR"), + "field_strength" = C.field_strength, + "target_field_strength" = C.target_field_strength, + "x" = C.x, + "y" = C.y, + "z" = C.z, + "ref" = "\ref[C]" + ))) + + data["cores"] = cores + return data + +/datum/tgui_module/rustcore_monitor/ntos + ntos = TRUE diff --git a/code/modules/tgui/modules/rustfuel_control.dm b/code/modules/tgui/modules/rustfuel_control.dm new file mode 100644 index 0000000000..a1e7336419 --- /dev/null +++ b/code/modules/tgui/modules/rustfuel_control.dm @@ -0,0 +1,51 @@ +/datum/tgui_module/rustfuel_control + name = "Fuel Injector Control" + tgui_id = "RustFuelControl" + + var/fuel_tag = "" + +/datum/tgui_module/rustfuel_control/tgui_act(action, params) + if(..()) + return TRUE + + switch(action) + if("toggle_active") + var/obj/machinery/fusion_fuel_injector/FI = locate(params["fuel"]) in GLOB.fuel_injectors + if(!istype(FI)) + return FALSE + + if(FI.injecting) + FI.StopInjecting() + else + FI.BeginInjecting() + + return TRUE + + if("set_tag") + var/new_ident = sanitize_text(input("Enter a new ident tag.", "Gyrotron Control", fuel_tag) as null|text) + if(new_ident) + fuel_tag = new_ident + +/datum/tgui_module/rustfuel_control/tgui_data(mob/user) + var/list/data = list() + var/list/fuels = list() + + for(var/obj/machinery/fusion_fuel_injector/FI in GLOB.fuel_injectors) + if(FI.id_tag == fuel_tag) + fuels.Add(list(list( + "name" = FI.name, + "active" = FI.injecting, + "fuel_type" = (FI.cur_assembly ? FI.cur_assembly.fuel_type : "NONE"), + "fuel_amt" = (FI.cur_assembly ? "[FI.cur_assembly.percent_depleted * 100]%" : "NONE"), + "deployed" = FI.anchored, + "x" = FI.x, + "y" = FI.y, + "z" = FI.z, + "ref" = "\ref[FI]" + ))) + + data["fuels"] = fuels + return data + +/datum/tgui_module/rustfuel_control/ntos + ntos = TRUE diff --git a/code/modules/tgui/modules/shutoff_monitor.dm b/code/modules/tgui/modules/shutoff_monitor.dm index ead6502dc4..beba99ca81 100644 --- a/code/modules/tgui/modules/shutoff_monitor.dm +++ b/code/modules/tgui/modules/shutoff_monitor.dm @@ -10,19 +10,19 @@ if("toggle_enable") var/obj/machinery/atmospherics/valve/shutoff/S = locate(params["valve"]) if(!istype(S)) - return 0 + return FALSE S.close_on_leaks = !S.close_on_leaks - return 1 + return TRUE if("toggle_open") var/obj/machinery/atmospherics/valve/shutoff/S = locate(params["valve"]) if(!istype(S)) - return 0 + return FALSE if(S.open) S.close() else S.open() - return 1 + return TRUE /datum/tgui_module/shutoff_monitor/tgui_data(mob/user) var/list/data = list() diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm index 6d1c680927..7009f6f884 100644 --- a/code/modules/tgui/states/admin.dm +++ b/code/modules/tgui/states/admin.dm @@ -7,6 +7,6 @@ GLOBAL_DATUM_INIT(tgui_admin_state, /datum/tgui_state/admin_state, new) /datum/tgui_state/admin_state/can_use_topic(src_object, mob/user) - if(check_rights_for(user.client, R_ADMIN)) + if(check_rights_for(user.client, R_ADMIN|R_EVENT)) return STATUS_INTERACTIVE return STATUS_CLOSE diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index a69295452b..93ba1df55f 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -61,7 +61,7 @@ GLOBAL_DATUM_INIT(tgui_default_state, /datum/tgui_state/default, new) return STATUS_CLOSE -/mob/living/simple_animal/default_can_use_tgui_topic(src_object) +/mob/living/simple_mob/default_can_use_tgui_topic(src_object) . = shared_tgui_interaction(src_object) if(. > STATUS_CLOSE) . = min(., shared_living_tgui_distance(src_object)) //simple animals can only use things they're near. @@ -74,6 +74,6 @@ GLOBAL_DATUM_INIT(tgui_default_state, /datum/tgui_state/default, new) return ..() /mob/observer/dead/default_can_use_tgui_topic() - if(can_admin_interact()) + if(check_rights(R_ADMIN|R_EVENT, 0, src)) return STATUS_INTERACTIVE // Admins are more equal return STATUS_UPDATE // Ghosts can view updates diff --git a/code/modules/tgui/states/observer.dm b/code/modules/tgui/states/observer.dm index bf98f44465..bdfe690dba 100644 --- a/code/modules/tgui/states/observer.dm +++ b/code/modules/tgui/states/observer.dm @@ -9,7 +9,7 @@ GLOBAL_DATUM_INIT(tgui_observer_state, /datum/tgui_state/observer_state, new) /datum/tgui_state/observer_state/can_use_topic(src_object, mob/user) if(isobserver(user)) return STATUS_INTERACTIVE - if(check_rights(R_ADMIN, 0, src)) + if(check_rights(R_ADMIN|R_EVENT, 0, src)) return STATUS_INTERACTIVE return STATUS_CLOSE diff --git a/code/modules/tgui/states/vorepanel_vr.dm b/code/modules/tgui/states/vorepanel_vr.dm new file mode 100644 index 0000000000..855c332c08 --- /dev/null +++ b/code/modules/tgui/states/vorepanel_vr.dm @@ -0,0 +1,18 @@ + /** + * tgui state: vorepanel_state + * + * Only checks that the user and src_object are the same. + **/ + +GLOBAL_DATUM_INIT(tgui_vorepanel_state, /datum/tgui_state/vorepanel_state, new) + +/datum/tgui_state/vorepanel_state/can_use_topic(src_object, mob/user) + if(src_object != user) + // Note, in order to allow others to look at others vore panels, change this to + // STATUS_UPDATE + return STATUS_CLOSE + if(!user.client) + return STATUS_CLOSE + if(user.stat == DEAD) + return STATUS_DISABLED + return STATUS_INTERACTIVE \ No newline at end of file diff --git a/code/modules/turbolift/turbolift_turfs.dm b/code/modules/turbolift/turbolift_turfs.dm index 8949f71448..0fb3302885 100644 --- a/code/modules/turbolift/turbolift_turfs.dm +++ b/code/modules/turbolift/turbolift_turfs.dm @@ -1,2 +1,2 @@ /turf/simulated/wall/elevator/Initialize(mapload) - ..(mapload, "elevatorium") + . = ..(mapload, "elevatorium") diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css index 40e4c3c1e2..99635ac464 100644 --- a/code/modules/vchat/css/ss13styles.css +++ b/code/modules/vchat/css/ss13styles.css @@ -120,8 +120,10 @@ body.inverted { /* Miscellaneous */ .name {font-weight: bold;} -.say {} -.emote {} +.say {color: #000000;} +.inverted .say {color: #FFFFFF;} +.emote {color: #000000;} +.inverted .emote {color: #FFFFFF;} .alert {color: #ff0000;} h1.alert, h2.alert {color: #000000;} .nif {} /* VOREStation Add */ @@ -154,7 +156,7 @@ h1.alert, h2.alert {color: #000000;} .akhani {color: #AC398C;} .skrell {color: #00B0B3;} .skrellfar {color: #70FCFF;} -.soghun {color: #228B22;} +.soghun {color: #50BA6C;} .solcom {color: #22228B;} .changeling {color: #800080;} .sergal {color: #0077FF;} @@ -216,7 +218,8 @@ img.icon.bigicon {max-height: 32px;} /* Debug Logs */ .debug_error {color:#FF0000; font-weight:bold} .debug_warning {color:#FF0000;} -.debug_info {} +.debug_info {color:#000000;} +.inverted .debug_info {color: #FFFFFF;} .debug_debug {color:#0000FF;} .debug_trace {color:#888888;} diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index a69cd8179e..49d5ef211f 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -37,7 +37,7 @@ /obj/item/weapon/virusdish name = "virus dish" icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" + icon_state = "virussample" var/datum/disease2/disease/virus2 = null var/growth = 0 var/basic_info = null @@ -81,7 +81,7 @@ /obj/item/weapon/ruinedvirusdish name = "ruined virus sample" icon = 'icons/obj/items.dmi' - icon_state = "implantcase-b" + icon_state = "virussample-ruined" desc = "The bacteria in the dish are completely dead." /obj/item/weapon/ruinedvirusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob) diff --git a/code/modules/vore/appearance/preferences_vr.dm b/code/modules/vore/appearance/preferences_vr.dm index 5897cb2a48..01caeda13d 100644 --- a/code/modules/vore/appearance/preferences_vr.dm +++ b/code/modules/vore/appearance/preferences_vr.dm @@ -20,36 +20,3 @@ var/r_acc3 = 30 var/g_acc3 = 30 var/b_acc3 = 30 - var/datum/sprite_accessory/ears/ear_style = null - var/r_ears = 30 - var/g_ears = 30 - var/b_ears = 30 - var/r_ears2 = 30 - var/g_ears2 = 30 - var/b_ears2 = 30 - var/r_ears3 = 30 //Trust me, we could always use more colour. No japes. - var/g_ears3 = 30 - var/b_ears3 = 30 - var/datum/sprite_accessory/tail/tail_style = null - var/r_tail = 30 - var/g_tail = 30 - var/b_tail = 30 - var/r_tail2 = 30 - var/g_tail2 = 30 - var/b_tail2 = 30 - var/r_tail3 = 30 - var/g_tail3 = 30 - var/b_tail3 = 30 - var/datum/sprite_accessory/wing/wing_style = null - var/r_wing = 30 - var/g_wing = 30 - var/b_wing = 30 - var/r_wing2 = 30 - var/g_wing2 = 30 - var/b_wing2 = 30 - var/r_wing3 = 30 - var/g_wing3 = 30 - var/b_wing3 = 30 - - // Custom Species Name - var/custom_species diff --git a/code/modules/vore/appearance/spider_taur_powers_vr.dm b/code/modules/vore/appearance/spider_taur_powers_vr.dm deleted file mode 100644 index 3e9cf2657b..0000000000 --- a/code/modules/vore/appearance/spider_taur_powers_vr.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/item/clothing/suit/web_bindings/ - icon = 'icons/vore/custom_clothes_vr.dmi' - icon_override = 'icons/vore/custom_clothes_vr.dmi' - name = "web bindings" - desc = "A webbed cocoon that completely restrains the wearer." - icon_state = "web_bindings" - item_state = "web_bindings_mob" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL - //yw edit - Teshari sprite - sprite_sheets = list( - SPECIES_TESHARI = 'icons/vore/custom_onmob_yw.dmi' - ) - //yw edit end - -//yw edit start - Teshari Sprite -/obj/item/clothing/suit/web_bindings/get_worn_icon_file(var/body_type,var/slot_name,var/default_icon,var/inhands) - if(body_type == SPECIES_TESHARI) - if(!inhands) - return 'icons/vore/custom_onmob_yw.dmi' - return ..() -//yw edit end - -/mob/living/proc/weaveWebBindings() - set name = "Weave Web Bindings" - set category = "Species Powers" - if(nutrition >= 30) //This isn't a huge problem. This is so you can bind people up. - src.visible_message("\the [src] pulls silk from their manibles and delicately weaves it into bindings.") - adjust_nutrition(-30) - spawn(30) //5 seconds to weave the bindings~ - var/obj/item/clothing/suit/web_bindings/bindings = new() //This sprite is amazing, I must say. - src.put_in_hands(bindings) - else - to_chat(src, "You do not have enough nutrition to create webbing!") //CK~ - diff --git a/code/modules/vore/appearance/sprite_accessories_ch.dm b/code/modules/vore/appearance/sprite_accessories_ch.dm index 7992902b8d..9cc62fd860 100644 --- a/code/modules/vore/appearance/sprite_accessories_ch.dm +++ b/code/modules/vore/appearance/sprite_accessories_ch.dm @@ -38,6 +38,25 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/teshbeeantenna + name = "Teshari bee antenna" + icon = 'icons/mob/vore/ears_ch.dmi' + icon_state = "teshbee" + +/datum/sprite_accessory/ears/teshantenna + name = "Teshari antenna, colorable" + icon = 'icons/mob/vore/ears_ch.dmi' + icon_state = "teshantenna" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/curlyteshantenna + name = "Teshari curly antenna, colorable" + icon = 'icons/mob/vore/ears_ch.dmi' + icon_state = "curly_bug_tesh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //TAILS /datum/sprite_accessory/tail/alien_slug name = "Alien slug tail" @@ -77,6 +96,100 @@ extra_overlay = "valetail_mark" extra_overlay_w = "valetail_mark_w" +/datum/sprite_accessory/tail/teshbeethorax + name = "Teshari bee thorax" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "beethorax_tesh" + +/datum/sprite_accessory/tail/teshbuggo + name = "Teshari bug abdomen, colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbug_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/teshbuggobee + name = "Teshari bug abdomen, bee top, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbug_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshbee_markings" + +/datum/sprite_accessory/tail/teshbeefull + name = "Teshari bug abdomen, bee full, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbug_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshbeefull_markings" + +/datum/sprite_accessory/tail/teshbuggounder + name = "Teshari bug abdomen, underside, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbug_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshunder_markings" + +/datum/sprite_accessory/tail/teshbuggofirefly + name = "Teshari bug abdomen, firefly, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbug_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshfirefly_markings" + +/datum/sprite_accessory/tail/fatteshbuggo + name = "Teshari fat bug abdomen, colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbugfat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fatteshbuggobee + name = "Teshari fat bug abdomen, bee top, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbugfat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshfatbee_markings" + +/datum/sprite_accessory/tail/fatteshbeefull + name = "Teshari fat bug abdomen, bee full, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbugfat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshfatbeefull_markings" + +/datum/sprite_accessory/tail/fatteshbuggounder + name = "Teshari fat bug abdomen, underside, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbugfat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshfatunder_markings" + +/datum/sprite_accessory/tail/fatteshbuggofirefly + name = "Teshari fat bug abdomen, firefly, dual-colorable" + desc = "" + icon = 'icons/mob/vore/tails_ch.dmi' + icon_state = "teshbugfat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshfatfirefly_markings" + //WINGS /datum/sprite_accessory/wing/snagc @@ -86,6 +199,18 @@ icon_state = "csnag-backplate" do_colouration = 1 +/datum/sprite_accessory/wing/teshbee + name = "Teshari bee wings" + desc = "" + icon = 'icons/mob/vore/wings_ch.dmi' + icon_state = "beewings_tesh" + +/datum/sprite_accessory/wing/teshdragonfly + name = "Teshari dragonfly wings" + desc = "" + icon = 'icons/mob/vore/wings_ch.dmi' + icon_state = "dragonfly_tesh" + /datum/sprite_accessory/wing/snail //We should some day make a variable to make some wings not be able to fly name = "Snail shell" desc = "" diff --git a/code/modules/vore/appearance/sprite_accessories_taur_ch.dm b/code/modules/vore/appearance/sprite_accessories_taur_ch.dm new file mode 100644 index 0000000000..4df2ff7831 --- /dev/null +++ b/code/modules/vore/appearance/sprite_accessories_taur_ch.dm @@ -0,0 +1,30 @@ +/datum/sprite_accessory/tail/taur/naga/alt + name = "Naga alt (Taur)" + icon_state = "naga_alt_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + suit_sprites = 'icons/mob/taursuits_naga_ch.dmi' + +/datum/sprite_accessory/tail/taur/naga/alt_2c + name = "Naga dual-color alt (Taur)" + icon_state = "naga_alt_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + extra_overlay = "naga_alt_markings" + suit_sprites = 'icons/mob/taursuits_naga_ch.dmi' + +/datum/sprite_accessory/tail/taur/horse/scoli + name = "Scolipede (Taur)" + icon_state = "scoli_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + extra_overlay = "scoli_markings1" + extra_overlay2 = "scoli_markings2" + +/datum/sprite_accessory/tail/taur/lizard/fat + name = "Fat Lizard (Taur)" + icon_state = "fatlizard_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + +/datum/sprite_accessory/tail/taur/lizard/fat_2c + name = "Fat Lizard (Taur, dual-color)" + icon_state = "fatlizard_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + extra_overlay= "fatlizard_markings" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm deleted file mode 100644 index 8b317fc4cc..0000000000 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ /dev/null @@ -1,2010 +0,0 @@ -/* - Hello and welcome to VOREStation sprite_accessories: For a more general overview - please read sprite_accessories.dm. This file is for ears and tails. - This is intended to be friendly for people with little to no actual coding experience. - !!WARNING!!: changing existing accessory information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm -*/ - -// Add Additional variable onto sprite_accessory -/datum/sprite_accessory - // Ckey of person allowed to use this, if defined. - var/list/ckeys_allowed = null - var/apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings - -/* -//////////////////////////// -/ =--------------------= / -/ == Ear Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/ears - name = "You should not see this..." - icon = 'icons/mob/vore/ears_vr.dmi' - do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color - - var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 - var/desc = "You should not see this..." - -// Species-unique ears - -/datum/sprite_accessory/ears/shadekin - name = "Shadekin Ears, colorable" - desc = "" - icon_state = "shadekin" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -// Ears avaliable to anyone - -/datum/sprite_accessory/ears/hyena - name = "hyena ears, dual-color" - desc = "" - icon_state = "hyena" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "hyena-inner" - -/datum/sprite_accessory/ears/moth - name = "moth antennae" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/squirrel_orange - name = "squirel, orange" - desc = "" - icon_state = "squirrel-orange" - -/datum/sprite_accessory/ears/squirrel_red - name = "squirrel, red" - desc = "" - icon_state = "squirrel-red" - -/datum/sprite_accessory/ears/bunny_white - name = "bunny, white" - desc = "" - icon_state = "bunny" - -/datum/sprite_accessory/ears/bear_brown - name = "bear, brown" - desc = "" - icon_state = "bear-brown" - -/datum/sprite_accessory/ears/bear_panda - name = "bear, panda" - desc = "" - icon_state = "panda" - -/datum/sprite_accessory/ears/wolf_grey - name = "wolf, grey" - desc = "" - icon_state = "wolf-grey" - -/datum/sprite_accessory/ears/wolf_green - name = "wolf, green" - desc = "" - icon_state = "wolf-green" - -/datum/sprite_accessory/ears/wisewolf - name = "wolf, wise" - desc = "" - icon_state = "wolf-wise" - -/datum/sprite_accessory/ears/mouse_grey - name = "mouse, grey" - desc = "" - icon_state = "mouse-grey" - -/datum/sprite_accessory/ears/bee - name = "bee antennae" - desc = "" - icon_state = "bee" - -/datum/sprite_accessory/ears/antennae - name = "antennae, colorable" - desc = "" - icon_state = "antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/curly_bug - name = "curly antennae, colorable" - desc = "" - icon_state = "curly_bug" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dual_robot - name = "synth antennae, colorable" - desc = "" - icon_state = "dual_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/right_robot - name = "right synth, colorable" - desc = "" - icon_state = "right_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/left_robot - name = "left synth, colorable" - desc = "" - icon_state = "left_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/oni_h1 - name = "oni horns" - desc = "" - icon_state = "oni-h1" - -/datum/sprite_accessory/ears/oni_h1_c - name = "oni horns, colorable" - desc = "" - icon_state = "oni-h1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns1 - name = "demon horns" - desc = "" - icon_state = "demon-horns1" - -/datum/sprite_accessory/ears/demon_horns1_c - name = "demon horns, colorable" - desc = "" - icon_state = "demon-horns1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns2 - name = "demon horns, colorable(outward)" - desc = "" - icon_state = "demon-horns2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dragon_horns - name = "dragon horns, colorable" - desc = "" - icon_state = "dragon-horns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/foxears - name = "highlander zorren ears" - desc = "" - icon_state = "foxears" - -/datum/sprite_accessory/ears/fenears - name = "flatland zorren ears" - desc = "" - icon_state = "fenears" - -/datum/sprite_accessory/ears/sergal //Redundant - name = "Sergal ears" - icon_state = "serg_plain_s" - -/datum/sprite_accessory/ears/foxearshc - name = "highlander zorren ears, colorable" - desc = "" - icon_state = "foxearshc" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/fenearshc - name = "flatland zorren ears, colorable" - desc = "" - icon_state = "fenearshc" - extra_overlay = "fenears-inner" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sergalhc - name = "Sergal ears, colorable" - icon_state = "serg_plain_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/mousehc - name = "mouse, colorable" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "mouseinner" - -/datum/sprite_accessory/ears/mousehcno - name = "mouse, colorable, no inner" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/wolfhc - name = "wolf, colorable" - desc = "" - icon_state = "wolf" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "wolfinner" - -/datum/sprite_accessory/ears/bearhc - name = "bear, colorable" - desc = "" - icon_state = "bear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallbear - name = "small bear" - desc = "" - icon_state = "smallbear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/squirrelhc - name = "squirrel, colorable" - desc = "" - icon_state = "squirrel" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/kittyhc - name = "kitty, colorable" - desc = "" - icon_state = "kitty" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "kittyinner" - -/datum/sprite_accessory/ears/bunnyhc - name = "bunny, colorable" - desc = "" - icon_state = "bunny" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers - name = "antlers" - desc = "" - icon_state = "antlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers_e - name = "antlers with ears" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "antlers_mark" - -/datum/sprite_accessory/ears/smallantlers - name = "small antlers" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallantlers_e - name = "small antlers with ears" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "deer" - -/datum/sprite_accessory/ears/deer - name = "deer ears" - desc = "" - icon_state = "deer" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow - name = "cow, horns" - desc = "" - icon_state = "cow" - -/datum/sprite_accessory/ears/cowc - name = "cow, horns, colorable" - desc = "" - icon_state = "cow-c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow_nohorns - name = "cow, no horns" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/caprahorns - name = "caprine horns" - desc = "" - icon_state = "caprahorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/otie - name = "otie, colorable" - desc = "" - icon_state = "otie" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "otie-inner" - -/datum/sprite_accessory/ears/donkey - name = "donkey, colorable" - desc = "" - icon_state = "donkey" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "otie-inner" - -/datum/sprite_accessory/ears/zears - name = "jagged ears" - desc = "" - icon_state = "zears" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/elfs - name = "elven ears" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sleek - name = "sleek ears" - desc = "" - icon_state = "sleek" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/drake - name = "drake frills" - desc = "" - icon_state = "drake" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/vulp - name = "vulpkanin, dual-color" - desc = "" - icon_state = "vulp" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp-inner" - -/datum/sprite_accessory/ears/vulp_short - name = "vulpkanin short" - desc = "" - icon_state = "vulp_terrier" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/vulp_short_dc - name = "vulpkanin short, dual-color" - desc = "" - icon_state = "vulp_terrier" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp_terrier-inner" - -/datum/sprite_accessory/ears/vulp_jackal - name = "vulpkanin thin, dual-color" - desc = "" - icon_state = "vulp_jackal" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp_jackal-inner" - -/datum/sprite_accessory/ears/bunny_floppy - name = "floopy bunny ears (colorable)" - desc = "" - icon_state = "floppy_bun" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/teshari - name = "Teshari (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshariinner" - -/datum/sprite_accessory/ears/tesharihigh - name = "Teshari upper ears (colorable)" - desc = "" - icon_state = "tesharihigh" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharihighinner" - -/datum/sprite_accessory/ears/tesharilow - name = "Teshari lower ears (colorable)" - desc = "" - icon_state = "tesharilow" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharilowinner" - -/datum/sprite_accessory/ears/tesh_pattern_ear_male - name = "Teshari male ear pattern (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_male_pattern" - -/datum/sprite_accessory/ears/tesh_pattern_ear_female - name = "Teshari female ear pattern (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_female_pattern" - -/datum/sprite_accessory/ears/inkling - name = "colorable mature inkling hair" - desc = "" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "inkling-colorable" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - -/datum/sprite_accessory/ears/large_dragon - name = "Large dragon horns" - desc = "" - icon_state = "big_liz" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -// Special snowflake ears go below here. - -/datum/sprite_accessory/ears/molenar_kitsune - name = "quintail kitsune ears (Molenar)" - desc = "" - icon_state = "molenar-kitsune" - -/datum/sprite_accessory/ears/lilimoth_antennae - name = "citheronia antennae (Kira72)" - desc = "" - icon_state = "lilimoth_antennae" - -/datum/sprite_accessory/ears/molenar_deathclaw - name = "deathclaw ears (Molenar)" - desc = "" - icon_state = "molenar-deathclaw" - -/datum/sprite_accessory/ears/miria_fluffdragon - name = "fluffdragon ears (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragonears" - -/datum/sprite_accessory/ears/miria_kitsune - name = "kitsune ears (Miria Masters)" - desc = "" - icon_state = "miria-kitsuneears" - -/datum/sprite_accessory/ears/runac - name = "fennecsune ears (Runac)" - desc = "" - icon_state = "runac" - -/datum/sprite_accessory/ears/kerena - name = "wingwolf ears (Kerena)" - desc = "" - icon_state = "kerena" - -/datum/sprite_accessory/ears/rosey - name = "tritail kitsune ears (Rosey)" - desc = "" - icon_state = "rosey" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/aronai - name = "aronai ears/head (Aronai)" - desc = "" - icon_state = "aronai" - -/datum/sprite_accessory/ears/holly - name = "tigress ears (Holly Sharp)" - desc = "" - icon_state = "tigressears" - -/datum/sprite_accessory/ears/molenar_inkling - name = "teal mature inkling hair (Kari Akiren)" - desc = "" - icon_state = "molenar-tentacle" - -/datum/sprite_accessory/ears/shock - name = "pharoah hound ears (Shock Diamond)" - desc = "" - icon_state = "shock" - -/datum/sprite_accessory/ears/alurane - name = "alurane ears/hair (Pumila)" - desc = "" - icon_state = "alurane-ears" - -/datum/sprite_accessory/ears/frost - name = "Frost antenna" - desc = "" - icon_state = "frosted_tips" - -/datum/sprite_accessory/ears/sylv_pip - name = "sylveon ears and ribbons (Pip Shyner)" - desc = "" - icon_state = "pipears" - -/datum/sprite_accessory/ears/elf_caprine_colorable - name = "Caprine horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "caprahorns" - -/datum/sprite_accessory/ears/elf_oni_colorable - name = "oni horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "oni-h1_c" - -/datum/sprite_accessory/ears/elf_demon_colorable - name = "Demon horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "demon-horns1_c" - -/datum/sprite_accessory/ears/elf_demon_outwards_colorable - name = "Demon horns with pointy ears, outwards, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "demon-horns2" - -/datum/sprite_accessory/ears/elf_dragon_colorable - name = "Dragon horns with pointy ears, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "dragon-horns" - -/datum/sprite_accessory/ears/synthhorns_plain - name = "Synth horns, plain" - desc = "" - icon_state = "synthhorns_plain" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "synthhorns_plain_light" - -/datum/sprite_accessory/ears/synthhorns_thick - name = "Synth horns, thick" - desc = "" - icon_state = "synthhorns_thick" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "synthhorns_thick_light" - -/datum/sprite_accessory/ears/synthhorns_curly - name = "Synth horns, curly" - desc = "" - icon_state = "synthhorns_curled" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/forward_curled_demon_horns_bony - name = "Succubus horns, colourable" - desc = "" - icon_state = "succu-horns_b" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/forward_curled_demon_horns_bony_with_colorable_ears - name = "Succubus horns with pointy ears, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "succu-horns_b" - - - -/* -//////////////////////////// -/ =--------------------= / -/ == Wing Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/wing - name = "You should not see this..." - icon = 'icons/mob/vore/wings_vr.dmi' - do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 //Tertiary. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. - // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana - var/desc = "You should not see this..." - var/ani_state // State when flapping/animated - var/extra_overlay_w // Flapping state for extra overlay - var/extra_overlay2_w - -/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings. - name = "pharoah hound tail (Shock Diamond)" - desc = "" - icon_state = "shock" - -/datum/sprite_accessory/wing/featheredlarge //Made by Natje! - name = "large feathered wings (colorable)" - desc = "" - icon_state = "feathered2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. - name = "spider legs" - desc = "" - icon_state = "spider-legs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/moth - name = "moth wings" - desc = "" - icon_state = "moth" - -/datum/sprite_accessory/wing/mothc - name = "moth wings, colorable" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/dragonfly - name = "dragonfly" - desc = "" - icon_state = "dragonfly" - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/citheroniamoth - name = "citheronia wings" - desc = "" - icon_state = "citheronia_wings" - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered_medium - name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. - desc = "" - icon_state = "feathered3" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/bat_black - name = "bat wings, black" - desc = "" - icon_state = "bat-black" - -/datum/sprite_accessory/wing/bat_color - name = "bat wings, colorable" - desc = "" - icon_state = "bat-color" - do_colouration = 1 - -/datum/sprite_accessory/wing/bat_red - name = "bat wings, red" - desc = "" - icon_state = "bat-red" - -/datum/sprite_accessory/wing/harpywings - name = "harpy wings, colorable" - desc = "" - icon_state = "harpywings" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/harpywings_alt - name = "harpy wings alt, archeopteryx" - desc = "" - icon_state = "harpywings_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_altmarkings" - -/datum/sprite_accessory/wing/harpywings_alt_neckfur - name = "harpy wings alt, archeopteryx & neckfur" - desc = "" - icon_state = "harpywings_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_altmarkings" - extra_overlay2 = "neckfur" - -/datum/sprite_accessory/wing/harpywings_bat - name = "harpy wings, bat" - desc = "" - icon_state = "harpywings_bat" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_batmarkings" - -/datum/sprite_accessory/wing/harpywings_bat_neckfur - name = "harpy wings, bat & neckfur" - desc = "" - icon_state = "harpywings_bat" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_batmarkings" - extra_overlay2 = "neckfur" - -/datum/sprite_accessory/wing/neckfur - name = "neck fur" - desc = "" - icon_state = "neckfur" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/beewings - name = "bee wings" - desc = "" - icon_state = "beewings" - -/datum/sprite_accessory/wing/sepulchre - name = "demon wings (Sepulchre)" - desc = "" - icon_state = "sepulchre_wings" - -/datum/sprite_accessory/wing/miria_fluffdragon - name = "fluffdragon wings (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragontail" - -/datum/sprite_accessory/wing/scree - name = "green taj wings (Scree)" - desc = "" - icon_state = "scree-wings" - -/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? - name = "gazer eyestalks" - desc = "" - icon_state = "liquidfirefly-eyestalks" - -/datum/sprite_accessory/wing/moth_full - name = "moth antenna and wings" - desc = "" - icon_state = "moth_full" - -/datum/sprite_accessory/wing/moth_full_gray - name = "moth antenna and wings, colorable" - desc = "" - icon_state = "moth_full_gray" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/kerena - name = "wingwolf wings (Kerena)" - desc = "" - icon_state = "kerena-wings" - -/datum/sprite_accessory/wing/snag - name = "xenomorph backplate" - desc = "" - icon_state = "snag-backplate" - -/datum/sprite_accessory/wing/sepulchre_c_yw - name = "demon wings (colorable)" - desc = "" - icon_state = "sepulchre_wingsc" - do_colouration = 1 - -/datum/sprite_accessory/wing/cyberdragon - name = "Cyber dragon wing (colorable)" - desc = "" - icon_state = "cyberdragon_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/cyberdragon_red - name = "Cyber dragon wing (red)" - desc = "" - icon_state = "cyberdragon_red_s" - do_colouration = 0 - -/datum/sprite_accessory/wing/cyberdoe - name = "Cyber doe wing" - desc = "" - icon_state = "cyberdoe_s" - do_colouration = 0 - -/datum/sprite_accessory/wing/drago_wing - name = "Cybernetic Dragon wings" - desc = "" - icon_state = "drago_wing" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "drago_wing_2" - -/* -//////////////////////////// -/ =--------------------= / -/ == Tail Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/tail - name = "You should not see this..." - icon = 'icons/mob/vore/tails_vr.dmi' - do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 //Tertiary. - var/show_species_tail = 0 // If false, do not render species' tail. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it - var/desc = "You should not see this..." - var/ani_state // State when wagging/animated - var/extra_overlay_w // Wagging state for extra overlay - var/extra_overlay2_w // Tertiary wagging. - var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. - var/icon/clip_mask_icon = null //Icon file used for clip mask. - var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. - var/icon/clip_mask = null //Instantiated clip mask of given icon and state - -/datum/sprite_accessory/tail/New() - . = ..() - if(clip_mask_icon && clip_mask_state) - clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state) - -// Species-unique tails - -// Everyone tails - -/datum/sprite_accessory/tail/invisible - name = "hide species-sprite tail" - icon = null - icon_state = null - -/datum/sprite_accessory/tail/squirrel_orange - name = "squirel, orange" - desc = "" - icon_state = "squirrel-orange" - -/datum/sprite_accessory/tail/squirrel_red - name = "squirrel, red" - desc = "" - icon_state = "squirrel-red" - -/datum/sprite_accessory/tail/squirrel - name = "squirrel, colorable" - desc = "" - icon_state = "squirrel" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/kitty - name = "kitty, colorable, downwards" - desc = "" - icon_state = "kittydown" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/kittyup - name = "kitty, colorable, upwards" - desc = "" - icon_state = "kittyup" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/tiger_white - name = "tiger, colorable" - desc = "" - icon_state = "tiger" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tigerinnerwhite" - -/datum/sprite_accessory/tail/stripey - name = "stripey taj, colorable" - desc = "" - icon_state = "stripeytail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "stripeytail_mark" - -/datum/sprite_accessory/tail/stripeytail_brown - name = "stripey taj, brown" - desc = "" - icon_state = "stripeytail-brown" - -/datum/sprite_accessory/tail/chameleon - name = "Chameleon, colorable" - desc = "" - icon_state = "chameleon" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/bunny - name = "bunny, colorable" - desc = "" - icon_state = "bunny" - do_colouration = 1 - -/datum/sprite_accessory/tail/bear_brown - name = "bear, brown" - desc = "" - icon_state = "bear-brown" - -/datum/sprite_accessory/tail/bear - name = "bear, colorable" - desc = "" - icon_state = "bear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/dragon - name = "dragon, colorable" - desc = "" - icon_state = "dragon" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/wolf_grey - name = "wolf, grey" - desc = "" - icon_state = "wolf-grey" - -/datum/sprite_accessory/tail/wolf_green - name = "wolf, green" - desc = "" - icon_state = "wolf-green" - -/datum/sprite_accessory/tail/wisewolf - name = "wolf, wise" - desc = "" - icon_state = "wolf-wise" - -/datum/sprite_accessory/tail/blackwolf - name = "wolf, black" - desc = "" - icon_state = "wolf" - -/datum/sprite_accessory/tail/wolf - name = "wolf, colorable" - desc = "" - icon_state = "wolf" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "wolfinner" - -/datum/sprite_accessory/tail/mouse_pink - name = "mouse, pink" - desc = "" - icon_state = "mouse-pink" - -/datum/sprite_accessory/tail/mouse - name = "mouse, colorable" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/horse - name = "horse tail, colorable" - desc = "" - icon_state = "horse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/cow - name = "cow tail, colorable" - desc = "" - icon_state = "cow" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/fantail - name = "avian fantail, colorable" - desc = "" - icon_state = "fantail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/wagtail - name = "avian wagtail, colorable" - desc = "" - icon_state = "wagtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/nevreandc - name = "nevrean tail, dual-color" - desc = "" - icon_state = "nevreantail_dc" - extra_overlay = "nevreantail_dc_tail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/nevreanwagdc - name = "nevrean wagtail, dual-color" - desc = "" - icon_state = "wagtail" - extra_overlay = "wagtail_dc_tail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/nevreanwagdc_alt - name = "nevrean wagtail, marked, dual-color" - desc = "" - icon_state = "wagtail2_dc" - extra_overlay = "wagtail2_dc_mark" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/crossfox - name = "cross fox" - desc = "" - icon_state = "crossfox" - -/datum/sprite_accessory/tail/beethorax - name = "bee thorax" - desc = "" - icon_state = "beethorax" - -/datum/sprite_accessory/tail/doublekitsune - name = "double kitsune tail, colorable" - desc = "" - icon_state = "doublekitsune" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/spade_color - name = "spade-tail (colorable)" - desc = "" - icon_state = "spadetail-black" - do_colouration = 1 - -/datum/sprite_accessory/tail/snag - name = "xenomorph tail 1" - desc = "" - icon_state = "snag" - -/datum/sprite_accessory/tail/xenotail - name = "xenomorph tail 2" - desc = "" - icon_state = "xenotail" - -/datum/sprite_accessory/tail/eboop - name = "EGN mech tail (dual color)" - desc = "" - icon_state = "eboop" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "eboop_mark" - -/datum/sprite_accessory/tail/molenar_kitsune - name = "quintail kitsune tails (Molenar)" - desc = "" - icon_state = "molenar-kitsune" - -/datum/sprite_accessory/tail/miria_fluffdragon - name = "fluffdragon tail (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragontail" - -/datum/sprite_accessory/tail/miria_kitsune - name = "Black kitsune tails (Miria Masters)" - desc = "" - icon_state = "miria-kitsunetail" - -/datum/sprite_accessory/tail/molenar_deathclaw - name = "deathclaw bits (Molenar)" - desc = "" - icon_state = "molenar-deathclaw" - -/datum/sprite_accessory/tail/runac - name = "fennecsune tails (Runac)" - desc = "" - icon_state = "runac" - -/datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail. - name = "fox tail (+ beewings) (Reika)" - desc = "" - icon_state = "reika" - -/datum/sprite_accessory/tail/rosey - name = "tritail kitsune tails (Rosey)" - desc = "" - icon_state = "rosey_three" - -/datum/sprite_accessory/tail/rosey2 - name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK - desc = "" - icon_state = "rosey_five" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/scree - name = "green taj tail (Scree)" - desc = "" - icon_state = "scree" - -/datum/sprite_accessory/tail/aronai - name = "aronai tail (Aronai)" - desc = "" - icon_state = "aronai" - -/datum/sprite_accessory/tail/cabletail - name = "cabletail" - desc = "cabletail" - icon_state = "cabletail" - -/datum/sprite_accessory/tail/featherfluff_tail - name = "featherfluff_tail" - desc = "" - icon_state = "featherfluff_tail" - -/datum/sprite_accessory/tail/ketrai_wag - name = "fennix tail (vwag)" - desc = "" - icon_state = "ketraitail" - ani_state = "ketraitail_w" - -/datum/sprite_accessory/tail/ketrainew_wag - name = "new fennix tail (vwag)" - desc = "" - icon_state = "ketraitailnew" - ani_state = "ketraitailnew_w" - -/datum/sprite_accessory/tail/redpanda - name = "red panda" - desc = "" - icon_state = "redpanda" - -/datum/sprite_accessory/tail/ringtail - name = "ringtail, colorable" - desc = "" - icon_state = "ringtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "ringtail_mark" - -/datum/sprite_accessory/tail/holly - name = "tigress tail (Holly)" - desc = "" - icon_state = "tigresstail" - -/datum/sprite_accessory/tail/satyr - name = "goat legs, colorable" - desc = "" - icon_state = "satyr" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. - clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' - clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. - -/datum/sprite_accessory/tail/tailmaw - name = "tailmaw, colorable" - desc = "" - icon_state = "tailmaw" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - -/datum/sprite_accessory/tail/curltail - name = "curltail (vwag)" - desc = "" - icon_state = "curltail" - ani_state = "curltail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "curltail_mark" - extra_overlay_w = "curltail_mark_w" - -/datum/sprite_accessory/tail/shorttail - name = "shorttail (vwag)" - desc = "" - icon_state = "straighttail" - ani_state = "straighttail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/sneptail - name = "Snep/Furry Tail (vwag)" - desc = "" - icon_state = "sneptail" - ani_state = "sneptail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "sneptail_mark" - extra_overlay_w = "sneptail_mark_w" - - -/datum/sprite_accessory/tail/tiger_new - name = "tiger tail (vwag)" - desc = "" - icon_state = "tigertail" - ani_state = "tigertail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tigertail_mark" - extra_overlay_w = "tigertail_mark_w" - -/datum/sprite_accessory/tail/vulp_new - name = "new vulp tail (vwag)" - desc = "" - icon_state = "vulptail" - ani_state = "vulptail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulptail_mark" - extra_overlay_w = "vulptail_mark_w" - -/datum/sprite_accessory/tail/otietail - name = "otie tail (vwag)" - desc = "" - icon_state = "otie" - ani_state = "otie_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/newtailmaw - name = "new tailmaw (vwag)" - desc = "" - icon_state = "newtailmaw" - ani_state = "newtailmaw_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/ztail - name = "jagged flufftail" - desc = "" - icon_state = "ztail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/snaketail - name = "snake tail, colorable" - desc = "" - icon_state = "snaketail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/vulpan_alt - name = "vulpkanin alt style, colorable" - desc = "" - icon_state = "vulptail_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/sergaltaildc - name = "sergal, dual-color" - desc = "" - icon_state = "sergal" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "sergal_mark" - -/datum/sprite_accessory/tail/skunktail - name = "skunk, dual-color" - desc = "" - icon_state = "skunktail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "skunktail_mark" - -/datum/sprite_accessory/tail/deertail - name = "deer, dual-color" - desc = "" - icon_state = "deertail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "deertail_mark" - -/datum/sprite_accessory/tail/tesh_feathered - name = "Teshari tail" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - extra_overlay = "teshtail_feathers_s" - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/teshari_fluffytail - name = "Teshari alternative, colorable" - desc = "" - icon_state = "teshari_fluffytail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_fluffytail_mark" - -/datum/sprite_accessory/tail/tesh_pattern_male - name = "Teshari male tail pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_male_tail" - -/datum/sprite_accessory/tail/tesh_pattern_male_alt - name = "Teshari male tail alt. pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_male_alt" - -/datum/sprite_accessory/tail/tesh_pattern_fem - name = "Teshari female tail pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_fem_tail" - -/datum/sprite_accessory/tail/tesh_pattern_fem_alt - name = "Teshari male tail alt. pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_fem_alt" - -/datum/sprite_accessory/tail/nightstalker - name = "Nightstalker, colorable" - desc = "" - icon_state = "nightstalker" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -//For all species tails. Includes haircolored tails. -/datum/sprite_accessory/tail/special - name = "Blank tail. Do not select." - icon = 'icons/effects/species_tails_vr.dmi' - -/datum/sprite_accessory/tail/special/unathi - name = "unathi tail" - desc = "" - icon_state = "sogtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/tajaran - name = "tajaran tail" - desc = "" - icon_state = "tajtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/sergal - name = "sergal tail" - desc = "" - icon_state = "sergtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/akula - name = "akula tail" - desc = "" - icon_state = "sharktail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/nevrean - name = "nevrean tail" - desc = "" - icon_state = "nevreantail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/armalis - name = "armalis tail" - desc = "" - icon_state = "armalis_tail_humanoid_s" - -/datum/sprite_accessory/tail/special/xenodrone - name = "xenomorph drone tail" - desc = "" - icon_state = "xenos_drone_tail_s" - -/datum/sprite_accessory/tail/special/xenosentinel - name = "xenomorph sentinel tail" - desc = "" - icon_state = "xenos_sentinel_tail_s" - -/datum/sprite_accessory/tail/special/xenohunter - name = "xenomorph hunter tail" - desc = "" - icon_state = "xenos_hunter_tail_s" - -/datum/sprite_accessory/tail/special/xenoqueen - name = "xenomorph queen tail" - desc = "" - icon_state = "xenos_queen_tail_s" - -/datum/sprite_accessory/tail/special/monkey - name = "monkey tail" - desc = "" - icon_state = "chimptail_s" - -/datum/sprite_accessory/tail/special/unathihc - name = "unathi tail, colorable" - desc = "" - icon_state = "sogtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/tajaranhc - name = "tajaran tail, colorable" - desc = "" - icon_state = "tajtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/sergalhc - name = "sergal tail, colorable" - desc = "" - icon_state = "sergtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/akulahc - name = "akula tail, colorable" - desc = "" - icon_state = "sharktail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/nevreanhc - name = "nevrean tail, colorable" - desc = "" - icon_state = "nevreantail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/foxhc - name = "highlander zorren tail, colorable" - desc = "" - icon_state = "foxtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/fennechc - name = "flatland zorren tail, colorable" - desc = "" - icon_state = "fentail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/armalishc - name = "armalis tail, colorable" - desc = "" - icon_state = "armalis_tail_humanoid_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenodronehc - name = "xenomorph drone tail, colorable" - desc = "" - icon_state = "xenos_drone_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenosentinelhc - name = "xenomorph sentinel tail, colorable" - desc = "" - icon_state = "xenos_sentinel_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenohunterhc - name = "xenomorph hunter tail, colorable" - desc = "" - icon_state = "xenos_hunter_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/xenoqueenhc - name = "xenomorph queen tail, colorable" - desc = "" - icon_state = "xenos_queen_tail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/monkeyhc - name = "monkey tail, colorable" - desc = "" - icon_state = "chimptail_hc_s" - do_colouration = 1 - -/datum/sprite_accessory/tail/special/vulpan - name = "vulpkanin, colorable" - desc = "" - icon_state = "vulptail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - - -/datum/sprite_accessory/tail/zenghu_taj - name = "Zeng-Hu Tajaran Synth tail" - desc = "" - icon_state = "zenghu_taj" - -//Taurs moved to a separate file due to extra code around them - -//Buggo Abdomens! - -/datum/sprite_accessory/tail/buggo - name = "Bug abdomen, colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggobee - name = "Bug abdomen, bee top, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_markings" - -/datum/sprite_accessory/tail/buggobeefull - name = "Bug abdomen, bee full, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_markings" - -/datum/sprite_accessory/tail/buggounder - name = "Bug abdomen, underside, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_markings" - -/datum/sprite_accessory/tail/buggofirefly - name = "Bug abdomen, firefly, dual-colorable" - desc = "" - icon_state = "buggo_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_markings" - -/datum/sprite_accessory/tail/buggofat - name = "Fat bug abdomen, colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggofatbee - name = "Fat bug abdomen, bee top, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbee_markings" - -/datum/sprite_accessory/tail/buggofatbeefull - name = "Fat bug abdomen, bee full, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbeefull_markings" - -/datum/sprite_accessory/tail/buggofatunder - name = "Fat bug abdomen, underside, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatunder_markings" - -/datum/sprite_accessory/tail/buggofatfirefly - name = "Fat bug abdomen, firefly, dual-colorable" - desc = "" - icon_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatfirefly_markings" - -/datum/sprite_accessory/tail/buggowag - name = "Bug abdomen, colorable, vwag change" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggobeewag - name = "Bug abdomen, bee top, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_markings" - extra_overlay_w = "buggofatbee_markings" - -/datum/sprite_accessory/tail/buggobeefullwag - name = "Bug abdomen, bee full, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_markings" - extra_overlay_w = "buggofatbeefull_markings" - -/datum/sprite_accessory/tail/buggounderwag - name = "Bug abdomen, underside, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_markings" - extra_overlay_w = "buggofatunder_markings" - -/datum/sprite_accessory/tail/buggofireflywag - name = "Bug abdomen, firefly, dual color, vwag" - desc = "" - icon_state = "buggo_s" - ani_state = "buggofat_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_markings" - extra_overlay_w = "buggofatfirefly_markings" - -//Vass buggo variants! - -/datum/sprite_accessory/tail/buggovass - name = "Bug abdomen, vass, colorable" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggovassbee - name = "Bug abdomen, bee top, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_vass_markings" - -/datum/sprite_accessory/tail/buggovassbeefull - name = "Bug abdomen, bee full, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_vass_markings" - -/datum/sprite_accessory/tail/buggovassunder - name = "Bug abdomen, underside, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_vass_markings" - -/datum/sprite_accessory/tail/buggovassfirefly - name = "Bug abdomen, firefly, dc, vass" - desc = "" - icon_state = "buggo_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_vass_markings" - -/datum/sprite_accessory/tail/buggovassfat - name = "Fat bug abdomen, vass, colorable" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggovassfatbee - name = "Fat bug abdomen, bee top, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbee_vass_markings" - -/datum/sprite_accessory/tail/buggovassfatbeefull - name = "Fat bug abdomen, bee full, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatbeefull_vass_markings" - -/datum/sprite_accessory/tail/buggovassfatunder - name = "Fat bug abdomen, underside, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatunder_vass_markings" - -/datum/sprite_accessory/tail/buggovassfatfirefly - name = "Fat bug abdomen, firefly, dc, vass" - desc = "" - icon_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofatfirefly_vass_markings" - -/datum/sprite_accessory/tail/buggovasswag - name = "Bug abdomen, vass, colorable, vwag change" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/buggovassbeewag - name = "Bug abdomen, bee top, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobee_vass_markings" - extra_overlay_w = "buggofatbee_vass_markings" - -/datum/sprite_accessory/tail/buggovassbeefullwag - name = "Bug abdomen, bee full, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggobeefull_vass_markings" - extra_overlay_w = "buggofatbeefull_vass_markings" - -/datum/sprite_accessory/tail/buggovassunderwag - name = "Bug abdomen, underside, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggounder_vass_markings" - extra_overlay_w = "buggofatunder_vass_markings" - -/datum/sprite_accessory/tail/buggovassfireflywag - name = "Bug abdomen, firefly, dc, vass, vwag" - desc = "" - icon_state = "buggo_vass_s" - ani_state = "buggofat_vass_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "buggofirefly_vass_markings" - extra_overlay_w = "buggofatfirefly_vass_markings" - -/datum/sprite_accessory/tail/tail_smooth - name = "Smooth Lizard Tail, colorable" - desc = "" - icon_state = "tail_smooth" - ani_state = "tail_smooth_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/triplekitsune_colorable - name = "Kitsune 3 tails, colorable" - desc = "" - icon_state = "triplekitsune" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "triplekitsune_tips" - -/datum/sprite_accessory/tail/ninekitsune_colorable - name = "Kitsune 9 tails, colorable" - desc = "" - icon_state = "ninekitsune" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "ninekitsune-tips" - -/datum/sprite_accessory/tail/shadekin_short - name = "Shadekin Short Tail, colorable" - desc = "" - icon_state = "shadekin-short" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts - name = "Ward-Takahashi Tail" - desc = "" - icon_state = "wardtakahashi_vulp" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/wartacosushi_tail_dc - name = "Ward-Takahashi Tail, dual-color" - desc = "" - icon_state = "wardtakahashi_vulp_dc" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "wardtakahashi_vulp_dc_mark" - -/datum/sprite_accessory/tail/Easterntail - name = "Eastern Dragon (Animated)" - desc = "" - icon_state = "Easterntail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "EasterntailColorTip" - ani_state = "Easterntail_w" - extra_overlay_w = "EasterntailColorTip_w" - -/datum/sprite_accessory/tail/synthtail_static - name = "Synthetic lizard tail" - desc = "" - icon_state = "synthtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/synthtail_vwag - name = "Synthetic lizard tail (vwag)" - desc = "" - icon_state = "synthtail" - ani_state = "synthtail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/Plugtail - name = "Synthetic plug tail" - desc = "" - icon_state = "Plugtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "PlugtailMarking" - extra_overlay2 = "PlugtailMarking2" - -/datum/sprite_accessory/tail/Segmentedtail - name = "Segmented tail, animated" - desc = "" - icon_state = "Segmentedtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "Segmentedtailmarking" - ani_state = "Segmentedtail_w" - extra_overlay_w = "Segmentedtailmarking_w" - -/datum/sprite_accessory/tail/Segmentedlights - name = "Segmented tail, animated synth" - desc = "" - icon_state = "Segmentedtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "Segmentedlights" - ani_state = "Segmentedtail_w" - extra_overlay_w = "Segmentedlights_w" - -/datum/sprite_accessory/tail/fox_tail - name = "Fox tail" - desc = "" - icon_state = "fox_tail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/fox_tail_plain - name = "Fox tail" - desc = "" - icon_state = "fox_tail_plain_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/fennec_tail - name = "Fennec tail" - desc = "" - icon_state = "fennec_tail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_smooth - name = "Lizard Tail (Smooth)" - desc = "" - icon_state = "lizard_tail_smooth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_dark_tiger - name = "Lizard Tail (Dark Tiger)" - desc = "" - icon_state = "lizard_tail_dark_tiger" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_light_tiger - name = "Lizard Tail (Light Tiger)" - desc = "" - icon_state = "lizard_tail_light_tiger" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_spiked - name = "Lizard Tail (Spiked)" - desc = "" - icon_state = "lizard_tail_spiked" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/xenotail_fullcolour - name = "xenomorph tail (fully colourable)" - desc = "" - icon_state = "xenotail_fullcolour" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/xenotailalt_fullcolour - name = "xenomorph tail alt. (fully colourable)" - desc = "" - icon_state = "xenotailalt_fullcolour" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/* -//////////////////////////// -/ =--------------------= / -/ == Misc Definitions == / -/ =--------------------= / -//////////////////////////// -*/ - -// Yes, I have to add all of this just to make some glowy hair. -// No, this isn't a character creation option, but... I guess in the future it could be, if anyone wants that? - -/datum/sprite_accessory/hair_accessory - name = "You should not see this..." - icon = 'icons/mob/vore/hair_accessories_vr.dmi' - do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color - - var/ignores_lighting = 0 // Whether or not this hair accessory will ignore lighting and glow in the dark. - var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/desc = "You should not see this..." - -/datum/sprite_accessory/hair_accessory/verie_hair_glow //CHOMP Comment: Leaving the name Verie here because I cannot be arsed to change it in other code - name = "hair glow" //CHOMP Edit: removed the name Verie - desc = "" - icon_state = "verie_hair_glow" //CHOMP Comment: Leaving the name Verie here because I cannot be arsed to change the .dmi - ignores_lighting = 1 - //ckeys_allowed = list("vitoras") // This probably won't come into play EVER but better safe than sorry diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm index 9185db35f3..15ebcc7c9f 100644 --- a/code/modules/vore/appearance/update_icons_vr.dm +++ b/code/modules/vore/appearance/update_icons_vr.dm @@ -1,25 +1,3 @@ -var/global/list/wing_icon_cache = list() - -/mob/living/carbon/human/proc/get_ears_overlay() - if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) - var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) - if(ear_style.do_colouration) - ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode) - - if(ear_style.extra_overlay) - var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay) - overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode) - ears_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER - var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2) - overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode) - ears_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - return ears_s - return null - /mob/living/carbon/human/proc/get_hair_accessory_overlay() if(hair_accessory_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) var/icon/hair_acc_s = icon(hair_accessory_style.icon, hair_accessory_style.icon_state) @@ -27,99 +5,3 @@ var/global/list/wing_icon_cache = list() hair_acc_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), hair_accessory_style.color_blend_mode) return hair_acc_s return null - - -/mob/living/carbon/human/proc/get_tail_image() - //If you are FBP with tail style and didn't set a custom one - var/datum/robolimb/model = isSynthetic() - if(istype(model) && model.includes_tail && !tail_style) - var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail") - tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) - return image(tail_s) - - //If you have a custom tail selected - if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style))) - var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) - if(tail_style.do_colouration) - tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) - if(tail_style.extra_overlay) - var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) - if(wagging && tail_style.ani_state) - overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) - overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(tail_style.extra_overlay2) - var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2) - if(wagging && tail_style.ani_state) - overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) - overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(isTaurTail(tail_style)) - var/datum/sprite_accessory/tail/taur/taurtype = tail_style - if(taurtype.can_ride && !riding_datum) - riding_datum = new /datum/riding/taur(src) - verbs |= /mob/living/carbon/human/proc/taur_mount - verbs |= /mob/living/proc/toggle_rider_reins - return image(tail_s, "pixel_x" = -16) - else - return image(tail_s) - return null - -/mob/living/carbon/human/proc/get_wing_image() - if(QDESTROYING(src)) - return - - //If you are FBP with wing style and didn't set a custom one - if((synthetic && synthetic.includes_wing && !wing_style) && !wings_hidden) - var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing? - wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) - return image(wing_s) - - //If you have custom wings selected - if((wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) && !wings_hidden) - var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state) - if(wing_style.do_colouration) - wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode) - if(wing_style.extra_overlay) - var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay) - overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(wing_style.extra_overlay2) - var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2) - if(wing_style.ani_state) - overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w) - overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - return image(wing_s) - - -// TODO - Move this to where it should go ~Leshana -/mob/proc/stop_flying() - if(QDESTROYING(src)) - return - flying = FALSE - return 1 - -/mob/living/carbon/human/stop_flying() - if((. = ..())) - update_wing_showing() \ No newline at end of file diff --git a/code/modules/vore/eating/belly_obj_ch.dm b/code/modules/vore/eating/belly_obj_ch.dm index 14fc437cdf..605665d6ed 100644 --- a/code/modules/vore/eating/belly_obj_ch.dm +++ b/code/modules/vore/eating/belly_obj_ch.dm @@ -12,6 +12,8 @@ "Draining Liquids" = DM_FLAG_REAGENTSDRAIN ) + var/belly_fullscreen_color = "#823232" + var/show_liquids = FALSE //Moved from vorepanel_ch to be a belly var var/show_fullness_messages = FALSE //Moved from vorepanel_ch to be a belly var diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index bf753d7cb2..c35c346c41 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -18,7 +18,6 @@ var/vore_verb = "ingest" // Verb for eating with this in messages var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else - var/emote_time = 60 SECONDS // How long between stomach emotes at prey var/nutrition_percent = 100 // Nutritional percentage per tick in digestion mode var/digest_brute = 0.5 // Brute damage per tick in digestion mode var/digest_burn = 0.5 // Burn damage per tick in digestion mode @@ -38,6 +37,13 @@ var/fancy_vore = FALSE // Using the new sounds? var/is_wet = TRUE // Is this belly's insides made of slimy parts? var/wet_loop = TRUE // Does the belly have a fleshy loop playing? + var/obj/item/weapon/storage/vore_egg/ownegg // Is this belly creating an egg? + var/egg_type = "Egg" // Default egg type and path. + var/egg_path = /obj/item/weapon/storage/vore_egg + var/list/emote_lists = list() // Idle emotes that happen on their own, depending on the bellymode. Contains lists of strings indexed by bellymode + var/emote_time = 60 // How long between stomach emotes at prey (in seconds) + var/emote_active = TRUE // Are we even giving emotes out at all or not? + var/next_emote = 0 // When we're supposed to print our next emote, as a world.time //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes @@ -53,7 +59,6 @@ var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human) var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. - var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a world.time var/tmp/recent_sound = FALSE // Prevent audio spam // Don't forget to watch your commas at the end of each line if you change these. @@ -110,11 +115,6 @@ var/contamination_flavor = "Generic" // Determines descriptions of contaminated items var/contamination_color = "green" // Color of contamination overlay - //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into - //a carbon's belly if someone really wanted. No UI for carbons to adjust this. - //List has indexes that are the digestion mode strings, and keys that are lists of strings. - var/tmp/list/emote_lists = list() - // Lets you do a fullscreen overlay. Set to an icon_state string. var/belly_fullscreen = "" var/disable_hud = FALSE @@ -149,6 +149,8 @@ "digest_messages_prey", "examine_messages", "emote_lists", + "emote_time", + "emote_active", "mode_flags", "item_digest_mode", "contaminates", @@ -161,6 +163,7 @@ "belly_fullscreen", "disable_hud", "reagent_mode_flags", //CHOMP start of variables from CHOMP + "belly_fullscreen_color", "reagentbellymode", "liquid_fullness1_messages", "liquid_fullness2_messages", @@ -184,7 +187,8 @@ "fullness3_messages", "fullness4_messages", "fullness5_messages", - "vorespawn_blacklist" //CHOMP end of variables from CHOMP + "vorespawn_blacklist", //CHOMP end of variables from CHOMP + "egg_type" ) /*These have been pulled from the above list as these were chomp edits for liquid belly stuff. This needs to be ported back in for TGUI port @@ -287,7 +291,7 @@ if(belly_fullscreen) var/obj/screen/fullscreen/F = L.overlay_fullscreen("belly", /obj/screen/fullscreen/belly) F.icon_state = belly_fullscreen - // F.color = belly_fullscreen_color + F.color = belly_fullscreen_color //CHOMPEdit else L.clear_fullscreen("belly") @@ -341,6 +345,11 @@ if (!(M in contents)) return 0 // They weren't in this belly anyway + for(var/mob/living/L in M.contents) + L.muffled = 0 + for(var/obj/item/weapon/holder/H in M.contents) + H.held_mob.muffled = 0 + //Place them into our drop_location M.forceMove(drop_location()) @@ -409,9 +418,15 @@ var/raw_message = pick(examine_messages) var/total_bulge = 0 - formatted_message = replacetext(raw_message, "%belly" ,lowertext(name)) - formatted_message = replacetext(formatted_message, "%pred" ,owner) - formatted_message = replacetext(formatted_message, "%prey" ,english_list(contents)) + var/living_count = 0 + for(var/mob/living/L in contents) + living_count++ + + formatted_message = replacetext(raw_message, "%belly", lowertext(name)) + formatted_message = replacetext(formatted_message, "%pred", owner) + formatted_message = replacetext(formatted_message, "%prey", english_list(contents)) + formatted_message = replacetext(formatted_message, "%count", contents.len) + formatted_message = replacetext(formatted_message, "%countprey", living_count) for(var/mob/living/P in contents) if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach. total_bulge += P.size_multiplier @@ -424,7 +439,7 @@ // This is useful in customization boxes and such. The delimiter right now is \n\n so // in message boxes, this looks nice and is easily delimited. /obj/belly/proc/get_messages(type, delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em" || type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain") var/list/raw_messages switch(type) @@ -438,15 +453,27 @@ raw_messages = digest_messages_prey if("em") raw_messages = examine_messages + if("im_digest") + raw_messages = emote_lists[DM_DIGEST] + if("im_hold") + raw_messages = emote_lists[DM_HOLD] + if("im_absorb") + raw_messages = emote_lists[DM_ABSORB] + if("im_heal") + raw_messages = emote_lists[DM_HEAL] + if("im_drain") + raw_messages = emote_lists[DM_DRAIN] - var/messages = list2text(raw_messages, delim) + var/messages = null + if(raw_messages) + messages = list2text(raw_messages, delim) return messages // The next function sets the messages on the belly, from human-readable var // replacement strings and linebreaks as delimiters (two \n\n by default). // They also sanitize the messages. /obj/belly/proc/set_messages(raw_text, type, delim = "\n\n") - ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em") + ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em" || type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain") var/list/raw_list = text2list(html_encode(raw_text),delim) if(raw_list.len > 10) @@ -454,9 +481,12 @@ log_debug("[owner] tried to set [lowertext(name)] with 11+ messages") for(var/i = 1, i <= raw_list.len, i++) - if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size + if((length(raw_list[i]) > 160 || length(raw_list[i]) < 10) && !(type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain")) //160 is fudged value due to htmlencoding increasing the size raw_list.Cut(i,i) log_debug("[owner] tried to set [lowertext(name)] with >121 or <10 char message") + else if((type == "im_digest" || type == "im_hold" || type == "im_absorb" || type == "im_heal" || type == "im_drain") && (length(raw_list[i]) > 510 || length(raw_list[i]) < 10)) + raw_list.Cut(i,i) + log_debug("[owner] tried to set [lowertext(name)] idle message with >501 or <10 char message") else raw_list[i] = readd_quotes(raw_list[i]) //Also fix % sign for var replacement @@ -475,6 +505,16 @@ digest_messages_prey = raw_list if("em") examine_messages = raw_list + if("im_digest") + emote_lists[DM_DIGEST] = raw_list + if("im_hold") + emote_lists[DM_HOLD] = raw_list + if("im_absorb") + emote_lists[DM_ABSORB] = raw_list + if("im_heal") + emote_lists[DM_HEAL] = raw_list + if("im_drain") + emote_lists[DM_DRAIN] = raw_list return @@ -601,9 +641,10 @@ //Handle a mob struggling // Called from /mob/living/carbon/relaymove() -/obj/belly/proc/relay_resist(mob/living/R) +/obj/belly/proc/relay_resist(mob/living/R, obj/item/C) if (!(R in contents)) - return // User is not in this belly + if(!C) + return // User is not in this belly R.setClickCooldown(50) @@ -612,9 +653,13 @@ to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!") if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) - if((owner.stat || escapable) && (R.loc == src)) //Can still escape? - release_specific_contents(R) - return + if((owner.stat || escapable)) //Can still escape? + if(C) + release_specific_contents(C) + return + if(R.loc == src) + release_specific_contents(R) + return else if(R.loc != src) //Aren't even in the belly. Quietly fail. return else //Belly became inescapable or mob revived @@ -625,13 +670,21 @@ var/struggle_outer_message = pick(struggle_messages_outside) var/struggle_user_message = pick(struggle_messages_inside) + var/living_count = 0 + for(var/mob/living/L in contents) + living_count++ + struggle_outer_message = replacetext(struggle_outer_message, "%pred", owner) struggle_outer_message = replacetext(struggle_outer_message, "%prey", R) struggle_outer_message = replacetext(struggle_outer_message, "%belly", lowertext(name)) + struggle_outer_message = replacetext(struggle_outer_message, "%count", contents.len) + struggle_outer_message = replacetext(struggle_outer_message, "%countprey", living_count) struggle_user_message = replacetext(struggle_user_message, "%pred", owner) struggle_user_message = replacetext(struggle_user_message, "%prey", R) struggle_user_message = replacetext(struggle_user_message, "%belly", lowertext(name)) + struggle_user_message = replacetext(struggle_user_message, "%count", contents.len) + struggle_user_message = replacetext(struggle_user_message, "%countprey", living_count) struggle_outer_message = "[struggle_outer_message]" struggle_user_message = "[struggle_user_message]" @@ -657,6 +710,13 @@ to_chat(R, "You start to climb out of \the [lowertext(name)].") to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!") if(do_after(R, escapetime)) + if(escapable && C) + release_specific_contents(C) + to_chat(R,"Your struggles successfully cause [owner] to squeeze your container out of their \the [lowertext(name)].") + to_chat(owner,"[C] suddenly slips out of your [lowertext(name)]!") + for(var/mob/M in hearers(4, owner)) + M.show_message("[C] suddenly slips out of [owner]'s [lowertext(name)]!", 2) + return if((escapable) && (R.loc == src) && !R.absorbed) //Does the owner still have escapable enabled? release_specific_contents(R) to_chat(R,"You climb out of \the [lowertext(name)].") @@ -687,6 +747,9 @@ to_chat(R, "Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!") + if(C) + transfer_contents(C, dest_belly) + return transfer_contents(R, dest_belly) return @@ -777,6 +840,7 @@ dupe.wet_loop = wet_loop dupe.reagent_mode_flags = reagent_mode_flags //CHOMP start of variables from CHOMP + dupe.belly_fullscreen_color = belly_fullscreen_color dupe.reagentbellymode = reagentbellymode dupe.vorefootsteps_sounds = vorefootsteps_sounds dupe.liquid_fullness1_messages = liquid_fullness1_messages @@ -798,6 +862,9 @@ dupe.belly_fullscreen = belly_fullscreen dupe.disable_hud = disable_hud + dupe.egg_type = egg_type + dupe.emote_time = emote_time + dupe.emote_active = emote_active //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm index 8b46a660ba..2ddf31c52d 100644 --- a/code/modules/vore/eating/bellymodes_datum_vr.dm +++ b/code/modules/vore/eating/bellymodes_datum_vr.dm @@ -14,6 +14,9 @@ GLOBAL_LIST_INIT(digest_modes, list()) /datum/digest_mode/proc/process_mob(obj/belly/B, mob/living/L) return null +/datum/digest_mode/proc/handle_atoms(obj/belly/B, list/touchable_atoms) + return FALSE + /datum/digest_mode/digest id = DM_DIGEST noise_chance = 50 @@ -156,8 +159,68 @@ GLOBAL_LIST_INIT(digest_modes, list()) // E G G /datum/digest_mode/egg id = DM_EGG - +/* /datum/digest_mode/egg/process_mob(obj/belly/B, mob/living/carbon/human/H) if(!istype(H) || H.stat == DEAD || H.absorbed) return null - B.put_in_egg(H, 1) + B.put_in_egg(H, 1)*/ + +/datum/digest_mode/egg/handle_atoms(obj/belly/B, list/touchable_atoms) + var/list/egg_contents = list() + for(var/E in touchable_atoms) + if(istype(E, /obj/item/weapon/storage/vore_egg)) // Don't egg other eggs. + continue + if(isliving(E)) + var/mob/living/L = E + if(L.absorbed) + continue + egg_contents += L + if(isitem(E)) + egg_contents += E + if(egg_contents.len) + if(!B.ownegg) + if(B.egg_type in tf_vore_egg_types) + B.egg_path = tf_vore_egg_types[B.egg_type] + B.ownegg = new B.egg_path(B) + for(var/atom/movable/C in egg_contents) + if(isitem(C) && egg_contents.len == 1) //Only egging one item + var/obj/item/I = C + B.ownegg.w_class = I.w_class + B.ownegg.max_storage_space = B.ownegg.w_class + I.forceMove(B.ownegg) + B.ownegg.icon_scale_x = 0.2 * B.ownegg.w_class + B.ownegg.icon_scale_y = 0.2 * B.ownegg.w_class + B.ownegg.update_transform() + egg_contents -= I + B.ownegg = null + return + if(isliving(C)) + var/mob/living/M = C + B.ownegg.w_class = M.size_multiplier * 4 //Egg size and weight scaled to match occupant. + var/obj/item/weapon/holder/H = new M.holder_type(B.ownegg) + H.held_mob = M + M.forceMove(H) + H.sync(M) + B.ownegg.max_storage_space = H.w_class + B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class + B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class + B.ownegg.update_transform() + egg_contents -= M + if(B.ownegg.w_class > 4) + B.ownegg.slowdown = B.ownegg.w_class - 4 + B.ownegg = null + return + C.forceMove(B.ownegg) + if(isitem(C)) + var/obj/item/I = C + B.ownegg.w_class += I.w_class //Let's assume a regular outfit can reach total w_class of 16. + B.ownegg.calibrate_size() + B.ownegg.orient2hud() + B.ownegg.w_class = clamp(B.ownegg.w_class * 0.25, 1, 8) //A total w_class of 16 will result in a backpack sized egg. + B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class + B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class + B.ownegg.update_transform() + if(B.ownegg.w_class > 4) + B.ownegg.slowdown = B.ownegg.w_class - 4 + B.ownegg = null + return \ No newline at end of file diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 95162dfb15..75a2540a0e 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -32,6 +32,14 @@ if(!length(touchable_atoms)) return + var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"] + if(!DM) + log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!") + return FALSE + if(DM.handle_atoms(src, touchable_atoms)) + updateVRPanels() + return + var/list/touchable_mobs = null var/list/hta_returns = handle_touchable_atoms(touchable_atoms) @@ -48,17 +56,23 @@ ///////////////////// Early Non-Mode Handling ///////////////////// var/list/EL = emote_lists[digest_mode] - if(LAZYLEN(EL) && touchable_mobs && next_emote <= world.time) - next_emote = world.time + emote_time + if(LAZYLEN(EL) && touchable_mobs && next_emote <= world.time && emote_active) + next_emote = world.time + (emote_time SECONDS) for(var/mob/living/M in contents) if(digest_mode == DM_DIGEST && !M.digestable) continue // don't give digesty messages to indigestible people - to_chat(M, "[pick(EL)]") + var/living_count = 0 + for(var/mob/living/L in contents) + living_count++ - var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"] - if(!DM) - log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!") - return FALSE + var/raw_message = pick(EL) + var/formatted_message + formatted_message = replacetext(raw_message, "%belly", lowertext(name)) + formatted_message = replacetext(formatted_message, "%pred", owner) + formatted_message = replacetext(formatted_message, "%prey", english_list(contents)) + formatted_message = replacetext(formatted_message, "%count", contents.len) + formatted_message = replacetext(formatted_message, "%countprey", living_count) + to_chat(M, "[formatted_message]") if(!digestion_noise_chance) digestion_noise_chance = DM.noise_chance @@ -81,14 +95,14 @@ play_sound = pred_digest if(play_sound) - for(var/mob/M in hearers(VORE_SOUND_RANGE, owner)) //so we don't fill the whole room with the sound effect + for(var/mob/M in hearers(VORE_SOUND_RANGE, get_turf(owner))) //so we don't fill the whole room with the sound effect if(!M.is_preference_enabled(/datum/client_preference/digestion_noises)) continue if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check if(fancy_vore) - M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF) + M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) else - M.playsound_local(owner.loc, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) + M.playsound_local(get_turf(owner), play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF) //these are all external sound triggers now, so it's ok. if(to_update) @@ -203,14 +217,22 @@ var/digest_alert_prey = pick(digest_messages_prey) var/compensation = M.getOxyLoss() //How much of the prey's damage was caused by passive crit oxyloss to compensate the lost nutrition. + var/living_count = 0 + for(var/mob/living/L in contents) + living_count++ + //Replace placeholder vars digest_alert_owner = replacetext(digest_alert_owner, "%pred", owner) digest_alert_owner = replacetext(digest_alert_owner, "%prey", M) digest_alert_owner = replacetext(digest_alert_owner, "%belly", lowertext(name)) + digest_alert_owner = replacetext(digest_alert_owner, "%count", contents.len) + digest_alert_owner = replacetext(digest_alert_owner, "%countprey", living_count) digest_alert_prey = replacetext(digest_alert_prey, "%pred", owner) digest_alert_prey = replacetext(digest_alert_prey, "%prey", M) digest_alert_prey = replacetext(digest_alert_prey, "%belly", lowertext(name)) + digest_alert_prey = replacetext(digest_alert_prey, "%count", contents.len) + digest_alert_prey = replacetext(digest_alert_prey, "%countprey", living_count) //Send messages to_chat(owner, "[digest_alert_owner]") diff --git a/code/modules/vore/eating/contaminate_vr.dm b/code/modules/vore/eating/contaminate_vr.dm index 5bbbe902c7..998c7b53c5 100644 --- a/code/modules/vore/eating/contaminate_vr.dm +++ b/code/modules/vore/eating/contaminate_vr.dm @@ -105,6 +105,9 @@ var/list/gurgled_overlays = list( /obj/item/weapon/reagent_containers/food/gurgle_contaminate(var/atom/movable/item_storage = null) return FALSE +/obj/item/weapon/storage/vore_egg/gurgle_contaminate(var/atom/movable/item_storage = null) + return FALSE + /obj/item/weapon/holder/gurgle_contaminate(var/atom/movable/item_storage = null) if(isbelly(loc)) digest_act(item_storage) @@ -150,4 +153,4 @@ var/list/gurgled_overlays = list( if(pockets.contents) for(var/obj/item/O in pockets.contents) O.gurgle_contaminate(item_storage, contamination_flavor, contamination_color) - ..() \ No newline at end of file + ..() diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index ab589d9671..b2958d0ddf 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -82,9 +82,13 @@ var/lost_access = list() /obj/item/weapon/card/id/digest_act(atom/movable/item_storage = null) - desc = "A partially digested card that has seen better days. The damage appears to be only cosmetic, but the access codes need to be reprogrammed at the HoP office." - icon = 'icons/obj/card_vr.dmi' - icon_state = "[initial(icon_state)]_digested" + desc = "A partially digested card that has seen better days. The damage appears to be only cosmetic, but the access codes need to be reprogrammed at the HoP office or ID restoration terminal." + if(!sprite_stack || !istype(sprite_stack) || !(sprite_stack.len)) + icon = 'icons/obj/card_vr.dmi' + icon_state = "[initial(icon_state)]_digested" + else + sprite_stack += "digested" + update_icon() if(!(LAZYLEN(lost_access)) && LAZYLEN(access)) lost_access = access //Do not forget what access we lose access = list() // Then lose it diff --git a/code/modules/vore/eating/human_ch.dm b/code/modules/vore/eating/human_ch.dm new file mode 100644 index 0000000000..cdcc049993 --- /dev/null +++ b/code/modules/vore/eating/human_ch.dm @@ -0,0 +1,19 @@ +/* +init_vore() was moved to only be called when vore organs are needed. This is also responsible for loading vore prefs. +This file is here to make vore prefs default to off so that someone who hasn't opened their vore panel during a round +won't accidentally be prefbroken. + +Also, these should've been defaulted to off in the first place. +*/ +/mob/living/carbon/human + digestable = FALSE + devourable = FALSE + feeding = FALSE + absorbable = FALSE + digest_leave_remains = FALSE + allowmobvore = FALSE + showvoreprefs = FALSE + permit_healbelly = FALSE + can_be_drop_prey = FALSE + can_be_drop_pred = FALSE + show_vore_fx = FALSE \ No newline at end of file diff --git a/code/modules/vore/eating/living_ch.dm b/code/modules/vore/eating/living_ch.dm index 5d8dc28d08..f51bc265b1 100644 --- a/code/modules/vore/eating/living_ch.dm +++ b/code/modules/vore/eating/living_ch.dm @@ -7,7 +7,7 @@ var/vore_footstep_chance = 0 var/vore_footstep_volume_cooldown = 0 //goes up each time a step isnt heard, and will proc update of list of viable bellies to determine the most filled and loudest one to base audio on. - var/parasitic = FALSE //Digestion immunity and nutrition leeching variable + var/parasitic = FALSE //Digestion immunity and nutrition leeching variable mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) @@ -66,6 +66,16 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return message +/mob/living/proc/vore_check_reagents() + set name = "Check Belly Liquid (Vore)" + set category = "Abilities" + set desc = "Check the amount of liquid in your belly." + + var/obj/belly/RTB = input("Choose which vore belly to check") as null|anything in src.vore_organs + if(!RTB) + return FALSE + + to_chat(src, "[RTB] has [RTB.reagents.total_volume] units of liquid.") /mob/living/proc/vore_transfer_reagents() set name = "Transfer Liquid (Vore)" @@ -111,9 +121,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return FALSE if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into their [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into their [TB].") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into their [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into their [TB].") add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB) @@ -132,9 +142,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return FALSE if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into [TR]'s [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into [TR]'s [TB].") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]s [RTB] into [TR]'s [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]s [RTB] into [TR]'s [TB].") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB) add_attack_logs(user,TR,"Transfered reagents from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -148,9 +158,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) if(TR == user) //Proceed, we dont need to have prefs enabled for transfer within user if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into their stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into their stomach.") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into their stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into their stomach.") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null) add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") @@ -160,9 +170,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) else if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into [TR]'s stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into [TR]'s stomach.") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into [TR]'s stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into [TR]'s stomach.") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null) add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -178,9 +188,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return //No long distance transfer if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into [T].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into [T].") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into [T].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into [T].") RTB.reagents.vore_trans_to_con(T, transfer_amount, 1, 0) add_attack_logs(user, T,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to a [T]") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -195,9 +205,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return if(TG == user) - user.visible_message("[user] spills [RTB.reagent_name] from their [RTB] onto the floor!") + user.custom_emote_vr(1, "spills [RTB.reagent_name] from their [RTB] onto the floor!") else - user.visible_message("[user] spills [RTB.reagent_name] from [TG]'s [RTB] onto the floor!") + user.custom_emote_vr(1, "spills [RTB.reagent_name] from [TG]'s [RTB] onto the floor!") var/obj/effect/decal/cleanable/blood/reagent/puddle = new /obj/effect/decal/cleanable/blood/reagent(RTB.reagent_name, RTB.reagentcolor, RTB.reagentid, puddle_amount, user.ckey, TG.ckey) puddle.loc = TG.loc diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 1cb18f9f65..0429d5bb4a 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -23,8 +23,7 @@ var/noisy = FALSE // Toggle audible hunger. var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr. var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time. - var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon. - var/tail_alt = 0 // Tail layer toggle. + var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon. var/permit_healbelly = TRUE var/can_be_drop_prey = FALSE var/can_be_drop_pred = TRUE // Mobs are pred by default. @@ -33,7 +32,7 @@ var/adminbus_eat_minerals = FALSE // This creature subsists on a diet of pure adminium. var/vis_height = 32 // Sprite height used for resize features. var/show_vore_fx = TRUE // Show belly fullscreens - var/latejoin_vore = FALSE // If enabled, latejoiners can spawn into this, assuming they have a client + var/latejoin_vore = FALSE //CHOMPedit: If enabled, latejoiners can spawn into this, assuming they have a client // // Hook for generic creation of stuff on new creatures @@ -48,6 +47,7 @@ M.vorePanel = new(M) M.verbs += /mob/living/proc/insidePanel M.verbs += /mob/living/proc/vore_transfer_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything + M.verbs += /mob/living/proc/vore_check_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything //Tries to load prefs if a client is present otherwise gives freebie stomach spawn(2 SECONDS) @@ -107,11 +107,6 @@ ///// If user clicked on themselves if(src == G.assailant && is_vore_predator(src)) - if(!G.affecting.devourable) - to_chat(user, "They aren't able to be devoured.") - log_and_message_admins("[key_name_admin(src)] attempted to devour [key_name_admin(G.affecting)] against their prefs ([G.affecting ? ADMIN_JMP(G.affecting) : "null"])") - return FALSE - if(feed_grabbed_to_self(src, G.affecting)) qdel(G) return TRUE @@ -241,6 +236,8 @@ P.show_vore_fx = src.show_vore_fx P.can_be_drop_prey = src.can_be_drop_prey P.can_be_drop_pred = src.can_be_drop_pred + P.step_mechanics_pref = src.step_mechanics_pref + P.pickup_pref = src.pickup_pref //CHOMP stuff @@ -280,6 +277,8 @@ show_vore_fx = P.show_vore_fx can_be_drop_prey = P.can_be_drop_prey can_be_drop_pred = P.can_be_drop_pred + step_mechanics_pref = P.step_mechanics_pref + pickup_pref = P.pickup_pref //CHOMP stuff latejoin_vore = P.latejoin_vore @@ -291,6 +290,7 @@ vore_organs.Cut() for(var/entry in P.belly_prefs) list_to_object(entry,src) + break //CHOMPedit: Belly load optimization. Only load first belly, save the rest for vorepanel. return TRUE @@ -326,13 +326,13 @@ //A uniform could hide it. if(istype(w_uniform,/obj/item/clothing)) var/obj/item/clothing/under = w_uniform - if(under.hides_bulges) + if(istype(under) && under.hides_bulges) return FALSE //We return as soon as we find one, no need for 'else' really. if(istype(wear_suit,/obj/item/clothing)) var/obj/item/clothing/suit = wear_suit - if(suit.hides_bulges) + if(istype(suit) && suit.hides_bulges) return FALSE return ..() @@ -503,6 +503,11 @@ if(user_to_pred > 1 || user_to_prey > 1) return FALSE + if(!prey.devourable) + to_chat(user, "They aren't able to be devoured.") + log_and_message_admins("[key_name_admin(src)] attempted to devour [key_name_admin(prey)] against their prefs ([prey ? ADMIN_JMP(prey) : "null"])") + return FALSE + // Prepare messages //CHOMPEdit begin if(prey.is_slipping) @@ -615,7 +620,7 @@ to_chat(src, "You are not allowed to eat this.") return - if(is_type_in_list(I,edible_trash) | adminbus_trash) + if(is_type_in_list(I,edible_trash) | adminbus_trash || is_type_in_list(I,edible_tech) && isSynthetic()) //chompstation add synth check if(I.hidden_uplink) to_chat(src, "You really should not be eating this.") message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? ADMIN_JMP(src) : "null"])") @@ -688,6 +693,9 @@ to_chat(src, "You can taste the flavor of really bad ideas.") else if(istype(I,/obj/item/toy)) visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!") + else if(istype(I,/obj/item/weapon/bikehorn/tinytether)) + to_chat(src, "You feel a rush of power swallowing such a large, err, tiny structure.") + visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!") else if(istype(I,/obj/item/device/paicard) || istype(I,/obj/item/device/mmi/digital/posibrain) || istype(I,/obj/item/device/aicard)) visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!") to_chat(src, "You can taste the sweet flavor of digital friendship. Or maybe it is something else.") @@ -701,6 +709,15 @@ else if (istype(I,/obj/item/clothing/accessory/collar)) visible_message("[src] demonstrates their voracious capabilities by swallowing [I] whole!") to_chat(src, "You can taste the submissiveness in the wearer of [I]!") + //kcin2000 1/29/21 - lets you eat the news digitally and adds a text for the paper news + else if(istype(I,/obj/item/device/starcaster_news)) + to_chat(src, "You can taste the dry flavor of digital garbage, oh wait its just the news.") + else if(istype(I,/obj/item/weapon/newspaper)) + to_chat(src, "You can taste the dry flavor of garbage, oh wait its just the news.") + //kcin2001 1/29/21 - Adding some special synth trash eat + else if (istype(I,/obj/item/weapon/cell)) + visible_message("[src] sates their electric appeite with a [I]!") + to_chat(src, "You can taste the spicy flavor of electrolytes, yum.") else to_chat(src, "You can taste the flavor of garbage. Delicious.") return @@ -839,6 +856,7 @@ set category = "Preferences" set desc = "Switch sharp/fuzzy scaling for current mob." appearance_flags ^= PIXEL_SCALE + fuzzy = !fuzzy /mob/living/examine(mob/user, infix, suffix) . = ..() @@ -871,6 +889,8 @@ dispvoreprefs += "Late join spawn point belly: [latejoin_vore ? "Enabled" : "Disabled"]
" //CHOMPstation edit dispvoreprefs += "Receiving liquids: [receive_reagents ? "Enabled" : "Disabled"]
" //CHOMPstation edit dispvoreprefs += "Giving liquids: [give_reagents ? "Enabled" : "Disabled"]
" //CHOMPstation edit + dispvoreprefs += "Can be stepped on/over: [step_mechanics_pref ? "Allowed" : "Disallowed"]
" + dispvoreprefs += "Can be picked up: [pickup_pref ? "Allowed" : "Disallowed"]
" user << browse("Vore prefs: [src]
[dispvoreprefs]
", "window=[name]mvp;size=200x300;can_resize=0;can_minimize=0") onclose(user, "[name]") return diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index eda82b1c9a..9272bd37f0 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -3,6 +3,12 @@ var/swallowTime = (3 SECONDS) //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds. var/list/prey_excludes = list() //For excluding people from being eaten. +/mob/living/simple_mob/insidePanel() //CHOMPedit: On-demand belly loading. + if(vore_active && !voremob_loaded) + voremob_loaded = TRUE + init_vore() + ..() + // // Simple nom proc for if you get ckey'd into a simple_mob mob! Avoids grabs. // @@ -11,6 +17,9 @@ set category = "IC" set desc = "Since you can't grab, you get a verb!" + if(vore_active && !voremob_loaded) //CHOMPedit: On-demand belly loading. + voremob_loaded = TRUE + init_vore() if(stat != CONSCIOUS) return // Verbs are horrifying. They don't call overrides. So we're stuck with this. diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index e0cf4d22fb..5a69bc9dc9 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -56,6 +56,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE var/show_vore_fx = TRUE var/can_be_drop_prey = FALSE var/can_be_drop_pred = FALSE + var/step_mechanics_pref = FALSE + var/pickup_pref = TRUE //CHOMP stuff @@ -137,6 +139,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE show_vore_fx = json_from_file["show_vore_fx"] can_be_drop_prey = json_from_file["can_be_drop_prey"] can_be_drop_pred = json_from_file["can_be_drop_pred"] + step_mechanics_pref = json_from_file["step_mechanics_pref"] + pickup_pref = json_from_file["pickup_pref"] belly_prefs = json_from_file["belly_prefs"] @@ -167,6 +171,10 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE can_be_drop_prey = FALSE if(isnull(can_be_drop_pred)) can_be_drop_pred = FALSE + if(isnull(step_mechanics_pref)) + step_mechanics_pref = TRUE + if(isnull(pickup_pref)) + pickup_pref = TRUE if(isnull(belly_prefs)) belly_prefs = list() @@ -199,7 +207,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE "show_vore_fx" = show_vore_fx, "can_be_drop_prey" = can_be_drop_prey, "can_be_drop_pred" = can_be_drop_pred, - "latejoin_vore" = latejoin_vore, + "latejoin_vore" = latejoin_vore, //CHOMPedit + "step_mechanics_pref" = step_mechanics_pref, + "pickup_pref" = pickup_pref, "belly_prefs" = belly_prefs, "receive_reagents" = receive_reagents, "give_reagents" = give_reagents, diff --git a/code/modules/vore/eating/vorepanel_ch.dm b/code/modules/vore/eating/vorepanel_ch.dm index a77b0cf486..f47f58e946 100644 --- a/code/modules/vore/eating/vorepanel_ch.dm +++ b/code/modules/vore/eating/vorepanel_ch.dm @@ -3,4 +3,38 @@ /datum/vore_look var/show_liquids = FALSE var/show_fullness_messages = FALSE -*/ \ No newline at end of file +*/ + +/obj/screen/belly_fullscreen_preview + icon = 'icons/mob/screen_full_vore.dmi' + icon_state = "" + appearance_flags = 0 + +/datum/vore_look + var/scloc = "1,1" + var/map_name + var/obj/screen/belly_fullscreen_preview/fullscreen_preview + +/*/datum/vore_look/tgui_static_data(mob/user) + var/list/data = ..() + data["mapRef"] = map_name + return data*/ + +/datum/vore_look/New() + . = ..() + map_name = "belly_fullscreen_[REF(src)]_map" + fullscreen_preview = new() + fullscreen_preview.name = "" + fullscreen_preview.assigned_map = map_name + fullscreen_preview.del_on_map_removal = FALSE + fullscreen_preview.screen_loc = "[map_name]:[scloc]" + +/datum/vore_look/proc/update_preview_icon() + if(host.vore_selected) + var/obj/belly/selected = host.vore_selected + fullscreen_preview.icon_state = selected.belly_fullscreen + fullscreen_preview.color = selected.belly_fullscreen_color + fullscreen_preview.screen_loc = "[map_name]:[scloc]" + +/datum/vore_look/proc/give_client_previews(client/C) + C.register_map_obj(fullscreen_preview) \ No newline at end of file diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index ccf3535d25..6a892c65d1 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -19,6 +19,16 @@ log_debug("[src] ([type], \ref[src]) didn't have a vorePanel and tried to use the verb.") vorePanel = new(src) + if(!vorePanel.bellies_loaded) //CHOMPedit Start: On-demand belly loading + var/datum/vore_preferences/P = client.prefs_vr + var/firstbelly = FALSE // First belly loaded on init_vore + for(var/entry in P.belly_prefs) + if(!firstbelly) + firstbelly = TRUE + continue + list_to_object(entry,src) + vorePanel.bellies_loaded = TRUE //CHOMPedit End + vorePanel.tgui_interact(src) /mob/living/proc/updateVRPanel() //Panel popup update call from belly events. @@ -31,6 +41,7 @@ var/mob/living/host // Note, we do this in case we ever want to allow people to view others vore panels var/unsaved_changes = FALSE var/show_pictures = TRUE + var/bellies_loaded = FALSE //CHOMPedit: On-demand belly loading /datum/vore_look/New(mob/living/new_host) if(istype(new_host)) @@ -48,6 +59,8 @@ /datum/vore_look/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) + update_preview_icon() //CHOMPEdit + give_client_previews(user.client) //CHOMPEdit ui = new(user, src, "VorePanel", "Inside!") ui.open() @@ -57,9 +70,9 @@ return host // Note, in order to allow others to look at others vore panels, this state would need -// to be changed to tgui_always_state, and a custom tgui_status() implemented for true "rights" management. +// to be modified. /datum/vore_look/tgui_state(mob/user) - return GLOB.tgui_self_state + return GLOB.tgui_vorepanel_state /datum/vore_look/var/static/list/nom_icons /datum/vore_look/proc/cached_nom_icon(atom/target) @@ -133,7 +146,6 @@ "digest_mode" = B.digest_mode, "contents" = LAZYLEN(B.contents), ))) - data["selected"] = null if(host.vore_selected) var/obj/belly/selected = host.vore_selected @@ -150,21 +162,27 @@ "release_sound" = selected.release_sound, // "messages" // TODO "can_taste" = selected.can_taste, + "egg_type" = selected.egg_type, "nutrition_percent" = selected.nutrition_percent, "digest_brute" = selected.digest_brute, "digest_burn" = selected.digest_burn, "bulge_size" = selected.bulge_size, "shrink_grow_size" = selected.shrink_grow_size, + "emote_time" = selected.emote_time, + "emote_active" = selected.emote_active, "belly_fullscreen" = selected.belly_fullscreen, + "belly_fullscreen_color" = selected.belly_fullscreen_color, //CHOMPEdit + "mapRef" = map_name, //CHOMPEdit "possible_fullscreens" = icon_states('icons/mob/screen_full_vore.dmi'), "vorespawn_blacklist" = selected.vorespawn_blacklist - ) + ) //CHOMP Addition: vorespawn blacklist data["selected"]["addons"] = list() for(var/flag_name in selected.mode_flag_list) if(selected.mode_flags & selected.mode_flag_list[flag_name]) data["selected"]["addons"].Add(flag_name) + data["selected"]["egg_type"] = selected.egg_type data["selected"]["contaminates"] = selected.contaminates data["selected"]["contaminate_flavor"] = null data["selected"]["contaminate_color"] = null @@ -244,7 +262,9 @@ "show_vore_fx" = host.show_vore_fx, "can_be_drop_prey" = host.can_be_drop_prey, "can_be_drop_pred" = host.can_be_drop_pred, - "latejoin_vore" = host.latejoin_vore, + "latejoin_vore" = host.latejoin_vore, //CHOMPedit + "step_mechanics_active" = host.step_mechanics_pref, + "pickup_mechanics_active" = host.pickup_pref, "noisy" = host.noisy, //CHOMPedit start, liquid belly prefs "liq_rec" = host.receive_reagents, @@ -419,6 +439,18 @@ host.client.prefs_vr.allowmobvore = host.allowmobvore unsaved_changes = TRUE return TRUE + if("toggle_steppref") + host.step_mechanics_pref = !host.step_mechanics_pref + if(host.client.prefs_vr) + host.client.prefs_vr.step_mechanics_pref = host.step_mechanics_pref + unsaved_changes = TRUE + return TRUE + if("toggle_pickuppref") + host.pickup_pref = !host.pickup_pref + if(host.client.prefs_vr) + host.client.prefs_vr.pickup_pref = host.pickup_pref + unsaved_changes = TRUE + return TRUE if("toggle_healbelly") host.permit_healbelly = !host.permit_healbelly if(host.client.prefs_vr) @@ -696,6 +728,13 @@ host.vore_selected.contamination_color = new_color host.vore_selected.items_preserved.Cut() //To re-contaminate for new color . = TRUE + if("b_egg_type") + var/list/menu_list = global_vore_egg_types.Copy() + var/new_egg_type = input("Choose Egg Type (currently [host.vore_selected.egg_type])") as null|anything in menu_list + if(!new_egg_type) + return FALSE + host.vore_selected.egg_type = new_egg_type + . = TRUE if("b_desc") var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",host.vore_selected.desc) as message|null) @@ -707,8 +746,8 @@ host.vore_selected.desc = new_desc . = TRUE if("b_msgs") - alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.") - var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name." + alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message (500 for idle messages), max 10 messages per topic.","Really, don't.") + var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. '%count' will be replaced with the number of anything in your belly. '%countprey' will be replaced with the number of living prey in your belly." switch(params["msgtype"]) if("dmp") var/new_message = input(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp")) as message @@ -735,6 +774,31 @@ if(new_message) host.vore_selected.set_messages(new_message,"em") + if("im_digest") + var/new_message = input(user,"These are sent to prey every minute when you are on Digest mode. Write them in 2nd person ('%pred's %belly squishes down on you.')."+help,"Idle Message (Digest)",host.vore_selected.get_messages("im_digest")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_digest") + + if("im_hold") + var/new_message = input(user,"These are sent to prey every minute when you are on Hold mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Hold)",host.vore_selected.get_messages("im_hold")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_hold") + + if("im_absorb") + var/new_message = input(user,"These are sent to prey every minute when you are on Absorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Absorb)",host.vore_selected.get_messages("im_absorb")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_absorb") + + if("im_heal") + var/new_message = input(user,"These are sent to prey every minute when you are on Heal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Heal)",host.vore_selected.get_messages("im_heal")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_heal") + + if("im_drain") + var/new_message = input(user,"These are sent to prey every minute when you are on Drain mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Drain)",host.vore_selected.get_messages("im_drain")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"im_drain") + if("reset") var/confirm = alert(user,"This will delete any custom messages. Are you sure?","Confirmation","DELETE","Cancel") if(confirm == "DELETE") @@ -742,6 +806,8 @@ host.vore_selected.digest_messages_owner = initial(host.vore_selected.digest_messages_owner) host.vore_selected.struggle_messages_outside = initial(host.vore_selected.struggle_messages_outside) host.vore_selected.struggle_messages_inside = initial(host.vore_selected.struggle_messages_inside) + host.vore_selected.examine_messages = initial(host.vore_selected.examine_messages) + host.vore_selected.emote_lists = initial(host.vore_selected.emote_lists) . = TRUE if("b_verb") var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null) @@ -848,6 +914,16 @@ var/new_new_damage = CLAMP(new_damage, 0, 6) host.vore_selected.digest_brute = new_new_damage . = TRUE + if("b_emoteactive") + host.vore_selected.emote_active = !host.vore_selected.emote_active + . = TRUE + if("b_emotetime") + var/new_time = input(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute) + if(new_time == null) + return FALSE + var/new_new_time = CLAMP(new_time, 60, 600) + host.vore_selected.emote_time = new_new_time + . = TRUE if("b_escapable") if(host.vore_selected.escapable == 0) //Possibly escapable and special interactions. host.vore_selected.escapable = 1 @@ -896,7 +972,14 @@ . = TRUE if("b_fullscreen") host.vore_selected.belly_fullscreen = params["val"] + update_preview_icon() //CHOMPEdit Begin . = TRUE + if("b_fullscreen_color") + var/newcolor = input(usr, "Choose a color.", "", host.vore_selected.belly_fullscreen_color) as color|null + if(newcolor) + host.vore_selected.belly_fullscreen_color = newcolor + update_preview_icon() + . = TRUE //CHOMPEdit End if("b_disable_hud") host.vore_selected.disable_hud = !host.vore_selected.disable_hud . = TRUE @@ -929,7 +1012,7 @@ qdel(host.vore_selected) host.vore_selected = host.vore_organs[1] . = TRUE - if("b_vorespawn_blacklist") + if("b_vorespawn_blacklist") //CHOMP Addition host.vore_selected.vorespawn_blacklist = !host.vore_selected.vorespawn_blacklist . = TRUE @@ -979,7 +1062,7 @@ host.vore_selected.reagent_name = new_name . = TRUE if("b_liq_reagent_transfer_verb") - var/new_verb = html_encode(input(usr,"New verb when liquid is transfered from this belly (infinitive tense, e.g. pump or inject):","New Verb") as text|null) + var/new_verb = html_encode(input(usr,"New verb when liquid is transfered from this belly:","New Verb") as text|null) if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") @@ -1107,4 +1190,4 @@ if(new_message) host.vore_selected.set_reagent_messages(new_message,"full5") . = TRUE -//CHOMPedit end \ No newline at end of file +//CHOMPedit end diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 0f58fdaf96..9113866f5f 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1718,7 +1718,7 @@ Departamental Swimsuits, for general use item_state = "latexmaid_mob" sprite_sheets = list( - "Teshari" = 'icons/vore/custom_clothes_tesh_vr.dmi' + SPECIES_TESHARI = 'icons/vore/custom_clothes_tesh_vr.dmi' ) body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 2c2427c9ce..e0b7cc44fc 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -786,43 +786,14 @@ Under it is written 'Kouri, Amina, Marine Unit 14, Fifth Echelon. Service number NTN-5528928522372'" //arokha:Amaya Rahl - Custom ID (Medical dept) -/obj/item/weapon/card/id/fluff/amaya +/obj/item/weapon/card/id/event/fluff/amaya registered_name = "CONFIGURE ME" assignment = "CONFIGURE ME" - var/configured = 0 - var/accessset = 0 icon = 'icons/vore/custom_items_vr.dmi' + base_icon = 'icons/vore/custom_items_vr.dmi' icon_state = "amayarahlwahID" desc = "A primarily blue ID with a holographic 'WAH' etched onto its back. The letters do not obscure anything important on the card. It is shiny and it feels very bumpy." - var/title_strings = list("Amaya Rahl's Wah-identification card", "Amaya Rahl's Wah-ID card") - -/obj/item/weapon/card/id/fluff/amaya/attack_self(mob/user as mob) - if(configured == 1) - return ..() - - var/title - if(user.client.prefs.player_alt_titles[user.job]) - title = user.client.prefs.player_alt_titles[user.job] - else - title = user.job - assignment = title - user.set_id_info(src) - if(user.mind && user.mind.initial_account) - associated_account_number = user.mind.initial_account.account_number - var/tempname = pick(title_strings) - name = tempname + " ([title])" - configured = 1 - to_chat(user, "Card settings set.") - -/obj/item/weapon/card/id/fluff/amaya/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/card/id) && !accessset) - var/obj/item/weapon/card/id/O = I - access |= O.access - to_chat(user, "You copy the access from \the [I] to \the [src].") - user.drop_from_inventory(I) - qdel(I) - accessset = 1 - ..() + title_strings = list("Amaya Rahl's Wah-identification card", "Amaya Rahl's Wah-ID card") //General use, Verk felt like sharing. /obj/item/clothing/glasses/fluff/science_proper @@ -952,23 +923,6 @@ /obj/item/weapon/material/twohanded/fluff/New(var/newloc) ..(newloc," ") //See materials_vr_dmi for more information as to why this is a blank space. -//General use. -/obj/item/weapon/material/twohanded/fluff/riding_crop - name = "riding crop" - desc = "A steel rod, a little over a foot long with a widened grip and a thick, leather patch at the end. Made to smack naughty submissives." - //force_wielded = 0.05 //Stings, but does jack shit for damage, provided you don't hit someone 100 times. 1 damage with hardness of 60. - force_divisor = 0.05 //Required in order for the X attacks Y message to pop up. - unwielded_force_divisor = 1 // One here, too. - applies_material_colour = 0 - unbreakable = 1 - base_icon = "riding_crop" - icon_state = "riding_crop0" - attack_verb = list("cropped","spanked","swatted","smacked","peppered") -//1R1S: Malady Blanche -/obj/item/weapon/material/twohanded/fluff/riding_crop/malady - name = "Malady's riding crop" - desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked." - //jacknoir413:Areax Third /obj/item/weapon/melee/baton/fluff/stunstaff name = "Electrostaff" @@ -1228,7 +1182,7 @@ desc = "A standard vacuum-flask filled with good and expensive drink." /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/viktor/Initialize() - ..() + . = ..() reagents.add_reagent("pwine", 60) //RadiantAurora: Tiemli Kroto diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index 4e7b63e0b9..b0bfbcc5b4 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -48,3 +48,23 @@ ..() for(var/mob/living/carbon/human/I in contents) item_state = lowertext(I.species.name) + +//Egg features. +/obj/item/weapon/holder/attack_hand(mob/living/user as mob) + if(istype(src.loc, /obj/item/weapon/storage/vore_egg)) //Don't scoop up the egged mob + src.pickup(user) + user.drop_from_inventory(src) + return + ..() + +/obj/item/weapon/holder/container_resist(mob/living/held) + if(!istype(src.loc, /obj/item/weapon/storage/vore_egg)) + ..() + else + var/obj/item/weapon/storage/vore_egg/E = src.loc + if(isbelly(E.loc)) + var/obj/belly/B = E.loc + B.relay_resist(held, E) + return + E.hatch(held) + return diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index ea7ec4c5cd..eb14ffb20e 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -17,6 +17,9 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 /mob/living var/size_multiplier = 1 //multiplier for the mob's icon size var/holder_default + var/step_mechanics_pref = TRUE // Allow participation in macro-micro step mechanics + var/pickup_pref = TRUE // Allow participation in macro-micro pickup mechanics + var/pickup_active = TRUE // Toggle whether your help intent picks up micros or pets them // Define holder_type on types we want to be scoop-able /mob/living/carbon/human @@ -41,7 +44,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 . = ..() ASSERT(!ishuman(src)) var/matrix/M = matrix() - M.Scale(size_multiplier) + M.Scale(size_multiplier * icon_scale_x, size_multiplier * icon_scale_y) M.Translate(0, (vis_height/2)*(size_multiplier-1)) transform = M @@ -61,16 +64,40 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 * Resizes the mob immediately to the desired mod, animating it growing/shrinking. * It can be used by anything that calls it. */ -/mob/living/proc/resize(var/new_size, var/animate = TRUE) +/atom/movable/proc/in_dorms() + var/area/A = get_area(src) + return istype(A, /area/crew_quarters/sleep) + +/atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that + if((!in_dorms() && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1)) + return FALSE + return TRUE + +/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/mark_unnatural_size = TRUE) if(size_multiplier == new_size) return 1 size_multiplier = new_size //Change size_multiplier so that other items can interact with them + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(new_size > 2 || new_size < 0.25) + if(mark_unnatural_size) //Will target size be reverted to ordinary bounds when out of dorms or not? + H.unnaturally_resized = TRUE + else + H.unnaturally_resized = FALSE if(animate) var/change = new_size - size_multiplier var/duration = (abs(change)+0.25) SECONDS var/matrix/resize = matrix() // Defines the matrix to change the player's size - resize.Scale(new_size) //Change the size of the matrix + var/special_x = 1 + var/special_y = 1 + if(ishuman(src)) + var/mob/living/carbon/human/H = src + var/datum/species/S = H.species + special_x = S.icon_scale_x + special_y = S.icon_scale_y + resize.Scale(new_size * icon_scale_x * special_x, new_size * icon_scale_y * special_y) //Change the size of the matrix resize.Translate(0, (vis_height/2) * (new_size - 1)) //Move the player up in the tile so their feet align with the bottom animate(src, transform = resize, time = duration) //Animate the player resizing @@ -85,6 +112,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 update_transform() //Lame way /mob/living/carbon/human/resize(var/new_size, var/animate = TRUE) + if(!resizable) + return 1 if(species) vis_height = species.icon_height . = ..() @@ -109,9 +138,13 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 set name = "Adjust Mass" set category = "Abilities" //Seeing as prometheans have an IC reason to be changing mass. - var/nagmessage = "Adjust your mass to be a size between 25 to 200% (DO NOT ABUSE)" + if(!resizable) + to_chat(src, "You are immune to resizing!") + return + + var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or 1% to 600% in dormitories). (DO NOT ABUSE)" var/new_size = input(nagmessage, "Pick a Size") as num|null - if(new_size && ISINRANGE(new_size, 25, 200)) + if(size_range_check(new_size)) resize(new_size/100) // I'm not entirely convinced that `src ? ADMIN_JMP(src) : "null"` here does anything // but just in case it does, I'm leaving the null-src checking @@ -129,6 +162,10 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 * @return false if normal code should continue, 1 to prevent normal code. */ /mob/living/proc/attempt_to_scoop(mob/living/M, mob/living/G) //second one is for the Grabber, only exists for animals to self-grab + if(!(pickup_pref && M.pickup_pref && pickup_active)) + return 0 + if(!(M.a_intent == I_HELP)) + return 0 var/size_diff = M.get_effective_size() - get_effective_size() if(!holder_default && holder_type) holder_default = holder_type @@ -273,8 +310,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 tail = pred.tail_style if(a_intent == I_GRAB) - // You can only grab prey if you have no shoes on. - if(pred.shoes) + // You can only grab prey if you have no shoes on. And both of you are cool with it. + if(pred.shoes || !(pred.pickup_pref && prey.pickup_pref)) message_pred = "You step down onto [prey], squishing them and forcing them down to the ground!" message_prey = "[pred] steps down and squishes you with their foot, forcing you down to the ground!" if(tail) @@ -337,5 +374,13 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 to_chat(prey, "[message_prey]") return TRUE +/mob/living/verb/toggle_pickups() + set name = "Toggle Micro Pick-up" + set desc = "Toggles whether your help-intent action attempts to pick up the micro or pet/hug/help them. Does not disable participation in pick-up mechanics entirely, refer to Vore Panel preferences for that." + set category = "IC" + + pickup_active = !pickup_active + to_chat(src, "You will [pickup_active ? "now" : "no longer"] attempt to pick up mobs when clicking them with help intent.") + #undef STEP_TEXT_OWNER -#undef STEP_TEXT_PREY \ No newline at end of file +#undef STEP_TEXT_PREY diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index 863fad54fc..e30c218fbb 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -24,7 +24,10 @@ /obj/item/weapon/gun/energy/sizegun/New() ..() - verbs += /obj/item/weapon/gun/energy/sizegun/proc/select_size + if(istype(src, /obj/item/weapon/gun/energy/sizegun/admin)) + verbs += /obj/item/weapon/gun/energy/sizegun/admin/select_size + else + verbs += /obj/item/weapon/gun/energy/sizegun/proc/select_size /obj/item/weapon/gun/energy/sizegun/attack_self(mob/user) . = ..() @@ -41,8 +44,8 @@ set category = "Object" set src in view(1) - var/size_select = input("Put the desired size (25-200%)", "Set Size", size_set_to * 100) as num - if(size_select > 200 || size_select < 25) + var/size_select = input("Put the desired size (25-200%), (1-600%) in dormitory areas.", "Set Size", size_set_to * 100) as num + if(!size_range_check(size_select)) to_chat(usr, "Invalid size.") return size_set_to = (size_select/100) @@ -52,6 +55,21 @@ . = ..() . += "It is currently set at [size_set_to*100]%" +/obj/item/weapon/gun/energy/sizegun/admin + name = "modified size gun" + desc = "Sizegun, without limits on minimum/maximum size, and with unlimited charge. Time to show 'em that size does matter." + charge_cost = 0 + projectile_type = /obj/item/projectile/beam/sizelaser/admin + +/obj/item/weapon/gun/energy/sizegun/admin/select_size() + set name = "Select Size" + set category = "Object" + set src in view(1) + + var/size_select = input("Put the desired size", "Set Size", size_set_to * 100) as num + size_set_to = max(1,size_select/100) //No negative numbers + to_chat(usr, "You set the size to [size_select]%") + // // Beams for size gun // @@ -71,8 +89,21 @@ /obj/item/projectile/beam/sizelaser/on_hit(var/atom/target) var/mob/living/M = target if(istype(M)) - M.resize(set_size) - to_chat(M, " The beam fires into your body, changing your size!") + if(!M.in_dorms() || !istype(M, /mob/living/carbon/human)) + if(!M.resize(clamp(set_size,0.25,2))) + to_chat(M, "The beam fires into your body, changing your size!") + else + if(!M.resize(clamp(set_size,0.01,6))) + to_chat(M, "The beam fires into your body, changing your size!") + M.updateicon() + return + return 1 + +/obj/item/projectile/beam/sizelaser/admin/on_hit(var/atom/target) + var/mob/living/M = target + if(istype(M)) + M.resize(set_size, TRUE, FALSE) + to_chat(M, "The beam fires into your body, changing your size!") M.updateicon() return return 1 diff --git a/code/modules/vore/smoleworld/smoleworld_vr.dm b/code/modules/vore/smoleworld/smoleworld_vr.dm new file mode 100644 index 0000000000..5e84d7cbd1 --- /dev/null +++ b/code/modules/vore/smoleworld/smoleworld_vr.dm @@ -0,0 +1,405 @@ +// future to do list for anyone who wants to try: +//Make building turf enterable for small people. +//Make buildings enterable then bustable from the inside. +//Tiny cars drivable only by small people, wheel chair code. +//Add details to planet foods as well as diversify options for cargo ordering. +//make water turfs stomp and apply to player sprites. + + +//turf items + +/turf/simulated/floor/smole + name = "toy floor" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "megablocksturf" + var/list/crossed_dirs = list() + +/turf/simulated/floor/smole/Entered(atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.hovering) // Flying things shouldn't make footprints. + return ..() + if(L.get_effective_size() <= RESIZE_NORMAL) + return ..() + if(L.get_effective_size() >= RESIZE_A_BIGNORMAL) + playsound(src, 'sound/effects/footstep/giantstep_gigga.ogg', 35, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) + var/mdir = "[A.dir]" + crossed_dirs[mdir] = 1 + update_icon() + . = ..() + +/turf/simulated/floor/smole/update_icon() + ..() + for(var/d in crossed_dirs) + add_overlay(image(icon = 'icons/vore/smoleworld_vr.dmi', icon_state = "stomp", dir = text2num(d))) + +//Extra micro turfs +/turf/simulated/floor/smole/grass + name = "grass" + icon_state = "grass0" + initial_flooring = /decl/flooring/grass/outdoors + +/turf/simulated/floor/smole/desert + icon = 'icons/turf/desert.dmi' + icon_state = "desert" + initial_flooring = /decl/flooring/sand/desert + +/turf/simulated/floor/smole/megablocks + name = "block floor" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "megablocksturf" + +//Used to make smole objects be able to be built from menu + +/datum/material/smolebricks/generate_recipes() + recipes = list() + recipes += new/datum/stack_recipe("road straight", /obj/structure/smoletrack/roadS, 1, time = 5) + recipes += new/datum/stack_recipe("road threeway", /obj/structure/smoletrack/roadT, 1, time = 5) + recipes += new/datum/stack_recipe("road turn ", /obj/structure/smoletrack/roadturn, 1, time = 5) + recipes += new/datum/stack_recipe("road fourway", /obj/structure/smoletrack/roadF, 1, time = 5) + recipes += new/datum/stack_recipe("smole houses", /obj/structure/smolebuilding/houses, 2, time = 10) + recipes += new/datum/stack_recipe("smole business", /obj/structure/smolebuilding/business, 2, time = 10) + recipes += new/datum/stack_recipe("smole warehouses", /obj/structure/smolebuilding/warehouses, 2, time = 10) + recipes += new/datum/stack_recipe("smole musem", /obj/structure/smolebuilding/musem, 2, time = 10) + +/datum/material/smolebricks + name = "smolebricks" + stack_type = /obj/item/stack/material/smolebricks + icon_base = "solid" + icon_reinf = "reinf_over" + destruction_desc = "smashed" + sheet_singular_name = "bag" + sheet_plural_name = "bags" + +//the actual materials + +/obj/item/stack/material/smolebricks + name = "smolebricks" + desc = "A collection of tiny colored bricks ready to be built into whatever you want." + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "smolematerial" + drop_sound = 'sound/items/drop/smolematerial.ogg' + pickup_sound = 'sound/items/pickup/pillbottle.ogg' + default_type = "smolebricks" + w_class = ITEMSIZE_SMALL + +//smolebrick case to make for easy bricks. +/obj/item/weapon/storage/smolebrickcase + name = "smolebrick case" + desc = "you feel the power of imagination." + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "smolestorage" + throw_speed = 1 + throw_range = 4 + w_class = ITEMSIZE_LARGE + max_w_class = ITEMSIZE_NORMAL + max_storage_space = ITEMSIZE_COST_SMALL * 7 // most code copied from toolbox + use_sound = 'sound/items/storage/smolecase.ogg' + drop_sound = 'sound/items/drop/device.ogg' + pickup_sound = 'sound/items/pickup/device.ogg' + starts_with = list( /obj/item/stack/material/smolebricks, + /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, + /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, + /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks, /obj/item/stack/material/smolebricks + ) + +//Track code +//defineing actions +/obj/structure/smoletrack + icon = 'icons/vore/smoleworld_vr.dmi' + density = 0 + +/obj/structure/smoletrack/attack_hand(mob/user) + if(user.a_intent == I_DISARM) + if(ismouse(usr) || (isobserver(usr) && !config.ghost_interaction)) + return + to_chat(user, "[src] was dismantaled into bricks.") + playsound(src, 'sound/items/smolesmallbuild.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) + var/turf/simulated/floor/F = get_turf(src) + if(istype(F)) + new /obj/item/stack/material/smolebricks(F) + qdel(src) + +/obj/structure/smoletrack/verb/rotate_clockwise() + set name = "Rotate Road Clockwise" + set category = "Object" + set src in oview(1) + if(ismouse(usr) || (isobserver(usr) && !config.ghost_interaction)) + return + src.set_dir(turn(src.dir, 270)) + +// Road pieces + +/obj/structure/smoletrack/roadS + name = "road straight piece" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "carstraight" + desc = "A long set of tiny road." + anchored = 1 + +/obj/structure/smoletrack/roadT + name = "road threeway piece" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "carthreeway" + desc = "A tiny threeway road piece." + anchored = 1 + +/obj/structure/smoletrack/roadturn + name = "road turn piece" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "carturn" + desc = "A tiny turn road piece." + anchored = 1 + +/obj/structure/smoletrack/roadF + name = "road fourway piece" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "carfourway" + desc = "A fourway road piece." + anchored = 1 + +//buildings code +//Defining building actions +/obj/structure/smolebuilding + icon = 'icons/vore/smoleworld_vr.dmi' + density = 1 + anchored = 1 + var/health = 75 + var/damage +//makes it so buildings can be dismaintaled or GodZilla style attacked +/obj/structure/smolebuilding/attack_hand(mob/user) + if(user.a_intent == I_DISARM) + if(ismouse(usr) || (isobserver(usr) && !config.ghost_interaction)) + return + to_chat(user, "[src] was dismantaled into bricks.") + playsound(src, 'sound/items/smolesmallbuild.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) + if(!isnull(loc)) + new /obj/item/stack/material/smolebricks(loc) + new /obj/item/stack/material/smolebricks(loc) + qdel(src) + + else if (usr.a_intent == I_HURT) + + if(ismouse(usr) || (isobserver(usr) && !config.ghost_interaction)) + return + + take_damage() + playsound(src, 'sound/items/smolebuildinghit2.ogg', 50, 1) + user.do_attack_animation(src) + usr.visible_message("\The [usr] bangs against \the [src]!", + "You bang against \the [src]!", + "You hear a banging sound.") + else + usr.visible_message("[usr.name] knocks on the [src.name].", + "You knock on the [src.name].") + return + +//takes 3 normal attacks +/obj/structure/smolebuilding/take_damage() + damage = 25 + health = health - damage + + if(health <= 0) + dismantle() + else + return + return +//results of attacks will remove building and spawn in ruins. +/obj/structure/smolebuilding/proc/dismantle() + visible_message("\The [src] falls apart!") + playsound(src, 'sound/items/smolebuildingdestoryed.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) + new /obj/structure/smoleruins(loc) + qdel(src) + return + +//checks for items and does the same as dismaintle but spawns material instead. +/obj/structure/smolebuilding/attackby(obj/item/weapon/W as obj, mob/user as mob) + dismantle() + return +//checks for projectile damage and does the same as dismaintle but spawns material instead. +/obj/structure/smolebuilding/bullet_act(var/obj/item/projectile/Proj) + displode() + return +//is the same as dismaintal but instead of ruins it just makes it all explode +/obj/structure/smolebuilding/proc/displode() + visible_message("\The [src] explodes into pieces!") + playsound(src, 'sound/items/smolebuildingdestoryedshort.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) + new /obj/item/stack/material/smolebricks(loc) + new /obj/item/stack/material/smolebricks(loc) + qdel(src) + return + +//get material from ruins +/obj/structure/smoleruins/attack_hand(mob/user) + if(user.a_intent == I_DISARM) + if(ismouse(usr) || (isobserver(usr) && !config.ghost_interaction)) + return + to_chat(user, "[src] was dismantaled into bricks.") + playsound(src, 'sound/items/smolelargeunbuild.ogg', 50, 1, volume_channel = VOLUME_CHANNEL_MASTER) + if(!isnull(loc)) + new /obj/item/stack/material/smolebricks(loc) + new /obj/item/stack/material/smolebricks(loc) + qdel(src) + +//Ruins go asplode same as buildings if attacked +/obj/structure/smoleruins/attackby(obj/item/weapon/W as obj, mob/user as mob) + displode() + return + +/obj/structure/smoleruins/bullet_act(var/obj/item/projectile/Proj) + displode() + return + +/obj/structure/smoleruins/proc/displode() + visible_message("\The [src] explodes into pieces!") + playsound(src, 'sound/items/smolebuildingdestoryedshort.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) + new /obj/item/stack/material/smolebricks(loc) + new /obj/item/stack/material/smolebricks(loc) + qdel(src) + return + +//buildings +/obj/structure/smoleruins + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "ruins" + density = 0 + +/obj/structure/smolebuilding/houses + name = "smole houses" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "smolehouses" + +/obj/structure/smolebuilding/business + name = "smole business" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "smolebusiness" + +/obj/structure/smolebuilding/warehouses + name = "smole warehouses" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "smolewarehouses" + +/obj/structure/smolebuilding/musem + name = "smole musem" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "smolemusem" +// +//CAR STUFF < WILL BE MESSED WITH IN A LATER UPDATE COMMENTED OUT FOR NOW +///obj/item/smolecar +// name = "toy car" +// desc = "A toy car ready to be snapped together and burn rubber!" +// icon = 'icons/vore/smoleworld_vr.dmi' +// icon_state = "smolecarA_folded" +// item_state = "smolecarA" +// unfolded_type = /obj/structure/bed/chair/wheelchair/smolecar +// +///obj/structure/smolecar +// name = "Toy Car" +// desc = "Lets burn rubber!" +// icon = 'icons/vore/smoleworld_vr.dmi' +// icon_state = "smolecarA" +// anchored = 0 +// buckle_movable = 1 +// var/carry_type = /obj/item/smolecar +// +///obj/structure/bed/chair/wheelchair/smolecar/can_buckle_check(mob/living/M, forced = FALSE) +// . = ..() +// if(.) +// +// if(M.get_effective_size() > RESIZE_TINY) +// to_chat(M, SPAN_WARNING("You are to big to fit in \the [src].")) + // . = FALSE +// +// +//snack planets, currently just plopped out will be organized later. +/obj/item/trash/Asteroidsmall + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_asteriodB" + name = "asteriod" + desc = "A solid chunk of candy crumb that looks like a asteriod." + +/obj/item/trash/Asteroidlarge + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_asteriodA" + name = "asteriod" + desc = "A solid chunk of candy crumb that looks like a asteriod." + +/obj/item/trash/Asteroidmulti + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_asteriodC" + name = "asteriod" + desc = "Several chunks of sugar crumbs that looks like asteriods." + +/obj/item/weapon/bikehorn/tinytether + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "tether_trash" + name = "tether" + desc = "Its a tiny bit of plastic in the shape of the tether. There seems to be a small button on top." + +/obj/item/weapon/bikehorn/tinytether/attack_self(mob/user as mob) + if(spam_flag == 0) + spam_flag = 1 + playsound(src, 'sound/items/tinytether.ogg', 30, 1, volume_channel = VOLUME_CHANNEL_MASTER) + src.add_fingerprint(user) + spawn(20) + spam_flag = 0 + return + +/obj/item/weapon/reagent_containers/food/snacks/snackplanet/moon + name = "moon" + desc = "A firm solid mass of white powdery sugar in the shape of a moon!" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_moon" + bitesize = 1 + trash = /obj/item/trash/Asteroidsmall + nutriment_amt = 2 + nutriment_desc = list("sugar" = 2) + drop_sound = 'sound/items/drop/basketball.ogg' + +/obj/item/weapon/reagent_containers/food/snacks/snackplanet/virgo3b + name = "virgo3bB" + desc = "A sticky jelly jaw breaker in the shape of Virgo3B, it even has a tiny tether!" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_Virgo3B" + bitesize = 3 + trash = /obj/item/weapon/bikehorn/tinytether + nutriment_amt = 2 + nutriment_desc = list("spicy" = 2, "tang" = 2) + drop_sound = 'sound/items/drop/basketball.ogg' + +/obj/item/weapon/reagent_containers/food/snacks/snackplanet/phoron + name = "phoron giant" + desc = "A spicy jaw breaker that seems to swirl in the light." + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_phoron" + bitesize = 3 + trash = /obj/item/trash/Asteroidmulti + nutriment_amt = 2 + nutriment_desc = list("spicy" = 2) + drop_sound = 'sound/items/drop/basketball.ogg' + +/obj/item/weapon/reagent_containers/food/snacks/snackplanet/virgoprime + name = "virgo prime" + desc = "Its a orange jaw breaker in the shape Virgo Prime!" + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_virgoprime" + bitesize = 3 + trash = /obj/item/trash/Asteroidmulti + nutriment_amt = 2 + nutriment_desc = list("salty" = 2) + drop_sound = 'sound/items/drop/basketball.ogg' + +/obj/item/weapon/storage/bagoplanets + name = "bag o' planets" + desc = "A cosmic bag of fist sized candy planets." + icon = 'icons/vore/smoleworld_vr.dmi' + icon_state = "sp_storage" + w_class = ITEMSIZE_LARGE + max_w_class = ITEMSIZE_NORMAL + max_storage_space = ITEMSIZE_COST_SMALL * 7 // most code copied from toolbox + drop_sound = 'sound/items/drop/food.ogg' + pickup_sound = 'sound/items/pickup/food.ogg' + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/snackplanet/phoron, + /obj/item/weapon/reagent_containers/food/snacks/snackplanet/virgo3b,/obj/item/weapon/reagent_containers/food/snacks/snackplanet/moon, + /obj/item/weapon/reagent_containers/food/snacks/snackplanet/virgoprime + ) diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 6efbfdaf94..703d7fb12b 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -68,10 +68,10 @@ h1.alert, h2.alert {color: #000000;} .ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} -// VOREStation Edit Start +/* VOREStation Edit Start */ .emote {} .emote_subtle {font-style: italic;} -// VOREStation Edit End +/* VOREStation Edit End */ /* Game Messages */ @@ -99,7 +99,7 @@ h1.alert, h2.alert {color: #000000;} .akhani {color: #AC398C;} .skrell {color: #00B0B3;} .skrellfar {color: #70FCFF;} -.soghun {color: #228B22;} +.soghun {color: #50BA6C;} .solcom {color: #22228B;} .changeling {color: #800080;} .sergal {color: #0077FF;} diff --git a/code/unit_tests/integrated_circuits/prefabs.dm b/code/unit_tests/integrated_circuits/prefabs.dm index 056c0d1568..04b3136640 100644 --- a/code/unit_tests/integrated_circuits/prefabs.dm +++ b/code/unit_tests/integrated_circuits/prefabs.dm @@ -3,8 +3,9 @@ /datum/unit_test/integrated_circuit_prefabs_shall_respect_complexity_and_size_contraints/start_test() var/list/failed_prefabs = list() - for(var/prefab_type in subtypesof(/decl/prefab/ic_assembly)) - var/decl/prefab/ic_assembly/prefab = decls_repository.get_decl(prefab_type) + var/list/prefab_types = decls_repository.get_decls_of_subtype(/decl/prefab/ic_assembly) + for(var/prefab_type in prefab_types) + var/decl/prefab/ic_assembly/prefab = prefab_types[prefab_type] var/obj/item/device/electronic_assembly/assembly = prefab.assembly_type var/available_size = initial(assembly.max_components) @@ -33,9 +34,9 @@ /datum/unit_test/integrated_circuit_prefabs_shall_not_fail_to_create/start_test() var/list/failed_prefabs = list() - for(var/prefab_type in subtypesof(/decl/prefab/ic_assembly)) - var/decl/prefab/ic_assembly/prefab = decls_repository.get_decl(prefab_type) - + var/list/prefab_types = decls_repository.get_decls_of_subtype(/decl/prefab/ic_assembly) + for(var/prefab_type in prefab_types) + var/decl/prefab/ic_assembly/prefab = prefab_types[prefab_type] try var/built_item = prefab.create(get_standard_turf()) if(built_item) diff --git a/code/unit_tests/subsystem_tests.dm b/code/unit_tests/subsystem_tests.dm new file mode 100644 index 0000000000..0e62c2896b --- /dev/null +++ b/code/unit_tests/subsystem_tests.dm @@ -0,0 +1,46 @@ +/datum/unit_test/subsystem_shall_be_initialized + name = "SUBSYSTEM - INIT: Subsystems shall be initalized" + +/datum/unit_test/subsystem_shall_be_initialized/start_test() + var/list/bad_subsystems = list() + for(var/datum/controller/subsystem/SS in Master.subsystems) + if (SS.flags & SS_NO_INIT) + continue + if(!SS.subsystem_initialized) + bad_subsystems += SS.type + + if(bad_subsystems.len) + fail("Found improperly initialized subsystems: [english_list(bad_subsystems)]") + else + pass("All susbsystems have initialized properly") + + return 1 + +/* Uncomment when all atoms init properly +/datum/unit_test/subsystem_atom_shall_have_no_bad_init_calls + name = "SUBSYSTEM - ATOMS: Shall have no bad init calls" + +/datum/unit_test/subsystem_atom_shall_have_no_bad_init_calls/start_test() + if(SSatoms.BadInitializeCalls.len) + log_bad(jointext(SSatoms.InitLog(), null)) + fail("[SSatoms] had bad initialization calls.") + else + pass("[SSatoms] had no bad initialization calls.") + return 1 + +/datum/unit_test/all_atoms_shall_be_initialized + name = "SUBSYSTEM - ATOMS: All atoms shall be initialized." + +/datum/unit_test/all_atoms_shall_be_initialized/start_test() + set background = TRUE // avoid infinite loop warning; SS will still wait for us. + var/fail = FALSE + for(var/atom/atom in world) + if(!(atom.initialized)) + log_bad("Uninitialized atom: [atom.log_info_line()]") + fail = TRUE + if(fail) + fail("There were uninitialized atoms.") + else + pass("All atoms were initialized") + return 1 +*/ \ No newline at end of file diff --git a/code/unit_tests/unit_test_vr.dm b/code/unit_tests/unit_test_vr.dm index 8ede60a902..555431f895 100644 --- a/code/unit_tests/unit_test_vr.dm +++ b/code/unit_tests/unit_test_vr.dm @@ -19,6 +19,7 @@ return 0 var/mob/living/carbon/human/H = new mobtype(mobloc) + H.init_vore() if(with_mind) H.mind_initialize("TestKey[rand(0,10000)]") diff --git a/config/custom_sprites.txt b/config/custom_sprites.txt index b99307d173..dc5302cb7f 100644 --- a/config/custom_sprites.txt +++ b/config/custom_sprites.txt @@ -1,3 +1,3 @@ ckey|state lunarfleet|Clea-Nor -jademanique|B.A.U-Kingside \ No newline at end of file +jademanique|B.A.U-Kingside diff --git a/html/changelog.html b/html/changelog.html index d280fd6dc9..f5813382aa 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,7 +1,7 @@ - Polaris Changelog + CHOMPStation13 Changelog