diff --git a/README.txt b/README.txt
index 1a025b7674..c6ea4cd5dc 100644
--- a/README.txt
+++ b/README.txt
@@ -1,7 +1,7 @@
tgstation13 v1.0 - 6 October 2010
Website: http://nanotrasen.com
-Code: http://code.google.com/p/tgstation13
+Code: https://github.com/tgstation/-tg-station
IRC: irc://irc.rizon.net/tgstation13
================================================================================
diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql
index b7e2e501ce..2c3742b81d 100644
--- a/SQL/tgstation_schema.sql
+++ b/SQL/tgstation_schema.sql
@@ -1,100 +1,100 @@
-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;
+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/datums/recipe.dm b/code/datums/recipe.dm
index a121092add..093fc8f5fd 100644
--- a/code/datums/recipe.dm
+++ b/code/datums/recipe.dm
@@ -1,120 +1,120 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * *
- * /datum/recipe by rastaf0 13 apr 2011 *
- * * * * * * * * * * * * * * * * * * * * * * * * * *
- * This is powerful and flexible recipe system.
- * It exists not only for food.
- * supports both reagents and objects as prerequisites.
- * In order to use this system you have to define a deriative from /datum/recipe
- * * reagents are reagents. Acid, milc, booze, etc.
- * * items are objects. Fruits, tools, circuit boards.
- * * result is type to create as new object
- * * time is optional parameter, you shall use in in your machine,
- default /datum/recipe/ procs does not rely on this parameter.
- *
- * Functions you need:
- * /datum/recipe/proc/make(var/obj/container as obj)
- * Creates result inside container,
- * deletes prerequisite reagents,
- * transfers reagents from prerequisite objects,
- * deletes all prerequisite objects (even not needed for recipe at the moment).
- *
- * /proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj as obj, exact = 1)
- * Wonderful function that select suitable recipe for you.
- * obj is a machine (or magik hat) with prerequisites,
- * exact = 0 forces algorithm to ignore superfluous stuff.
- *
- *
- * Functions you do not need to call directly but could:
- * /datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents)
- * //1=precisely, 0=insufficiently, -1=superfluous
- *
- * /datum/recipe/proc/check_items(var/obj/container as obj)
- * //1=precisely, 0=insufficiently, -1=superfluous
- *
- * */
-
-/datum/recipe
- var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
- var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
- var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut
- var/time = 100 // 1/10 part of second
-
-
-/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous
- . = 1
- for (var/r_r in reagents)
- var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r)
- if (!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals
- if (aval_r_amnt>reagents[r_r])
- . = -1
- else
- return 0
- if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
- return -1
- return .
-
-/datum/recipe/proc/check_items(var/obj/container as obj) //1=precisely, 0=insufficiently, -1=superfluous
- if (!items)
- if (locate(/obj/) in container)
- return -1
- else
- return 1
- . = 1
- var/list/checklist = items.Copy()
- for (var/obj/O in container)
- var/found = 0
- for (var/type in checklist)
- if (istype(O,type))
- checklist-=type
- found = 1
- break
- if (!found)
- . = -1
- if (checklist.len)
- return 0
- return .
-
-//general version
-/datum/recipe/proc/make(var/obj/container as obj)
- var/obj/result_obj = new result(container)
- for (var/obj/O in (container.contents-result_obj))
- O.reagents.trans_to(result_obj, O.reagents.total_volume)
- del(O)
- container.reagents.clear_reagents()
- return result_obj
-
-// food-related
-/datum/recipe/proc/make_food(var/obj/container as obj)
- var/obj/result_obj = new result(container)
- for (var/obj/O in (container.contents-result_obj))
- if (O.reagents)
- O.reagents.del_reagent("nutriment")
- O.reagents.update_total()
- O.reagents.trans_to(result_obj, O.reagents.total_volume)
- del(O)
- container.reagents.clear_reagents()
- return result_obj
-
-/proc/select_recipe(var/list/datum/recipe/avaiable_recipes, var/obj/obj as obj, var/exact = 1 as num)
- if (!exact)
- exact = -1
- var/list/datum/recipe/possible_recipes = new
- for (var/datum/recipe/recipe in avaiable_recipes)
- if (recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact)
- possible_recipes+=recipe
- if (possible_recipes.len==0)
- return null
- else if (possible_recipes.len==1)
- return possible_recipes[1]
- else //okay, let's select the most complicated recipe
- var/r_count = 0
- var/i_count = 0
- . = possible_recipes[1]
- for (var/datum/recipe/recipe in possible_recipes)
- var/N_i = (recipe.items)?(recipe.items.len):0
- var/N_r = (recipe.reagents)?(recipe.reagents.len):0
- if (N_i > i_count || (N_i== i_count && N_r > r_count ))
- r_count = N_r
- i_count = N_i
- . = recipe
- return .
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ * /datum/recipe by rastaf0 13 apr 2011 *
+ * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * This is powerful and flexible recipe system.
+ * It exists not only for food.
+ * supports both reagents and objects as prerequisites.
+ * In order to use this system you have to define a deriative from /datum/recipe
+ * * reagents are reagents. Acid, milc, booze, etc.
+ * * items are objects. Fruits, tools, circuit boards.
+ * * result is type to create as new object
+ * * time is optional parameter, you shall use in in your machine,
+ default /datum/recipe/ procs does not rely on this parameter.
+ *
+ * Functions you need:
+ * /datum/recipe/proc/make(var/obj/container as obj)
+ * Creates result inside container,
+ * deletes prerequisite reagents,
+ * transfers reagents from prerequisite objects,
+ * deletes all prerequisite objects (even not needed for recipe at the moment).
+ *
+ * /proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj as obj, exact = 1)
+ * Wonderful function that select suitable recipe for you.
+ * obj is a machine (or magik hat) with prerequisites,
+ * exact = 0 forces algorithm to ignore superfluous stuff.
+ *
+ *
+ * Functions you do not need to call directly but could:
+ * /datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents)
+ * //1=precisely, 0=insufficiently, -1=superfluous
+ *
+ * /datum/recipe/proc/check_items(var/obj/container as obj)
+ * //1=precisely, 0=insufficiently, -1=superfluous
+ *
+ * */
+
+/datum/recipe
+ var/list/reagents // example: = list("berryjuice" = 5) // do not list same reagent twice
+ var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
+ var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut
+ var/time = 100 // 1/10 part of second
+
+
+/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous
+ . = 1
+ for (var/r_r in reagents)
+ var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r)
+ if (!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals
+ if (aval_r_amnt>reagents[r_r])
+ . = -1
+ else
+ return 0
+ if ((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
+ return -1
+ return .
+
+/datum/recipe/proc/check_items(var/obj/container as obj) //1=precisely, 0=insufficiently, -1=superfluous
+ if (!items)
+ if (locate(/obj/) in container)
+ return -1
+ else
+ return 1
+ . = 1
+ var/list/checklist = items.Copy()
+ for (var/obj/O in container)
+ var/found = 0
+ for (var/type in checklist)
+ if (istype(O,type))
+ checklist-=type
+ found = 1
+ break
+ if (!found)
+ . = -1
+ if (checklist.len)
+ return 0
+ return .
+
+//general version
+/datum/recipe/proc/make(var/obj/container as obj)
+ var/obj/result_obj = new result(container)
+ for (var/obj/O in (container.contents-result_obj))
+ O.reagents.trans_to(result_obj, O.reagents.total_volume)
+ del(O)
+ container.reagents.clear_reagents()
+ return result_obj
+
+// food-related
+/datum/recipe/proc/make_food(var/obj/container as obj)
+ var/obj/result_obj = new result(container)
+ for (var/obj/O in (container.contents-result_obj))
+ if (O.reagents)
+ O.reagents.del_reagent("nutriment")
+ O.reagents.update_total()
+ O.reagents.trans_to(result_obj, O.reagents.total_volume)
+ del(O)
+ container.reagents.clear_reagents()
+ return result_obj
+
+/proc/select_recipe(var/list/datum/recipe/avaiable_recipes, var/obj/obj as obj, var/exact = 1 as num)
+ if (!exact)
+ exact = -1
+ var/list/datum/recipe/possible_recipes = new
+ for (var/datum/recipe/recipe in avaiable_recipes)
+ if (recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact)
+ possible_recipes+=recipe
+ if (possible_recipes.len==0)
+ return null
+ else if (possible_recipes.len==1)
+ return possible_recipes[1]
+ else //okay, let's select the most complicated recipe
+ var/r_count = 0
+ var/i_count = 0
+ . = possible_recipes[1]
+ for (var/datum/recipe/recipe in possible_recipes)
+ var/N_i = (recipe.items)?(recipe.items.len):0
+ var/N_r = (recipe.reagents)?(recipe.reagents.len):0
+ if (N_i > i_count || (N_i== i_count && N_r > r_count ))
+ r_count = N_r
+ i_count = N_i
+ . = recipe
+ return .
diff --git a/code/defines/obj/clothing/gimmick.dm b/code/defines/obj/clothing/gimmick.dm
index 7de6fa4c28..4b4463a753 100644
--- a/code/defines/obj/clothing/gimmick.dm
+++ b/code/defines/obj/clothing/gimmick.dm
@@ -546,4 +546,19 @@ obj/item/clothing/suit/justice
desc = "this pretty much looks ridiculous"
icon_state = "justice"
item_state = "justice"
- flags = FPRINT | TABLEPASS
\ No newline at end of file
+ flags = FPRINT | TABLEPASS
+
+/obj/item/clothing/under/gladiator
+ name = "gladiator uniform"
+ desc = "Are you not entertained? Is that not why you are here?"
+ icon_state = "gladiator"
+ item_state = "gladiator"
+ color = "gladiator"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
+/obj/item/clothing/head/helmet/gladiator
+ name = "gladiator helmet"
+ desc = "Ave, Imperator, morituri te salutant."
+ icon_state = "gladiator"
+ flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
+ item_state="gladiator"
\ No newline at end of file
diff --git a/code/defines/obj/clothing/jumpsuit.dm b/code/defines/obj/clothing/jumpsuit.dm
index 3b724694f2..981ef0da6b 100644
--- a/code/defines/obj/clothing/jumpsuit.dm
+++ b/code/defines/obj/clothing/jumpsuit.dm
@@ -1,513 +1,513 @@
-// UNDERS AND BY THAT, NATURALLY I MEAN UNIFORMS/JUMPSUITS
-
-/obj/item/clothing/under
- icon = 'uniforms.dmi'
- name = "under"
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
- protective_temperature = T0C + 50
- heat_transfer_coefficient = 0.30
- permeability_coefficient = 0.90
- flags = FPRINT | TABLEPASS | ONESIZEFITSALL
- var/has_sensor = 1//For the crew computer 2 = unable to change mode
- var/sensor_mode = 0
- /*
- 1 = Report living/dead
- 2 = Report detailed damages
- 3 = Report location
- */
-
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-// Colors
-
-/obj/item/clothing/under/chameleon
-//starts off as black
- name = "Black Jumpsuit"
- icon_state = "black"
- item_state = "bl_suit"
- color = "black"
- desc = "A plain jumpsuit. It seems to have a small dial on the wrist."
- origin_tech = "syndicate=3"
- var/list/clothing_choices = list()
-
-/obj/item/clothing/under/chameleon/all
-
-/obj/item/clothing/under/color/black
- name = "Black Jumpsuit"
- icon_state = "black"
- item_state = "bl_suit"
- color = "black"
-
-/obj/item/clothing/under/color/blackf
- name = "Female Black Jumpsuit"
- desc = "This one is a lady-size!"
- icon_state = "black"
- item_state = "bl_suit"
- color = "blackf"
-
-/obj/item/clothing/under/color/blue
- name = "Blue Jumpsuit"
- icon_state = "blue"
- item_state = "b_suit"
- color = "blue"
-
-/obj/item/clothing/under/color/green
- name = "Green Jumpsuit"
- icon_state = "green"
- item_state = "g_suit"
- color = "green"
-
-/obj/item/clothing/under/color/grey
- name = "Grey Jumpsuit"
- icon_state = "grey"
- item_state = "gy_suit"
- color = "grey"
-
-/obj/item/clothing/under/color/orange
- name = "Orange Jumpsuit"
- desc = "Standard Nanotrasen prisoner wear. Its suit sensors are stuck in the \"Fully On\" position."
- icon_state = "orange"
- item_state = "o_suit"
- color = "orange"
- has_sensor = 2
- sensor_mode = 3
-
-/obj/item/clothing/under/color/pink
- name = "Pink Jumpsuit"
- icon_state = "pink"
- item_state = "p_suit"
- color = "pink"
-
-/obj/item/clothing/under/color/red
- name = "Red Jumpsuit"
- icon_state = "red"
- item_state = "r_suit"
- color = "red"
-
-/obj/item/clothing/under/color/white
- desc = "Made of a special fiber that gives special protection against biohazards."
- name = "White Jumpsuit"
- icon_state = "white"
- item_state = "w_suit"
- color = "white"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/color/yellow
- name = "Yellow Jumpsuit"
- icon_state = "yellow"
- item_state = "y_suit"
- color = "yellow"
-
-// RANKS
-/obj/item/clothing/under/rank
-
-/obj/item/clothing/under/rank/atmospheric_technician
- desc = "A jumpsuit used by atmospheric technicians."
- name = "Atmospherics Jumpsuit"
- icon_state = "atmos"
- item_state = "atmos_suit"
- color = "atmos"
-
-/obj/item/clothing/under/rank/captain
- desc = "A blue jumpsuit with gold marking denoting the rank of \"Captain\"."
- name = "Captain Jumpsuit"
- icon_state = "captain"
- item_state = "caparmor"
- color = "captain"
-
-/obj/item/clothing/under/rank/chaplain
- desc = "A black jumpsuit, worn by religious folk."
- name = "Chaplain Jumpsuit"
- icon_state = "chaplain"
- item_state = "bl_suit"
- color = "chapblack"
-
-/obj/item/clothing/under/rank/engineer
- desc = "An orange high visibility jumpsuit. Used by Nanotrasen Engineers, has minor radiation shielding."
- name = "Engineering Jumpsuit"
- icon_state = "engine"
- item_state = "engi_suit"
- color = "engine"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
-
-/obj/item/clothing/under/rank/forensic_technician
- desc = "It has a Forensics rank stripe on it."
- name = "Forensics Jumpsuit"
- icon_state = "darkred"
- item_state = "r_suit"
- color = "forensicsred"
-
-/obj/item/clothing/under/rank/warden
- desc = "Made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. This one has the word \"Warden\" written on the shoulders."
- name = "Warden Jumpsuit"
- icon_state = "darkred"
- item_state = "r_suit"
- color = "darkred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/rank/security
- name = "Security Jumpsuit"
- desc = "Made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection."
- icon_state = "red"
- item_state = "r_suit"
- color = "red"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/rank/vice
- name = "Vice officer Jumpsuit"
- desc = "Your standard issue pretty-boy outfit, as seen on TV."
- icon_state = "vice"
- item_state = "gy_suit"
- color = "vice"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/rank/geneticist
- desc = "Made of a special fiber that gives special protection against biohazards. Has a genetics rank stripe on it."
- name = "Genetics Jumpsuit"
- icon_state = "genetics"
- item_state = "w_suit"
- color = "geneticswhite"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/chemist
- desc = "Made of a special fiber that gives special protection against biohazards. Has a chemist rank stripe on it."
- name = "Chemist Jumpsuit"
- icon_state = "genetics"
- item_state = "w_suit"
- color = "geneticswhite"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/head_of_personnel
- desc = "A jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
- name = "Head of Personnel Jumpsuit"
- icon_state = "hop"
- item_state = "b_suit"
- color = "hop"
-
-/obj/item/clothing/under/rank/centcom_officer
- desc = "A jumpsuit worn by Centcom Officers."
- name = "CentCom Officer Jumpsuit"
- icon_state = "officer"
- item_state = "g_suit"
- color = "officer"
-
-/obj/item/clothing/under/rank/centcom_commander
- desc = "A jumpsuit worn by Centcom's highest level Commanders."
- name = "CentCom Officer Jumpsuit"
- icon_state = "centcom"
- item_state = "dg_suit"
- color = "centcom"
-
-/obj/item/clothing/under/rank/miner
- desc = "A snappy jumpsuit with a sturdy set of overalls. It is very dirty."
- name = "Shaft Miner Jumpsuit"
- icon_state = "miner"
- item_state = "miner"
- color = "miner"
-
-/obj/item/clothing/under/rank/roboticist
- desc = "A slimming black with reinforced seams. Great for industrial work."
- name = "Roboticist Jumpsuit"
- icon_state = "robotics"
- item_state = "robotics"
- color = "robotics"
-
-/obj/item/clothing/under/rank/head_of_security
- desc = "A jumpsuit worn by those few with the dedication to achieve the position of \"Head of Security\". Has slight armor to protect the wearer."
- name = "Head of Security Jumpsuit"
- icon_state = "hos"
- item_state = "r_suit"
- color = "hosred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/rank/chief_engineer
- desc = "A high visibility jumpsuit given to those engineers committed enough to their jobs to achieve the rank of \"Chief engineer\". Has minor radiation shielding."
- name = "Chief Engineer Jumpsuit"
- icon_state = "chiefengineer"
- item_state = "g_suit"
- color = "chief"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
-
-/obj/item/clothing/under/rank/research_director
- desc = "A jumpsuit worn by those dedicated to all that is science and have achieved the position of \"Research Director\". Has minor biological anomaly protection."
- name = "Research Director Jumpsuit"
- icon_state = "director"
- item_state = "g_suit"
- color = "director"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/janitor
- desc = "Official clothing of the station's janitor. Has minor protection from biohazards."
- name = "Janitor's Jumpsuit"
- icon_state = "janitor"
- color = "janitor"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/scientist
- desc = "Made of a special fiber that gives special protection against biohazards. Has markings denoting the wearer as a scientist."
- name = "Scientist's Jumpsuit"
- icon_state = "toxins"
- item_state = "w_suit"
- color = "toxinswhite"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
-
-/obj/item/clothing/under/rank/medical
- desc = "Made of a special fiber that gives special protection against biohazards. Has a cross on the chest denoting that the wearer is trained medical personnel."
- name = "Medical Doctor's Jumpsuit"
- icon_state = "medical"
- item_state = "w_suit"
- color = "medical"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/chief_medical_officer
- desc = "A jumpsuit worn by those with the dedication to the medical profession who have achieved the position of \"Chief Medical Officer\". Has minor biological protection."
- name = "Chief Medical Officer's Jumpsuit"
- icon_state = "medical"
- item_state = "w_suit"
- color = "medical"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/hydroponics
- desc = "A jumpsuit designed to protect against minor plant-related hazards."
- name = "Hydroponics Jumpsuit"
- icon_state = "hydroponics"
- item_state = "g_suit"
- color = "hydroponics"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/cargo
- name = "Quartermaster's Jumpsuit"
- desc = "What can brown do for you?"
- icon_state = "lightbrown"
- item_state = "lb_suit"
- color = "cargo"
-
-/obj/item/clothing/under/rank/cargotech
- name = "Cargotech's Jumpsuit"
- desc = "Shooooorts! They're comfy and easy to wear!"
- icon_state = "cargotech"
- item_state = "cargotech"
- color = "cargotech"
-
-/obj/item/clothing/under/rank/mailman
- name = "Mailman Jumpsuit"
- desc = "Special delivery!"
- icon_state = "mailman"
- item_state = "b_suit"
- color = "mailman"
-
-/obj/item/clothing/under/sexyclown
- name = "Sexyclown suit"
- desc = "What can I do for you?"
- icon_state = "sexyclown"
- item_state = "sexyclown"
- color = "sexyclown"
-
-/obj/item/clothing/under/rank/bartender
- desc = "It looks like it could use more flair."
- name = "Bartender's Uniform"
- icon_state = "ba_suit"
- item_state = "ba_suit"
- color = "ba_suit"
-
-/obj/item/clothing/under/rank/clown
- name = "clown suit"
- desc = "Wearing this, all the children love you, for all the wrong reasons."
- icon_state = "clown"
- item_state = "clown"
- color = "clown"
-
-/obj/item/clothing/under/rank/chef
- desc = "Issued only to the most hardcore chefs in space."
- name = "Chef's Uniform"
- icon_state = "chef"
- color = "chef"
-
-/obj/item/clothing/under/rank/geneticist_new
- desc = "Made of a special fiber that gives special protection against biohazards."
- name = "Genetics Jumpsuit"
- icon_state = "genetics_new"
- item_state = "w_suit"
- color = "genetics_new"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/chemist_new
- desc = "Made of a special fiber that gives special protection against biohazards."
- name = "Chemist Jumpsuit"
- icon_state = "chemist_new"
- item_state = "w_suit"
- color = "chemist_new"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/rank/scientist_new
- desc = "Made of a special fiber that gives special protection against biohazards and small explosions."
- name = "Scientist Jumpsuit"
- icon_state = "scientist_new"
- item_state = "w_suit"
- color = "scientist_new"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
-
-/obj/item/clothing/under/rank/virologist_new
- desc = "Made of a special fiber that gives increased protection against biohazards."
- name = "Virologist Jumpsuit"
- icon_state = "virologist_new"
- item_state = "w_suit"
- color = "virologist_new"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-
-// OTHER NONRANKED STATION JOBS
-/obj/item/clothing/under/det
- name = "Hard worn suit"
- desc = "Someone who wears this means business."
- icon_state = "detective"
- item_state = "det"
- color = "detective"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/scratch
- name = "White Suit"
- desc = "A white suit, suitable for an excellent host"
- flags = FPRINT | TABLEPASS
- icon_state = "scratch"
- item_state = "scratch"
- color = "scratch"
-
-
-/obj/item/clothing/under/jensen
- desc = "You never asked for anything this stylish."
- name = "Head of Security Jumpsuit"
- icon_state = "jensen"
- item_state = "jensen"
- color = "jensen"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/sl_suit
- desc = "A very amish looking suit."
- name = "Amish Suit"
- icon_state = "sl_suit"
- color = "sl_suit"
-
-/obj/item/clothing/under/syndicate
- name = "Tactical Turtleneck"
- desc = "Non-descript, slightly suspicious civilian clothing."
- icon_state = "syndicate"
- item_state = "bl_suit"
- color = "syndicate"
- has_sensor = 0
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/syndicate/tacticool
- name = "Tacticool Turtleneck"
- desc = "Wearing this makes you feel like buying an SKS, going into the woods, and operating."
- icon_state = "tactifool"
- item_state = "bl_suit"
- color = "tactifool"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
-/obj/item/clothing/under/syndicate/combat
- name = "Combat Turtleneck"
-
-/obj/item/clothing/under/librarian
- name = "Sensible Suit"
- desc = "It's very... sensible."
- icon_state = "red_suit"
- item_state = "red_suit"
- color = "red_suit"
-
-/obj/item/clothing/under/mime
- name = "Mime Outfit"
- desc = "It's not very colourful."
- icon_state = "mime"
- item_state = "mime"
- color = "mime"
-
-/obj/item/clothing/under/waiter
- name = "Waiter Outfit"
- desc = "There is a special pocket for tip."
- icon_state = "waiter"
- item_state = "waiter"
- color = "waiter"
-
-
-// Athletic shorts.. heh
-/obj/item/clothing/under/shorts
- name = "athletic shorts"
- desc = "95% Polyester, 5% Spandex!"
- flags = FPRINT | TABLEPASS
- body_parts_covered = LOWER_TORSO
-
-/obj/item/clothing/under/shorts/red
- icon_state = "redshorts"
- color = "redshorts"
-
-/obj/item/clothing/under/shorts/green
- icon_state = "greenshorts"
- color = "greenshorts"
-
-/obj/item/clothing/under/shorts/blue
- icon_state = "blueshorts"
- color = "blueshorts"
-
-/obj/item/clothing/under/shorts/black
- icon_state = "blackshorts"
- color = "blackshorts"
-
-/obj/item/clothing/under/shorts/grey
- icon_state = "greyshorts"
- color = "greyshorts"
-
-/obj/item/clothing/under/space
- name = "NASA Jumpsuit"
- icon_state = "black"
- item_state = "bl_suit"
- color = "black"
- desc = "Has a NASA logo on it, made of space proofed materials."
- w_class = 4//bulky item
- gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.02
- heat_transfer_coefficient = 0.02
- protective_temperature = 1000
- flags = FPRINT | TABLEPASS | SUITSPACE
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
-
-/obj/item/clothing/under/spiderman
- name = "Deadpool Suit"
- desc = "A suit of Deadpool!"
- icon_state = "spiderman"
- item_state = "spiderman"
- color = "spiderman"
-
-/obj/item/clothing/under/rank/nursesuit
- desc = "A jumpsuit commonly worn by nursing staff in the medical department."
- name = "Nurse Suit"
- icon_state = "nursesuit"
- item_state = "nursesuit"
- color = "nursesuit"
- permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
-
-/obj/item/clothing/under/acj
- name = "Administrative Cybernetic Jumpsuit"
- icon_state = "syndicate"
- item_state = "bl_suit"
- color = "syndicate"
- desc = "A cybernetically enhanced jumpsuit used in administrative duties."
- gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
- heat_transfer_coefficient = 0.01
- protective_temperature = 100000
- flags = FPRINT | TABLEPASS | SUITSPACE
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+// UNDERS AND BY THAT, NATURALLY I MEAN UNIFORMS/JUMPSUITS
+
+/obj/item/clothing/under
+ icon = 'uniforms.dmi'
+ name = "under"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ protective_temperature = T0C + 50
+ heat_transfer_coefficient = 0.30
+ permeability_coefficient = 0.90
+ flags = FPRINT | TABLEPASS | ONESIZEFITSALL
+ var/has_sensor = 1//For the crew computer 2 = unable to change mode
+ var/sensor_mode = 0
+ /*
+ 1 = Report living/dead
+ 2 = Report detailed damages
+ 3 = Report location
+ */
+
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+// Colors
+
+/obj/item/clothing/under/chameleon
+//starts off as black
+ name = "Black Jumpsuit"
+ icon_state = "black"
+ item_state = "bl_suit"
+ color = "black"
+ desc = "A plain jumpsuit. It seems to have a small dial on the wrist."
+ origin_tech = "syndicate=3"
+ var/list/clothing_choices = list()
+
+/obj/item/clothing/under/chameleon/all
+
+/obj/item/clothing/under/color/black
+ name = "Black Jumpsuit"
+ icon_state = "black"
+ item_state = "bl_suit"
+ color = "black"
+
+/obj/item/clothing/under/color/blackf
+ name = "Female Black Jumpsuit"
+ desc = "This one is a lady-size!"
+ icon_state = "black"
+ item_state = "bl_suit"
+ color = "blackf"
+
+/obj/item/clothing/under/color/blue
+ name = "Blue Jumpsuit"
+ icon_state = "blue"
+ item_state = "b_suit"
+ color = "blue"
+
+/obj/item/clothing/under/color/green
+ name = "Green Jumpsuit"
+ icon_state = "green"
+ item_state = "g_suit"
+ color = "green"
+
+/obj/item/clothing/under/color/grey
+ name = "Grey Jumpsuit"
+ icon_state = "grey"
+ item_state = "gy_suit"
+ color = "grey"
+
+/obj/item/clothing/under/color/orange
+ name = "Orange Jumpsuit"
+ desc = "Standard Nanotrasen prisoner wear. Its suit sensors are stuck in the \"Fully On\" position."
+ icon_state = "orange"
+ item_state = "o_suit"
+ color = "orange"
+ has_sensor = 2
+ sensor_mode = 3
+
+/obj/item/clothing/under/color/pink
+ name = "Pink Jumpsuit"
+ icon_state = "pink"
+ item_state = "p_suit"
+ color = "pink"
+
+/obj/item/clothing/under/color/red
+ name = "Red Jumpsuit"
+ icon_state = "red"
+ item_state = "r_suit"
+ color = "red"
+
+/obj/item/clothing/under/color/white
+ desc = "Made of a special fiber that gives special protection against biohazards."
+ name = "White Jumpsuit"
+ icon_state = "white"
+ item_state = "w_suit"
+ color = "white"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/color/yellow
+ name = "Yellow Jumpsuit"
+ icon_state = "yellow"
+ item_state = "y_suit"
+ color = "yellow"
+
+// RANKS
+/obj/item/clothing/under/rank
+
+/obj/item/clothing/under/rank/atmospheric_technician
+ desc = "A jumpsuit used by atmospheric technicians."
+ name = "Atmospherics Jumpsuit"
+ icon_state = "atmos"
+ item_state = "atmos_suit"
+ color = "atmos"
+
+/obj/item/clothing/under/rank/captain
+ desc = "A blue jumpsuit with gold marking denoting the rank of \"Captain\"."
+ name = "Captain Jumpsuit"
+ icon_state = "captain"
+ item_state = "caparmor"
+ color = "captain"
+
+/obj/item/clothing/under/rank/chaplain
+ desc = "A black jumpsuit, worn by religious folk."
+ name = "Chaplain Jumpsuit"
+ icon_state = "chaplain"
+ item_state = "bl_suit"
+ color = "chapblack"
+
+/obj/item/clothing/under/rank/engineer
+ desc = "An orange high visibility jumpsuit. Used by Nanotrasen Engineers, has minor radiation shielding."
+ name = "Engineering Jumpsuit"
+ icon_state = "engine"
+ item_state = "engi_suit"
+ color = "engine"
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/under/rank/forensic_technician
+ desc = "It has a Forensics rank stripe on it."
+ name = "Forensics Jumpsuit"
+ icon_state = "darkred"
+ item_state = "r_suit"
+ color = "forensicsred"
+
+/obj/item/clothing/under/rank/warden
+ desc = "Made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. This one has the word \"Warden\" written on the shoulders."
+ name = "Warden Jumpsuit"
+ icon_state = "darkred"
+ item_state = "r_suit"
+ color = "darkred"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/rank/security
+ name = "Security Jumpsuit"
+ desc = "Made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection."
+ icon_state = "red"
+ item_state = "r_suit"
+ color = "red"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/rank/vice
+ name = "Vice officer Jumpsuit"
+ desc = "Your standard issue pretty-boy outfit, as seen on TV."
+ icon_state = "vice"
+ item_state = "gy_suit"
+ color = "vice"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/rank/geneticist
+ desc = "Made of a special fiber that gives special protection against biohazards. Has a genetics rank stripe on it."
+ name = "Genetics Jumpsuit"
+ icon_state = "genetics"
+ item_state = "w_suit"
+ color = "geneticswhite"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/chemist
+ desc = "Made of a special fiber that gives special protection against biohazards. Has a chemist rank stripe on it."
+ name = "Chemist Jumpsuit"
+ icon_state = "genetics"
+ item_state = "w_suit"
+ color = "geneticswhite"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/head_of_personnel
+ desc = "A jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
+ name = "Head of Personnel Jumpsuit"
+ icon_state = "hop"
+ item_state = "b_suit"
+ color = "hop"
+
+/obj/item/clothing/under/rank/centcom_officer
+ desc = "A jumpsuit worn by Centcom Officers."
+ name = "CentCom Officer Jumpsuit"
+ icon_state = "officer"
+ item_state = "g_suit"
+ color = "officer"
+
+/obj/item/clothing/under/rank/centcom_commander
+ desc = "A jumpsuit worn by Centcom's highest level Commanders."
+ name = "CentCom Officer Jumpsuit"
+ icon_state = "centcom"
+ item_state = "dg_suit"
+ color = "centcom"
+
+/obj/item/clothing/under/rank/miner
+ desc = "A snappy jumpsuit with a sturdy set of overalls. It is very dirty."
+ name = "Shaft Miner Jumpsuit"
+ icon_state = "miner"
+ item_state = "miner"
+ color = "miner"
+
+/obj/item/clothing/under/rank/roboticist
+ desc = "A slimming black with reinforced seams. Great for industrial work."
+ name = "Roboticist Jumpsuit"
+ icon_state = "robotics"
+ item_state = "robotics"
+ color = "robotics"
+
+/obj/item/clothing/under/rank/head_of_security
+ desc = "A jumpsuit worn by those few with the dedication to achieve the position of \"Head of Security\". Has slight armor to protect the wearer."
+ name = "Head of Security Jumpsuit"
+ icon_state = "hos"
+ item_state = "r_suit"
+ color = "hosred"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/rank/chief_engineer
+ desc = "A high visibility jumpsuit given to those engineers committed enough to their jobs to achieve the rank of \"Chief engineer\". Has minor radiation shielding."
+ name = "Chief Engineer Jumpsuit"
+ icon_state = "chiefengineer"
+ item_state = "g_suit"
+ color = "chief"
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/under/rank/research_director
+ desc = "A jumpsuit worn by those dedicated to all that is science and have achieved the position of \"Research Director\". Has minor biological anomaly protection."
+ name = "Research Director Jumpsuit"
+ icon_state = "director"
+ item_state = "g_suit"
+ color = "director"
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/janitor
+ desc = "Official clothing of the station's janitor. Has minor protection from biohazards."
+ name = "Janitor's Jumpsuit"
+ icon_state = "janitor"
+ color = "janitor"
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/scientist
+ desc = "Made of a special fiber that gives special protection against biohazards. Has markings denoting the wearer as a scientist."
+ name = "Scientist's Jumpsuit"
+ icon_state = "toxins"
+ item_state = "w_suit"
+ color = "toxinswhite"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
+
+/obj/item/clothing/under/rank/medical
+ desc = "Made of a special fiber that gives special protection against biohazards. Has a cross on the chest denoting that the wearer is trained medical personnel."
+ name = "Medical Doctor's Jumpsuit"
+ icon_state = "medical"
+ item_state = "w_suit"
+ color = "medical"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/chief_medical_officer
+ desc = "A jumpsuit worn by those with the dedication to the medical profession who have achieved the position of \"Chief Medical Officer\". Has minor biological protection."
+ name = "Chief Medical Officer's Jumpsuit"
+ icon_state = "medical"
+ item_state = "w_suit"
+ color = "medical"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/hydroponics
+ desc = "A jumpsuit designed to protect against minor plant-related hazards."
+ name = "Hydroponics Jumpsuit"
+ icon_state = "hydroponics"
+ item_state = "g_suit"
+ color = "hydroponics"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/cargo
+ name = "Quartermaster's Jumpsuit"
+ desc = "What can brown do for you?"
+ icon_state = "lightbrown"
+ item_state = "lb_suit"
+ color = "cargo"
+
+/obj/item/clothing/under/rank/cargotech
+ name = "Cargotech's Jumpsuit"
+ desc = "Shooooorts! They're comfy and easy to wear!"
+ icon_state = "cargotech"
+ item_state = "cargotech"
+ color = "cargotech"
+
+/obj/item/clothing/under/rank/mailman
+ name = "Mailman Jumpsuit"
+ desc = "Special delivery!"
+ icon_state = "mailman"
+ item_state = "b_suit"
+ color = "mailman"
+
+/obj/item/clothing/under/sexyclown
+ name = "Sexyclown suit"
+ desc = "What can I do for you?"
+ icon_state = "sexyclown"
+ item_state = "sexyclown"
+ color = "sexyclown"
+
+/obj/item/clothing/under/rank/bartender
+ desc = "It looks like it could use more flair."
+ name = "Bartender's Uniform"
+ icon_state = "ba_suit"
+ item_state = "ba_suit"
+ color = "ba_suit"
+
+/obj/item/clothing/under/rank/clown
+ name = "clown suit"
+ desc = "Wearing this, all the children love you, for all the wrong reasons."
+ icon_state = "clown"
+ item_state = "clown"
+ color = "clown"
+
+/obj/item/clothing/under/rank/chef
+ desc = "Issued only to the most hardcore chefs in space."
+ name = "Chef's Uniform"
+ icon_state = "chef"
+ color = "chef"
+
+/obj/item/clothing/under/rank/geneticist_new
+ desc = "Made of a special fiber that gives special protection against biohazards."
+ name = "Genetics Jumpsuit"
+ icon_state = "genetics_new"
+ item_state = "w_suit"
+ color = "genetics_new"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/chemist_new
+ desc = "Made of a special fiber that gives special protection against biohazards."
+ name = "Chemist Jumpsuit"
+ icon_state = "chemist_new"
+ item_state = "w_suit"
+ color = "chemist_new"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/scientist_new
+ desc = "Made of a special fiber that gives special protection against biohazards and small explosions."
+ name = "Scientist Jumpsuit"
+ icon_state = "scientist_new"
+ item_state = "w_suit"
+ color = "scientist_new"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
+
+/obj/item/clothing/under/rank/virologist_new
+ desc = "Made of a special fiber that gives increased protection against biohazards."
+ name = "Virologist Jumpsuit"
+ icon_state = "virologist_new"
+ item_state = "w_suit"
+ color = "virologist_new"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+
+// OTHER NONRANKED STATION JOBS
+/obj/item/clothing/under/det
+ name = "Hard worn suit"
+ desc = "Someone who wears this means business."
+ icon_state = "detective"
+ item_state = "det"
+ color = "detective"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/scratch
+ name = "White Suit"
+ desc = "A white suit, suitable for an excellent host"
+ flags = FPRINT | TABLEPASS
+ icon_state = "scratch"
+ item_state = "scratch"
+ color = "scratch"
+
+
+/obj/item/clothing/under/jensen
+ desc = "You never asked for anything this stylish."
+ name = "Head of Security Jumpsuit"
+ icon_state = "jensen"
+ item_state = "jensen"
+ color = "jensen"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/sl_suit
+ desc = "A very amish looking suit."
+ name = "Amish Suit"
+ icon_state = "sl_suit"
+ color = "sl_suit"
+
+/obj/item/clothing/under/syndicate
+ name = "Tactical Turtleneck"
+ desc = "Non-descript, slightly suspicious civilian clothing."
+ icon_state = "syndicate"
+ item_state = "bl_suit"
+ color = "syndicate"
+ has_sensor = 0
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/syndicate/tacticool
+ name = "Tacticool Turtleneck"
+ desc = "Wearing this makes you feel like buying an SKS, going into the woods, and operating."
+ icon_state = "tactifool"
+ item_state = "bl_suit"
+ color = "tactifool"
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/under/syndicate/combat
+ name = "Combat Turtleneck"
+
+/obj/item/clothing/under/librarian
+ name = "Sensible Suit"
+ desc = "It's very... sensible."
+ icon_state = "red_suit"
+ item_state = "red_suit"
+ color = "red_suit"
+
+/obj/item/clothing/under/mime
+ name = "Mime Outfit"
+ desc = "It's not very colourful."
+ icon_state = "mime"
+ item_state = "mime"
+ color = "mime"
+
+/obj/item/clothing/under/waiter
+ name = "Waiter Outfit"
+ desc = "There is a special pocket for tip."
+ icon_state = "waiter"
+ item_state = "waiter"
+ color = "waiter"
+
+
+// Athletic shorts.. heh
+/obj/item/clothing/under/shorts
+ name = "athletic shorts"
+ desc = "95% Polyester, 5% Spandex!"
+ flags = FPRINT | TABLEPASS
+ body_parts_covered = LOWER_TORSO
+
+/obj/item/clothing/under/shorts/red
+ icon_state = "redshorts"
+ color = "redshorts"
+
+/obj/item/clothing/under/shorts/green
+ icon_state = "greenshorts"
+ color = "greenshorts"
+
+/obj/item/clothing/under/shorts/blue
+ icon_state = "blueshorts"
+ color = "blueshorts"
+
+/obj/item/clothing/under/shorts/black
+ icon_state = "blackshorts"
+ color = "blackshorts"
+
+/obj/item/clothing/under/shorts/grey
+ icon_state = "greyshorts"
+ color = "greyshorts"
+
+/obj/item/clothing/under/space
+ name = "NASA Jumpsuit"
+ icon_state = "black"
+ item_state = "bl_suit"
+ color = "black"
+ desc = "Has a NASA logo on it, made of space proofed materials."
+ w_class = 4//bulky item
+ gas_transfer_coefficient = 0.01
+ permeability_coefficient = 0.02
+ heat_transfer_coefficient = 0.02
+ protective_temperature = 1000
+ flags = FPRINT | TABLEPASS | SUITSPACE
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+
+/obj/item/clothing/under/spiderman
+ name = "Deadpool Suit"
+ desc = "A suit of Deadpool!"
+ icon_state = "spiderman"
+ item_state = "spiderman"
+ color = "spiderman"
+
+/obj/item/clothing/under/rank/nursesuit
+ desc = "A jumpsuit commonly worn by nursing staff in the medical department."
+ name = "Nurse Suit"
+ icon_state = "nursesuit"
+ item_state = "nursesuit"
+ color = "nursesuit"
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/acj
+ name = "Administrative Cybernetic Jumpsuit"
+ icon_state = "syndicate"
+ item_state = "bl_suit"
+ color = "syndicate"
+ desc = "A cybernetically enhanced jumpsuit used in administrative duties."
+ gas_transfer_coefficient = 0.01
+ permeability_coefficient = 0.01
+ heat_transfer_coefficient = 0.01
+ protective_temperature = 100000
+ flags = FPRINT | TABLEPASS | SUITSPACE
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
\ No newline at end of file
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 44683711f0..7dee8f55de 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -1080,7 +1080,7 @@
/obj/item/weapon/cell/super
name = "super-capacity power cell"
- origin_tech = "powerstorage=3"
+ origin_tech = "powerstorage=5"
maxcharge = 20000
g_amt = 70
diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm
index 7a4d64d0c0..6d0a359a5b 100644
--- a/code/game/gamemodes/changeling/traitor_chan.dm
+++ b/code/game/gamemodes/changeling/traitor_chan.dm
@@ -1,37 +1,37 @@
-/datum/game_mode/traitor/changeling
- name = "traitor+changeling"
- config_tag = "traitorchan"
- traitors_possible = 3 //hard limit on traitors if scaling is turned off
- required_players = 20
- required_enemies = 2
-
-/datum/game_mode/traitor/changeling/announce()
- world << "The current game mode is - Traitor+Changeling!"
- world << "There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!"
-
-
-/datum/game_mode/traitor/changeling/pre_setup()
- var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
-
- for(var/datum/mind/player in possible_changelings)
- for(var/job in restricted_jobs)//Removing robots from the list
- if(player.assigned_role == job)
- possible_changelings -= player
-
- if(possible_changelings.len>0)
- var/datum/mind/changeling = pick(possible_changelings)
- //possible_changelings-=changeling
- changelings += changeling
- modePlayer += changelings
- return ..()
- else
- return 0
-
-/datum/game_mode/traitor/changeling/post_setup()
- for(var/datum/mind/changeling in changelings)
- grant_changeling_powers(changeling.current)
- changeling.special_role = "Changeling"
- forge_changeling_objectives(changeling)
- greet_changeling(changeling)
- ..()
+/datum/game_mode/traitor/changeling
+ name = "traitor+changeling"
+ config_tag = "traitorchan"
+ traitors_possible = 3 //hard limit on traitors if scaling is turned off
+ required_players = 20
+ required_enemies = 2
+
+/datum/game_mode/traitor/changeling/announce()
+ world << "The current game mode is - Traitor+Changeling!"
+ world << "There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!"
+
+
+/datum/game_mode/traitor/changeling/pre_setup()
+ var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
+
+ for(var/datum/mind/player in possible_changelings)
+ for(var/job in restricted_jobs)//Removing robots from the list
+ if(player.assigned_role == job)
+ possible_changelings -= player
+
+ if(possible_changelings.len>0)
+ var/datum/mind/changeling = pick(possible_changelings)
+ //possible_changelings-=changeling
+ changelings += changeling
+ modePlayer += changelings
+ return ..()
+ else
+ return 0
+
+/datum/game_mode/traitor/changeling/post_setup()
+ for(var/datum/mind/changeling in changelings)
+ grant_changeling_powers(changeling.current)
+ changeling.special_role = "Changeling"
+ forge_changeling_objectives(changeling)
+ greet_changeling(changeling)
+ ..()
return
\ No newline at end of file
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 71254becd0..44a49cf9f9 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -204,7 +204,7 @@ datum/objective/block
datum/objective/escape
- explanation_text = "Escape on the shuttle alive."
+ explanation_text = "Escape on the shuttle or an escape pod alive."
check_completion()
diff --git a/code/game/hud.dm b/code/game/hud.dm
index c7dadb4eed..24741b333e 100644
--- a/code/game/hud.dm
+++ b/code/game/hud.dm
@@ -1,113 +1,113 @@
-#define ui_dropbutton "SOUTH-1,7"
-#define ui_swapbutton "SOUTH-1,7"
-#define ui_iclothing "SOUTH-1,2"
-#define ui_oclothing "SOUTH,2"
-//#define ui_headset "SOUTH,8"
-#define ui_rhand "SOUTH,1"
-#define ui_lhand "SOUTH,3"
-#define ui_id "SOUTH-1,1"
-#define ui_mask "SOUTH+1,1"
-#define ui_back "SOUTH+1,3"
-#define ui_storage1 "SOUTH-1,4"
-#define ui_storage2 "SOUTH-1,5"
-#define ui_sstore1 "SOUTH+1,4"
-#define ui_hstore1 "SOUTH+1,5"
-#define ui_resist "EAST+1,SOUTH-1"
-#define ui_gloves "SOUTH,5"
-#define ui_glasses "SOUTH,7"
-#define ui_ears "SOUTH,6"
-#define ui_head "SOUTH+1,2"
-#define ui_shoes "SOUTH,4"
-#define ui_belt "SOUTH-1,3"
-#define ui_throw "SOUTH-1,8"
-#define ui_oxygen "EAST+1, NORTH-4"
-#define ui_pressure "EAST+1, NORTH-5"
-#define ui_toxin "EAST+1, NORTH-6"
-#define ui_internal "EAST+1, NORTH-2"
-#define ui_fire "EAST+1, NORTH-8"
-#define ui_temp "EAST+1, NORTH-10"
-#define ui_health "EAST+1, NORTH-11"
-#define ui_nutrition "EAST+1, NORTH-12"
-#define ui_pull "SOUTH-1,10"
-#define ui_hand "SOUTH-1,6"
-#define ui_sleep "EAST+1, NORTH-13"
-#define ui_rest "EAST+1, NORTH-14"
-
-#define ui_acti "SOUTH-1,12"
-#define ui_movi "SOUTH-1,14"
-
-#define ui_iarrowleft "SOUTH-1,11"
-#define ui_iarrowright "SOUTH-1,13"
-
-#define ui_inv1 "SOUTH-1,1"
-#define ui_inv2 "SOUTH-1,2"
-#define ui_inv3 "SOUTH-1,3"
-
-
-
-obj/hud/New(var/type = 0)
- instantiate(type)
- ..()
- return
-
-
-/obj/hud/proc/other_update()
-
- if(!mymob) return
- if(show_otherinventory)
- if(mymob:shoes) mymob:shoes:screen_loc = ui_shoes
- if(mymob:gloves) mymob:gloves:screen_loc = ui_gloves
- if(mymob:ears) mymob:ears:screen_loc = ui_ears
- if(mymob:s_store) mymob:s_store:screen_loc = ui_sstore1
- if(mymob:glasses) mymob:glasses:screen_loc = ui_glasses
- if(mymob:h_store) mymob:h_store:screen_loc = ui_hstore1
- else
- if(istype(mymob, /mob/living/carbon/human))
- if(mymob:shoes) mymob:shoes:screen_loc = null
- if(mymob:gloves) mymob:gloves:screen_loc = null
- if(mymob:ears) mymob:ears:screen_loc = null
- if(mymob:s_store) mymob:s_store:screen_loc = null
- if(mymob:glasses) mymob:glasses:screen_loc = null
- if(mymob:h_store) mymob:h_store:screen_loc = null
-
-
-/obj/hud/var/show_otherinventory = 1
-/obj/hud/var/obj/screen/action_intent
-/obj/hud/var/obj/screen/move_intent
-
-/obj/hud/proc/instantiate(var/type = 0)
-
- mymob = loc
- ASSERT(istype(mymob, /mob))
-
- if(ishuman(mymob))
- human_hud(mymob.UI) // Pass the player the UI style chosen in preferences
-
- else if(ismonkey(mymob))
- monkey_hud(mymob.UI)
-
- else if(isbrain(mymob))
- brain_hud(mymob.UI)
-
- else if(islarva(mymob))
- larva_hud()
-
- else if(isalien(mymob))
- alien_hud()
-
- else if(isAI(mymob))
- ai_hud()
-
- else if(isrobot(mymob))
- robot_hud()
-
-// else if(ishivebot(mymob))
-// hivebot_hud()
-
-// else if(ishivemainframe(mymob))
-// hive_mainframe_hud()
-
- else if(isobserver(mymob))
- ghost_hud()
-
- return
+#define ui_dropbutton "SOUTH-1,7"
+#define ui_swapbutton "SOUTH-1,7"
+#define ui_iclothing "SOUTH-1,2"
+#define ui_oclothing "SOUTH,2"
+//#define ui_headset "SOUTH,8"
+#define ui_rhand "SOUTH,1"
+#define ui_lhand "SOUTH,3"
+#define ui_id "SOUTH-1,1"
+#define ui_mask "SOUTH+1,1"
+#define ui_back "SOUTH+1,3"
+#define ui_storage1 "SOUTH-1,4"
+#define ui_storage2 "SOUTH-1,5"
+#define ui_sstore1 "SOUTH+1,4"
+#define ui_hstore1 "SOUTH+1,5"
+#define ui_resist "EAST+1,SOUTH-1"
+#define ui_gloves "SOUTH,5"
+#define ui_glasses "SOUTH,7"
+#define ui_ears "SOUTH,6"
+#define ui_head "SOUTH+1,2"
+#define ui_shoes "SOUTH,4"
+#define ui_belt "SOUTH-1,3"
+#define ui_throw "SOUTH-1,8"
+#define ui_oxygen "EAST+1, NORTH-4"
+#define ui_pressure "EAST+1, NORTH-5"
+#define ui_toxin "EAST+1, NORTH-6"
+#define ui_internal "EAST+1, NORTH-2"
+#define ui_fire "EAST+1, NORTH-8"
+#define ui_temp "EAST+1, NORTH-10"
+#define ui_health "EAST+1, NORTH-11"
+#define ui_nutrition "EAST+1, NORTH-12"
+#define ui_pull "SOUTH-1,10"
+#define ui_hand "SOUTH-1,6"
+#define ui_sleep "EAST+1, NORTH-13"
+#define ui_rest "EAST+1, NORTH-14"
+
+#define ui_acti "SOUTH-1,12"
+#define ui_movi "SOUTH-1,14"
+
+#define ui_iarrowleft "SOUTH-1,11"
+#define ui_iarrowright "SOUTH-1,13"
+
+#define ui_inv1 "SOUTH-1,1"
+#define ui_inv2 "SOUTH-1,2"
+#define ui_inv3 "SOUTH-1,3"
+
+
+
+obj/hud/New(var/type = 0)
+ instantiate(type)
+ ..()
+ return
+
+
+/obj/hud/proc/other_update()
+
+ if(!mymob) return
+ if(show_otherinventory)
+ if(mymob:shoes) mymob:shoes:screen_loc = ui_shoes
+ if(mymob:gloves) mymob:gloves:screen_loc = ui_gloves
+ if(mymob:ears) mymob:ears:screen_loc = ui_ears
+ if(mymob:s_store) mymob:s_store:screen_loc = ui_sstore1
+ if(mymob:glasses) mymob:glasses:screen_loc = ui_glasses
+ if(mymob:h_store) mymob:h_store:screen_loc = ui_hstore1
+ else
+ if(istype(mymob, /mob/living/carbon/human))
+ if(mymob:shoes) mymob:shoes:screen_loc = null
+ if(mymob:gloves) mymob:gloves:screen_loc = null
+ if(mymob:ears) mymob:ears:screen_loc = null
+ if(mymob:s_store) mymob:s_store:screen_loc = null
+ if(mymob:glasses) mymob:glasses:screen_loc = null
+ if(mymob:h_store) mymob:h_store:screen_loc = null
+
+
+/obj/hud/var/show_otherinventory = 1
+/obj/hud/var/obj/screen/action_intent
+/obj/hud/var/obj/screen/move_intent
+
+/obj/hud/proc/instantiate(var/type = 0)
+
+ mymob = loc
+ ASSERT(istype(mymob, /mob))
+
+ if(ishuman(mymob))
+ human_hud(mymob.UI) // Pass the player the UI style chosen in preferences
+
+ else if(ismonkey(mymob))
+ monkey_hud(mymob.UI)
+
+ else if(isbrain(mymob))
+ brain_hud(mymob.UI)
+
+ else if(islarva(mymob))
+ larva_hud()
+
+ else if(isalien(mymob))
+ alien_hud()
+
+ else if(isAI(mymob))
+ ai_hud()
+
+ else if(isrobot(mymob))
+ robot_hud()
+
+// else if(ishivebot(mymob))
+// hivebot_hud()
+
+// else if(ishivemainframe(mymob))
+// hive_mainframe_hud()
+
+ else if(isobserver(mymob))
+ ghost_hud()
+
+ return
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 0eb1dd3437..cbddc9c4fb 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -1,447 +1,447 @@
-obj/machinery/air_sensor
- icon = 'stationobjs.dmi'
- icon_state = "gsensor1"
- name = "Gas Sensor"
-
- anchored = 1
- var/state = 0
-
- var/id_tag
- var/frequency = 1439
-
- var/on = 1
- var/output = 3
- //Flags:
- // 1 for pressure
- // 2 for temperature
- // Output >= 4 includes gas composition
- // 4 for oxygen concentration
- // 8 for toxins concentration
- // 16 for nitrogen concentration
- // 32 for carbon dioxide concentration
-
- var/datum/radio_frequency/radio_connection
-
- update_icon()
- icon_state = "gsensor[on]"
-
- process()
- if(on)
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.data["tag"] = id_tag
- signal.data["timestamp"] = world.time
-
- var/datum/gas_mixture/air_sample = return_air()
-
- if(output&1)
- signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),)
- if(output&2)
- signal.data["temperature"] = round(air_sample.temperature,0.1)
-
- if(output>4)
- var/total_moles = air_sample.total_moles()
- if(total_moles > 0)
- if(output&4)
- signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1)
- if(output&8)
- signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1)
- if(output&16)
- signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1)
- if(output&32)
- signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1)
- else
- signal.data["oxygen"] = 0
- signal.data["toxins"] = 0
- signal.data["nitrogen"] = 0
- signal.data["carbon_dioxide"] = 0
- signal.data["sigtype"]="status"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
-
- proc
- set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
-
- initialize()
- set_frequency(frequency)
-
- New()
- ..()
-
- if(radio_controller)
- set_frequency(frequency)
-
-obj/machinery/computer/general_air_control
- icon = 'computer.dmi'
- icon_state = "computer_generic"
-
- name = "Computer"
-
- var/frequency = 1439
- var/list/sensors = list()
-
- var/list/sensor_information = list()
- var/datum/radio_frequency/radio_connection
-
- attack_hand(mob/user)
- user << browse(return_text(),"window=computer")
- user.machine = src
- onclose(user, "computer")
-
- process()
- ..()
-
- src.updateDialog()
-
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/air_management/M = new /obj/item/weapon/circuitboard/air_management( A )
- for (var/obj/C in src)
- C.loc = src.loc
- M.frequency = src.frequency
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/air_management/M = new /obj/item/weapon/circuitboard/air_management( A )
- for (var/obj/C in src)
- C.loc = src.loc
- M.frequency = src.frequency
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
- else
- src.attack_hand(user)
- return
-
- receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/id_tag = signal.data["tag"]
- if(!id_tag || !sensors.Find(id_tag)) return
-
- sensor_information[id_tag] = signal.data
-
- proc/return_text()
- var/sensor_data
- if(sensors.len)
- for(var/id_tag in sensors)
- var/long_name = sensors[id_tag]
- var/list/data = sensor_information[id_tag]
- var/sensor_part = "[long_name]:
"
-
- if(data)
- if(data["pressure"])
- sensor_part += " Pressure: [data["pressure"]] kPa
"
- if(data["temperature"])
- sensor_part += " Temperature: [data["temperature"]] K
"
- if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"])
- sensor_part += " Gas Composition :"
- if(data["oxygen"])
- sensor_part += "[data["oxygen"]]% O2; "
- if(data["nitrogen"])
- sensor_part += "[data["nitrogen"]]% N; "
- if(data["carbon_dioxide"])
- sensor_part += "[data["carbon_dioxide"]]% CO2; "
- if(data["toxins"])
- sensor_part += "[data["toxins"]]% TX; "
- sensor_part += "
"
-
- else
- sensor_part = "[long_name] can not be found!
"
-
- sensor_data += sensor_part
-
- else
- sensor_data = "No sensors connected."
-
- var/output = {"[name]
-Sensor Data:
[sensor_data]"}
-
- return output
-
- proc
- set_frequency(new_frequency)
- radio_controller.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
-
- initialize()
- set_frequency(frequency)
-
- large_tank_control
- icon = 'computer.dmi'
- icon_state = "tank"
-
- var/input_tag
- var/output_tag
-
- var/list/input_info
- var/list/output_info
-
- var/pressure_setting = ONE_ATMOSPHERE * 45
-
-
- return_text()
- var/output = ..()
- //if(signal.data)
- // input_info = signal.data // Attempting to fix intake control -- TLE
-
- output += "Tank Control System
"
- if(input_info)
- var/power = (input_info["power"])
- var/volume_rate = input_info["volume_rate"]
- output += {"Input: [power?("Injecting"):("On Hold")] Refresh
-Rate: [volume_rate] L/sec
"}
- output += "Command: Toggle Power
"
-
- else
- output += "ERROR: Can not find input port Search
"
-
- output += "
"
-
- if(output_info)
- var/power = (output_info["power"])
- var/output_pressure = output_info["internal"]
- output += {"Output: [power?("Open"):("On Hold")] Refresh
-Max Output Pressure: [output_pressure] kPa
"}
- output += "Command: Toggle Power Set Pressure
"
-
- else
- output += "ERROR: Can not find output port Search
"
-
- output += "Max Output Pressure Set: - - [pressure_setting] kPa + +
"
-
- return output
-
- receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/id_tag = signal.data["tag"]
-
- if(input_tag == id_tag)
- input_info = signal.data
- else if(output_tag == id_tag)
- output_info = signal.data
- else
- ..(signal)
-
- Topic(href, href_list)
- if(..())
- return
-
- if(href_list["adj_pressure"])
- var/change = text2num(href_list["adj_pressure"])
- pressure_setting = between(0, pressure_setting + change, 50*ONE_ATMOSPHERE)
- spawn(1)
- src.updateDialog()
- return
-
- if(!radio_connection)
- return 0
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- if(href_list["in_refresh_status"])
- input_info = null
- signal.data = list ("tag" = input_tag, "status")
-
- if(href_list["in_toggle_injector"])
- input_info = null
- signal.data = list ("tag" = input_tag, "power_toggle")
-
- if(href_list["out_refresh_status"])
- output_info = null
- signal.data = list ("tag" = output_tag, "status")
-
- if(href_list["out_toggle_power"])
- output_info = null
- signal.data = list ("tag" = output_tag, "power_toggle")
-
- if(href_list["out_set_pressure"])
- output_info = null
- signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]")
-
- signal.data["sigtype"]="command"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
- spawn(5)
- src.updateDialog()
-
- fuel_injection
- icon = 'computer.dmi'
- icon_state = "atmos"
-
- var/device_tag
- var/list/device_info
-
- var/automation = 0
-
- var/cutoff_temperature = 2000
- var/on_temperature = 1200
-
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/injector_control/M = new /obj/item/weapon/circuitboard/injector_control( A )
- for (var/obj/C in src)
- C.loc = src.loc
- M.frequency = src.frequency
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/injector_control/M = new /obj/item/weapon/circuitboard/injector_control( A )
- for (var/obj/C in src)
- C.loc = src.loc
- M.frequency = src.frequency
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
- else
- src.attack_hand(user)
- return
-
- process()
- if(automation)
- if(!radio_connection)
- return 0
-
- var/injecting = 0
- for(var/id_tag in sensor_information)
- var/list/data = sensor_information[id_tag]
- if(data["temperature"])
- if(data["temperature"] >= cutoff_temperature)
- injecting = 0
- break
- if(data["temperature"] <= on_temperature)
- injecting = 1
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
-
- signal.data = list(
- "tag" = device_tag,
- "power" = injecting,
- "sigtype"="command"
- )
-
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
- ..()
-
- return_text()
- var/output = ..()
-
- output += "Fuel Injection System
"
- if(device_info)
- var/power = device_info["power"]
- var/volume_rate = device_info["volume_rate"]
- output += {"Status: [power?("Injecting"):("On Hold")] Refresh
-Rate: [volume_rate] L/sec
"}
-
- if(automation)
- output += "Automated Fuel Injection: Engaged
"
- output += "Injector Controls Locked Out
"
- else
- output += "Automated Fuel Injection: Disengaged
"
- output += "Injector: Toggle Power Inject (1 Cycle)
"
-
- else
- output += "ERROR: Can not find device Search
"
-
- return output
-
- receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/id_tag = signal.data["tag"]
-
- if(device_tag == id_tag)
- device_info = signal.data
- else
- ..(signal)
-
- Topic(href, href_list)
- if(..())
- return
-
- if(href_list["refresh_status"])
- device_info = null
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data = list(
- "tag" = device_tag,
- "status",
- "sigtype"="command"
- )
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
- if(href_list["toggle_automation"])
- automation = !automation
-
- if(href_list["toggle_injector"])
- device_info = null
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data = list(
- "tag" = device_tag,
- "power_toggle",
- "sigtype"="command"
- )
-
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
- if(href_list["injection"])
- if(!radio_connection)
- return 0
-
- var/datum/signal/signal = new
- signal.transmission_method = 1 //radio signal
- signal.source = src
- signal.data = list(
- "tag" = device_tag,
- "inject",
- "sigtype"="command"
- )
-
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
-
-
-
-
+obj/machinery/air_sensor
+ icon = 'stationobjs.dmi'
+ icon_state = "gsensor1"
+ name = "Gas Sensor"
+
+ anchored = 1
+ var/state = 0
+
+ var/id_tag
+ var/frequency = 1439
+
+ var/on = 1
+ var/output = 3
+ //Flags:
+ // 1 for pressure
+ // 2 for temperature
+ // Output >= 4 includes gas composition
+ // 4 for oxygen concentration
+ // 8 for toxins concentration
+ // 16 for nitrogen concentration
+ // 32 for carbon dioxide concentration
+
+ var/datum/radio_frequency/radio_connection
+
+ update_icon()
+ icon_state = "gsensor[on]"
+
+ process()
+ if(on)
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.data["tag"] = id_tag
+ signal.data["timestamp"] = world.time
+
+ var/datum/gas_mixture/air_sample = return_air()
+
+ if(output&1)
+ signal.data["pressure"] = num2text(round(air_sample.return_pressure(),0.1),)
+ if(output&2)
+ signal.data["temperature"] = round(air_sample.temperature,0.1)
+
+ if(output>4)
+ var/total_moles = air_sample.total_moles()
+ if(total_moles > 0)
+ if(output&4)
+ signal.data["oxygen"] = round(100*air_sample.oxygen/total_moles,0.1)
+ if(output&8)
+ signal.data["toxins"] = round(100*air_sample.toxins/total_moles,0.1)
+ if(output&16)
+ signal.data["nitrogen"] = round(100*air_sample.nitrogen/total_moles,0.1)
+ if(output&32)
+ signal.data["carbon_dioxide"] = round(100*air_sample.carbon_dioxide/total_moles,0.1)
+ else
+ signal.data["oxygen"] = 0
+ signal.data["toxins"] = 0
+ signal.data["nitrogen"] = 0
+ signal.data["carbon_dioxide"] = 0
+ signal.data["sigtype"]="status"
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+
+ proc
+ set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
+
+ initialize()
+ set_frequency(frequency)
+
+ New()
+ ..()
+
+ if(radio_controller)
+ set_frequency(frequency)
+
+obj/machinery/computer/general_air_control
+ icon = 'computer.dmi'
+ icon_state = "computer_generic"
+
+ name = "Computer"
+
+ var/frequency = 1439
+ var/list/sensors = list()
+
+ var/list/sensor_information = list()
+ var/datum/radio_frequency/radio_connection
+
+ attack_hand(mob/user)
+ user << browse(return_text(),"window=computer")
+ user.machine = src
+ onclose(user, "computer")
+
+ process()
+ ..()
+
+ src.updateDialog()
+
+ attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ new /obj/item/weapon/shard( src.loc )
+ var/obj/item/weapon/circuitboard/air_management/M = new /obj/item/weapon/circuitboard/air_management( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ M.frequency = src.frequency
+ A.circuit = M
+ A.state = 3
+ A.icon_state = "3"
+ A.anchored = 1
+ del(src)
+ else
+ user << "\blue You disconnect the monitor."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/item/weapon/circuitboard/air_management/M = new /obj/item/weapon/circuitboard/air_management( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ M.frequency = src.frequency
+ A.circuit = M
+ A.state = 4
+ A.icon_state = "4"
+ A.anchored = 1
+ del(src)
+ else
+ src.attack_hand(user)
+ return
+
+ receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
+
+ var/id_tag = signal.data["tag"]
+ if(!id_tag || !sensors.Find(id_tag)) return
+
+ sensor_information[id_tag] = signal.data
+
+ proc/return_text()
+ var/sensor_data
+ if(sensors.len)
+ for(var/id_tag in sensors)
+ var/long_name = sensors[id_tag]
+ var/list/data = sensor_information[id_tag]
+ var/sensor_part = "[long_name]:
"
+
+ if(data)
+ if(data["pressure"])
+ sensor_part += " Pressure: [data["pressure"]] kPa
"
+ if(data["temperature"])
+ sensor_part += " Temperature: [data["temperature"]] K
"
+ if(data["oxygen"]||data["toxins"]||data["nitrogen"]||data["carbon_dioxide"])
+ sensor_part += " Gas Composition :"
+ if(data["oxygen"])
+ sensor_part += "[data["oxygen"]]% O2; "
+ if(data["nitrogen"])
+ sensor_part += "[data["nitrogen"]]% N; "
+ if(data["carbon_dioxide"])
+ sensor_part += "[data["carbon_dioxide"]]% CO2; "
+ if(data["toxins"])
+ sensor_part += "[data["toxins"]]% TX; "
+ sensor_part += "
"
+
+ else
+ sensor_part = "[long_name] can not be found!
"
+
+ sensor_data += sensor_part
+
+ else
+ sensor_data = "No sensors connected."
+
+ var/output = {"[name]
+Sensor Data:
[sensor_data]"}
+
+ return output
+
+ proc
+ set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
+
+ initialize()
+ set_frequency(frequency)
+
+ large_tank_control
+ icon = 'computer.dmi'
+ icon_state = "tank"
+
+ var/input_tag
+ var/output_tag
+
+ var/list/input_info
+ var/list/output_info
+
+ var/pressure_setting = ONE_ATMOSPHERE * 45
+
+
+ return_text()
+ var/output = ..()
+ //if(signal.data)
+ // input_info = signal.data // Attempting to fix intake control -- TLE
+
+ output += "Tank Control System
"
+ if(input_info)
+ var/power = (input_info["power"])
+ var/volume_rate = input_info["volume_rate"]
+ output += {"Input: [power?("Injecting"):("On Hold")] Refresh
+Rate: [volume_rate] L/sec
"}
+ output += "Command: Toggle Power
"
+
+ else
+ output += "ERROR: Can not find input port Search
"
+
+ output += "
"
+
+ if(output_info)
+ var/power = (output_info["power"])
+ var/output_pressure = output_info["internal"]
+ output += {"Output: [power?("Open"):("On Hold")] Refresh
+Max Output Pressure: [output_pressure] kPa
"}
+ output += "Command: Toggle Power Set Pressure
"
+
+ else
+ output += "ERROR: Can not find output port Search
"
+
+ output += "Max Output Pressure Set: - - [pressure_setting] kPa + +
"
+
+ return output
+
+ receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
+
+ var/id_tag = signal.data["tag"]
+
+ if(input_tag == id_tag)
+ input_info = signal.data
+ else if(output_tag == id_tag)
+ output_info = signal.data
+ else
+ ..(signal)
+
+ Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["adj_pressure"])
+ var/change = text2num(href_list["adj_pressure"])
+ pressure_setting = between(0, pressure_setting + change, 50*ONE_ATMOSPHERE)
+ spawn(1)
+ src.updateDialog()
+ return
+
+ if(!radio_connection)
+ return 0
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ if(href_list["in_refresh_status"])
+ input_info = null
+ signal.data = list ("tag" = input_tag, "status")
+
+ if(href_list["in_toggle_injector"])
+ input_info = null
+ signal.data = list ("tag" = input_tag, "power_toggle")
+
+ if(href_list["out_refresh_status"])
+ output_info = null
+ signal.data = list ("tag" = output_tag, "status")
+
+ if(href_list["out_toggle_power"])
+ output_info = null
+ signal.data = list ("tag" = output_tag, "power_toggle")
+
+ if(href_list["out_set_pressure"])
+ output_info = null
+ signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]")
+
+ signal.data["sigtype"]="command"
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+ spawn(5)
+ src.updateDialog()
+
+ fuel_injection
+ icon = 'computer.dmi'
+ icon_state = "atmos"
+
+ var/device_tag
+ var/list/device_info
+
+ var/automation = 0
+
+ var/cutoff_temperature = 2000
+ var/on_temperature = 1200
+
+ attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ new /obj/item/weapon/shard( src.loc )
+ var/obj/item/weapon/circuitboard/injector_control/M = new /obj/item/weapon/circuitboard/injector_control( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ M.frequency = src.frequency
+ A.circuit = M
+ A.state = 3
+ A.icon_state = "3"
+ A.anchored = 1
+ del(src)
+ else
+ user << "\blue You disconnect the monitor."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/item/weapon/circuitboard/injector_control/M = new /obj/item/weapon/circuitboard/injector_control( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ M.frequency = src.frequency
+ A.circuit = M
+ A.state = 4
+ A.icon_state = "4"
+ A.anchored = 1
+ del(src)
+ else
+ src.attack_hand(user)
+ return
+
+ process()
+ if(automation)
+ if(!radio_connection)
+ return 0
+
+ var/injecting = 0
+ for(var/id_tag in sensor_information)
+ var/list/data = sensor_information[id_tag]
+ if(data["temperature"])
+ if(data["temperature"] >= cutoff_temperature)
+ injecting = 0
+ break
+ if(data["temperature"] <= on_temperature)
+ injecting = 1
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+
+ signal.data = list(
+ "tag" = device_tag,
+ "power" = injecting,
+ "sigtype"="command"
+ )
+
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+ ..()
+
+ return_text()
+ var/output = ..()
+
+ output += "Fuel Injection System
"
+ if(device_info)
+ var/power = device_info["power"]
+ var/volume_rate = device_info["volume_rate"]
+ output += {"Status: [power?("Injecting"):("On Hold")] Refresh
+Rate: [volume_rate] L/sec
"}
+
+ if(automation)
+ output += "Automated Fuel Injection: Engaged
"
+ output += "Injector Controls Locked Out
"
+ else
+ output += "Automated Fuel Injection: Disengaged
"
+ output += "Injector: Toggle Power Inject (1 Cycle)
"
+
+ else
+ output += "ERROR: Can not find device Search
"
+
+ return output
+
+ receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
+
+ var/id_tag = signal.data["tag"]
+
+ if(device_tag == id_tag)
+ device_info = signal.data
+ else
+ ..(signal)
+
+ Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["refresh_status"])
+ device_info = null
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data = list(
+ "tag" = device_tag,
+ "status",
+ "sigtype"="command"
+ )
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+ if(href_list["toggle_automation"])
+ automation = !automation
+
+ if(href_list["toggle_injector"])
+ device_info = null
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data = list(
+ "tag" = device_tag,
+ "power_toggle",
+ "sigtype"="command"
+ )
+
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+ if(href_list["injection"])
+ if(!radio_connection)
+ return 0
+
+ var/datum/signal/signal = new
+ signal.transmission_method = 1 //radio signal
+ signal.source = src
+ signal.data = list(
+ "tag" = device_tag,
+ "inject",
+ "sigtype"="command"
+ )
+
+ radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+
+
+
+
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index a590640aaf..cec39215e6 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -11,6 +11,7 @@
volume = 750
stationary
+ name = "Stationary Air Scrubber"
icon_state = "scrubber:0"
anchored = 1
volume = 30000
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index eec60faf6f..784860b11a 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -560,6 +560,10 @@
process_bot()
sleep(2)
process_bot()
+ sleep(2)
+ process_bot()
+ sleep(2)
+ process_bot()
if(2)
process_bot()
spawn(4)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index dd496bbfb3..eabfdd003a 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -51,7 +51,7 @@
if(!charging || (stat & (BROKEN|NOPOWER)) )
return
- var/added = charging.give(50)
+ var/added = charging.give(500)
use_power(added / CELLRATE)
updateicon()
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index f4821d0e66..41b0484035 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -22,10 +22,10 @@
var/name_part1
var/name_part2
- name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Rape ", "Pwn ", "Own ")
+ name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ")
- name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Faggot ", "Duke ", "General ")
- name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "Metroid", "Griefer", "ERPer", "Homosexual", "Lizard Man", "Unicorn")
+ name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ")
+ name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "Metroid", "Griefer", "ERPer", "Lizard Man", "Unicorn")
src.enemy_name = dd_replacetext((name_part1 + name_part2), "the ", "")
src.name = (name_action + name_part1 + name_part2)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index e92df5603a..c70b696dd7 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -1,131 +1,131 @@
-/obj/machinery/computer
- name = "computer"
- icon = 'computer.dmi'
- density = 1
- anchored = 1.0
- var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassemble
-
-
- New()
- ..()
- spawn(2)
- power_change()
-
-
- meteorhit(var/obj/O as obj)
- for(var/x in verbs)
- verbs -= x
- set_broken()
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
- smoke.set_up(5, 0, src)
- smoke.start()
- return
-
-
- emp_act(severity)
- if(prob(20/severity)) set_broken()
- ..()
-
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(25))
- del(src)
- return
- if (prob(50))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- if(3.0)
- if (prob(25))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- else
- return
-
-
- blob_act()
- if (prob(75))
- for(var/x in verbs)
- verbs -= x
- set_broken()
- density = 0
-
-
- power_change()
- if(!istype(src,/obj/machinery/computer/security/telescreen))
- if(stat & BROKEN)
- icon_state = initial(icon_state)
- icon_state += "b"
- if (istype(src,/obj/machinery/computer/aifixer))
- overlays = null
-
- else if(powered())
- icon_state = initial(icon_state)
- stat &= ~NOPOWER
- if (istype(src,/obj/machinery/computer/aifixer))
- var/obj/machinery/computer/aifixer/O = src
- if (O.occupant)
- switch (O.occupant.stat)
- if (0)
- overlays += image('computer.dmi', "ai-fixer-full")
- if (2)
- overlays += image('computer.dmi', "ai-fixer-404")
- else
- overlays += image('computer.dmi', "ai-fixer-empty")
- else
- spawn(rand(0, 15))
- //icon_state = "c_unpowered"
- icon_state = initial(icon_state)
- icon_state += "0"
- stat |= NOPOWER
- if (istype(src,/obj/machinery/computer/aifixer))
- overlays = null
-
-
- process()
- if(stat & (NOPOWER|BROKEN))
- return
- use_power(250)
-
-
- proc/set_broken()
- icon_state = initial(icon_state)
- icon_state += "b"
- stat |= BROKEN
-
-
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/M = new circuit( A )
- A.circuit = M
- A.anchored = 1
- for (var/obj/C in src)
- C.loc = src.loc
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "\blue You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
- del(src)
- else
- src.attack_hand(user)
- return
-
-
-
-
-
-
+/obj/machinery/computer
+ name = "computer"
+ icon = 'computer.dmi'
+ density = 1
+ anchored = 1.0
+ var/obj/item/weapon/circuitboard/circuit = null //if circuit==null, computer can't disassemble
+
+
+ New()
+ ..()
+ spawn(2)
+ power_change()
+
+
+ meteorhit(var/obj/O as obj)
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ smoke.set_up(5, 0, src)
+ smoke.start()
+ return
+
+
+ emp_act(severity)
+ if(prob(20/severity)) set_broken()
+ ..()
+
+
+ ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
+ if (prob(25))
+ del(src)
+ return
+ if (prob(50))
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ if(3.0)
+ if (prob(25))
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ else
+ return
+
+
+ blob_act()
+ if (prob(75))
+ for(var/x in verbs)
+ verbs -= x
+ set_broken()
+ density = 0
+
+
+ power_change()
+ if(!istype(src,/obj/machinery/computer/security/telescreen))
+ if(stat & BROKEN)
+ icon_state = initial(icon_state)
+ icon_state += "b"
+ if (istype(src,/obj/machinery/computer/aifixer))
+ overlays = null
+
+ else if(powered())
+ icon_state = initial(icon_state)
+ stat &= ~NOPOWER
+ if (istype(src,/obj/machinery/computer/aifixer))
+ var/obj/machinery/computer/aifixer/O = src
+ if (O.occupant)
+ switch (O.occupant.stat)
+ if (0)
+ overlays += image('computer.dmi', "ai-fixer-full")
+ if (2)
+ overlays += image('computer.dmi', "ai-fixer-404")
+ else
+ overlays += image('computer.dmi', "ai-fixer-empty")
+ else
+ spawn(rand(0, 15))
+ //icon_state = "c_unpowered"
+ icon_state = initial(icon_state)
+ icon_state += "0"
+ stat |= NOPOWER
+ if (istype(src,/obj/machinery/computer/aifixer))
+ overlays = null
+
+
+ process()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ use_power(250)
+
+
+ proc/set_broken()
+ icon_state = initial(icon_state)
+ icon_state += "b"
+ stat |= BROKEN
+
+
+ attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.loc = src.loc
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ new /obj/item/weapon/shard( src.loc )
+ A.state = 3
+ A.icon_state = "3"
+ else
+ user << "\blue You disconnect the monitor."
+ A.state = 4
+ A.icon_state = "4"
+ del(src)
+ else
+ src.attack_hand(user)
+ return
+
+
+
+
+
+
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 10d4dca1db..15c175a5bf 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -126,7 +126,7 @@ to destroy them and players will be able to make replacements.
build_path = "/obj/machinery/r_n_d/destructive_analyzer"
board_type = "machine"
origin_tech = "magnets=2;engineering=2;programming=2"
- frame_desc = "Requires 2 Scanning Modules, 1 Manipulator, and 1 Micro-Laser."
+ frame_desc = "Requires 1 Scanning Module, 1 Manipulator, and 1 Micro-Laser."
req_components = list(
"/obj/item/weapon/stock_parts/scanning_module" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index bfb5c85678..d362a2cab7 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -1,72 +1,72 @@
-obj/machinery/recharger
- anchored = 1.0
- icon = 'stationobjs.dmi'
- icon_state = "recharger0"
- name = "recharger"
- use_power = 1
- idle_power_usage = 4
- active_power_usage = 250
-
- var
- obj/item/weapon/gun/energy/charging = null
- obj/item/weapon/melee/baton/charging2 = null
-
-/obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
- if (src.charging || src.charging2)
- return
- if (istype(G, /obj/item/weapon/gun/energy))
- if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow))
- user << "Your gun's recharge port was removed to make room for a miniaturized reactor."
- return
- if (istype(G, /obj/item/weapon/gun/energy/staff))
- user << "It's a wooden staff, not a gun!"
- return
- user.drop_item()
- G.loc = src
- src.charging = G
- use_power = 2
- if (istype(G, /obj/item/weapon/melee/baton))
- user.drop_item()
- G.loc = src
- src.charging2 = G
- use_power = 2
-
-/obj/machinery/recharger/attack_hand(mob/user as mob)
- src.add_fingerprint(user)
- if(ishuman(user))
- if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
- call(/obj/item/clothing/gloves/space_ninja/proc/drain)("MACHINERY",src,user:wear_suit)
- return
-
- if (src.charging)
- src.charging.update_icon()
- src.charging.loc = src.loc
- src.charging = null
- use_power = 1
- if(src.charging2)
- src.charging2.update_icon()
- src.charging2.loc = src.loc
- src.charging2 = null
- use_power = 1
-
-/obj/machinery/recharger/attack_paw(mob/user as mob)
- if ((ticker && ticker.mode.name == "monkey"))
- return src.attack_hand(user)
-
-/obj/machinery/recharger/process()
- if ((src.charging) && ! (stat & NOPOWER) )
- if (src.charging.power_supply.charge < src.charging.power_supply.maxcharge)
- src.charging.power_supply.give(100)
- src.icon_state = "recharger1"
- use_power(250)
- else
- src.icon_state = "recharger2"
- if ((src.charging2) && ! (stat & NOPOWER) )
- if (src.charging2.charges < src.charging2.maximum_charges)
- src.charging2.charges++
- src.icon_state = "recharger1"
- use_power(250)
- else
- src.icon_state = "recharger2"
- else if (!(src.charging || src.charging2))
- src.icon_state = "recharger0"
+obj/machinery/recharger
+ anchored = 1.0
+ icon = 'stationobjs.dmi'
+ icon_state = "recharger0"
+ name = "recharger"
+ use_power = 1
+ idle_power_usage = 4
+ active_power_usage = 250
+
+ var
+ obj/item/weapon/gun/energy/charging = null
+ obj/item/weapon/melee/baton/charging2 = null
+
+/obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
+ if (src.charging || src.charging2)
+ return
+ if (istype(G, /obj/item/weapon/gun/energy))
+ if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow))
+ user << "Your gun's recharge port was removed to make room for a miniaturized reactor."
+ return
+ if (istype(G, /obj/item/weapon/gun/energy/staff))
+ user << "It's a wooden staff, not a gun!"
+ return
+ user.drop_item()
+ G.loc = src
+ src.charging = G
+ use_power = 2
+ if (istype(G, /obj/item/weapon/melee/baton))
+ user.drop_item()
+ G.loc = src
+ src.charging2 = G
+ use_power = 2
+
+/obj/machinery/recharger/attack_hand(mob/user as mob)
+ src.add_fingerprint(user)
+ if(ishuman(user))
+ if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining)
+ call(/obj/item/clothing/gloves/space_ninja/proc/drain)("MACHINERY",src,user:wear_suit)
+ return
+
+ if (src.charging)
+ src.charging.update_icon()
+ src.charging.loc = src.loc
+ src.charging = null
+ use_power = 1
+ if(src.charging2)
+ src.charging2.update_icon()
+ src.charging2.loc = src.loc
+ src.charging2 = null
+ use_power = 1
+
+/obj/machinery/recharger/attack_paw(mob/user as mob)
+ if ((ticker && ticker.mode.name == "monkey"))
+ return src.attack_hand(user)
+
+/obj/machinery/recharger/process()
+ if ((src.charging) && ! (stat & NOPOWER) )
+ if (src.charging.power_supply.charge < src.charging.power_supply.maxcharge)
+ src.charging.power_supply.give(100)
+ src.icon_state = "recharger1"
+ use_power(250)
+ else
+ src.icon_state = "recharger2"
+ if ((src.charging2) && ! (stat & NOPOWER) )
+ if (src.charging2.charges < src.charging2.maximum_charges)
+ src.charging2.charges++
+ src.icon_state = "recharger1"
+ use_power(250)
+ else
+ src.icon_state = "recharger2"
+ else if (!(src.charging || src.charging2))
+ src.icon_state = "recharger0"
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 629725132c..a46e1efec7 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -1,196 +1,196 @@
-/obj/machinery/space_heater
- anchored = 0
- density = 1
- icon = 'atmos.dmi'
- icon_state = "sheater0"
- name = "space heater"
- desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
- var/obj/item/weapon/cell/cell
- var/on = 0
- var/open = 0
- var/set_temperature = 50 // in celcius, add T0C for kelvin
- var/heating_power = 40000
-
- flags = FPRINT
-
-
- New()
- ..()
- cell = new(src)
- cell.charge = 1000
- cell.maxcharge = 1000
- update_icon()
- return
-
- update_icon()
- if(open)
- icon_state = "sheater-open"
- else
- icon_state = "sheater[on]"
- return
-
- examine()
- set src in oview(12)
- if (!( usr ))
- return
- usr << "This is \icon[src] \an [src.name]."
- usr << src.desc
-
- usr << "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"]."
- if(open)
- usr << "The power cell is [cell ? "installed" : "missing"]."
- else
- usr << "The charge meter reads [cell ? round(cell.percent(),1) : 0]%"
- return
-
-
- attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/weapon/cell))
- if(open)
- if(cell)
- user << "There is already a power cell inside."
- return
- else
- // insert cell
- var/obj/item/weapon/cell/C = usr.equipped()
- if(istype(C))
- user.drop_item()
- cell = C
- C.loc = src
- C.add_fingerprint(usr)
-
- user.visible_message("\blue [user] inserts a power cell into [src].", "\blue You insert the power cell into [src].")
- else
- user << "The hatch must be open to insert a power cell."
- return
- else if(istype(I, /obj/item/weapon/screwdriver))
- open = !open
- user.visible_message("\blue [user] [open ? "opens" : "closes"] the hatch on the [src].", "\blue You [open ? "open" : "close"] the hatch on the [src].")
- update_icon()
- if(!open && user.machine == src)
- user << browse(null, "window=spaceheater")
- user.machine = null
- else
- ..()
- return
-
- attack_hand(mob/user as mob)
- src.add_fingerprint(user)
- if(open)
-
- var/dat
- dat = "Power cell: "
- if(cell)
- dat += "Installed
"
- else
- dat += "Removed
"
-
- dat += "Power Level: [cell ? round(cell.percent(),1) : 0]%
"
-
- dat += "Set Temperature: "
-
- dat += "-"
-
- dat += " [set_temperature]°C "
- dat += "+
"
-
- user.machine = src
- user << browse("Space Heater Control Panel[dat]", "window=spaceheater")
- onclose(user, "spaceheater")
-
-
-
-
- else
- on = !on
- user.visible_message("\blue [user] switches [on ? "on" : "off"] the [src].","\blue You switch [on ? "on" : "off"] the [src].")
- update_icon()
- return
-
-
- Topic(href, href_list)
- if (usr.stat)
- return
- if ((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
- usr.machine = src
-
- switch(href_list["op"])
-
- if("temp")
- var/value = text2num(href_list["val"])
-
- // limit to 20-90 degC
- set_temperature = dd_range(20, 90, set_temperature + value)
-
- if("cellremove")
- if(open && cell && !usr.equipped())
- cell.loc = usr
- cell.layer = 20
- if(usr.hand)
- usr.l_hand = cell
- else
- usr.r_hand = cell
-
- cell.add_fingerprint(usr)
- cell.updateicon()
- cell = null
-
- usr.visible_message("\blue [usr] removes the power cell from \the [src].", "\blue You remove the power cell from \the [src].")
-
-
- if("cellinstall")
- if(open && !cell)
- var/obj/item/weapon/cell/C = usr.equipped()
- if(istype(C))
- usr.drop_item()
- cell = C
- C.loc = src
- C.add_fingerprint(usr)
-
- usr.visible_message("\blue [usr] inserts a power cell into \the [src].", "\blue You insert the power cell into \the [src].")
-
- updateDialog()
- else
- usr << browse(null, "window=spaceheater")
- usr.machine = null
- return
-
-
-
- process()
- if(on)
- if(cell && cell.charge > 0)
-
- var/turf/simulated/L = loc
- if(istype(L))
- var/datum/gas_mixture/env = L.return_air()
- if(env.temperature < (set_temperature+T0C))
-
- var/transfer_moles = 0.25 * env.total_moles()
-
- var/datum/gas_mixture/removed = env.remove(transfer_moles)
-
- //world << "got [transfer_moles] moles at [removed.temperature]"
-
- if(removed)
-
- var/heat_capacity = removed.heat_capacity()
- //world << "heating ([heat_capacity])"
- if(heat_capacity == 0 || heat_capacity == null) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE
- heat_capacity = 1
- removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE
- cell.use(heating_power/20000)
-
- //world << "now at [removed.temperature]"
-
- env.merge(removed)
-
- //world << "turf now at [env.temperature]"
-
-
- else
- on = 0
- update_icon()
-
-
+/obj/machinery/space_heater
+ anchored = 0
+ density = 1
+ icon = 'atmos.dmi'
+ icon_state = "sheater0"
+ name = "space heater"
+ desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
+ var/obj/item/weapon/cell/cell
+ var/on = 0
+ var/open = 0
+ var/set_temperature = 50 // in celcius, add T0C for kelvin
+ var/heating_power = 40000
+
+ flags = FPRINT
+
+
+ New()
+ ..()
+ cell = new(src)
+ cell.charge = 1000
+ cell.maxcharge = 1000
+ update_icon()
+ return
+
+ update_icon()
+ if(open)
+ icon_state = "sheater-open"
+ else
+ icon_state = "sheater[on]"
+ return
+
+ examine()
+ set src in oview(12)
+ if (!( usr ))
+ return
+ usr << "This is \icon[src] \an [src.name]."
+ usr << src.desc
+
+ usr << "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"]."
+ if(open)
+ usr << "The power cell is [cell ? "installed" : "missing"]."
+ else
+ usr << "The charge meter reads [cell ? round(cell.percent(),1) : 0]%"
+ return
+
+
+ attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/cell))
+ if(open)
+ if(cell)
+ user << "There is already a power cell inside."
+ return
+ else
+ // insert cell
+ var/obj/item/weapon/cell/C = usr.equipped()
+ if(istype(C))
+ user.drop_item()
+ cell = C
+ C.loc = src
+ C.add_fingerprint(usr)
+
+ user.visible_message("\blue [user] inserts a power cell into [src].", "\blue You insert the power cell into [src].")
+ else
+ user << "The hatch must be open to insert a power cell."
+ return
+ else if(istype(I, /obj/item/weapon/screwdriver))
+ open = !open
+ user.visible_message("\blue [user] [open ? "opens" : "closes"] the hatch on the [src].", "\blue You [open ? "open" : "close"] the hatch on the [src].")
+ update_icon()
+ if(!open && user.machine == src)
+ user << browse(null, "window=spaceheater")
+ user.machine = null
+ else
+ ..()
+ return
+
+ attack_hand(mob/user as mob)
+ src.add_fingerprint(user)
+ if(open)
+
+ var/dat
+ dat = "Power cell: "
+ if(cell)
+ dat += "Installed
"
+ else
+ dat += "Removed
"
+
+ dat += "Power Level: [cell ? round(cell.percent(),1) : 0]%
"
+
+ dat += "Set Temperature: "
+
+ dat += "-"
+
+ dat += " [set_temperature]°C "
+ dat += "+
"
+
+ user.machine = src
+ user << browse("Space Heater Control Panel[dat]", "window=spaceheater")
+ onclose(user, "spaceheater")
+
+
+
+
+ else
+ on = !on
+ user.visible_message("\blue [user] switches [on ? "on" : "off"] the [src].","\blue You switch [on ? "on" : "off"] the [src].")
+ update_icon()
+ return
+
+
+ Topic(href, href_list)
+ if (usr.stat)
+ return
+ if ((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
+ usr.machine = src
+
+ switch(href_list["op"])
+
+ if("temp")
+ var/value = text2num(href_list["val"])
+
+ // limit to 20-90 degC
+ set_temperature = dd_range(20, 90, set_temperature + value)
+
+ if("cellremove")
+ if(open && cell && !usr.equipped())
+ cell.loc = usr
+ cell.layer = 20
+ if(usr.hand)
+ usr.l_hand = cell
+ else
+ usr.r_hand = cell
+
+ cell.add_fingerprint(usr)
+ cell.updateicon()
+ cell = null
+
+ usr.visible_message("\blue [usr] removes the power cell from \the [src].", "\blue You remove the power cell from \the [src].")
+
+
+ if("cellinstall")
+ if(open && !cell)
+ var/obj/item/weapon/cell/C = usr.equipped()
+ if(istype(C))
+ usr.drop_item()
+ cell = C
+ C.loc = src
+ C.add_fingerprint(usr)
+
+ usr.visible_message("\blue [usr] inserts a power cell into \the [src].", "\blue You insert the power cell into \the [src].")
+
+ updateDialog()
+ else
+ usr << browse(null, "window=spaceheater")
+ usr.machine = null
+ return
+
+
+
+ process()
+ if(on)
+ if(cell && cell.charge > 0)
+
+ var/turf/simulated/L = loc
+ if(istype(L))
+ var/datum/gas_mixture/env = L.return_air()
+ if(env.temperature < (set_temperature+T0C))
+
+ var/transfer_moles = 0.25 * env.total_moles()
+
+ var/datum/gas_mixture/removed = env.remove(transfer_moles)
+
+ //world << "got [transfer_moles] moles at [removed.temperature]"
+
+ if(removed)
+
+ var/heat_capacity = removed.heat_capacity()
+ //world << "heating ([heat_capacity])"
+ if(heat_capacity == 0 || heat_capacity == null) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE
+ heat_capacity = 1
+ removed.temperature = min((removed.temperature*heat_capacity + heating_power)/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE
+ cell.use(heating_power/20000)
+
+ //world << "now at [removed.temperature]"
+
+ env.merge(removed)
+
+ //world << "turf now at [env.temperature]"
+
+
+ else
+ on = 0
+ update_icon()
+
+
return
\ No newline at end of file
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index bb2bbc23dd..658ea97ce6 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -5,6 +5,9 @@
They receive their message from a server after the message has been logged.
*/
+var
+ list/recentmessages = list() // global list of recent messages broadcasted : used to circumvent massive radio spam
+
/obj/machinery/telecomms/broadcaster
name = "Subspace Broadcaster"
@@ -19,11 +22,17 @@
heatgen = 60
delay = 7
circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster"
+
receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
-
if(signal.data["message"])
+ // Kind of lame way to prevent MASSIVE RADIO SPAM but it works
+ if("[signal.data["message"]]:[signal.data["realname"]]" in recentmessages)
+ return
+ recentmessages.Add( "[signal.data["message"]]:[signal.data["realname"]]" )
+
+
signal.data["done"] = 1 // mark the signal as being broadcasted
// Search for the original signal and mark it as done as well
@@ -44,6 +53,9 @@
/* --- Do a snazzy animation! --- */
flick("broadcaster_send", src)
+ spawn(1)
+ recentmessages = list()
+
/*
Basically just an empty shell for receiving and broadcasting radio messages. Not
@@ -68,38 +80,36 @@
if(!on) // has to be on to receive messages
return
- if(signal.transmission_method == 2)
+ if(is_freq_listening(signal)) // detect subspace signals
- if(is_freq_listening(signal)) // detect subspace signals
+ signal.data["done"] = 1 // mark the signal as being broadcasted
+ signal.data["compression"] = 0
- signal.data["done"] = 1 // mark the signal as being broadcasted
- signal.data["compression"] = 0
+ // Search for the original signal and mark it as done as well
+ var/datum/signal/original = signal.data["original"]
+ if(original)
+ original.data["done"] = 1
- // Search for the original signal and mark it as done as well
- var/datum/signal/original = signal.data["original"]
- if(original)
- original.data["done"] = 1
+ if(signal.data["slow"] > 0)
+ sleep(signal.data["slow"]) // simulate the network lag if necessary
- if(signal.data["slow"] > 0)
- sleep(signal.data["slow"]) // simulate the network lag if necessary
+ /* ###### Broadcast a message using signal.data ###### */
- /* ###### Broadcast a message using signal.data ###### */
+ var/datum/radio_frequency/connection = signal.data["connection"]
- var/datum/radio_frequency/connection = signal.data["connection"]
-
- if(connection.frequency == SYND_FREQ) // if syndicate broadcast, just
+ if(connection.frequency == SYND_FREQ) // if syndicate broadcast, just
+ 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"],, signal.data["compression"])
+ else
+ if(intercept)
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"],, signal.data["compression"])
- else
- if(intercept)
- 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"], 3, signal.data["compression"])
+ signal.data["vmask"], signal.data["vmessage"],
+ signal.data["radio"], signal.data["message"],
+ signal.data["name"], signal.data["job"],
+ signal.data["realname"], signal.data["vname"], 3, signal.data["compression"])
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index ce10bf54ac..417ecdde3c 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -77,6 +77,9 @@
newpath = text2path(I)
var/obj/item/s = new newpath
s.loc = user.loc
+ if(istype(P, /obj/item/weapon/cable_coil))
+ var/obj/item/weapon/cable_coil/A = P
+ A.amount = 1
// Drop a circuit board too
C.loc = user.loc
@@ -113,13 +116,16 @@
dat += "
Network: [network]"
dat += "
Prefabrication: [autolinkers.len ? "TRUE" : "FALSE"]"
dat += "
Linked Network Entities: "
+
+ var/i = 0
for(var/obj/machinery/telecomms/T in links)
- dat += "- \ref[T] [T.name] ([T.id])
"
+ i++
+ dat += "- \ref[T] [T.name] ([T.id]) \[X\]
"
dat += "
"
dat += "
Filtering Frequencies: "
- var/i = 0
+ i = 0
if(length(freq_listening))
for(var/x in freq_listening)
i++
@@ -197,6 +203,16 @@
temp = "-% Removed frequency filter [x] %-"
freq_listening.Remove(x)
+ if(href_list["unlink"])
+
+ var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])]
+ temp = "-% Removed \ref[T] [T.name] from linked entities. %-"
+
+ // Remove link entries from both T and src.
+ if(src in T.links)
+ T.links.Remove(src)
+ links.Remove(T)
+
if(href_list["link"])
if(P.buffer)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 8e33bebe72..cdb3f55899 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -1,314 +1,314 @@
-/obj/machinery/computer/teleporter
- name = "Teleporter"
- desc = "Used to control a linked teleportation Hub and Station."
- icon_state = "teleport"
- circuit = "/obj/item/weapon/circuitboard/teleporter"
- var/obj/item/locked = null
- var/id = null
-
-/obj/machinery/computer/teleporter/New()
- src.id = text("[]", rand(1000, 9999))
- ..()
- return
-
-/obj/machinery/computer/teleporter/attackby(I as obj, user as mob)
- if (istype(I, /obj/item/weapon/card/data/))
- var/obj/item/weapon/card/data/M = I
- if(stat & (NOPOWER|BROKEN) & (M.function != "teleporter"))
- src.attack_hand()
-
- var/obj/S = null
- for(var/obj/effect/landmark/sloc in world)
- if (sloc.name != M.data)
- continue
- if (locate(/mob) in sloc.loc)
- continue
- S = sloc
- break
- if (!S)
- S = locate("landmark*[M.data]") // use old stype
- if (istype(S, /obj/effect/landmark/) && istype(S.loc, /turf))
- usr.loc = S.loc
- del(I)
- return
- else
- ..()
- return
-
-/obj/machinery/computer/teleporter/attack_paw()
- src.attack_hand()
-
-/obj/machinery/computer/teleporter/security/attackby(obj/item/weapon/W)
- src.attack_hand()
-
-/obj/machinery/computer/teleporter/security/attack_paw()
- src.attack_hand()
-
-/obj/machinery/teleport/station/attack_ai()
- src.attack_hand()
-
-/obj/machinery/computer/teleporter/attack_hand()
- if(stat & (NOPOWER|BROKEN))
- return
-
- var/list/L = list()
- var/list/areaindex = list()
-
- for(var/obj/item/device/radio/beacon/R in world)
- var/turf/T = get_turf(R)
- if (!T) continue
- if(T.z == 2) continue
- var/tmpname = T.loc.name
- if(areaindex[tmpname])
- tmpname = "[tmpname] ([++areaindex[tmpname]])"
- else
- areaindex[tmpname] = 1
- L[tmpname] = R
-
- for (var/obj/item/weapon/implant/tracking/I in world)
- if (!I.implanted || !ismob(I.loc))
- continue
- else
- var/mob/M = I.loc
- if (M.stat == 2)
- if (M.timeofdeath + 6000 < world.time)
- continue
- var/turf/T = get_turf(M)
- if(T) continue
- if(T.z == 2) continue
- var/tmpname = M.real_name
- if(areaindex[tmpname])
- tmpname = "[tmpname] ([++areaindex[tmpname]])"
- else
- areaindex[tmpname] = 1
- L[tmpname] = I
-
- var/desc = input("Please select a location to lock in.", "Locking Computer") in L
- src.locked = L[desc]
- for(var/mob/O in hearers(src, null))
- O.show_message("\blue Locked In", 2)
- src.add_fingerprint(usr)
- return
-
-/obj/machinery/computer/teleporter/verb/set_id(t as text)
- set category = "Object"
- set name = "Set teleporter ID"
- set src in oview(1)
- set desc = "ID Tag:"
-
- if(stat & (NOPOWER|BROKEN) || !istype(usr,/mob/living))
- return
- if (t)
- src.id = t
- return
-
-/proc/find_loc(obj/R as obj)
- if (!R) return null
- var/turf/T = R.loc
- while(!istype(T, /turf))
- T = T.loc
- if(!T || istype(T, /area)) return null
- return T
-
-/obj/machinery/teleport/hub/Bumped(M as mob|obj)
- spawn()
- if (src.icon_state == "tele1")
- teleport(M)
- use_power(5000)
- return
-
-/obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj)
- var/atom/l = src.loc
- var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(l.x - 2, l.y, l.z))
- if (!com)
- return
- if (!com.locked)
- for(var/mob/O in hearers(src, null))
- O.show_message("\red Failure: Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.")
- return
- if (istype(M, /atom/movable))
- if(prob(5) && !accurate) //oh dear a problem, put em in deep space
- do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy - 5), 3), 2)
- else
- do_teleport(M, com.locked) //dead-on precision
- else
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- for(var/mob/B in hearers(src, null))
- B.show_message("\blue Test fire completed.")
- return
-/*
-/proc/do_teleport(atom/movable/M as mob|obj, atom/destination, precision)
- if(istype(M, /obj/effect))
- del(M)
- return
- if (istype(M, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red The [] bounces off of the portal!", M.name), 1)
- return
- if (istype(M, /mob/living))
- var/mob/living/MM = M
- if(MM.check_contents_for(/obj/item/weapon/disk/nuclear))
- MM << "\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through."
- return
- var/disky = 0
- for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite
- if (istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift))
- for (var/obj/OO in O.contents)
- if (istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift))
- for (var/obj/OOO in OO.contents)
- if (istype(OOO, /obj/item/weapon/disk/nuclear))
- disky = 1
- if (istype(OO, /obj/item/weapon/disk/nuclear))
- disky = 1
- if (istype(O, /obj/item/weapon/disk/nuclear))
- disky = 1
- if (istype(O, /mob/living))
- var/mob/living/MM = O
- if(MM.check_contents_for(/obj/item/weapon/disk/nuclear))
- disky = 1
- if (disky)
- for(var/mob/P in viewers(M, null))
- P.show_message(text("\red The [] bounces off of the portal!", M.name), 1)
- return
-
-//Bags of Holding cause bluespace teleportation to go funky. --NeoFite
- if (istype(M, /mob/living))
- var/mob/living/MM = M
- if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding))
- MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!"
- precision = rand(1,100)
- if (istype(M, /obj/item/weapon/storage/backpack/holding))
- precision = rand(1,100)
- for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite
- if (istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift))
- for (var/obj/OO in O.contents)
- if (istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift))
- for (var/obj/OOO in OO.contents)
- if (istype(OOO, /obj/item/weapon/storage/backpack/holding))
- precision = rand(1,100)
- if (istype(OO, /obj/item/weapon/storage/backpack/holding))
- precision = rand(1,100)
- if (istype(O, /obj/item/weapon/storage/backpack/holding))
- precision = rand(1,100)
- if (istype(O, /mob/living))
- var/mob/living/MM = O
- if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding))
- precision = rand(1,100)
-
-
- var/turf/destturf = get_turf(destination)
-
- var/tx = destturf.x + rand(precision * -1, precision)
- var/ty = destturf.y + rand(precision * -1, precision)
-
- var/tmploc
-
- if (ismob(destination.loc)) //If this is an implant.
- tmploc = locate(tx, ty, destturf.z)
- else
- tmploc = locate(tx, ty, destination.z)
-
- if(tx == destturf.x && ty == destturf.y && (istype(destination.loc, /obj/structure/closet) || istype(destination.loc, /obj/structure/closet/secure_closet)))
- tmploc = destination.loc
-
- if(tmploc==null)
- return
-
- M.loc = tmploc
- sleep(2)
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, M)
- s.start()
- return
-*/
-/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W)
- src.attack_hand()
-
-/obj/machinery/teleport/station/attack_paw()
- src.attack_hand()
-
-/obj/machinery/teleport/station/attack_ai()
- src.attack_hand()
-
-/obj/machinery/teleport/station/attack_hand()
- if(engaged)
- src.disengage()
- else
- src.engage()
-
-/obj/machinery/teleport/station/proc/engage()
- if(stat & (BROKEN|NOPOWER))
- return
-
- var/atom/l = src.loc
- var/atom/com = locate(/obj/machinery/teleport/hub, locate(l.x + 1, l.y, l.z))
- if (com)
- com.icon_state = "tele1"
- use_power(5000)
- for(var/mob/O in hearers(src, null))
- O.show_message("\blue Teleporter engaged!", 2)
- src.add_fingerprint(usr)
- src.engaged = 1
- return
-
-/obj/machinery/teleport/station/proc/disengage()
- if(stat & (BROKEN|NOPOWER))
- return
-
- var/atom/l = src.loc
- var/atom/com = locate(/obj/machinery/teleport/hub, locate(l.x + 1, l.y, l.z))
- if (com)
- com.icon_state = "tele0"
- for(var/mob/O in hearers(src, null))
- O.show_message("\blue Teleporter disengaged!", 2)
- src.add_fingerprint(usr)
- src.engaged = 0
- return
-
-/obj/machinery/teleport/station/verb/testfire()
- set name = "Test Fire Teleporter"
- set category = "Object"
- set src in oview(1)
-
- if(stat & (BROKEN|NOPOWER) || !istype(usr,/mob/living))
- return
-
- var/atom/l = src.loc
- var/obj/machinery/teleport/hub/com = locate(/obj/machinery/teleport/hub, locate(l.x + 1, l.y, l.z))
- if (com && !active)
- active = 1
- for(var/mob/O in hearers(src, null))
- O.show_message("\blue Test firing!", 2)
- com.teleport()
- use_power(5000)
-
- spawn(30)
- active=0
-
- src.add_fingerprint(usr)
- return
-
-/obj/machinery/teleport/station/power_change()
- ..()
- if(stat & NOPOWER)
- icon_state = "controller-p"
- var/obj/machinery/teleport/hub/com = locate(/obj/machinery/teleport/hub, locate(x + 1, y, z))
- if(com)
- com.icon_state = "tele0"
- else
- icon_state = "controller"
-
-
-/obj/effect/laser/Bump()
- src.range--
- return
-
-/obj/effect/laser/Move()
- src.range--
- return
-
-/atom/proc/laserhit(L as obj)
- return 1
+/obj/machinery/computer/teleporter
+ name = "Teleporter"
+ desc = "Used to control a linked teleportation Hub and Station."
+ icon_state = "teleport"
+ circuit = "/obj/item/weapon/circuitboard/teleporter"
+ var/obj/item/locked = null
+ var/id = null
+
+/obj/machinery/computer/teleporter/New()
+ src.id = text("[]", rand(1000, 9999))
+ ..()
+ return
+
+/obj/machinery/computer/teleporter/attackby(I as obj, user as mob)
+ if (istype(I, /obj/item/weapon/card/data/))
+ var/obj/item/weapon/card/data/M = I
+ if(stat & (NOPOWER|BROKEN) & (M.function != "teleporter"))
+ src.attack_hand()
+
+ var/obj/S = null
+ for(var/obj/effect/landmark/sloc in world)
+ if (sloc.name != M.data)
+ continue
+ if (locate(/mob) in sloc.loc)
+ continue
+ S = sloc
+ break
+ if (!S)
+ S = locate("landmark*[M.data]") // use old stype
+ if (istype(S, /obj/effect/landmark/) && istype(S.loc, /turf))
+ usr.loc = S.loc
+ del(I)
+ return
+ else
+ ..()
+ return
+
+/obj/machinery/computer/teleporter/attack_paw()
+ src.attack_hand()
+
+/obj/machinery/computer/teleporter/security/attackby(obj/item/weapon/W)
+ src.attack_hand()
+
+/obj/machinery/computer/teleporter/security/attack_paw()
+ src.attack_hand()
+
+/obj/machinery/teleport/station/attack_ai()
+ src.attack_hand()
+
+/obj/machinery/computer/teleporter/attack_hand()
+ if(stat & (NOPOWER|BROKEN))
+ return
+
+ var/list/L = list()
+ var/list/areaindex = list()
+
+ for(var/obj/item/device/radio/beacon/R in world)
+ var/turf/T = get_turf(R)
+ if (!T) continue
+ if(T.z == 2) continue
+ var/tmpname = T.loc.name
+ if(areaindex[tmpname])
+ tmpname = "[tmpname] ([++areaindex[tmpname]])"
+ else
+ areaindex[tmpname] = 1
+ L[tmpname] = R
+
+ for (var/obj/item/weapon/implant/tracking/I in world)
+ if (!I.implanted || !ismob(I.loc))
+ continue
+ else
+ var/mob/M = I.loc
+ if (M.stat == 2)
+ if (M.timeofdeath + 6000 < world.time)
+ continue
+ var/turf/T = get_turf(M)
+ if(T) continue
+ if(T.z == 2) continue
+ var/tmpname = M.real_name
+ if(areaindex[tmpname])
+ tmpname = "[tmpname] ([++areaindex[tmpname]])"
+ else
+ areaindex[tmpname] = 1
+ L[tmpname] = I
+
+ var/desc = input("Please select a location to lock in.", "Locking Computer") in L
+ src.locked = L[desc]
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\blue Locked In", 2)
+ src.add_fingerprint(usr)
+ return
+
+/obj/machinery/computer/teleporter/verb/set_id(t as text)
+ set category = "Object"
+ set name = "Set teleporter ID"
+ set src in oview(1)
+ set desc = "ID Tag:"
+
+ if(stat & (NOPOWER|BROKEN) || !istype(usr,/mob/living))
+ return
+ if (t)
+ src.id = t
+ return
+
+/proc/find_loc(obj/R as obj)
+ if (!R) return null
+ var/turf/T = R.loc
+ while(!istype(T, /turf))
+ T = T.loc
+ if(!T || istype(T, /area)) return null
+ return T
+
+/obj/machinery/teleport/hub/Bumped(M as mob|obj)
+ spawn()
+ if (src.icon_state == "tele1")
+ teleport(M)
+ use_power(5000)
+ return
+
+/obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj)
+ var/atom/l = src.loc
+ var/obj/machinery/computer/teleporter/com = locate(/obj/machinery/computer/teleporter, locate(l.x - 2, l.y, l.z))
+ if (!com)
+ return
+ if (!com.locked)
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\red Failure: Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.")
+ return
+ if (istype(M, /atom/movable))
+ if(prob(5) && !accurate) //oh dear a problem, put em in deep space
+ do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy - 5), 3), 2)
+ else
+ do_teleport(M, com.locked) //dead-on precision
+ else
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ for(var/mob/B in hearers(src, null))
+ B.show_message("\blue Test fire completed.")
+ return
+/*
+/proc/do_teleport(atom/movable/M as mob|obj, atom/destination, precision)
+ if(istype(M, /obj/effect))
+ del(M)
+ return
+ if (istype(M, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red The [] bounces off of the portal!", M.name), 1)
+ return
+ if (istype(M, /mob/living))
+ var/mob/living/MM = M
+ if(MM.check_contents_for(/obj/item/weapon/disk/nuclear))
+ MM << "\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through."
+ return
+ var/disky = 0
+ for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite
+ if (istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift))
+ for (var/obj/OO in O.contents)
+ if (istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift))
+ for (var/obj/OOO in OO.contents)
+ if (istype(OOO, /obj/item/weapon/disk/nuclear))
+ disky = 1
+ if (istype(OO, /obj/item/weapon/disk/nuclear))
+ disky = 1
+ if (istype(O, /obj/item/weapon/disk/nuclear))
+ disky = 1
+ if (istype(O, /mob/living))
+ var/mob/living/MM = O
+ if(MM.check_contents_for(/obj/item/weapon/disk/nuclear))
+ disky = 1
+ if (disky)
+ for(var/mob/P in viewers(M, null))
+ P.show_message(text("\red The [] bounces off of the portal!", M.name), 1)
+ return
+
+//Bags of Holding cause bluespace teleportation to go funky. --NeoFite
+ if (istype(M, /mob/living))
+ var/mob/living/MM = M
+ if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding))
+ MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!"
+ precision = rand(1,100)
+ if (istype(M, /obj/item/weapon/storage/backpack/holding))
+ precision = rand(1,100)
+ for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite
+ if (istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift))
+ for (var/obj/OO in O.contents)
+ if (istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift))
+ for (var/obj/OOO in OO.contents)
+ if (istype(OOO, /obj/item/weapon/storage/backpack/holding))
+ precision = rand(1,100)
+ if (istype(OO, /obj/item/weapon/storage/backpack/holding))
+ precision = rand(1,100)
+ if (istype(O, /obj/item/weapon/storage/backpack/holding))
+ precision = rand(1,100)
+ if (istype(O, /mob/living))
+ var/mob/living/MM = O
+ if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding))
+ precision = rand(1,100)
+
+
+ var/turf/destturf = get_turf(destination)
+
+ var/tx = destturf.x + rand(precision * -1, precision)
+ var/ty = destturf.y + rand(precision * -1, precision)
+
+ var/tmploc
+
+ if (ismob(destination.loc)) //If this is an implant.
+ tmploc = locate(tx, ty, destturf.z)
+ else
+ tmploc = locate(tx, ty, destination.z)
+
+ if(tx == destturf.x && ty == destturf.y && (istype(destination.loc, /obj/structure/closet) || istype(destination.loc, /obj/structure/closet/secure_closet)))
+ tmploc = destination.loc
+
+ if(tmploc==null)
+ return
+
+ M.loc = tmploc
+ sleep(2)
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, M)
+ s.start()
+ return
+*/
+/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W)
+ src.attack_hand()
+
+/obj/machinery/teleport/station/attack_paw()
+ src.attack_hand()
+
+/obj/machinery/teleport/station/attack_ai()
+ src.attack_hand()
+
+/obj/machinery/teleport/station/attack_hand()
+ if(engaged)
+ src.disengage()
+ else
+ src.engage()
+
+/obj/machinery/teleport/station/proc/engage()
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ var/atom/l = src.loc
+ var/atom/com = locate(/obj/machinery/teleport/hub, locate(l.x + 1, l.y, l.z))
+ if (com)
+ com.icon_state = "tele1"
+ use_power(5000)
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\blue Teleporter engaged!", 2)
+ src.add_fingerprint(usr)
+ src.engaged = 1
+ return
+
+/obj/machinery/teleport/station/proc/disengage()
+ if(stat & (BROKEN|NOPOWER))
+ return
+
+ var/atom/l = src.loc
+ var/atom/com = locate(/obj/machinery/teleport/hub, locate(l.x + 1, l.y, l.z))
+ if (com)
+ com.icon_state = "tele0"
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\blue Teleporter disengaged!", 2)
+ src.add_fingerprint(usr)
+ src.engaged = 0
+ return
+
+/obj/machinery/teleport/station/verb/testfire()
+ set name = "Test Fire Teleporter"
+ set category = "Object"
+ set src in oview(1)
+
+ if(stat & (BROKEN|NOPOWER) || !istype(usr,/mob/living))
+ return
+
+ var/atom/l = src.loc
+ var/obj/machinery/teleport/hub/com = locate(/obj/machinery/teleport/hub, locate(l.x + 1, l.y, l.z))
+ if (com && !active)
+ active = 1
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\blue Test firing!", 2)
+ com.teleport()
+ use_power(5000)
+
+ spawn(30)
+ active=0
+
+ src.add_fingerprint(usr)
+ return
+
+/obj/machinery/teleport/station/power_change()
+ ..()
+ if(stat & NOPOWER)
+ icon_state = "controller-p"
+ var/obj/machinery/teleport/hub/com = locate(/obj/machinery/teleport/hub, locate(x + 1, y, z))
+ if(com)
+ com.icon_state = "tele0"
+ else
+ icon_state = "controller"
+
+
+/obj/effect/laser/Bump()
+ src.range--
+ return
+
+/obj/effect/laser/Move()
+ src.range--
+ return
+
+/atom/proc/laserhit(L as obj)
+ return 1
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 13d4b4eeef..3a77bca8df 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -105,6 +105,14 @@
return 1
return 0
+/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
+ name = "Diamond Drill"
+ desc = "This is an upgraded version of the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)"
+ icon_state = "mecha_diamond_drill"
+ origin_tech = "materials=4;engineering=3"
+ construction_cost = list("metal"=10000,"diamond"=6500)
+ equip_cooldown = 20
+ force = 15
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher
name = "Extinguisher"
@@ -1543,3 +1551,69 @@
return 1
*/
+
+//This is pretty much just for the death-ripley so that it is harmless
+/obj/item/mecha_parts/mecha_equipment/tool/safety_clamp
+ name = "KILL CLAMP"
+ icon_state = "mecha_clamp"
+ equip_cooldown = 15
+ energy_drain = 0
+ var/dam_force = 0
+ var/obj/mecha/working/ripley/cargo_holder
+
+ can_attach(obj/mecha/working/ripley/M as obj)
+ if(..())
+ if(istype(M))
+ return 1
+ return 0
+
+ attach(obj/mecha/M as obj)
+ ..()
+ cargo_holder = M
+ return
+
+ action(atom/target)
+ if(!action_checks(target)) return
+ if(!cargo_holder) return
+ if(istype(target,/obj))
+ var/obj/O = target
+ if(!O.anchored)
+ if(cargo_holder.cargo.len < cargo_holder.cargo_capacity)
+ chassis.occupant_message("You lift [target] and start to load it into cargo compartment.")
+ chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.")
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ O.anchored = 1
+ var/T = chassis.loc
+ if(do_after_cooldown(target))
+ if(T == chassis.loc && src == chassis.selected)
+ cargo_holder.cargo += O
+ O.loc = chassis
+ O.anchored = 0
+ chassis.occupant_message("[target] succesfully loaded.")
+ chassis.log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
+ else
+ chassis.occupant_message("You must hold still while handling objects.")
+ O.anchored = initial(O.anchored)
+ else
+ chassis.occupant_message("Not enough room in cargo compartment.")
+ else
+ chassis.occupant_message("[target] is firmly secured.")
+
+ else if(istype(target,/mob/living))
+ var/mob/living/M = target
+ if(M.stat>1) return
+ if(chassis.occupant.a_intent == "hurt")
+ chassis.occupant_message("\red You obliterate [target] with [src.name], leaving blood and guts everywhere.")
+ chassis.visible_message("\red [chassis] destroys [target] in an unholy fury.")
+ if(chassis.occupant.a_intent == "disarm")
+ chassis.occupant_message("\red You tear [target]'s limbs off with [src.name].")
+ chassis.visible_message("\red [chassis] rips [target]'s arms off.")
+ else
+ step_away(M,chassis)
+ chassis.occupant_message("You smash into [target], sending them flying.")
+ chassis.visible_message("[chassis] tosses [target] like a piece of paper.")
+ set_ready_state(0)
+ chassis.use_power(energy_drain)
+ do_after_cooldown()
+ return 1
\ No newline at end of file
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index ad2dcca0c1..626629b07b 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -94,6 +94,7 @@
/obj/item/mecha_parts/part/honker_right_leg
),
"Exosuit Equipment"=list(
+ /obj/item/mecha_parts/chassis/firefighter,
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,
@@ -111,9 +112,17 @@
"Misc"=list(/obj/item/mecha_tracking)
)
-
New()
..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/mechfab(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
+ RefreshParts()
+
for(var/part_set in part_sets)
convert_part_set(part_set)
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 deafcabed3..c349a39d16 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -559,10 +559,29 @@
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
return
-//TODO
-/obj/mecha/blob_act()
+/*Will fix later -Sieve
+/obj/mecha/attack_blob(mob/user as mob)
+ src.log_message("Attack by blob. Attacker - [user].",1)
+ if(!prob(src.deflect_chance))
+ src.take_damage(6)
+ src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
+ playsound(src.loc, 'blobattack.ogg', 50, 1, -1)
+ user << "\red You smash at the armored suit!"
+ for (var/mob/V in viewers(src))
+ if(V.client && !(V.blinded))
+ V.show_message("\red The [user] smashes against [src.name]'s armor!", 1)
+ else
+ src.log_append_to_last("Armor saved.")
+ playsound(src.loc, 'blobattack.ogg', 50, 1, -1)
+ user << "\green Your attack had no effect!"
+ src.occupant_message("\blue The [user]'s attack is stopped by the armor.")
+ for (var/mob/V in viewers(src))
+ if(V.client && !(V.blinded))
+ V.show_message("\blue The [user] rebounds off the [src.name] armor!", 1)
return
+*/
+//TODO
/obj/mecha/meteorhit()
return ex_act(rand(1,3))//should do for now
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 8039cf0c9a..27237d4a25 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -12,6 +12,9 @@
else if(istype(used_atom, /obj/item/weapon/wrench))
playsound(holder, 'Ratchet.ogg', 50, 1)
+ else if(istype(used_atom, /obj/item/weapon/screwdriver))
+ playsound(holder, 'Screwdriver.ogg', 50, 1)
+
else if(istype(used_atom, /obj/item/weapon/wirecutters))
playsound(holder, 'Wirecutter.ogg', 50, 1)
@@ -22,6 +25,7 @@
return 0
else
C.use(4)
+ playsound(holder, 'Deconstruct.ogg', 50, 1)
else if(istype(used_atom, /obj/item/stack))
var/obj/item/stack/S = used_atom
if(S.amount < 5)
@@ -41,6 +45,9 @@
else if(istype(used_atom, /obj/item/weapon/wrench))
playsound(holder, 'Ratchet.ogg', 50, 1)
+ else if(istype(used_atom, /obj/item/weapon/screwdriver))
+ playsound(holder, 'Screwdriver.ogg', 50, 1)
+
else if(istype(used_atom, /obj/item/weapon/wirecutters))
playsound(holder, 'Wirecutter.ogg', 50, 1)
@@ -51,6 +58,7 @@
return 0
else
C.use(4)
+ playsound(holder, 'Deconstruct.ogg', 50, 1)
else if(istype(used_atom, /obj/item/stack))
var/obj/item/stack/S = used_atom
if(S.amount < 5)
@@ -477,11 +485,12 @@
/datum/construction/mecha/firefighter_chassis
- steps = list(list("key"=/obj/item/mecha_parts/part/firefighter_torso),//1
- list("key"=/obj/item/mecha_parts/part/firefighter_left_arm),//2
- list("key"=/obj/item/mecha_parts/part/firefighter_right_arm),//3
- list("key"=/obj/item/mecha_parts/part/firefighter_left_leg),//4
- list("key"=/obj/item/mecha_parts/part/firefighter_right_leg)//5
+ steps = list(list("key"=/obj/item/mecha_parts/part/ripley_torso),//1
+ list("key"=/obj/item/mecha_parts/part/ripley_left_arm),//2
+ list("key"=/obj/item/mecha_parts/part/ripley_right_arm),//3
+ list("key"=/obj/item/mecha_parts/part/ripley_left_leg),//4
+ list("key"=/obj/item/mecha_parts/part/ripley_right_leg),//5
+ list("key"=/obj/item/clothing/suit/fire)//6
)
custom_action(step, atom/used_atom, mob/user)
@@ -495,7 +504,7 @@
spawn_result()
var/obj/item/mecha_parts/chassis/const_holder = holder
- const_holder.construct = new /datum/construction/mecha/firefighter(const_holder)
+ const_holder.construct = new /datum/construction/reversible/mecha/firefighter(const_holder)
const_holder.density = 1
spawn()
del src
@@ -503,64 +512,165 @@
return
-/datum/construction/mecha/firefighter
- result = "/obj/mecha/working/firefighter"
- steps = list(list("key"=/obj/item/weapon/weldingtool),//1
- list("key"=/obj/item/weapon/wrench),//2
- list("key"=/obj/item/stack/sheet/plasteel),//3
- list("key"=/obj/item/weapon/weldingtool),//4
- list("key"=/obj/item/weapon/wrench),//5
- list("key"=/obj/item/stack/sheet/metal),//6
- list("key"=/obj/item/weapon/screwdriver),//7
- list("key"=/obj/item/weapon/circuitboard/mecha/firefighter/peripherals),//8
- list("key"=/obj/item/weapon/screwdriver),//9
- list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main),//10
- list("key"=/obj/item/weapon/wirecutters),//11
- list("key"=/obj/item/weapon/cable_coil),//12
- list("key"=/obj/item/weapon/screwdriver),//13
- list("key"=/obj/item/weapon/wrench)//14
+/datum/construction/reversible/mecha/firefighter
+ result = "/obj/mecha/working/ripley/firefighter"
+ steps = list(
+ //1
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=/obj/item/weapon/wrench,
+ "desc"="External armor is wrenched."),
+ //2
+ list("key"=/obj/item/weapon/wrench,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="External armor is installed."),
+ //3
+ list("key"=/obj/item/stack/sheet/plasteel,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="External armor is being installed."),
+ //4
+ list("key"=/obj/item/stack/sheet/plasteel,
+ "backkey"=/obj/item/weapon/weldingtool,
+ "desc"="Internal armor is welded."),
+ //5
+ list("key"=/obj/item/weapon/weldingtool,
+ "backkey"=/obj/item/weapon/wrench,
+ "desc"="Internal armor is wrenched"),
+ //6
+ list("key"=/obj/item/weapon/wrench,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="Internal armor is installed"),
+
+ //7
+ list("key"=/obj/item/stack/sheet/plasteel,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="Peripherals control module is secured"),
+ //8
+ list("key"=/obj/item/weapon/screwdriver,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="Peripherals control module is installed"),
+ //9
+ list("key"=/obj/item/weapon/circuitboard/mecha/ripley/peripherals,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="Central control module is secured"),
+ //10
+ list("key"=/obj/item/weapon/screwdriver,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="Central control module is installed"),
+ //11
+ list("key"=/obj/item/weapon/circuitboard/mecha/ripley/main,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="The wiring is adjusted"),
+ //12
+ list("key"=/obj/item/weapon/wirecutters,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="The wiring is added"),
+ //13
+ list("key"=/obj/item/weapon/cable_coil,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="The hydraulic systems are active."),
+ //14
+ list("key"=/obj/item/weapon/screwdriver,
+ "backkey"=/obj/item/weapon/wrench,
+ "desc"="The hydraulic systems are connected."),
+ //15
+ list("key"=/obj/item/weapon/wrench,
+ "desc"="The hydraulic systems are disconnected.")
)
action(atom/used_atom,mob/user as mob)
return check_step(used_atom,user)
-
- custom_action(step, atom/used_atom, mob/user)
+ custom_action(index, diff, atom/used_atom, mob/user)
if(!..())
return 0
//TODO: better messages.
- switch(step)
- if(14)
+ switch(index)
+ if(15)
user.visible_message("[user] connects [holder] hydraulic systems", "You connect [holder] hydraulic systems.")
+ if(14)
+ if(diff==FORWARD)
+ user.visible_message("[user] activates [holder] hydraulic systems.", "You activate [holder] hydraulic systems.")
+ else
+ user.visible_message("[user] disconnects [holder] hydraulic systems", "You disconnect [holder] hydraulic systems.")
if(13)
- user.visible_message("[user] adjusts [holder] hydraulic systems.", "You adjust [holder] hydraulic systems.")
+ if(diff==FORWARD)
+ user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ else
+ user.visible_message("[user] deactivates [holder] hydraulic systems.", "You deactivate [holder] hydraulic systems.")
if(12)
- user.visible_message("[user] adds the wiring to [holder].", "You add the wiring to [holder].")
+ if(diff==FORWARD)
+ user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ else
+ user.visible_message("[user] removes the wiring from [holder].", "You remove the wiring from [holder].")
+ var/obj/item/weapon/cable_coil/coil = new /obj/item/weapon/cable_coil(get_turf(holder))
+ coil.amount = 4
if(11)
- user.visible_message("[user] adjusts the wiring of [holder].", "You adjust the wiring of [holder].")
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
+ del used_atom
+ else
+ user.visible_message("[user] disconnects the wiring of [holder].", "You disconnect the wiring of [holder].")
if(10)
- user.visible_message("[user] installs the central control module into [holder].", "You install the central computer mainboard into [holder].")
- del used_atom
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ else
+ user.visible_message("[user] removes the central control module from [holder].", "You remove the central computer mainboard from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/ripley/main(get_turf(holder))
if(9)
- user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
+ if(diff==FORWARD)
+ user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
+ del used_atom
+ else
+ user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
if(8)
- user.visible_message("[user] installs the peripherals control module into [holder].", "You install the peripherals control module into [holder].")
- del used_atom
+ if(diff==FORWARD)
+ user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ else
+ user.visible_message("[user] removes the peripherals control module from [holder].", "You remove the peripherals control module from [holder].")
+ new /obj/item/weapon/circuitboard/mecha/ripley/peripherals(get_turf(holder))
if(7)
- user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
+ if(diff==FORWARD)
+ user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
+
if(6)
- user.visible_message("[user] installs internal armor layer to [holder].", "You install internal armor layer to [holder].")
+ if(diff==FORWARD)
+ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ else
+ user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
+ var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ MS.amount = 5
if(5)
- user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.")
+ if(diff==FORWARD)
+ user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the internal armor layer.", "You unfasten the internal armor layer.")
if(4)
- user.visible_message("[user] welds internal armor layer to [holder].", "You weld the internal armor layer to [holder].")
+ if(diff==FORWARD)
+ user.visible_message("[user] starts to install the external armor layer to [holder].", "You start to install the external armor layer to [holder].")
+ else
+ user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].")
if(3)
- user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
+ if(diff==FORWARD)
+ user.visible_message("[user] installs external reinforced armor layer to [holder].", "You install external reinforced armor layer to [holder].")
+ else
+ user.visible_message("[user] removes the external armor from [holder].", "You remove the external armor from [holder].")
+ var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ MS.amount = 5
if(2)
- user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
+ if(diff==FORWARD)
+ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
+ else
+ user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
+ var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ MS.amount = 5
if(1)
- user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
+ if(diff==FORWARD)
+ user.visible_message("[user] welds external armor layer to [holder].", "You weld external armor layer to [holder].")
+ else
+ user.visible_message("[user] unfastens the external armor layer.", "You unfasten the external armor layer.")
return 1
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 6961bd7e81..40b26cc0b4 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -205,12 +205,12 @@
////////// Firefighter
/obj/item/mecha_parts/chassis/firefighter
- name = "Ripley-on-Fire Chassis"
+ name = "Firefighter Chassis"
New()
..()
construct = new /datum/construction/mecha/firefighter_chassis(src)
-
+/*
/obj/item/mecha_parts/part/firefighter_torso
name="Ripley-on-Fire Torso"
icon_state = "ripley_harness"
@@ -230,7 +230,7 @@
/obj/item/mecha_parts/part/firefighter_right_leg
name="Ripley-on-Fire Right Leg"
icon_state = "ripley_r_leg"
-
+*/
////////// HONK
@@ -452,10 +452,6 @@
name = "Circuit board (Durand Central Control module)"
icon_state = "mainboard"
- firefighter/peripherals
- name = "Circuit board (Ripley-on-Fire Peripherals Control module)"
- icon_state = "mcontroller"
-
honker
origin_tech = "programming=4"
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index a55f8433a3..0ba5cfe0a3 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -126,6 +126,29 @@
parts -= part
return
+/obj/effect/decal/mecha_wreckage/ripley
+ name = "Firefighter wreckage"
+ icon_state = "firefighter-broken"
+
+ New()
+ ..()
+ var/list/parts = list(/obj/item/mecha_parts/part/ripley_torso,
+ /obj/item/mecha_parts/part/ripley_left_arm,
+ /obj/item/mecha_parts/part/ripley_right_arm,
+ /obj/item/mecha_parts/part/ripley_left_leg,
+ /obj/item/mecha_parts/part/ripley_right_leg,
+ /obj/item/clothing/suit/fire)
+ for(var/i=0;i<2;i++)
+ if(!isemptylist(parts) && prob(40))
+ var/part = pick(parts)
+ welder_salvage += part
+ parts -= part
+ return
+
+/obj/effect/decal/mecha_wreckage/deathripley
+ name = "Death-Ripley wreckage"
+ icon_state = "deathripley-broken"
+
/obj/effect/decal/mecha_wreckage/honker
name = "Honker wreckage"
icon_state = "honker-broken"
diff --git a/code/game/mecha/working/firefighter.dm b/code/game/mecha/working/firefighter.dm
index 6744ba1ace..e4fbffa8bf 100644
--- a/code/game/mecha/working/firefighter.dm
+++ b/code/game/mecha/working/firefighter.dm
@@ -1,4 +1,4 @@
-/obj/mecha/working/firefighter
+/*/obj/mecha/working/firefighter
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
name = "Ripley-on-Fire"
icon_state = "ripley"
@@ -9,17 +9,17 @@
wreckage = /obj/effect/decal/mecha_wreckage/ripley
infra_luminosity = 5
-/*
+
/obj/mecha/working/firefighter/New()
..()
// tools += new /datum/mecha_tool/uni_interface(src)
tools += new /datum/mecha_tool/extinguisher(src)
tools += new /datum/mecha_tool/drill(src)
-/*
+
for(var/g_type in typesof(/datum/mecha_tool/gimmick))
if(g_type!=/datum/mecha_tool/gimmick)
tools += new g_type(src)
-*/
+
selected_tool = tools[1]
return
*/
\ No newline at end of file
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index d03290438d..2c06bc966a 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -15,6 +15,30 @@
return
*/
+/obj/mecha/working/ripley/firefighter
+ desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
+ name = "APLU \"Firefighter\""
+ icon_state = "firefighter"
+ max_temperature = 2500
+ health = 250
+ lights_power = 8
+ list/damage_absorption = list("fire"=0.5,"bullet"=0.8,"bomb"=0.5)
+
+/obj/mecha/working/ripley/deathripley
+ desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE"
+ name = "DEATH-RIPLEY"
+ icon_state = "deathripley"
+ step_in = 2
+ opacity=0
+ lights_power = 60
+ step_energy_drain = 0
+
+/obj/mecha/working/ripley/deathripley/New()
+ ..()
+ var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/safety_clamp
+ ME.attach(src)
+ return
+
/obj/mecha/working/ripley/Exit(atom/movable/O)
if(O in cargo)
return 0
diff --git a/code/game/objects/closets.dm b/code/game/objects/closets.dm
index fa65fa17f5..3d3b3d7063 100644
--- a/code/game/objects/closets.dm
+++ b/code/game/objects/closets.dm
@@ -20,6 +20,9 @@
for(var/obj/item/I in src)
I.loc = src.loc
+ for(var/obj/mecha/working/ripley/deathripley/I in src)
+ I.loc = src.loc
+
for(var/mob/M in src)
M.loc = src.loc
if(M.client)
@@ -54,6 +57,9 @@
if(!I.anchored)
I.loc = src
+ for(var/obj/mecha/working/ripley/deathripley/I in src.loc)
+ I.loc = src
+
for(var/mob/M in src.loc)
if(istype (M, /mob/dead/observer))
continue
diff --git a/code/game/objects/closets/secure/cargo.dm b/code/game/objects/closets/secure/cargo.dm
new file mode 100644
index 0000000000..e25f87be09
--- /dev/null
+++ b/code/game/objects/closets/secure/cargo.dm
@@ -0,0 +1,20 @@
+/obj/structure/closet/secure_closet/cargotech
+ name = "Cargo Technician's Locker"
+ req_access = list(access_cargo)
+ //icon_state = "secureeng1"
+ //icon_closed = "secureeng"
+ //icon_locked = "secureeng1"
+ //icon_opened = "toolclosetopen"
+ //icon_broken = "secureengbroken"
+ //icon_off = "secureengoff"
+
+ //Needs proper sprites
+
+ New()
+ ..()
+ sleep(2)
+ new /obj/item/clothing/under/rank/cargo(src)
+ new /obj/item/clothing/shoes/brown(src)
+ new /obj/item/device/radio/headset/headset_cargo(src)
+ new /obj/item/clothing/gloves/black(src)
+ return
\ No newline at end of file
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 7b4fcf3963..7f3ad0a3d9 100644
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -745,7 +745,7 @@
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message("\blue Localized Damage, Brute-Burn:",1)
+ user.show_message("\blue Localized Damage, Brute/Burn:",1)
if(length(damaged)>0)
for(var/datum/organ/external/org in damaged)
user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index b9326ea668..a7ff0bd8f7 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -208,7 +208,7 @@ MASS SPECTROMETER
if(mode == 1 && istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message("\blue Localized Damage, Brute\\Burn:",1)
+ user.show_message("\blue Localized Damage, Brute/Burn:",1)
if(length(damaged)>0)
for(var/datum/organ/external/org in damaged)
user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 325a6cbdc7..bda87b047c 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -1,267 +1,267 @@
-/obj/item/blueprints
- var/const/AREA_ERRNONE = 0
- var/const/AREA_STATION = 1
- var/const/AREA_SPACE = 2
- var/const/AREA_SPECIAL = 3
-
- var/const/BORDER_ERROR = 0
- var/const/BORDER_NONE = 1
- var/const/BORDER_BETWEEN = 2
- var/const/BORDER_2NDTILE = 3
- var/const/BORDER_SPACE = 4
-
- var/const/ROOM_ERR_LOLWAT = 0
- var/const/ROOM_ERR_SPACE = -1
- var/const/ROOM_ERR_TOOLARGE = -2
-
-/obj/item/blueprints/attack_self(mob/M as mob)
- if (!istype(M,/mob/living/carbon/human))
- M << "This is stack of useless pieces of harsh paper." //monkeys cannot into projecting
- return
- interact()
- return
-
-/obj/item/blueprints/Topic(href, href_list)
- ..()
- if ((usr.restrained() || usr.stat || usr.equipped() != src))
- return
- if (!href_list["action"])
- return
- switch(href_list["action"])
- if ("create_area")
- if (get_area_type()!=AREA_SPACE)
- interact()
- return
- create_area()
- if ("edit_area")
- if (get_area_type()!=AREA_STATION)
- interact()
- return
- edit_area()
-
-/obj/item/blueprints/proc/interact()
- var/area/A = get_area()
- var/text = {"[src]
-[station_name()] blueprints
-Property of Nanotrasen. For heads of staff only. Store in high-secure storage.
-"}
- switch (get_area_type())
- if (AREA_SPACE)
- text += {"
-According this blueprints you are in open space now.
-Mark this place as new area.
-"}
- if (AREA_STATION)
- text += {"
-According this blueprints you are in [A.name] now.
-You may
-move an amendment to the drawing.
-"}
- if (AREA_SPECIAL)
- text += {"
-This place doesn't noted on this blueprints.
-"}
- else
- return
- text += ""
- usr << browse(text, "window=blueprints")
- onclose(usr, "blueprints")
-
-
-/obj/item/blueprints/proc/get_area()
- var/turf/T = get_turf_loc(usr)
- var/area/A = T.loc
- A = A.master
- return A
-
-/obj/item/blueprints/proc/get_area_type(var/area/A = get_area())
- if (A.name == "Space")
- return AREA_SPACE
- var/list/SPECIALS = list(
- /area/shuttle,
- /area/admin,
- /area/arrival,
- /area/centcom,
- /area/asteroid,
- /area/tdome,
- /area/syndicate_station,
- /area/wizard_station,
- /area/prison
- // /area/derelict //commented out, all hail derelict-rebuilders!
- )
- for (var/type in SPECIALS)
- if ( istype(A,type) )
- return AREA_SPECIAL
- return AREA_STATION
-
-/obj/item/blueprints/proc/create_area()
- //world << "DEBUG: create_area"
- var/res = detect_room(get_turf_loc(usr))
- if(!istype(res,/list))
- switch(res)
- if(ROOM_ERR_SPACE)
- usr << "\red New area must be complete airtight!"
- return
- if(ROOM_ERR_TOOLARGE)
- usr << "\red New area too large!"
- return
- else
- usr << "\red Error! Please notify administration!"
- return
- var/list/turf/turfs = res
- var/str = sanitize(trim(input(usr,"New area title","Blueprints editing")))
- if(!str || !length(str)) //cancel
- return
- if(length(str) > 50)
- usr << "\red Text too long."
- return
- var/area/A = new
- A.name = str
- A.tag="[A.type]_[md5(str)]" // without this dynamic light system ruin everithing
- //var/ma
- //ma = A.master ? "[A.master]" : "(null)"
- //world << "DEBUG: create_area:
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]"
- A.power_equip = 0
- A.power_light = 0
- A.power_environ = 0
- move_turfs_to_area(turfs, A)
- spawn(5)
- //ma = A.master ? "[A.master]" : "(null)"
- //world << "DEBUG: create_area(5):
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]"
- interact()
- return
-
-
-/obj/item/blueprints/proc/move_turfs_to_area(var/list/turf/turfs, var/area/A)
- A.contents.Add(turfs)
- //oldarea.contents.Remove(usr.loc) // not needed
- //T.loc = A //error: cannot change constant value
-
-
-/obj/item/blueprints/proc/edit_area()
- var/area/A = get_area()
- //world << "DEBUG: edit_area"
- var/prevname = A.name
- var/str = sanitize(trim(input(usr,"New area title","Blueprints editing",prevname)))
- if(!str || !length(str) || str==prevname) //cancel
- return
- if(length(str) > 50)
- usr << "\red Text too long."
- return
- set_area_machinery_title(A,str,prevname)
- for(var/area/RA in A.related)
- RA.name = str
- usr << "\blue You set the area '[prevname]' title to '[str]'."
- interact()
- return
-
-
-
-/obj/item/blueprints/proc/set_area_machinery_title(var/area/A,var/title,var/oldtitle)
- if (!oldtitle) // or dd_replacetext goes to infinite loop
- return
- for(var/area/RA in A.related)
- for(var/obj/machinery/alarm/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/power/apc/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/atmospherics/unary/vent_scrubber/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/atmospherics/unary/vent_pump/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- for(var/obj/machinery/door/M in RA)
- M.name = dd_replacetext(M.name,oldtitle,title)
- //TODO: much much more. Unnamed airlocks, cameras, etc.
-
-/obj/item/blueprints/proc/check_tile_is_border(var/turf/T2,var/dir)
- if (istype(T2, /turf/space))
- return BORDER_SPACE //omg hull breach we all going to die here
- if (istype(T2, /turf/simulated/shuttle))
- return BORDER_SPACE
- if (get_area_type(T2.loc)!=AREA_SPACE)
- return BORDER_BETWEEN
- if (istype(T2, /turf/simulated/wall))
- return BORDER_2NDTILE
- if (!istype(T2, /turf/simulated))
- return BORDER_BETWEEN
-
- for (var/obj/structure/window/W in T2)
- if(turn(dir,180) == W.dir)
- return BORDER_BETWEEN
- if (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST))
- return BORDER_2NDTILE
- for(var/obj/machinery/door/window/D in T2)
- if(turn(dir,180) == D.dir)
- return BORDER_BETWEEN
- if (locate(/obj/machinery/door) in T2)
- return BORDER_2NDTILE
- if (locate(/obj/structure/falsewall) in T2)
- return BORDER_2NDTILE
- if (locate(/obj/structure/falserwall) in T2)
- return BORDER_2NDTILE
-
- return BORDER_NONE
-
-/obj/item/blueprints/proc/detect_room(var/turf/first)
- var/list/turf/found = new
- var/list/turf/pending = list(first)
- while(pending.len)
- if (found.len+pending.len > 300)
- return ROOM_ERR_TOOLARGE
- var/turf/T = pending[1] //why byond havent list::pop()?
- pending -= T
- for (var/dir in cardinal)
- var/skip = 0
- for (var/obj/structure/window/W in T)
- if(dir == W.dir || (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST)))
- skip = 1; break
- if (skip) continue
- for(var/obj/machinery/door/window/D in T)
- if(dir == D.dir)
- skip = 1; break
- if (skip) continue
-
- var/turf/NT = get_step(T,dir)
- if (!isturf(NT) || (NT in found) || (NT in pending))
- continue
-
- switch(check_tile_is_border(NT,dir))
- if(BORDER_NONE)
- pending+=NT
- if(BORDER_BETWEEN)
- //do nothing, may be later i'll add 'rejected' list as optimization
- if(BORDER_2NDTILE)
- found+=NT //tile included to new area, but we dont seek more
- if(BORDER_SPACE)
- return ROOM_ERR_SPACE
- found+=T
- return found
-
-/*
-/proc/check_apc(var/area/A)
- for(var/area/RA in A.related)
- for(var/obj/machinery/power/apc/FINDME in RA)
- return 1
- return 0
-
-/proc/fuckingfreemachinery()
- for(var/obj/machinery/machine in machines)
- if (istype(machine,/obj/machinery/power/solar))
- continue
- var/area/A = machine.loc.loc // make sure it's in an area
- if (istype(A,/area/tdome))
- continue
- if (istype(A,/area/shuttle))
- continue
- if(!A || !isarea(A))
- world << "DEBUG: @[machine.x],[machine.y],[machine.z] ([A.name]) machine \"[machine.name]\" ([machine.type]) hasnt area!"
- continue
- A = A.master
- if (A.name=="Space")
- world << "DEBUG: @[machine.x],[machine.y],[machine.z] ([A.name]) machine \"[machine.name]\" ([machine.type]) work in space!"
- continue
- if (!check_apc(A))
- world << "DEBUG: @[machine.x],[machine.y],[machine.z] ([A.name]) machine \"[machine.name]\" ([machine.type]) work without APC!"
- world << "\red END ====="
-
+/obj/item/blueprints
+ var/const/AREA_ERRNONE = 0
+ var/const/AREA_STATION = 1
+ var/const/AREA_SPACE = 2
+ var/const/AREA_SPECIAL = 3
+
+ var/const/BORDER_ERROR = 0
+ var/const/BORDER_NONE = 1
+ var/const/BORDER_BETWEEN = 2
+ var/const/BORDER_2NDTILE = 3
+ var/const/BORDER_SPACE = 4
+
+ var/const/ROOM_ERR_LOLWAT = 0
+ var/const/ROOM_ERR_SPACE = -1
+ var/const/ROOM_ERR_TOOLARGE = -2
+
+/obj/item/blueprints/attack_self(mob/M as mob)
+ if (!istype(M,/mob/living/carbon/human))
+ M << "This is stack of useless pieces of harsh paper." //monkeys cannot into projecting
+ return
+ interact()
+ return
+
+/obj/item/blueprints/Topic(href, href_list)
+ ..()
+ if ((usr.restrained() || usr.stat || usr.equipped() != src))
+ return
+ if (!href_list["action"])
+ return
+ switch(href_list["action"])
+ if ("create_area")
+ if (get_area_type()!=AREA_SPACE)
+ interact()
+ return
+ create_area()
+ if ("edit_area")
+ if (get_area_type()!=AREA_STATION)
+ interact()
+ return
+ edit_area()
+
+/obj/item/blueprints/proc/interact()
+ var/area/A = get_area()
+ var/text = {"[src]
+[station_name()] blueprints
+Property of Nanotrasen. For heads of staff only. Store in high-secure storage.
+"}
+ switch (get_area_type())
+ if (AREA_SPACE)
+ text += {"
+According this blueprints you are in open space now.
+Mark this place as new area.
+"}
+ if (AREA_STATION)
+ text += {"
+According this blueprints you are in [A.name] now.
+You may
+move an amendment to the drawing.
+"}
+ if (AREA_SPECIAL)
+ text += {"
+This place doesn't noted on this blueprints.
+"}
+ else
+ return
+ text += ""
+ usr << browse(text, "window=blueprints")
+ onclose(usr, "blueprints")
+
+
+/obj/item/blueprints/proc/get_area()
+ var/turf/T = get_turf_loc(usr)
+ var/area/A = T.loc
+ A = A.master
+ return A
+
+/obj/item/blueprints/proc/get_area_type(var/area/A = get_area())
+ if (A.name == "Space")
+ return AREA_SPACE
+ var/list/SPECIALS = list(
+ /area/shuttle,
+ /area/admin,
+ /area/arrival,
+ /area/centcom,
+ /area/asteroid,
+ /area/tdome,
+ /area/syndicate_station,
+ /area/wizard_station,
+ /area/prison
+ // /area/derelict //commented out, all hail derelict-rebuilders!
+ )
+ for (var/type in SPECIALS)
+ if ( istype(A,type) )
+ return AREA_SPECIAL
+ return AREA_STATION
+
+/obj/item/blueprints/proc/create_area()
+ //world << "DEBUG: create_area"
+ var/res = detect_room(get_turf_loc(usr))
+ if(!istype(res,/list))
+ switch(res)
+ if(ROOM_ERR_SPACE)
+ usr << "\red New area must be complete airtight!"
+ return
+ if(ROOM_ERR_TOOLARGE)
+ usr << "\red New area too large!"
+ return
+ else
+ usr << "\red Error! Please notify administration!"
+ return
+ var/list/turf/turfs = res
+ var/str = sanitize(trim(input(usr,"New area title","Blueprints editing")))
+ if(!str || !length(str)) //cancel
+ return
+ if(length(str) > 50)
+ usr << "\red Text too long."
+ return
+ var/area/A = new
+ A.name = str
+ A.tag="[A.type]_[md5(str)]" // without this dynamic light system ruin everithing
+ //var/ma
+ //ma = A.master ? "[A.master]" : "(null)"
+ //world << "DEBUG: create_area:
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]"
+ A.power_equip = 0
+ A.power_light = 0
+ A.power_environ = 0
+ move_turfs_to_area(turfs, A)
+ spawn(5)
+ //ma = A.master ? "[A.master]" : "(null)"
+ //world << "DEBUG: create_area(5):
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]"
+ interact()
+ return
+
+
+/obj/item/blueprints/proc/move_turfs_to_area(var/list/turf/turfs, var/area/A)
+ A.contents.Add(turfs)
+ //oldarea.contents.Remove(usr.loc) // not needed
+ //T.loc = A //error: cannot change constant value
+
+
+/obj/item/blueprints/proc/edit_area()
+ var/area/A = get_area()
+ //world << "DEBUG: edit_area"
+ var/prevname = A.name
+ var/str = sanitize(trim(input(usr,"New area title","Blueprints editing",prevname)))
+ if(!str || !length(str) || str==prevname) //cancel
+ return
+ if(length(str) > 50)
+ usr << "\red Text too long."
+ return
+ set_area_machinery_title(A,str,prevname)
+ for(var/area/RA in A.related)
+ RA.name = str
+ usr << "\blue You set the area '[prevname]' title to '[str]'."
+ interact()
+ return
+
+
+
+/obj/item/blueprints/proc/set_area_machinery_title(var/area/A,var/title,var/oldtitle)
+ if (!oldtitle) // or dd_replacetext goes to infinite loop
+ return
+ for(var/area/RA in A.related)
+ for(var/obj/machinery/alarm/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,title)
+ for(var/obj/machinery/power/apc/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,title)
+ for(var/obj/machinery/atmospherics/unary/vent_scrubber/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,title)
+ for(var/obj/machinery/atmospherics/unary/vent_pump/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,title)
+ for(var/obj/machinery/door/M in RA)
+ M.name = dd_replacetext(M.name,oldtitle,title)
+ //TODO: much much more. Unnamed airlocks, cameras, etc.
+
+/obj/item/blueprints/proc/check_tile_is_border(var/turf/T2,var/dir)
+ if (istype(T2, /turf/space))
+ return BORDER_SPACE //omg hull breach we all going to die here
+ if (istype(T2, /turf/simulated/shuttle))
+ return BORDER_SPACE
+ if (get_area_type(T2.loc)!=AREA_SPACE)
+ return BORDER_BETWEEN
+ if (istype(T2, /turf/simulated/wall))
+ return BORDER_2NDTILE
+ if (!istype(T2, /turf/simulated))
+ return BORDER_BETWEEN
+
+ for (var/obj/structure/window/W in T2)
+ if(turn(dir,180) == W.dir)
+ return BORDER_BETWEEN
+ if (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST))
+ return BORDER_2NDTILE
+ for(var/obj/machinery/door/window/D in T2)
+ if(turn(dir,180) == D.dir)
+ return BORDER_BETWEEN
+ if (locate(/obj/machinery/door) in T2)
+ return BORDER_2NDTILE
+ if (locate(/obj/structure/falsewall) in T2)
+ return BORDER_2NDTILE
+ if (locate(/obj/structure/falserwall) in T2)
+ return BORDER_2NDTILE
+
+ return BORDER_NONE
+
+/obj/item/blueprints/proc/detect_room(var/turf/first)
+ var/list/turf/found = new
+ var/list/turf/pending = list(first)
+ while(pending.len)
+ if (found.len+pending.len > 300)
+ return ROOM_ERR_TOOLARGE
+ var/turf/T = pending[1] //why byond havent list::pop()?
+ pending -= T
+ for (var/dir in cardinal)
+ var/skip = 0
+ for (var/obj/structure/window/W in T)
+ if(dir == W.dir || (W.dir in list(NORTHEAST,SOUTHEAST,NORTHWEST,SOUTHWEST)))
+ skip = 1; break
+ if (skip) continue
+ for(var/obj/machinery/door/window/D in T)
+ if(dir == D.dir)
+ skip = 1; break
+ if (skip) continue
+
+ var/turf/NT = get_step(T,dir)
+ if (!isturf(NT) || (NT in found) || (NT in pending))
+ continue
+
+ switch(check_tile_is_border(NT,dir))
+ if(BORDER_NONE)
+ pending+=NT
+ if(BORDER_BETWEEN)
+ //do nothing, may be later i'll add 'rejected' list as optimization
+ if(BORDER_2NDTILE)
+ found+=NT //tile included to new area, but we dont seek more
+ if(BORDER_SPACE)
+ return ROOM_ERR_SPACE
+ found+=T
+ return found
+
+/*
+/proc/check_apc(var/area/A)
+ for(var/area/RA in A.related)
+ for(var/obj/machinery/power/apc/FINDME in RA)
+ return 1
+ return 0
+
+/proc/fuckingfreemachinery()
+ for(var/obj/machinery/machine in machines)
+ if (istype(machine,/obj/machinery/power/solar))
+ continue
+ var/area/A = machine.loc.loc // make sure it's in an area
+ if (istype(A,/area/tdome))
+ continue
+ if (istype(A,/area/shuttle))
+ continue
+ if(!A || !isarea(A))
+ world << "DEBUG: @[machine.x],[machine.y],[machine.z] ([A.name]) machine \"[machine.name]\" ([machine.type]) hasnt area!"
+ continue
+ A = A.master
+ if (A.name=="Space")
+ world << "DEBUG: @[machine.x],[machine.y],[machine.z] ([A.name]) machine \"[machine.name]\" ([machine.type]) work in space!"
+ continue
+ if (!check_apc(A))
+ world << "DEBUG: @[machine.x],[machine.y],[machine.z] ([A.name]) machine \"[machine.name]\" ([machine.type]) work without APC!"
+ world << "\red END ====="
+
*/
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index e0bf51c5cc..86ad4f1e45 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -307,6 +307,14 @@
Install the external reinforced armor plating (Not included due to Nanotrasen regulations. Can be made using 5 reinforced metal sheets.)
Secure the external reinforced armor plating with a wrench
Weld the external reinforced armor plating to the chassis
+
+ Additional Information:
+ The firefighting variation is made in a similar fashion.
+ A firesuit must be connected to the Firefighter chassis for heat shielding.
+ Internal armor is plasteel for additional strength.
+ External armor must be installed in 2 parts, totaling 10 sheets.
+ Completed mech is more resiliant against fire, and is a bit more durable overall
+ Nanotrasen is determined to the safety of its investments employees.